Skip to content

Instantly share code, notes, and snippets.

@motorailgun
Created January 26, 2021 00:11
Show Gist options
  • Save motorailgun/b93d57c1df66a271bfe3157d1e05f922 to your computer and use it in GitHub Desktop.
Save motorailgun/b93d57c1df66a271bfe3157d1e05f922 to your computer and use it in GitHub Desktop.
Twitterのモーメントにある画像を保存するやつ
require "json"
raw_json = JSON[File.open(ARGV[0]){|file| file.read}]
tweets_list = raw_json["globalObjects"]["tweets"]
# tweets_orderはツイートIDのArray
tweets_order = raw_json["timeline"]["instructions"][0]["addEntries"]["entries"][1..].reduce(Array.new){|orderd_list, item|
if item["content"].has_key?("item") and item["content"]["item"]["content"].has_key?("tweet") then
orderd_list << (item["content"]["item"]["content"]["tweet"]["id"])
else
orderd_list
end
}
# id_imgURL_pairは
# {ツイートID1: [メディアのファイル名1, メディアのファイル名2...], ツイートID2: [メディアのファイル名...]... }
# というハッシュになる(メディアの含まれないものは返さない)
id_imgname_pair = tweets_list.transform_values{|tweet|
if tweet["entities"].has_key?("media") then
tweet["entities"]["media"].reduce(Array.new){|media_urls, media_object|
media_urls << media_object["media_url_https"].match(/([^\/]+\.[^\/]+?\Z)/i).to_s
}
elsif
nil
end
}.reject{|key, value| true unless value}
randdir = "/tmp/TwMoment-#{rand(65536)}"
Dir.mkdir(randdir)
Dir.chdir(randdir)
imgfiles = tweets_order.reduce(Array.new){|files, id| files.push(id_imgname_pair[id])}.flatten.compact
imgfiles.each_with_index{|filename, index| system("curl https://pbs.twimg.com/media/#{filename}?name=orig -o #{index}-#{filename}"); sleep 2}

使い方

  1. ブラウザで画像を保存したいモーメントのページを開きます。
  2. 開発者向けツールを開いてネットワークタブへ移動し、絞り込みをXHRにします。
  3. ページをリロードすると(モーメントのURLの末尾の数列).jsonというものが降ってきているのがわかります。これを右クリックしてcURLとしてコピーします。
  4. ターミナルを開いて貼り付けます。パイプなどを使って適当なファイルに保存してください。
  5. このスクリプト(笑)を ruby Twitter_momentMediaDownloader.rb (今保存したjsonのパス) として実行します。
  6. ダウンロードされた画像は /tmp/TwMoment-(ランダムな数列)/ 以下に保存されています。変えたい時は28行目のパスを変更しておいてください。/tmpがtmpfsな人は忘れずにNVMに保存しましょう
  7. 画像ファイルはモーメントで表示した際に上から順に頭に番号がついているのでPDFにしたい時も楽です。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment