picon's Tech Blog

Talkroom / BATON を開発しているpicon inc.のテックブログです。

オリタケイさんのRT企画(約9000RT!!)の抽選をやった話(プログラム付き)

こんにちは、piconのエンジニアの渋谷幸人です!

どうしてやることになったの?

今回、ご縁があって「オリタケイ」さんというとても素敵なイラストを書く方のお手伝いをしました。

内容は、「Twitter上でリツイートしてくれた人の中から数名の選んで、アイコン用のイラストを書くよ!」といったものでした。

想像以上の大反響で、ネット上にあるツールだと100RTまでしか取得できないということで...

絶望の果てにくれていた とのことだったのですが、たまたまお話する機会があってお手伝いすることになりました。   

※ 社長からもこちらの案件を快諾していただきました。

どうやってやったの?

TwitterAPIの制限が厳しくなっているという話は小耳に挟んでおり、もしかしたら難しいかもな...と思っていました。

その旨を伝えた上で、とりあえずチャレンジしてみました。

調べてみたところ、通常の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ください!

まずは週末コミットやハッカソンのみの参加でも歓迎です。

↓ 連絡はこちら

twitter.com