PythonでTwitter

PythonでTwitterをやったのでメモ
OS:Ubuntu16.04LTS
Python3.5.2+requests2.9.1+requests-oauthlib0.8.0

#認証キーの作成
[TwitterApps]
(https://developer.twitter.com/en/apply/user)
※携帯番号で認証されたアカウントが必要
TwitterAPIを使う目的を300語以上で説明しないといけなくなりました。

1.TwitterAPIは何の目的のために使うの？
2.TwitterAPIを使う技術的な説明をしてね

質問の内容はだいたいこんな感じです。
![Screenshot-2018-11-12 Apply — Twitter Developers.png](https://qiita-image-store.s3.amazonaws.com/0/118622/0eee18b5-b03c-7aaa-9504-404e2b32f3e6.png)

***
#Pythonライブラリのインストール

```
pip3 install requests requests_oauthlib
```

twythonやtweepyなどもあるが今回はrequests-oauthlibを使います。
(tweepyはメンテナンスされなくなったので非推奨です)
***
#コードを書いていきます
ひな形はこんな感じです。

```Python
#coding: UTF-8
import json
from requests_oauthlib import OAuth1Session

CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_KEY = ''
ACCESS_SECRET = ''

twitter = OAuth1Session(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

url = ''
params = {}
req = twitter.post(url, params = params)
```

このコードのurl,paramsとreq = twitter.の後の部分(postかgetになる)を変更するだけ
1.[API reference index]
(https://developer.twitter.com/en/docs/api-reference-index)を見て面白そうなものを見つける
2.API Referenceを見てParameters,Resource URLを探す
3.上のひな形のurl,paramsにResource URL,Parametersをそれぞれ入れる


***
ちなみにこんなのができたりします
ヘッダーの画像を変更する

```Python
#coding: utf-8
import json
from requests_oauthlib import OAuth1Session
import base64


CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_KEY = ''
ACCESS_SECRET = ''

twitter = OAuth1Session(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)
url = "https://api.twitter.com/1.1/account/update_profile_banner.json"

img_file = '/home/yasudaak/Twitter/Hedder/login.jpg'
#ファイルの指定
data = base64.encodestring(open(img_file, 'rb').read())
#base64でエンコード
params = {'banner': data}
req = twitter.post(url, data = params)
#ファイルサイズが大きいのでparams= ではなくdata=
#https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile_bannerのサイトを見るとPOST account/update_profile_bannerとなっているのでreq = twitter.の後はpost
print(req.status_code)
#ステータスコードの表示
#https://developer.twitter.com/en/docs/basics/response-codes.html
```

名前を変更する

```Python
#coding: utf-8
import json
from requests_oauthlib import OAuth1Session

CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_KEY = ''
ACCESS_SECRET = ''


twitter = OAuth1Session(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)
url = "https://api.twitter.com/1.1/account/update_profile.json"
username = '妹かわいい'
#変更したい名前の指定
params = {"name": username}
req = twitter.post(url, params = params)
```
#特定のアカウントのツイートを10件所得

```Python
#coding: utf-8
import requests                                                                             
import json
from requests_oauthlib import OAuth1Session
import os


CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_KEY = os.environ['ACCESS_KEY']
ACCESS_SECRET = os.environ['ACCESS_SECRET']
twitter = OAuth1Session(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

url = "https://api.twitter.com/1.1/statuses/user_timeline.json"

params = {'screen_name':'anzu_ouenn_bot',
'exclude_replies':True,
'include_rts':False,'count':10}
#screen_nameに所得したいアカウントのIDを@なしで書く

res = twitter.get(url, params = params)
timeline = json.loads(res.text)

if res.status_code == 200:
    for tweet in timeline:
        print(tweet["text"])
else:
        print("error")


```
***

#APIキーはコードに書かないほうがいいよ

Githubとかに公開するときに気づかずに…ということになりかねないのでAPIキーは直接コードに書かないほうがいいです。
1.
foregoのインストール(Ubuntuの場合)

```
sudo wget https://bin.equinox.io/c/ekMN3bCZFUn/forego-stable-linux-amd64.deb
sudo dpkg -i forego-stable-linux-amd64.deb
```

2.

```
CONSUMER_KEY=
CONSUMER_SECRET=
ACCESS_KEY=
ACCESS_SECRET=
```
.envをホームディレクトリに作り上のような形でAPIキーを書く
3.

```
import os

CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_KEY = os.environ['ACCESS_KEY']
ACCESS_SECRET = os.environ['ACCESS_SECRET']
```
上記をコードの中のAPIキーの代わりに書く
4.
プログラムを実行するときに

```
forego run python3 test.py
```
のようにforego runをコマンドの前につける

***
いまさらだけどPython3では#coding: utf-8不要ですね。
僕は、TwitterAPIの規制が強くなったのでMastodonに移りました。。