TL; DR
- ログイン時、ヘッダにX-requested-With:XMLHttpRequestつける
- 投稿時は、csrf_tokenなので、GETでトークンを手に入れる
- csrf_tokenとtitle(話のタイトル)とbody(本文)をPOSTする
[動機]ファイルアップロードしたい
ローカルで書いてる人にとったら、コピペ面倒ですよね。こちとら、markdownで書いて、pandocでわざわざplain-textにしてるんじゃい。
どうせPOSTかPUTで投げたらいいんちゃうの?
というわけで、流行りの(?)httpieを使ってやってみます。
ログイン
しかし、Webセキュリティの基本にして、自動化の敵、CSRF対策が立ちふさがります。
ログイン画面は、ヘッダにX-requested-With:XMLHttpRequestつけるタイプです。
login.sh
#!/bin/bashread-p"email:" email
read-sp"password:" pw
echo$emailでログイン
http --session kakuyomu \-f https://kakuyomu.jp/login \email_address=$emailpassword=$pw\
X-requested-With:XMLHttpRequest
とりあえず、--sessionオプションをつけて、一旦ログインすることでセッションIDを保存します。
投稿
投稿画面も同じ感じかと思ったら、こっちのフォームには、csrf_tokenが隠れています。
そのため、一度GETでフォーム画面を標準出力に流し、grepやらsedやら使ってトークンを取ります。
(マッチした文字列だけ取る方法をもうちょっとスマートに書きたいんだけど......)
投稿で投げる必要のあるパラメータは、
- title : 話のタイトル
- body : 本文
- csrf_token : トークン
です。
第一引数に投稿したいファイルを指定
new_story.sh [file]
echo"追加したい小説のIDは以下のアドレスの****の部分です"echo"https://kakuyomu.jp/my/works/*******************/"echo"本文に半角ダブルクォートがあると死にます"read-p"小説ID:" novel
url="https://kakuyomu.jp/my/works/${novel}/episodes/new"#とりあえずcsrf_tokenとってくるtoken=$(http --session kakuyomu $url\
| grep csrf_token \
| sed-r's/^.*value="(.*?)".*$/\1/')#タイトルの第○話を残す場合title_no=$(http --session kakuyomu $url\
| grep"name=\"title\""\
| sed-r's/^.*value="([^"]*?)".*$/\1/')infile=$1title=$(cat$infile | grep"^#" | head-n1 | sed-r's/^\s*#+?(.*).*?$/\1/')title="$title_no$title"#タイトル行を除いた部分body=$(cat$infile | grep-v"^#")#echo $tokenecho"--------------------------------"echo$titleecho"--------------------------------"#echo $body
http --session kakuyomu \-f$url\title="$title"\status=draft \edit_reservation=0 \keep_editing=0 \body="$body"
ただし、試してないけどダブルクォートがtitleとかbodyにあると死ぬ。
bashマスターの人、解決方法求ム。