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/bash
read -p "email:" email
read -sp "password:" pw
echo $emailでログイン
http --session kakuyomu \
-f https://kakuyomu.jp/login \
email_address=$email password=$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=$1
title=$(cat $infile | grep "^#" | head -n1 | sed -r 's/^\s*#+?(.*).*?$/\1/')
title="$title_no $title"
# タイトル行を除いた部分
body=$(cat $infile | grep -v "^#")
# echo $token
echo "--------------------------------"
echo $title
echo "--------------------------------"
# echo $body
http --session kakuyomu \
-f $url \
title="$title" \
status=draft \
edit_reservation=0 \
keep_editing=0 \
body="$body"
ただし、試してないけどダブルクォートがtitleとかbodyにあると死ぬかも。
bashマスターの人、解決方法求ム。