【tweepy】TwitterAPIキーを取得してPythonでCLIからツイートできるようにする

## はじめに
　何回か趣味でTwitterのAPIキーを取得して遊んだけど一貫して書いてある記事が意外と無かったのでまとめてみる。

## APIキーの申請
　Twitter APIを使うにはAPIキーを取得する必要がある(ここが一番の関門)。  
　まずは申請したいアカウントでログインをする。複数垢ある人はTwitter Web Appで該当アカウントでログインした状態にしておけばOK(このページで紹介する方法ではこのアカウントからツイートすることになる)。APIを取得することでbotのような振る舞いができるようになるが今まで通りスマホ版のアプリを使ったりというのは可能。新しく作ってもいいし普段使ってるアカウントでも良し。
　その状態で下記リンクにアクセス↓

https://developer.twitter.com/en/portal/petition/use-case

　すると下のような申請用のページに行くはず↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/a09f70cf-ad9c-a3f9-6844-d5c36e46ea1f.png">

　よっぽどのことがない限りは「Hobbyist」を選択すれば大丈夫。その後目的を選択するように言われますがこれはどれを選択しても問題ないはず。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/762f6038-f2f3-845c-3e45-09f4d9f31970.png">

　そして[Get started]をクリックして次のページへ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/489e278b-d392-87a2-9482-9b093b2f1c45.png">

　するとアカウントの基本情報とかが表示されるので一応チェックを。あと本人確認のために電話番号でのアカウント認証もしておく必要がある。
そして下に進むといくつか入力する項目があるのでそれぞれ入力。どれもメモみたいなもので重大な意味を持たないので気楽に。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/dd012ede-7498-7f4d-459b-40a954f2c024.png">

+  What would you like us to call you?   
→このAPI自体の名前みたいなもの。あとで変更はできないがあまり意味はないので自分でわかりやすい名前をつければOK(ツイートソースラベルとは無関係)
+ What country do you live in?
+ What's your current coding skill level?
+ Get the latest Twitter API news?  
→これはそれぞれ当てはまるのを選べばOK

　[next]を押して次のページへ。  

　ここからがAPIキーの申請に必要な内容。

　まずは収集したTwitterデータ，APIをどのように使用するかのプランを書いてくれと。詳細に書くほど早く承認されるよと。「英語かよ。だる」と思うだろうけど実はこれ日本語でもいけた。日本語で200文字書けばOK。  
　「特定のハッシュタグを含むツイートを収集します。」「フォロワーの増減を記録します。」とかだと弱くて絶対通らない。
　「〇〇についてのブログを書いていて，その宣伝の自動投稿や扱うコンテンツの分析に利用します。」とか「大学の〇〇についての授業で〇〇をすることになり，そのために利用したいです。」とか，"遊びじゃなくてこういうしっかりした目的のために使うんだよ"アピールをしたほうがいいんだと思う。2アカウント分申請通したけど一発で通ったことないので当てにならん()
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/1f2b4ad4-3586-9ce6-cab0-4452b655f32d.png">

　これ以降はAPIの使用内容に当てはまる項目にチェックを入れてそれについての説明を書いていく。もちろんこっちも日本語でおk

　Twitterデータの分析をするかどうか。使う場合はどのようにするかプランを書けと。まあこれは書いておいたほうがよさそう。これも"ビジョンが見えてるアピール"をしたほうがいいので，使用するツールとか関数とか書いてそれっぽいこと(嘘っぱちじゃバレるけど)を書く。
　自分の場合は「Pythonのtweepyのsearch関数を使って特定のハッシュタグを含むツイートを取得し，pandasやcsvを使ってそのデータをCSV形式で記録し，そのカテゴリで今ホットなコンテンツが何なのかの分析を行います。」とか書いた気がする。正直盛っても問題無し。申請内容に応じてAPIキーの権限が抑えられるとかはないはず。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/9d2c0654-052a-147a-82aa-19b81613ae4a.png">

　次，ツイート，いいね，RT，Follow，DMを機械的に行うかどうか。とりあえずこの記事ではツイートをゴールにしたいのでこれも書いておきますか。さっきの使い回しでブログ書くていで「ブログを投稿した時に自動で宣伝の投稿をできるようにする」とか「提供する情報の需要に合致しそうなアカウントを自動フォローするとか」(これだとスパム認定される？)，やっぱりとにかく具体的に，やること決まってるよアピールを。~~正解が分からないので当てにしないで~~
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/3a8c87e8-f718-8440-0cda-2424674aeaa6.png">

　残りの項目は別に書かなくていいんじゃないかなと思う。チェック入れたら書かなきゃいけないし通っちゃえばこっちのもんなので...
　というわけで他のところはNoにして[next]

　次のページも内容合ってたら[next]。次も利用規約なので下までスクロールして同意のチェック入れて[submit application]で申請完了。多分確認のためのメールが届くので開いて[confirm your email]をクリックすると正式に審査が始まる。


　早いとその日中，遅くても2〜3日でメールに反応が来るはず。一発で通ったことないと言ったけどチャンスは一回じゃないから大丈夫。内容が不十分だとTwitterから「申請する上でこの辺もうちょい詳しく教えてくれ」みたいなメールが来る。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/56dc6526-2f6f-b1bb-1b4a-a1da15fb2b67.png">
　聞かれた項目について落ち着いて(日本語で)返信すればOK。ちなみにさっきの申請文を英語で頑張って書くとこのレスポンスも長文英語で来る。日本語で書くと画像のように日本語で来るっぽい。

　さっき一発で通ったことないって言ったけど正確には二発でも通ってません。1回目のメールに返信したらしばらくしてもう一回メールきました。~~めんどくs...~~
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/5dd3d685-3227-3087-5558-6f4ba8534a11.png">
　今回は太字の部分があったのでそこを重点的に返信。

　粘ってメールの返信をちゃんとすればこんな感じで受理のお知らせが来る。おめでとう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/9935b5d6-8b0b-a682-b1c6-f02e24c0318a.png">

　これで[Twitter Developer Portal](https://developer.twitter.com/en/portal/dashboard)にアクセスできるようになる。


## Appの作成
　まずProject&Appsから[Create App]でAppを作成する。
　ここに入力したApp nameはツイートした際のツイートソースラベルになるので自分の設定したい名前を入力する。ツイートしたクライアントを示す部分になるのですでに使われてるものは使えない。日本語もいけるのでオリジナリティーのあるものならそうそう被らないはず。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/f4e2252f-caf7-5e0d-ac31-a03ba9c83771.png">

　次のページでAPI Key，API Secret Key，Bearer Tokenが表示されるのでローカル環境にコピーしておく。外部に漏らさない，無くさないこと。あとで使いやすいように`config.py`みたいな名前で下のようにPythonファイルとして保存しておくことをお勧めします。この記事ではそういう進め方でいきます。

```python:config.py
#例
API_KEY = "ここにAPI Keyをペースト"
API_SECRET_KEY = "ここにAPI Secret Keyをペースト"
BEARER_TOKEN = "ここにBearer Tokenをペースト"
```

[App settings]でAppが作成される。デフォルトで権限がRead Onlyになってるので変更する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/f4b54042-2a7d-d61c-989e-08e56bccf33f.png">

Read and Writeに変更して[Save]。DMも使いたければそっちでも。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/3d42309d-234a-70c5-4c04-a99dcbe89106.png">

　次に認証関連の設定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/061a4f90-6abd-01cc-2bb9-01aaa4bef7b7.png">

　Enable 3-legged OAuthにチェックを入れる。Request email adress from usersはチェック無しでOK。
　Callback URLsとかWebsite URLはOAuth認証の時に使うけどツイートするだけならいらないので存在するURL(自分のブログとか，`https://twitter.com`とか)を入れておけばOK。
　あとはOptionalなので特に入力せずに[save]

　これで設定は完了なので[Keys and Tokens]に移動してAccess Token and Secretを[Generate]してさっきと同じように`config.py`などに保存しておく。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702618/a91c8edf-87bd-ac97-3784-26c27c4d3f27.png">

こんな感じ

```python:config.py
API_KEY = "ここにConsumer Keyを入力"
API_SECRET_KEY = "ここにAPI Secret Keyを入力"
BEARER_TOKEN = "ここにBearer Tokenを入力"
ACCESS_TOKEN = "ここにAccess Tokenを入力"
ACCESS_TOKEN_SECRET = "ここにAccess Token Secretを入力"
```

これでTwitter側の設定は終わり。


## ツイートの投稿
　`pip`や`conda install`でtweepyライブラリをインストールしてください。tweepyにはTwitter APIをPythonで扱うための機能が豊富に入ってるので大体これだけで済む。(筆者はanaconda環境でやったので`conda install -c conda-forge tweepy`で入れました。)
　tweepyのinstallが済んだら`config.py`と下記の`post_tweet.py`を同じ階層において`post_tweet.py`を実行。入力した内容が投稿されてるはず。

```python:post_tweet.py
import tweepy
from config import *

auth = tweepy.OAuthHandler(API_KEY, API_SECRET_KEY)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

tweet = input('ツイートを入力してください>> ') 
api.update_status(tweet)
```