読者です 読者をやめる 読者になる 読者になる

kivantium活動日記

プログラムを使っていろいろやります

PythonでTwitterを使う 〜Tweepyの紹介〜

現代人の生活に必須となったSNSTwitterTwitterをプログラムから扱うことができたら何かと便利でしょう。そこでPythonTwitterを扱うライブラリTweepyを紹介しようと思います。

Tweepyのインストール

例によって環境はUbuntuを想定しています。

sudo apt-get install python-setuptools
sudo easy_install tweepy

以上です。easy_installさえ使えれば他の環境でも使えると思います。

とりあえずHello, world

はじめの一歩として、「Hello, world!」とつぶやいてみることにします。

サードパーティーTwitterクライアントを使ったことがある人は分かると思いますが、アプリからTwitterアカウントを操作するためには認証が必要になります。認証を行うためには少々面倒な手順が必要です。

アプリケーションの登録

まず、Twitter Application Managementにアクセスしてプログラムに発言させたいアカウントでログインします。

Create New Appをクリックして新しいアプリケーションを作ります。Name, Description, Websiteを適当に入力し、Developer Agreementに同意してからCreate your Twitter applicationをクリックすれば完成です。

投稿を行うためにPermissionsタブでアプリケーションの権限をRead and Writeに設定します。

Keys and Access Tokensのタブを開いてConsumer KeyとConsumer Secretを確認して、次のスクリプトを実行します。

#!/usr/bin/python
#-*- coding: utf-8 -*-
import tweepy

consumer_key = "アプリのConsumer Key"
consumer_secret = "アプリのConsumer Secret"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
print "Access:", auth.get_authorization_url()
verifier = raw_input('Verifier:')
auth.get_access_token(verifier)
print "Access Token:", auth.access_token
print "Access Token Secret:", auth.access_token_secret

実行するとURLが表示されるので、そのURLにアクセスして認証を許可します。表示されたPINコードをコピペしてVerifier: の後ろに入力すると認証が行われ、Access TokenとAccess Token Secretが表示されます。この2つは一度取得するとずっと有効なのでどこかのファイルに保存しておきます。

認証が成功したのでHello, world!をつぶやくプログラムを書きます。

#!/usr/bin/python
#-*- coding: utf-8 -*-
import tweepy

#認証を行う
consumer_key = "アプリのConsumer Key"
consumer_secret = "アプリのConsumer Secret"
access_token = "取得したAccess Token"
access_secret = "取得したAccess Token Secret"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)

#Hello, world!と投稿する
api.update_status('Hello, world!')

これだけのプログラムで投稿することができました。

関連記事

Tweepyを使った記事がいくつかあるのでそれを参考にするのがよいと思います。

TweepyのAPI

Tweepyの機能は公式マニュアルに書いてあるのですが、このマニュアルは古いのでもう使えない関数(API.exists_friendshipなど)が載っていることがあるので気をつけてください。使えそうな機能について簡単に説明しておきます。

API.home_timeline([since_id][, max_id][, count][, page])

引数を指定しない場合、TLから最新20件のツイート(Statusオブジェクト)を取得します。引数を指定すれば多くのツイートを取得できます。

API.user_timeline([id/user_id/screen_name][, since_id][, max_id][, count][, page])

ユーザーを指定して、その人のTLから最新20件のツイート(Statusオブジェクト)を取得します。引数を指定すればより多くのツイートを取得できます。

API.get_status(id)

ツイートのidを指定して詳細な情報(Statusオブジェクト)を取得します。

API.update_status(status[, in_reply_to_status_id][, lat][, long][, source][, place_id])

つぶやきます。リプライ先などの加情報をつけることもできます。重複ツイートはエラーが出るので注意してください。

API.destroy_status(id)

idを指定してツイートを削除します。

API.retweet(id)

idを指定してツイートをRTします。

API.get_user(id/user_id/screen_name)

ユーザーを指定して詳細情報(Userオブジェクト)を取得します。

API.create_friendship(id/screen_name/user_id[, follow])

ユーザーをフォローします。

API.destroy_friendship(id/screen_name/user_id[, follow])

ユーザーをリムーブします

API.show_friendship(source_id/source_screen_name, target_id/target_screen_name)

2ユーザー間の関係(Friendshipオブジェクト)を取得します。

API.friends_ids(id/screen_name/user_id[, cursor])

指定したユーザーがフォローしているアカウントのidのリストを取得します

API.followers_ids(id/screen_name/user_id)

指定したユーザーをフォローしているアカウントのidのリストを取得します

API.search(q[, lang][, locale][, rpp][, page][, since_id][, geocode][, show_user])

検索します。

Tweepyのオブジェクト

Statusオブジェクト

いわゆるツイートを表します。status.textのようにしてアクセスします。使いそうなものだけ解説。

  • text: ツイートの本文(UTF-8)
  • author: ツイートした人のUserオブジェクト
  • id: ツイートのid
  • in_reply_to_status_id: リプライ先のツイートのid
  • in _reply_to_user_id: リプライ先のユーザーid
  • in_reply_to_screen_name: リプライ先のユーザーの表示名(@〜)
  • favorite_count: ふぁぼられた数
  • retweet_count: リツイートされた数
  • created_at: ツイート日時

Userオブジェクト

ユーザー情報を表します。これも使いそうなものだけ。

  • id: ユーザーのid
  • followers_count: 被フォロー数
  • description: プロフィール
  • friends_count: フォロー数
  • screen_name: 表示名(@〜)
  • name: 名前(@じゃないほう)

Friendshipオブジェクト

要素が2つの配列になっていて、[0]がsourceからtargetの、[1]がtargetからsourceの情報を表す。

  • following: フォローしているかどうか(True/False)

これだけ分かれば大抵のことはできるはずです。

複数画像をダウンロード

c = tweepy.Cursor(api.search, q='クエリ')
for status in c.items():
    print 'https://twitter.com/{}/status/{}'.format(status.author.screen_name, status.id)
    status = api.get_status(status.id)
    if hasattr(status, "extended_entities"):
        if status.extended_entities.has_key('media') and len(status.extended_entities['media']):
            for i, m in enumerate(status.extended_entities['media']):
                url = m['media_url_https']
                ext = url.split('.')[3]
                urllib.urlretrieve(url, '{}-{}.{}'.format(status.id, i, ext))