blog.euxn.me

rubyでTwitterから画像urlを取得する

2015-08-15 Sat.

gem twitter を使用してツイートから画像の URL だけを抽出します。

app.rb
1require 'twitter'
2
3@client = Twitter::REST::Client.new do |config|
4 config.consumer_key = CONSUMER_KEY
5 config.consumer_secret = CONSUMER_SECRET
6 config.access_token = ACCESS_TOKEN
7 config.access_token_secret = ACCESS_TOKEN_SECRET
8end
9
10tweets = @client.home_timeline(count: 200)
11imgs = tweets.flat_map { |s| s.media}.map { |m| m.media_url.to_s}

以上のように media を取得するとpic.twitter.com の画像しか取得できないため、動画の判定処理に加え、url からも画像であるか判定します。 今回は url が画像であるかどうかの判定に fastimage を使用します。 fastimage は本来画像のサイズを取得するためのものですが、(url の文字列からではなく)実際に url にアクセスしてファイル形式を判別できるため採用しました。

app.rb
1require 'twitter'
2require 'fastimage'
3
4# 省略
5
6imgs = []
7tweets = @client.home_timeline(count: 200)
8imgs.concat tweets.flat_map { |s| s.media }.flat_map { |m|
9 case m
10 when Twitter::Media::AnimatedGif
11 m.video_info.variants.map { |v| v.url.to_s }
12 when Twitter::Media::Photo
13 m.media_url.to_s
14 else
15 []
16 end
17 }
18imgs.concat tweets.flat_map { |s| s.urls }.flat_map { |u|
19 case FastImage.type(u.url.to_s)
20 when :bmp, :gif, :jpeg, :png, :webm
21 u.expanded_url.to_s
22 else
23 []
24 end
25 }

画像をファイルとして保存する場合は以下のようになります。

app.rb
1require 'open-uri'
2
3imgs.each do |url|
4 path = "./#{File.basename(url)}"
5 File.open(path, 'w') do |f|
6 f.write open(url).read
7 end
8end

url で動画を投稿している場合(vine とか)の処理は書いていません。画像だけでいいかな……

Other Works
2024-12-01 Sun.
OpenAPI Spec を出力できる DSL、TypeSpec の実践例
- ドワンゴ教育サービス開発者ブログ

2024-11-16 Sat.
型付き API リクエストを実現するいくつかの手法とその選択
- TSKaigi Kansai 2024

2024-09-10 Tue.
corepack が標準同梱じゃなくなる未来、 mise でパッケージマネージャを管理する
- Zenn

2024-09-10 Tue.
言語環境の管理は *env や *vm を超えて、 mise へ
- Zenn

2024-06-28 Fri.
TypeSpec を使い倒してる
- Kyoto.js 22

2024-05-11 Sat.
Powerfully Typed TypeScript
- TSKaigi 2024

2024-05-10 Fri.
pnpm の node_modules を探検して理解しよう
- ドワンゴ教育サービス開発者ブログ

2024-03-17 Sun.
neverthrow で局所的に Result 型を使い、 try-catch より安全に記述する
- Zenn

2023-12-20 Wed.
レガシーブラウザ向けのビルドオプションを剪定する
- ドワンゴ教育サービス開発者ブログ

2023-05-26 Fri.
Next.js で dynamic import を使い Client だけで動かす Component を実現する
- Zenn

2023-05-02 Tue.
Node.js でファイル名から拡張子を取り除く/取り出すために path.parse を使う
- Zenn

2023-02-27 Mon.
WSL2 で外部からアクセス可能にするために bridge mode を有効にする
- Zenn

2023-01-26 Thu.
init.vim & dein から init.lua & lazy.nvim へ、シンプル設定で移行した
- Zenn

2023-01-13 Fri.
kindle の本をブクログ形式の csv でエクスポートする@2023初春
- Zenn

2023-01-10 Tue.
自宅サーバの移設に際して docker から nerdctl に移行した
- Zenn

2023-01-10 Tue.
自宅サーバを rootless に移行した際のトラブル対応
- Zenn

2021-11-11 Thu.
並列実行した Promise で throw されても全てハンドルしたいときの方法(allSettled, finally, etc...)
- Zenn