Edited at

Python3でのtwitter投稿など

More than 1 year has passed since last update.


Python3でもtwitterを使いたい

tweepyがpython3.xでは使えなくなっている。

tweepy作者がもうお手上げしているので他のライブラリを使わないといけない。

ここではある程度メジャーだと思われる sixohsix氏のライブラリを使う

(bear氏メインのpython-twitterというのもあるようだが、どちらでも使用感は大差無さそうと判断しました)


はじめに

https://apps.twitter.com/

にて、アプリの登録, consumer key , consumer secret keyなどは取得しておいて下さい。

これがないとそもそもtwitter apiは叩けないので。consumer key & consumer secret keyが何かは本稿では振れないです。


インストール


install.sh

pip install twitter



使い方

https://github.com/sixohsix/twitter

に書いてあることが本当に全部...全部なのだが、多分初心者には厳しい。

順番に説明する。

スクリプトで叩くのであれば、oauth tokenなどを拾ってくる必要がある筈。

コマンドラインなどでauth_tokenを拾ってくるための簡単なapiが用意されている。


token.py

import os

from twitter import *

#consumer key, consumer secret key from https://apps.twitter.com/
CONSUMER_KEY = "YOUR_CONSUMER_KEYAAAAAAAA"
CONSUMER_SECRET="YOUR_CONSUMER_SECRETAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

MY_TWITTER_CREDS = os.path.expanduser('~/.my_app_credentials')
if not os.path.exists(MY_TWITTER_CREDS):
oauth_dance("My App Name", CONSUMER_KEY, CONSUMER_SECRET, MY_TWITTER_CREDS)

oauth_token, oauth_secret = read_token_file(MY_TWITTER_CREDS)

twitter = Twitter(auth=OAuth(oauth_token, oauth_secret, CONSUMER_KEY, CONSUMER_SECRET))

# Now work with Twitter
twitter.statuses.update(status='Hello, world!')


これで ~/.my_app_credintialsというファイルにtoken, secretが保存される。

ファイルがすでに存在していればファイルから読んでくるコードになっているので、これをおまじない程度に書いておけばとりあえずコマンドラインだとtoken取れる


twitter apiへのアクセス

https://github.com/sixohsix/twitter#the-twitter-class

ここに全部書いてあるのだが,,,要は「Twitterクラスのinstanceを作成して、REST APIのurlに応じてそれっぽい変数名、関数名で叩けや!!」と書いてある。

ソースを読めばわかるのですが、作者の意図としては「だってそうとしか書きようがない」という事なので、決して不親切ではないです。

「...何を言っているのかわからないと()」と思った人にはもう少し詳しく書きます。

上記URLの参考例と、REST APIの説明を見ながらこちらを読んで下さい。


タイムラインの取得例


home_timeline.py

# Get your "home" timeline

t.statuses.home_timeline()

これで、 /statuses/home_timeline の結果が帰ってきます。


埋め込み形式ステータスの取得


oembed.py

# to pass in the GET/POST parameter `id` you need to use `_id`

t.statuses.oembed(_id=1234567890)

これだと /statuses/oembedに idを渡した結果が帰ってきます。


投稿するとき


updata.py

# Update your status

t.statuses.update(
status="Using @sixohsix's sweet Python Twitter Tools.")

みんながやりたい投稿であればこんな感じ


中身についての解説

内部処理としてはTwitterクラスのプロパティを取得しようとすると、 getattr にて、中でmethodが走り、それぞれのプロパティはTwitterCallというclassのinstanceになっているため、 callableになっているので"()"をつければさらに callで定義されたmethodが走るようになっている。

getattrcallについてはDive Into Python3でも見てください。

apiに渡したい変数名は名前付きでそのまま渡せば良いようになってますが、"id"は予約語とかぶるために"_id"で指定するようになってます。


応用例-screen_nameの取得

というわけで応用として


screen_name.py

print(twitter.account.settings()["screen_name"])


参考例には書いていないけど、自分のscreen_nameを取得するならこういう感じで取れる。

何故かと言うとREST APIに account/settingsというものがあり、戻りのjsonに screen_nameという変数があるから。


応用例-block_listの取得


block_list.py

print(twitter.blocks.list())


こうすれば/blocks/listとかも取れる。

なので、このライブラリには「searchをするためにはこの関数を呼べ」「friends一覧を取るにはこの関数を呼べ」みたいな物がないのです。

伝わりました?

説明がわかりにくかったらもう少し詳しく書きます。