素人が今更Twitter APIで遊ぶ　〜その３：リツイート、マフレズようこそ編〜

初めましての方は初めまして。そうでない方はこんにちは。

W杯ほとんど見たせいで寝不足です。

今回は[前回](https://qiita.com/masahiro_isono/items/7ea8bf6b0d6adf67a090)に引き続き、Twitter APIを用いて遊んでみる。

今回の目的は「指定したツイートをリツイートする」である。

#環境
* Python3
* Jupyter Notebook

#準備
まずはじめに、tweetをリツイートするためのエンドポイント指定URLを探そう。
これは前回、前々回と同様、TwitterのDeveloper用ページから探せば良い。
今回の場合は[ここ](https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-retweet-id.html)。

POST statuses/retweet/:idにおけるResource InformationとParametersはそれぞれ以下の通り。

Resource Information
![スクリーンショット 2018-07-19 18.48.56.png](https://qiita-image-store.s3.amazonaws.com/0/253596/c44e26c0-3da2-f2c4-163f-77165f173b8c.png)

Parameters
![スクリーンショット 2018-07-19 18.49.10.png](https://qiita-image-store.s3.amazonaws.com/0/253596/fb1ff063-23a3-0a60-93e0-c17191ac342d.png)

特に重要なのはParametersのrequiredのところ。今回はリツイートする対象のtweetのidが必要である。
trim_userは今回必要がないので無視する。

準備はこのくらいにして、早速実装に移ろう。

#実装：指定したツイートをリツイートする

メインコードをできるだけ簡潔に書くことが大事らしいので、サーチをする関数やリツイートをする関数は別の.pyにまとめておいた。
それぞれの関数はこんな感じ。

```python:twitter_function.py
def oauth(ck, cs, at, ats):
    twitter = OAuth1Session(ck, cs, at, ats)
    
    return twitter


def search(q, cnt, ck, cs, at, ats):
    twitter = oauth(ck, cs, at, ats)
    
    url = 'https://api.twitter.com/1.1/search/tweets.json'

    params = {'q' : q, 'count' : cnt}

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

    try:
        timelines = json.loads(res.text)
        timelines = timelines['statuses']
    
    except:
        print(type(json.loads(res.text)))
        print('Error')

    return timelines


def retweet(tid, ck, cs, at, ats):
    twitter = oauth(ck, cs, at, ats)
    
    url = 'https://api.twitter.com/1.1/statuses/retweet/' + tid + '.json'
    
    params = {'id' : tid}
    
    res  = twitter.post(url, params = params)
    
    if res.status_code == 200:
        print('Success')
        
    else:
        print('Failed. : %d'% res.status_code)
```

１番上の関数は単にOAuth認証するための関数。
２番目はサーチする関数。
３番目は今回初登場のリツイートする関数。必要な引数は先ほど説明した通り、リツイート対象のtweet固有のidである。また、エンドポイントURLの中に、そのidを入れる必要があることに注意する。idはstring型でもってくる。

さて、それでははじめに今回リツイートされる記念すべきtweetを決めよう。

鳥のことばかり紹介するのはどうかと思うので、今回はサッカー関係で。

私はマンチェスターシティ(イングランドのプレミアリーグに所属、以下シティ)の大ファンである。つまりCITYZENだ。
先日シティにスーパースターが移籍することが決まった。そう、マフレズである。彼はアルジェリアの選手、そして前所属はレスターシティであり日本代表の岡崎選手のチームメイトだった。
私はとにかくプレイスタイルがエロいサッカー選手（ダビド・シルバ、エジルやモドリッチなど）が大好きなので、マフレズのようなマジシャンが加入すると聞いた時、それはもう歓喜オブ歓喜だった。

そんな経緯で今回はマフレズの移籍に関するtweetをリツイートしよう。

まず、マフレズ 移籍に関するtweetをサーチしよう。

```python:search.py
import json,config
from requests_oauthlib import OAuth1Session
from twitter_function import search, oauth

# 認証処理

ck = config.consumer_key
cs = config.consumer_secret
at = config.access_token
ats = config.access_token_secret

# パラメータ設定

q = 'マフレズ 移籍'
cnt = 5

res = search(q, cnt, ck, cs, at, ats)

# 表示

for line in res:
    print(line['user']['name']+'::'+line['text'])
    print(line['created_at'])
    print('*' * 100)
```

とりあえず、マフレズ 移籍に関するtweetを５つ表示して、その中からテキトーにリツイートするtweetを決めてみようと思う。
表示されたのはこんな感じ。

![写真 2018-07-19 19 23 41.png](https://qiita-image-store.s3.amazonaws.com/0/253596/8c2d353b-704c-1e73-f73c-60e461fdcacc.png)

名前とURLはモザイクかけさせていただきました。（だったら最初から表示すんな）
なんか１人目と２人目が同じ内容になっているけど、ちゃんと違う人です。運命共同体ですかね、羨ましい。
どれリツイートしてもいいんですけど、今回はW杯で大活躍した本田選手（アンチの方々、元気ですか？）の背番号にちなんで４人目で！

というわけで４番目のtweetをリツイートしよう。
メインコードはこんな感じ。

```python:main.py
import json,config
from requests_oauthlib import OAuth1Session
from twitter_function import search, oauth, retweet

# 認証処理

ck = config.consumer_key
cs = config.consumer_secret
at = config.access_token
ats = config.access_token_secret

# サーチ

q = 'マフレズ 移籍'
cnt = 5
res = search(q, cnt, ck, cs, at, ats)

# tweet_idの取り出し

tid = res[3]['id_str']    # ４人目なので[3]、stringで取り出したいので'id_str'

# リツイート

retweet(tid, ck, cs, at, ats)
```

結果はこんな感じ。

![スクリーンショット 2018-07-19 19.36.25.png](https://qiita-image-store.s3.amazonaws.com/0/253596/54c6d985-5d03-ab30-57f0-50a0d2f3a498.png)


![あ.png](https://qiita-image-store.s3.amazonaws.com/0/253596/7ca27477-a709-8833-57c7-f5b47b914d58.png)


リツイートできてた！

# 終わりに
Twitter APIを用いたリツイートもできるようになったので、あとはリツイートbotさえ作成すれば当初の目的に近づけるかね。

それと同時に、アクティヴなTwitterアカウントのフォロワー数を増やさなければこの取り組みも意味をなくしてしまうので、そういったマーケティングも考えていかなければなぁと思う。

ありがとうございました。


W杯の次はUEFAネーションズリーグかいな、寝れねえ

# 追記
8月から運用予定のTwitterアカウント(東京都におけるインコの迷子情報をリツイートします)をフォローしていただけると幸いです。
Twitterで[at]inko_maigo_infoで検索してください。