Pythonでサクッと簡単にTwitterAPIを叩いてみる

## はじめに

個人でPythonを使う機会が増えたので、今回は簡単なライブラリだけでつぶやいたりタイムラインを取得してみたりします。  
なお、アプリケーション登録をして認証キーを取得するまでは他サイトを参照してください。あまり躓くことはないと思います。(Twitterアカウントに電話番号を紐づけする必要があることだけ注意。)  
  
事前準備として、各種認証キーをコピペしてconfig.pyとして保存しておくとよいでしょう。


```python:config.py
CONSUMER_KEY = "**************"
CONSUMER_SECRET = "**************"
ACCESS_TOKEN = "**************"
ACCESS_TOKEN_SECRET = "**************"
```

それではいくつか簡単なスクリプトを書いてTwitterで遊んでみましょう。


```python
# -*- coding:utf-8 -*-
import json, config
from requests_oauthlib import OAuth1Session

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS)
```

Oauth認証用ライブラリにはrequest-oauthlibを利用しました。

## 自分自身のタイムラインを取得してみる


```python:timeline.py
url = "https://api.twitter.com/1.1/statuses/user_timeline.json"

params ={'count' : 5}
req = twitter.get(url, params = params)

if req.status_code == 200:
    timeline = json.loads(req.text)
    for tweet in timeline:
        print(tweet['user']['name']+'::'+tweet['text'])
        print(tweet['created_at'])
        print('----------------------------------------------------')
else:
    print("ERROR: %d" % req.status_code)
```

    Tearon::昨日の「放送禁止」すごいみたいんだけど結構評判悪いみたいだし、何よりホラーとかそういうの一切ダメな家系だから見れない、つらい
    Tue Jan 03 13:38:22 +0000 2017
    ----------------------------------------------------
    Tearon::MINAMI KOIKE https://t.co/vFmSRLs89X
    Tue Jan 03 13:29:53 +0000 2017
    ----------------------------------------------------
    Tearon::年末年始で聞きたかったラジオがたまりすぎて圧倒的時間が足りない
    Tue Jan 03 13:12:42 +0000 2017
    ----------------------------------------------------
    Tearon::それでは聞いてくださいブルーハーツで「リンダリンダ」
    Tue Jan 03 11:46:17 +0000 2017
    ----------------------------------------------------
    Tearon::「パチンコで勝った！」という自慢、そちらはずいぶんとテンション高いみたいですが、こっちはドブネズミを見る目で見ているのさっさと気がついて欲しい。
    Tue Jan 03 11:45:53 +0000 2017
    ----------------------------------------------------
    

## キーワードでサーチをかけてみる


```python:search.py
url = "https://api.twitter.com/1.1/search/tweets.json"

print("何を調べますか?")
keyword = input('>> ')
print('----------------------------------------------------')


params = {'q' : keyword, 'count' : 5}

req = twitter.get(url, params = params)

if req.status_code == 200:
    search_timeline = json.loads(req.text)
    for tweet in search_timeline['statuses']:
        print(tweet['user']['name'] + '::' + tweet['text'])
        print(tweet['created_at'])
        print('----------------------------------------------------')
else:
    print("ERROR: %d" % req.status_code)
```

    何を調べますか?
    >> #アルピーdcg
    ----------------------------------------------------
    ガリレオのくるぶし::アルピーANN感強すぎｗｗｗｗｗｗｗｗｗ #アルピーdcg
    Tue Jan 03 15:21:09 +0000 2017
    ----------------------------------------------------
    いつも素敵なみんなのまつー::「これは…すごななだからぁ」ｗｗｗ #アルピーdcg
    Tue Jan 03 15:21:08 +0000 2017
    ----------------------------------------------------
    応援歌ファン::音楽に甘えちゃダメw #アルピーdcg
    Tue Jan 03 15:21:07 +0000 2017
    ----------------------------------------------------
    ニューヨークにゃんちゅうス::音楽の力凄いっ…！
    
    #アルピーdcg
    Tue Jan 03 15:21:07 +0000 2017
    ----------------------------------------------------
    シュー::すごろく〔すごなな〕って言ったときのディーンフジオカの使い方www #アルピーdcg
    Tue Jan 03 15:21:07 +0000 2017
    ----------------------------------------------------
    

## 何かをつぶやいてみる


```python:tweet.py
url = "https://api.twitter.com/1.1/statuses/update.json"

print("何をつぶやきますか?")
tweet = input('>> ')
print('----------------------------------------------------')

params = {"status" : tweet}

req = twitter.post(url, params = params)

if req.status_code == 200:
    print("Succeed!")
else:
    print("ERROR : %d"% req.status_code)
```

    何をつぶやきますか?
    >> 年末年始で聞きたかったラジオがたまりすぎて圧倒的時間が足りない
    ----------------------------------------------------
    Succeed!
    
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135725/f29e57ab-934f-2d94-22f0-908511a52110.png)


## 画像付き投稿をする


```python:tweet_media.py
url_media = "https://upload.twitter.com/1.1/media/upload.json"
url_text = "https://api.twitter.com/1.1/statuses/update.json"

print("添付画像の名前を入力(jpg形式のみ)")
media_name = input('>> ')
print('-----------------------------------')

files = {"media" : open(media_name+".jpg", 'rb')}
req_media = twitter.post(url_media, files = files)

if req_media.status_code != 200:
    print("MEDIA UPLOAD FAILED... %s", req_media.text)
    exit()

media_id = json.loads(req_media.text)['media_id']
print("MEDIA ID: %d" % media_id)

print("何をつぶやきますか？")
tweet = input('>> ')
print('-----------------------------------')

params = {"status" : tweet, "media_ids" : [media_id]}
req_media = twitter.post(url_text, params = params)

if req_media.status_code != 200:
    print("TEXT UPLOAD FAILED... %s", req_text.text)
    exit()

print("SUCCEED!")
```

    添付画像の名前を入力(jpg形式のみ)
    >> asuka
    -----------------------------------
    MEDIA ID: 816275347591208960
    何をつぶやきますか？
    >> ASUKA SAITO
    -----------------------------------
    SUCCEED!
    
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135725/918b6f61-b7c3-4f50-c3fe-d551defaaaee.png)

  

## おわりに
簡単ではありますが、TwitterAPIが思っていた以上に使いやすくて感動しました。
本当は以前から聞いたことのあったTweepyを使って実装してみようかと思っていましたが、長い間メンテナンスされていないようなのでそちらはやめました。
次回はこれらの知識を使って作ったTwitterBOTのお話をしたいと思います。  

## 参考にさせていただきました
[Twitter APIでつぶやきを取得する](http://qiita.com/yokoh9/items/760e432ebd39040d5a0f)
[tweepy がメンテナンスされなくなった](http://qiita.com/utgwkk/items/4beed333e8262c675028)
[Twitterからキーワード検索して画像を取得する](http://qiita.com/tadaken3/items/59617136ded926fbffcb)
[PythonでTwitterしてみた](http://qiita.com/konojunya/items/59a68d35e44db8b87186)
[Python で Twitter API にアクセス](http://qiita.com/yubais/items/dd143fe608ccad8e9f85)