CodeIQ Blog

自分の実力を知りたいITエンジニア向けの、実務スキル評価サービス「CodeIQ(コードアイキュー)」の公式ブログです。

Gunosyから出題!「Twitterで過去につぶやいたURLを収集しましょう。」解説記事+優秀解答者発表 #python #gunosy

CodeIQ中の人、millionsmileです。

急成長中のGunosyからの問題の解説です!

Gunosyは、Twitter、Facebookアカウントを分析し、その人に興味のあるニュース・記事を推薦、配信してくれるパーソナルマガジンです。

そんなGunosyからの問題は、「Twitterで過去につぶやいたURLを収集しましょう」というもの。まさにGunosyが得意とする技術がテーマの問題ですね。

ではでは、Gunosy問題の解説と優秀解答者の発表です!

=========================================
GunosyのCoffeeYoshidaです。
今回、CodeIQで「Pythonを使ってTwitterで過去につぶやいたURLを収集しましょう。」という問題を出題しました。問題は以下のような内容でした。

【問題】

Twitterの公式APIを使い、過去のつぶやきの中からURLのみを抽出するプログラムを作成してください。
また、収集したURLごとに合計つぶやき数も取得してください。
つぶやきは、TwitterのAPIで遡れるすべてを対象としてください。

プログラミング言語は、Pythonを使ってください。

出力フォーマットは、以下の通りとして下さい。
url,tweet_count
https://codeiq.jp/ace/coffee_yoshida/q344,23
http://gunosy.com/,132

なお、複数回つぶやいたURLは一度のみ出力するようにしてください。

Twitter公式API:https://dev.twitter.com/docs/api/1.1

課題の提出は<b><u>プログラムのみ</u></b>です。(出力結果のcsvの提出は必要ありません。)
完成後、テキストファイル(.txt)に変換し、ファイルアップロードにて提出してください。

【解説】

ここでは、
 1. アプリケーションを作成し、キーを取得する
 2. つぶやきを取得し、URLをカウントする
 3. 表示する
の順にサンプルコードを交えて、解説していきます。

1. アプリケーションを作成し、キーを取得する

TwitterのDeveloperページ( https://dev.twitter.com/ )にログインし、
画面右上の「My applications」から、「Create a new application」を押して、
アプリケーション作成画面に移動します。
必須項目を入力し、「Create your Twitter application」ボタンを押して、
アプリケーションを作成します。
アプリケーションの作成が完了したら、アプリケーション詳細画面に表示される
「Consumer key」、「Consumer secret」をメモしておいて下さい。

今回は、自分のつぶやきを取得するためアクセストークンも取得する必要があります。
画面下の「Create my access token」ボタンを押して、アクセストークンを取得します。
表示される「Access token」「Access token secret」もメモしておいて下さい。

2. つぶやきを取得し、URLをカウントする

次に、1で取得したキーを用いて、つぶやきを取得します。

TwitterのPythonライブラリは色々ありますが、ここではpython-twitterを利用してみます。
python-twitterのインストールは、以下のGitHubの以下のページを参考にして下さい。
https://github.com/bear/python-twitter

インストールが終わったら、モジュールをインポートして、
1で取得したキーの設定をし、APIにつなげます。

import twitter

consumer_key = '1で取得したConsumer key'
consumer_secret = '1で取得したConsumer secret'
access_token_key = '1で取得したAccess token '
access_token_secret = '1で取得したAccess secret'

api = twitter.Api(consumer_key=consumer_key,
                  consumer_secret=consumer_secret,
                  access_token_key=access_token_key,
                  access_token_secret=access_token_secret)


つぶやきを取得するAPI( https://api.twitter.com/1.1/statuses/user_timeline.json )をラップしたGetUserTimelineを使用して、つぶやきを取得します。
つぶやきは最大で3200個、1回のアクセスで200個取得可能なので、最大で16(=3200/200)回のAPIアクセスが必要です。
つぶやきに含まれるURLは、APIのレスポンス内の「urls」で取得可能です。
URLだけ取得し、つぶやき数をカウントしていきます。

from collections import defaultdict
url_dict = defaultdict(int)
max_tweet = 3200
count = 200
page = max_tweet / count
max_id = None
print max_id
for i in range(page):
    statuses = api.GetUserTimeline(count=count,
                                   max_id=max_id)
   if not statuses:
        break
    for s in statuses:
        for u in s.urls:
            url = u.expanded_url or u.url
            url_dict[url] += 1
        max_id = s.id - 1

3.表示する

最後にURLとつぶやき数をcsv形式で表示して終了です。

for url, count in url_dict.iteritems():
    print '{},{}'.format(url, count)

【優秀解答者】

優秀解答者は、cielさんです。
2回目の解答がライブラリを使用せずに書いてくれていました。
素晴らしいです。

他のみなさまも挑戦いただき、ありがとうございました。

=========================================
いかがでしたか?わたしも毎朝新聞読むのと同じように、Gunosyを読むのが日課です。興味があるニュースを配信してくれるので、ついついポチポチリンクを押してしまいます。便利な世の中になってきましたなぁ~

https://codeiq.jp/ace/coffee_yoshida/q344
f:id:codeiq:20130705121648p:plain

まだまだこれからも面白い問題をだしていくので、
今後ともCodeIQをよろしくお願いします~

エンジニアのための新しい転職活動!CodeIQのウチに来ない?の特集ページを見る