Mon Feb 29 19:15:45 JST 2016

Twitter, ファボったツイートに付与された画像を保存してファボを消す

bashで書く

UNIX哲学的に次のように分離する

  1. ファボ一覧の取得
  2. ツイートが持つ画像のurlの取得
  3. ファボの削除

ファボ一覧の取得

用いるAPIは GET favorites/list | Twitter Developers. このAPIは例によって、最近 n 個だけを取得して (デフォルトでn=20で最大200)、 max_id を指定することで、あるところより古い、最近 n 個を取得するという形になってる.

我々の目的としては、全て取得したい. 従って、全部取得できるまでAPIをループで叩き続けなければいけない. 次のように書けば、多少は奇麗に書けると思う.

一番最初は

OPT=""
twurl /1.1/favorites/list.json?count=200${OPT}

とする. APIはツイートを表現するオブジェクトを成分とする配列を返す. 配列の最後の成分の .id から1だけ引き算したのを、max_id として利用することで、 その続きを取得するのに使える.

OPT="&max_id=$(( 最後のやつ.id - 1 ))"
twurl /1.1/favorites/list.json?count=200${OPT}

これをループする. 終了条件は返ってきた配列が空であること.

ファボ一覧というけれど、何を取得すれば最小限度十分な情報か.

前から疑問であったが、 max_id に指定したid以下のものが来るはずであるが、偶に少し大きいのも来る. あとで重複を取り除く必要が在る.

GET statuses/show/:id | Twitter Developers っていうAPIを見ると、 ツイートの id (https://twitter.com/:screen_name/status/:id:id) だけあれば十分らしい.

また、APIは .id と、それをただ文字列にしただけの .id_str も一緒に渡すのが通例になっている. .id は整数であるが int32 では到底収まりきらず、jq は実は死ぬ.

   echo '{"x":111111111111111111111}' | jq .
{
  "x": 111111111111111110000
}

また bash (zsh) の $(( )) による整数演算も同様の理由から信用できない. そのために、 .id_str があるわけで、これをソースにして信用できるプロセッサーのみを用いる.

文字列を吐くとき、ダブルクオーテーションで括ろうとするので -r オプションでそれを抑止する.

というわけでこんなスクリプトを tw-fav-list としておく.

#!/bin/bash

TMP=$(mktemp)
OPT=""

while :; do
    URL="/1.1/favorites/list.json?count=200${OPT}"
    twurl "$URL" | jq -r '.[].id_str' > "$TMP"
    if [ ! -s "$TMP" ]; then
        break
    else
        NEXTID=$(ruby -e "p $(tail -1 "$TMP") - 1")
        OPT="&max_id=${NEXTID}"
        cat "$TMP"
    fi
done | sort -ur

rm "$TMP"

ツイートが持つ画像のurlの取得

https://twitter.com/ily_ilyhk2/status/703932013493915648 が持つ画像を取得してみる. 1ツイートが複数枚持つことがある.

取り出すべきっぽい文字列はそこにあるので、

twurl /1.1/statuses/show.json?id=703932013493915648 | jq -r '.extended_entities.media[].media_url_https'

とすればよい.

次を tw-media-list としよう.

#!/bin/bash

twurl /1.1/statuses/show.json?id=$1 | jq -r '.extended_entities.media[].media_url_https'

ファボの削除

これはただAPIを叩くだけ.

次を tw-unfav とする.

#!/bin/bash

twurl -X POST /1.1/favorites/destroy.json -d id=$1

まとめ

tw-fav-list > fav-list.txt
for id in `cat fav-list.txt`; do tw-media-list $id; done | tee media-list.txt
wget -i media-list.txt
for id in `cat fav-list.txt`; do tw-unfav $id; done

動画 (webp形式だったかな) は、これだとサムネイル (jpg) が得られるぽい