オリタケイさんのRT企画(約9000RT!!)の抽選をやった話(プログラム付き)
こんにちは、piconのエンジニアの渋谷幸人です!
どうしてやることになったの?
今回、ご縁があって「オリタケイ」さんというとても素敵なイラストを書く方のお手伝いをしました。
内容は、「Twitter上でリツイートしてくれた人の中から数名の選んで、アイコン用のイラストを書くよ!」といったものでした。
【あなたのアイコン描くよ!企画】
— オリタケイ (@Oritakeikou) August 20, 2018
ご要望に応じてこんな感じ(画像参照)のアイコンイラストを4名くらいの方にお描きします〜〜
ご応募の方はこちらのツイートをRTお願いします!
応募期間は22日の23:59までです。
※鍵付きアカウントは探せないので、公開アカウントの方でお願いします! pic.twitter.com/NGRnBM9jLT
想像以上の大反響で、ネット上にあるツールだと100RTまでしか取得できないということで...
絶望の果てにくれていた とのことだったのですが、たまたまお話する機会があってお手伝いすることになりました。
※ 社長からもこちらの案件を快諾していただきました。
どうやってやったの?
TwitterのAPIの制限が厳しくなっているという話は小耳に挟んでおり、もしかしたら難しいかもな...と思っていました。
その旨を伝えた上で、とりあえずチャレンジしてみました。
調べてみたところ、通常のtweetの取得の方法だと、RTを100件程度しか取得できないことがわかりました。
なんとかできないかと、調査を進めるとこちらの記事を発見しました。
[Twitter API] リツイートを100件より多く取得する方法 | プログラミング生放送
やりたいことドンピシャでした。
特定Tweetの詳細を取得するのではなく、文字列でTweetを検索することでページングを可能にして全件取得を目指します。
実際に開発してみる
あとはAPIの変更を実際に確認した上で、使い慣れているRubyを利用して実行しました。
twitterというGemを利用しています。
APIはこちらのドキュメントを参考にしてます。(現在は15分あたり180回のリクエストまでの制限があります。)
以下が実際のコードです。
一度しっかり動けばいいので、強い実装にはなってないです...
client = Twitter::REST::Client.new do |config| config.consumer_key = "取得したものを入れる" config.consumer_secret = "取得したものを入れる" config.access_token = "取得したものを入れる" config.access_token_secret = "取得したものを入れる" end target_tweet_text = "ご要望に応じてこんな感じ(画像参照)のアイコンイラストを4名くらいの方にお描きします〜〜" number_of_selection = 4 screen_names = [] finish_paging = false max_id = nil while !finish_paging sleep 0.1 search_result = client.search(target_tweet_text, result_type: "recent", max_id: max_id) search_result.attrs[:statuses].each do |status| screen_names.append(status[:user][:screen_name]) p status[:user][:screen_name] end if next_results = search_result.attrs[:search_metadata][:next_results] max_id = next_results.match(/\max_id=(\d+)&q/)[1] else finish_paging = true end end p screen_names.sample(number_of_selection)
まとめ
いつもお世話になっている人の役に立ててよかったです。
美味しいお酒でもおごってもらいたいと思います。
piconでは、一緒にプロダクトを作っていく エンジニア(特にiOS, Android)を 募集しています。
少しでも興味ある方は、ぜひ気軽にDMください!
まずは週末コミットやハッカソンのみの参加でも歓迎です。
↓ 連絡はこちら