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アカウントを操作するためには認証が必要になります。認証を行うためには少々面倒な手順が必要です。

トークンの取得

(2021年2月24日 最新の仕様に合わせて更新。すごく邪道っぽいやり方だが、多分これが一番早い)

まず、https://developer.twitter.com/en/appsにアクセスして開発者アカウントを登録します。承認には数日掛かります。

新しいアプリケーションを作ったら、設定を適当に埋めます。
最近の仕様変更でCallback URLが必須になりました。Webアプリではない場合に何を書けばいいか困るのですが、とりあえずhttp://example.com/とでもしておけばいいです。

Keys and Access Tokensのタブを開いてConsumer KeyとConsumer Secretを確認して、Pythonの対話モードを立ち上げてで次のスクリプトを実行します。

import tweepy

consumer_key = "アプリのConsumer Key"
consumer_secret = "アプリのConsumer Secret"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
print(auth.get_authorization_url())
```

ここで表示されるURLにアクセスして、発言したいアカウントで認証します。
すると指定したコールバック先に飛ばされるのですが、このとき飛ばされるURLの<code>oauth_verifier=</code>以降の文字列をコピペしてください。
Pythonコンソールの続きで以下を実行します。

>|python|
auth.get_access_token('コピペした文字列')

こうすると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))

広告コーナー