0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-03

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/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マスターの人、解決方法求ム。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?