今回は、tweepyなるものを使って、PythonからTwitterを触ってみることにしました!
環境
以前の記事で作成した通りの環境です。
- MacBookAir 2013
- Intel core i5 1.3GHz
- python2.X (anaconda-2.1.0)
後々nfcと組み合わせたいとか考えていたので、anaconda-2.Xを利用しました。
(いつになったら、Python3.Xが普通に使える時代が来るのだろうか…。)
tweepy自体はPython2.6, 2.7, 3.3, 3.4に対応してるらしいです。(tweepy | Githubより)
必要知識として、TwitterではOAuth認証というものを利用してセキュアな通信をしています。
OAuth認証
ほっほげぇぇ。。。あまりしっかり理解できていないです><
環境構築
Twitter側
Twitterをいじるためにアプリケーション登録が必要となります。これをすると、Consumer KeyやConsumer Secretがもらえて、アプリケーションからTwitterを操作できるようになります。
参考サイト : TwitterAPIで、アプリケーション登録する方法 | Syncer.jp
[http://syncer.jp/twitter-api-create-application]
上記の参考サイトがかなり丁寧に、とてもわかりやすく書いてあったので基本的にこの流れに沿って実行しました。
途中、手間取った作業
- 電話番号の登録
途中、アプリケーションの登録にはアプリケーションの登録に利用するアカウントにたいして電話番号の登録が必要となった。https://support.twitter.com/articles/20172611- - CallbackURL
アプリケーションのを行う際に必須ではない入力欄。
とりあえず、CallbackURLは入力しないほうがわかりやすいと思う。
ここ以外に戸惑うともなく、簡単にトークンを取得できました。
Python側
PythonからTwitterを使うモジュール (tweepy | Github) 公式サイト(http://www.tweepy.org/)
githubからcloneしてきてインストール。
git clone https:/github.com/tweepy/tweepy.git python tweepy/setup.py install
インストールした時点で、tweepyのバージョンは3.3.0でした。
ここで、謎のASCI_LOGO.txtなるファイルを発見。
cat ASCII_LOGO.txt # 内容は自分で確認してください♪ こーゆーの結構好きだったりする。
こちらも、無事に問題なくインストールできました。
hello World
とりあえず、Hello Worldツイートまでやってみたいと思います。
認証情報の取得
Twitterのアプリケーションを管理するページ(https://apps.twitter.com/)で利用するアプリケーションをクリック。Key and Access TokensのタブでConsumer Key(API Key)とConsumer Secret(API Secret)をコピーしてきます。
取得してきたKeyとSecretを下記のソースコードに入力して実行してください。(ソースコードは” PythonでTwitterを使う 〜Tweepyの紹介〜| kivantium活動記録“様から引用させていただきました。)
get_token.py
# -*- coding: utf-8 -*- import tweepy consumer_key = "8odkT9********" consumer_secret = "8Q97IH******************" # ***は自分で取得したものに置き換えてください。 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
実行〜
python get_token.py --> Access: https://api.twitter.com/oauth/authorize?oauth_token=XyjNeXPlTroHMeoPH7RilcdMXSktU3JO # 上記のURLをコピーしてブラウザで開く
この時に先ほどのCallbackURLを設定していると、ブラウザに数字が表示されません。
--> Verifier:ブラウザ上で表示された7桁?のPINコードを入力 --> Access Token: (アカウントに対するアクセストークンが出力される) --> Access Token Secret: (アカウントに対するアクセストークンSecretが出力される)
こここで表示されたAcess TokenとAccess Token Secretを次のプログラムで利用します。
ツイートしてみる。
それでは、認証情報を使ってツイートしてみたいと思います。
#-*- coding: utf-8 -*- import tweepy # 認証に用いる情報 consumer_key = "8odk*****" consumer_secret = "8Q97I**********" access_token = "2173*******" # さきほどのプログラムで取得したやつ access_secret = "SfjbP*********" # さきほどのプログラムで取得したやつ2 auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_secret) api = tweepy.API(auth) # ↓この記述だとTweepy3.3ではエラーだった。 # api.update_status("Hello World") # ↓正しい記述 api.update_status(status="Hello World")
さて、これで実行してみると…
python post_hello.py
Hello World
— たくのこ (@takunokko) 2015, 5月 5
無事に…ツイートすることができました。。。やった♪
おまけ(nfcpyとtweepyを使ってみた)
最近、pythonからnfcpyをつかって、NFCを利用するってやってみました。(Pythonで遊んでみる -part2- (NFCを使ってみる)) これを利用して、自分のSuicaをかざしたら「入室しました」ってツイートされるプログラムを作ってみました。
#-*- coding: utf-8 -*- # Suicaをかざしたら、入室をツイートする import tweepy import nfc import datetime, locale def connected(tag): print("connected tag") print(tag) twitter_oauth = { "consumer_key":"8odk******", "consumer_secret":"8Q97***********", "access_token":"2173**********", "access_secret":"Sfjb*********" } # IDmとユーザ名の対応 user_data = { "01010*****" : "takunoko", "01100******" : "takunoko2" } # 時刻取得 d = datetime.datetime.today() time_data = str(d.month)+"月"+str(d.day)+"日/"+str(d.hour)+"時"+str(d.minute)+"分" # Twitter認証情報 auth = tweepy.OAuthHandler( twitter_oauth["consumer_key"], twitter_oauth["consumer_secret"]) auth.set_access_token( twitter_oauth["access_token"], twitter_oauth["access_secret"]) api = tweepy.API(auth) # usbのNFCポート作成? clf = nfc.ContactlessFrontend('usb') # カード待ち print("wait card") tag_data = clf.connect(rdwr={'on-connect': connected}) # カードのIDm情報を取得 # (カードの種類がType3Tagであることを前提に) card_idm = str(tag_data.idm).encode("hex") print("IDm : %s" % card_idm) clf.close() # 事前に登録されている情報と一致したら、ツイート if ( card_idm in user_data): post_str = user_data[card_idm]+"は"+time_data+"に入室しました。\n#nfchkin" api.update_status(status=post_str) print(post_str) else: print("登録されていないカードです。")
実行結果は、こんな感じです。
takunokoは5月5日/17時34分に入室しました。 #nfchkin
— たくのこ (@takunokko) 2015, 5月 5
とてもPython初心者なので、書き方が汚いと思うのですが…無事にツイートできています♪
ただ、すべての情報がソースコードにかかれていたり、あまり実用的じゃないです…。DBとか使ったりGUI化したりすると使いやすくなるのかな…。とりあえず、お遊びなんで許してください。
まとめ
今回は、PythonからTwitterを使ってみました。通信とか認証とかでもっと面倒だったり、苦戦したりするのかと思ったら、tweepyが優秀なのか思っていたよりもすんなり動いてくれました。このへんが、Pythonの強みなのかなぁとかおもったり…。
やっぱり、Python楽しいですね♪
✌(‘ω’✌ )三✌(‘ω’)✌三( ✌’ω’)✌
最後まで読んでいただきありがとうございました!
次回の記事にもご期待ください♪
Pingback: 2015年にやりたい100の事 -達成度- | たくのこ Web