すこしふしぎ.

VR/HI系院生による技術ブログ.まったりいきましょ.(友人ズとブログリレー中.さぼったら焼肉おごらなきゃいけない)

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叩く

では,twitterAPIを叩いてみます. 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系での違いについてまとめた