tweepyの主な使い方（ツイートする・ツイートを取得する）

#環境・バージョン
OS：Windows10
言語：python 3..8.3
パッケージ：tweepy3.9.0
#はじめに
　pythonでTwitterAPIを利用するためのパッケージtweepyの主な使い方についてまとめました。
　参考：[tweepyドキュメント](http://docs.tweepy.org/en/latest/api.html)
#事前準備
1 tweepyをインストールする。

```
pip install tweepy
```
2 [Twitter開発者ページ](https://developer.twitter.com/en/apps)からAPI key、API key secret、Access token、Access token secretを入手する。
※開発者ページに入るには申請が必要です。
#OAuth認証
　Twitterアプリ外からTwitterを利用するためのAPI(Apprication programming interface)ですが、当然誰でも利用できるわけがありません。アクセスを認可するための仕組みが存在し、OAuth（オーオース）認証と呼ばれます。
　これはログイン機能を想像すれば分かりやすいと思います。Twitterアプリを使う時は最初に固有のアカウントにログインすることでアクセス権を得て、ツイートやいいねをできるようになります。
　Twitterアプリ外からTwitterを利用するためにはOAuth認証をします。そして、OAuth認証は以下のコードを実行すれば十分です。

```python
import tweepy
consumer_key = "API key"  
consumer_secret = "API key secret"
access_token = "Access token"
access_token_secret = "Access token secret"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
```
　API key、API key secret、Access token、Access token secretには予め用意しておいた情報が入ります。
　最後のapiインスタンスはマスターキーのようなもので、これを使って色々なデータにアクセスします。
#ツイートする
```python

api.update_status(status="text")
```

で「text」とツイートできます。
　ただし、Twitterの仕様で短期間で連続して同じツイートはできないので注意してください。コーディングミスと勘違いすると無駄に時間を消費してしまいます。
　また、APIのアクセス権が「読み込み」のみだとツイートできません。開発者ページの設定からApp permissionsを「Read and Write」または「Read + Write + Direct Messages」に変更してください。さらに、アクセス権を変えた後はAccess Token & SecretをRegenerateしないと変更が反映されません。
　参考：[アクセス権についての公式ドキュメント](https://developer.twitter.com/en/docs/apps/app-permissions)

#画像付きでツイートする
```python

api.update_with_media(filename="画像のパス",status="text")
```
で画像付きでツイートできます。試してませんが、画像以外にも動画やgifもこれで投稿できると思います。逆にそれ以外のファイル（pdfなど）は投稿できません。
　あと、windowsの方はパスの書き方に注意してください。以下、バックスラッシュ \ を&yen;と読み替えてください。

```python

# C直下に置いた画像 hoge.png のパスの書き方
filename="C:\hoge.png"
# はエラーが出る。
filename="C:\\hoge.png"
# または
filename="C:/hoge.png"
# が正しい。
```
　上記のようにしなければいけないのは、pythonにはバックスラッシュと特定の文字を組み合わせることで意味を持つエスケープシーケンスというものがあり、それと表記が被ってしまうからです。例えば、改行を表す&yen;nはエスケープシーケンスです。

#ツイートを取得する
##TLのツイートを取得する
```python

a = api.home_timeline()
```
でTLのツイートを取得できます。
##特定のユーザーのツイートを取得する
```python

a = api.user_timeline(id="@以下のID")
```
で特定のユーザーのツイートを取得できます。
##キーワード検索してツイートを取得する
```python

a = api.search(q="word")
```
　wordはTwitterアプリで検索する時と同じように書けばいいです。「python twitter」で検索したければq="python twitter"とすれば良いです。検索結果を日本語に限定したければlang:jaを付け足します。RTを除きたければexclude:retweetsを付け足します。
　まとめると、q="python twitter lang:ja exclude:retweets"とすれば、日本語のみ、RTなしの結果が得られます。実装する時は検索ワードは適当な変数に代入しておく方が良いでしょう。

```python
keyword=["python","twitter","lang:ja","exclude:retweets"]
word=" ".join(word)
a = api.search(q=word)
```
　※tweepyのsearchメソッドとTwitterアプリの検索結果が一致しない時があります。この点については、[tweepyドキュメントのsearchメソッドについての説明](http://docs.tweepy.org/en/latest/api.html?highlight=search#search-methods)に、「Please note that Twitter’s search service and, by extension, the Search API is not meant to be an exhaustive source of Tweets.（Twitterの検索サービス、ひいては検索APIは、ツイートを網羅するものではないことに注意してください。）」 と書いてあります。
　つまり仕様です。あまり気にする必要は無いと思います。
##オプションについて
　これまで紹介したツイート取得系のメソッドの引数に色々書き加えることで取得するツイートの数を変えたり、ツイートの全文を取得できたりします。
　n個のツイートを取得するには「count=n」を追加すればいいです。省略した場合には予め決められた数だけ取得してきます。また制限以上の数を指定しても上限までしか取得できません（エラーにはなりません）。
　ツイートの全文を取得するには「tweet_mode = "extended"」を追加します。
　他のオプションについては[tweepyドキュメント](http://docs.tweepy.org/en/latest/api.html)を見てください。
##取得したツイートの扱い方について
　取得したツイートには本文だけでなくユーザーネームやリプライの有無、いいねの数など多くの情報が詰まっています。それらを取り出すにはどうすればいいでしょうか。例えば、以下のようにすれば本文が取り出せます。

```python

#TLのツイートを10個取得する。
a = api.home_timeline(count=10)

#TLの上から2番目のツイートの本文を表示する。
print(a[1].text)

#取得したツイートの本文を全て表示する。
for b in a
    print(b.text)
```
　この方法で表示される文字数は140字までです。画像付きのツイートを取得した場合、画像がurlで表示され本文が最後まで表示されないことがあります。これを解決するには以下のようにします。

```python

#引数に「tweet_mode = "extended"」を追加する。
a = api.home_timeline(count=10,tweet_mode = "extended")

#全文を表示する。
print(a[1]._json["full_text"])
```

　本文以外のデータへのアクセスについていくつかまとめました。

| a[n].~ | データ |
|:-:|:-:|
| text  | 本文  |
| place | ツイートされた場所 |
| created_at | ツイート日時　|
| user.name  | ユーザーネーム  |
| user.screen_name  | @以下の文字列  |
| user.location | プロフィールに記載された場所 |

#最後に
　自分が勉強した内容をまとめてみましたが、この記事が誰かの役に立てば幸いです。今後も公式ドキュメントを読み込んで他の機能についてもまとめる予定です。