twitterAPI叩いて遊ぶ~requests編~
こんばんは.1000chです.
以前の記事ではtweepyを用いてtwitterAPIを叩いて遊びました.
tweepyはtwitterAPIのラッパーライブラリで,とても便利に使えます. ですが今回はこれに頼ることなく,,直接twitterAPIを叩いてみます. そこに理由なんて存在しません. ただやってみたいからやるのです.
てわけで,requestsというhttpライブラリを用いてtwitterAPIを直叩きして遊んでみました.
requests
requestsは,python向けのシンプルなhttpライブラリです. http for humansとある通り,利用の簡便さに重きをおいているようです. pythonには標準でurllib2などのhttpライブラリが搭載されていますが,httpとしての機能はともかく.APIの利用が煩雑です. PyPIで8,000,000回以上のダウンロード回数だそうで,かなり評判の高いライブラリみたいです. 実際amazon,google,twitterなどでも使われているようですね.
簡単に,googleのトップページを取得してみましょう. requestsはpipで拾ってきます.
$ pip install requests $ pip show requests --- Name: requests Version: 2.2.1 ...
コードはこちら.
In [1]: import requests as req In [2]: url = "https://www.google.com" In [3]: res = req.get(url) In [4]: res.status_code Out[4]: 200 In [5]: res.text Out[5]: u'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"><head><meta content="\u4e16\u754c\u4e2d\u306e\u3042\u3089\u3086\u308b\u60c5\u5831\u3092\u691c\u7d22\u3059\u308b\u305f\u3081 #略
こんな感じですね. urlを「ほいっ!」と与えるだけでレスポンスのオブジェクトが取得できます. 便利ですね. urllib2だと確か
twitterAPI叩く
では,twitterのAPIを叩いてみます. requestsの公式リファレンスの中に,OAuthを使った認証方法のサンプルがあります. これが見事twitterを叩くサンプルなので.これを参考にします.
まずはrequestsのOAuth用追加ライブラリをインストールしましょう.
$ pip install requests-oauthlib $ pip show requests-oauthlib --- Name: requests-oauthlib Version: 0.4.0 ...
このライブラリを使うとOAuthが超簡単にできるみたいです.
ではまず,ユーザのtimelineを取得してみましょう.
# coding:utf-8 # tweet_req.py import requests as req from requests_oauthlib import OAuth1 api_key = "your_api_key" api_secret = "your_api_secret" token = "your_access_token" token_secret = "your_access_token_secret" url = "https://api.twitter.com/1.1/statuses/user_timeline.json?count=5" auth = OAuth1(api_key, api_secret, token, token_secret) res = req.get(url, auth=auth) status_list = res.json() for status in status_list: print status[u"text"]
実行結果
$ python tweet_req.py [~/programming/python/sandbox/twitter_requests] なーんかおかしいとおもったらrequestsのバージョンが古かったのか...(´・ω・`) 日本語でokというのはよいものだなぁ PSVita買ってFFXやろうかしら A4 2枚とか駒場を思い出すなぁ 全力でレポート書いて明日は@mentosとおでかけするんだぁ(
この例ではパラメータ込みのURLを生成してGETメソッドに渡しましたが,より簡便にディクショナリを使う方法もあります. こんな感じです.
url = "https://api.twitter.com/1.1/statuses/user_timeline.json" param_dict = {"count":5} res = req.get(url, params=param_dict, auth=auth) #以下同様
もちろんdictには複数のパラメータを指定できます. パラメータを自由に扱いたいときにはこちらが便利ですね.
続いて,POSTを用いてtweetを投稿します.
tweepyでいうところのtweepy.update_status()
ですね.
#coding:utf-8 import requests as req from requests_oauthlib import OAuth1 api_key = "your_api_key" api_secret = "your_api_secret" token = "your_access_token" token_secret = "your_access_token_secret" auth = OAuth1(api_key, api_secret, token, token_secret) url = "https://api.twitter.com/1.1/statuses/update.json" post_str = raw_input("please input post message (C:cancel) :") if post_str == "c": pass else: data = {"status":post_str} res = req.post(url, data=data, auth=auth) print res.json()
実行結果
$ ipython post_req.py please input text(c:cancel):post from termnal. {u'contributors': None, u'truncated': False, u'text': u'post from termnal.', u'in_reply_to_status_id': None, u'id': 433973095385141248, #略
raw_inputを使ってpostしたい文字を打ち込めるようにしてみました. 超簡易つぶやきクライアントterminalの完成です!
おまけ
余談ですが,python3系ではraw_input()
ってinput()
に変わったんですよね.
この辺の違いをちょこっとまとめておきます.
まずpython2系におけるinput()
は与えられた入力を式として評価し,raw_input()
はそのまま文字列として扱います.
こんな感じですね.
In [1]: a = input() 2+3 In [2]: a Out[2]: 5 In [3]: b = raw_input() 2+3 In [4]: b Out[4]: '2+3' In [5]: type(a) Out[5]: int In [6]: type(b) Out[6]: str In [7]: c = input() masa --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-2-9b8a430d8199> in <module>() ----> 1 a = input() <string> in <module>() NameError: name 'masa' is not defined
input()
に対し評価できない文字列を与えるとエラーになってますね.
というわけで文字列として取得したい場合はraw_input()
が鉄板です.
これがpython3系になると,input()
が2系でいうraw_input()
の挙動をし,式評価にはeval()を使うみたいです.
raw_input()
は無くなっているので注意が必要です.
こんな感じ.
In [1]: a = input() 2+3 In [2]: a Out[2]: '2+3' In [3]: b = raw_input() --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-3-04c30aaac3af> in <module>() ----> 1 b = raw_input() NameError: name 'raw_input' is not defined In [4]: b = eval(input()) 2+3 In [5]: b Out[5]: 5 In [7]: type(a) Out[7]: builtins.str In [8]: type(b) Out[8]: builtins.int
これやるためだけに改めてpython3環境にもipythonを入れたのですが,builtinsってなんなんでしょうねぇ. きになってググったらこんなのでてきました. いわくbuiltinsはbuilt-in objectsを扱うためのモジュールみたいですね. ...まぁとりあえずstrとintで違ってる,っぽいことがわかるのでよしとしましょう.
まとめ
- requestsライブラリをつかってtwitterAPIを直叩きしてみた.
- requests-oauthlibなるサポートライブラリをつかうとOAuthが超簡単に実現できる!神!
- 余談:
input()
とraw_input()
,およびpython2系,3系での違いについてまとめた