Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2862

カクヨムにファイルで投稿する機能がないので作ってみた

$
0
0

TL; DR

  1. ログイン時、ヘッダにX-requested-With:XMLHttpRequestつける
  2. 投稿時は、csrf_tokenなので、GETでトークンを手に入れる
  3. 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マスターの人、解決方法求ム。


Viewing all articles
Browse latest Browse all 2862

Trending Articles