Help us understand the problem. What is going on with this article?

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一覧を取るにはこの関数を呼べ」みたいな物がないのです。

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

nariya
株式会社プラチナエッグ 代表取締役 https://www.platinum-egg.com/ Blockchain Game作りたい人募集してます。
http://www.nariya.net/
platinum-egg
Blockchain Game 開発を行っています。ソーシャルゲーム、各種ブロックチェーン案件などもお問い合わせ下さい。
http://www.platinum-egg.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away