Tweepyの使い方 ~その１~ 【Tweetの取得】

#はじめに
公式ドキュメントを参考にtweepyの使い方をまとめていこうと思います。

※ TwitterAPIの認証を受け、APIkeyを取得するまではこちらの記事を参考にしました。-> [(Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報)](https://qiita.com/kngsym2018/items/2524d21455aac111cdee#consumer-api-keys%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%83%85%E5%A0%B1%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9Fpython%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88)

※ tweepyのバージョンは3.1.0で動作確認していました。
現在はアップデートされており一部動かない箇所がありましたので変更加えています。

# Hello Tweepy !
import と取得したAPIkeyを代入しておきます。

```python
import tweepy

consumer_key = '*********************************'
consumer_secret = '*************************************'
access_token = '*******************************************'
access_token_secret = '****************************************'
```
TweepyではOAuthHandlerを使い認証します。下の例のように`auth = tweepy.OAuthHandler(consumer_key, consumer_secret)` , `auth.set_access_token(access_token, access_token_secret)`とした後、 `api = tweepy.API(auth)`とすることで、すべてのリクエストで認証にOAuthを使用します。

```python
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

public_tweets = api.home_timeline()
for tweet in public_tweets:
    print('-------------------------')
    print(tweet.text)
```
これを実行すると、タイムラインが出力されたはずです。 
 Hello Tweepy !!

このように`api = tweepy.API(auth)`で、APIメソッドを呼び出すと、Tweepyモデルクラスインスタンスが返されます。 これにはTwitterから返されたデータが含まれており、以下ではこれを利用します。

#ツイートの探索
##指定した単語を含むツイート
```python
api = tweepy.API(auth)

# 旧バージョン
# for tweet in tweepy.Cursor(api.search, q='スマブラ').items(10):
#    print(tweet)

# 新しいバージョンでは少し変わっています。
for tweet in tweepy.Cursor(api.search_tweets, q='スマブラ').items(10):
    print(tweet)
```
実行すると、「スマブラ」を含む最新のツイートが10件取得できます。
この`tweepy.Cursor`で返された値はStatus objectとなっています。
printしたtweetを見るとわかるのですが、tweet.○○のようにすることで、様々な情報を取得できます。

例えば、`tweet.text`とするとツイート内容が表示され、`tweet.user`とすることで、ツイートしたユーザー情報にアクセスでき、さらに`tweet.user.name`などとすることで、ユーザー名を取ってくることができます。

これらを応用すると、「スマブラ」を含むツイートのうちRTではなく、ユーザー自身がツイートしてる場合のみユーザー名を取得する。のようなことができます。

```python
# 旧バージョン
# [tweet.user.name for tweet in tweepy.Cursor(api.search, q='スマブラ').items(10) if list(tweet.text)[:2] != ['R', 'T']]

[tweet.user.name for tweet in tweepy.Cursor(api.search_tweets, q='スマブラ').items(10) if list(tweet.text)[:2] != ['R', 'T']]

#名前は一応伏せておきます。
>> ['*********',
    '***********',
    '*******************',
    '********************',
    '**********']

```
##特定のユーザーのツイート
`tweepy.Cursor`の引数を以下のように変更することで、指定したidのアカウントのツイートを取得できます。


```python
#if文にてRTとリプライを除外
[tweet.text for tweet in tweepy.Cursor(api.user_timeline, id="Qiita").items(10) if (list(tweet.text)[:2]!=['R', 'T']) & (list(tweet.text)[0]!='@')]

>> ['3500いいね！ | GitHubで使われている実用英語コメント集 by @shikichee https://t.co/njAmOmPECK',
    '1000 Contribution! | @ruccho_vector https://t.co/691RY2XE7U',
    '600いいね！ | Firebaseで1時間で簡単なWebチャットアプリが作れるハンズオン by @taketakekaho https://t.co/r0agD6Z6Qf',
    '500いいね！ | シェルスクリプトの罠を避ける三つの tips by @tnacigam https://t.co/rKO7tBQYii',
    '1300いいね！ | 実装クリーンアーキテクチャ by @nrslib https://t.co/ZCMaz4ges6',
    '弊社が2019年12月25日に限定共有化を行った記事につきまして、 限定共有化を行った理由および弊社対応の経緯をこちらのブログに記載いたしました。\n\nhttps://t.co/SUqVaUKPbh',
    '300いいね！ | 治安の良いCSSを目指して 〜 平和な世界のために僕たちができること 〜 https://t.co/bww0EpoNDV',
    '400いいね！ | 10年後、仕事がなくなっていそうなアイコン by @otktko https://t.co/4sFpzK1zgu',
    '700いいね！ | エンジニア採用面接での「質問項目」と「意図」を公開する by @ka_me_sen_nin https://t.co/GvM7RzC4m5',
    '1000 Contribution! | @phanect_ja https://t.co/glKfw9y6vW']
```
##ページごとに取得する
試しに３ページ分取得してみると、各リストの長さが20であるので、1ページ辺り20ツイート分取得できていることがわかります。

```python
#デフォルトでは自分のツイートが取得される。
for page in tweepy.Cursor(api.user_timeline).pages(3):
    # pageはstatusのリストです。
    print(len(page))

>> 20
   20
   20
```

ここで、`tweepy.Cursor().pages()`と`tweepy.Cursor().items()`では実行速度に差があるのか見てみます。

```python
%%time
for page in tweepy.Cursor(api.user_timeline).pages(3):
    # get 60 tweet by pages
    print(page)

>> CPU times: user 67.5 ms, sys: 15.9 ms, total: 83.4 ms
Wall time: 490 ms
```

```python
%%time
for tweet in tweepy.Cursor(api.user_timeline).items(60):
    # get 60 tweet by items
    print(tweet)

>> CPU times: user 64 ms, sys: 6.8 ms, total: 70.8 ms
Wall time: 471 ms
```
後者の方が若干速そうです。

#おわりに
これで様々なツイートを取得できるようになりました。if文を駆使し、ユーザーやツイートをフィルタリングした上で、自動お気に入りや自動フォローを行うコードを書くと楽しいかもしれません。

次回も引き続き、APIを使って、フォローやいいね等の操作を行ってみようと思います。
-> 続編: [Tweepyの使い方 ~その２~ 【フォロー、いいねなど】](https://qiita.com/kitarikes/items/74b58bd28325d7d43a57)


※こちら、[tweepy ドキュメント](http://docs.tweepy.org/en/latest/getting_started.html)のリンクになります。