【TwitterAPI】超簡単！tweepyを用いて検索したツイートをいいねしよー！

# 今回やること〜

今回は特定のキーワードでTweetを検索して、その投稿をいいねしていきたいと思います！

前回、TwitterAPIの取得方法を0からまとめてみたのでまだAPI取得できてない人は先にこちらの記事を見といてください！

https://qiita.com/Naoya_pro/items/f1bdba5260bda054f6d2

# いいねする方法は？

それでは早速やっていきましょー！

```python:前回のコード
import tweepy

# 自分のキーに変更
api_key = "**********"
api_key_secret = "**********"
access_token = "**********"
access_token_secret = "**********"

# Twitterの認証
auth = tweepy.OAuthHandler(api_key, api_key_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth, wait_on_rate_limit=True)

# Tweetする
api.update_status(status = "Hello")
```
まず前回は上のコードで「hello」というツイートをしました！
これは、「update_status」というメソッドでステータスを更新しています！
つまり、新しくツイートしているという意味です！

今回はこの「update_status」が「create_favorite」になるだけだと思ってもらえれば特に問題ないです！
（特定のツイートにいいねします！）
つまり、、
```python:like.py
api.create_favorite(ツイートのid)
```
という感じになります！

# ツイートの取得方法について

では次に、ツイートの取得方法についてです！！
いいねの仕方はわかったかもしれませんが、ツイートのidってなんやねんと思うと思います！
色々取得の仕方はあると思います！例えば。。。
- timelineの最新のツイート
- 特定のユーザーの最新のツイート
- トレンドのツート
などです！
今回は特定のキーワードで検索してツイートを取得し、それにいいねしていこうと思います！
まず、ツイートの検索方法について見ていきましょー！
```python:tweets_get.py
tweets = api.search_tweets(q="#西野七瀬", result_type="recent", count=5)
```
ツイートの検索は「search_tweets」というメソッドを使います！
（うまくいかない人は「search」というメソッドを指定してみてください！）
- q="#西野七瀬"
    - 検索したいキーワード
- result_type="recent"
    - どのようなツイートを取得するか指定できます！
        - recent
            - 最新のツイート
        - popular
            - 人気のツイート
                - 判定方法はおそらく非公開
        - mixed
            - 上2つを混ぜたやつ
                - これも判定方法不明
- count=5
    - 取得するツイートの数

しかしこれでは実は良くありません！
なので、こちらを書きます！
```python:tweets_get.py
tweets = tweepy.Cursor(api.search_tweets,q='#西野七瀬',result_type="recent").items(150)
```
items(150)というのは150件分のツイートを取得するという意味ですが、
「Cursor」というのを少し詳しくみていきましょー！

「Cursor」というのを理解するには、まず「page」という概念を理解する必要があります！
TwitterAPIでツイートなどを取得するには、制限があり、基本的には1page分しか取得できません。。。
ただ1pageの量は探した限り明記されておらず、投稿の文字数などによって変化すると予想してて、一定個数のツイートとかで設定されているわけではないです。。。
なのでtimelineの全ての情報を取得したい場合や1page分以上の情報を取得したい場合などは、1page目取得終わったら2page目、終わったら3page目というふうに全て終わるまで繰り返す必要があります。
これをコードとして書くと。。。
```python:tweet_get.py
page = 1

while True:
    statuses = api.user_timeline(page=page,id=user)
    if statuses:
        for status in statuses:
            print(status.text)
    else:
        break
    page += 1 
```
とにかく長い！だるい！ってなって出てきたのが「Cursor」です！
```python:tweet_get_cursor.py
tweepy.Cursor(api.user_timeline,id=user).items()
```
「Cursor」を使うとpageの括りがなくなり、大量のデータの取得でも短く記述できます！

もう１度コードを書いておきます！
```python:tweets_get.py
tweets = tweepy.Cursor(api.search_tweets,q='#西野七瀬',result_type="recent").items(150)
```
もう1回みてみると意味がわかるのではないでしょうか？
「#西野七瀬」で検索し、最新の投稿150個という意味ですねー！
今回はもうちょっとレベルアップさせときます！
```python:tweets_get.py
tweets = tweepy.Cursor(api.search_tweets,q='西野七瀬',tweet_mode='extended',result_type="recent",lang='ja').items(150)
```
- tweet_mode='extended'
    - extended
        - 140文字を超えるツイートを省略しない
    - compat
        - 140文字を超えるツイートを省略する
- lang='ja'
    - 日本語のツイートのみ取得
        - ISO 639-1 コードで指定された特定の言語を指定できるらしいです


[ここ](https://docs.tweepy.org/en/stable/api.html?highlight=search_tweets#tweepy.API.search_tweets)見れば「search_tweets」の引数については詳しく載っているのでもっと知りたい方は見てみてください！

# まとめ

よっしゃー！！！
ここまでで、ツイートを検索し、取得完了です！

では、検索したツイートにいいねをいいねを押していきましょ〜！！
```python:tweets_like.py
import tweepy
import time

api_key = "**********"
api_key_secret = "**********"
access_token = "**********"
access_token_secret = "**********"

auth = tweepy.OAuthHandler(api_key, api_key_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth, wait_on_rate_limit=True)
# TwitterAPIの認証終了

# Tweet検索
tweets = tweepy.Cursor(api.search_tweets,q='西野七瀬',tweet_mode='extended',result_type="recent",lang='ja').items(150)

# 取得したTweetを順番にいいねする
for tweet in tweets:
    print('------------------')
    try:
        api.create_favorite(tweet.id)
        print(tweet.text)
        time.sleep(10)
    except tweepy.TweepyException as e:
        print(e)
```
```terminal:実行結果
,,,,

------------------
なーちゃんとカメレオン   #西野動物園 #可愛かったらRT #西野七瀬 #乃木坂46 https://t.co/voqKkTWgot
------------------
フォロワーさん5000人突破
ありがとうございます
気軽に絡んでください！よろしくです
#乃木坂46 #齋藤飛鳥 
#白石麻衣 #生田絵梨花 #西野七瀬 #橋本奈々未 #サヨナラの意味 あの教室 
#拡散希望RTおねがいします https://t.co/imX0PO1LuP
------------------
403 Forbidden
139 - You have already favorited this status.
------------------
403 Forbidden
139 - You have already favorited this status.
------------------
【#BRUTUS】2022-10-28
四半世紀をかけて辿り着いたのは地元に根づく、住宅街の名店 普段からマークしてる飯ってあるじゃないですか。僕の場合、その筆頭が焼肉なんです。22歳で上京したての頃...
#東京 #焼肉 #渋谷… https://t.co/6Iow9XiAoo
------------------

,,,,
```
注意点としては、「time.sleep(10)」です！
一気にたくさんのツイートをいいねしないようにしています！
これがないと大量のツイートに一気にいいねしてしまい、通報や凍結されることにつながってしまいます！
（迷惑はかけないようにしましょ〜！）

いいねする時にtry~exceptで記述しているのは、実行結果にあるようにalready favoritedみたいに既にいいねされていたりするとエラーで止まってしまうことを防いでいます！

# 最後にちょっと応用？
ちょっとここでtweets変数の中に入っているものをちょっと紹介します！
|メソッド|取得できるもの|
|---|---|
|tweet.id|ツイートID|
|tweet.created_at|ツイート時刻|
|tweet.text|ツイート本文|
|tweet.favorite_count|いいね数|
|tweet.retweet_count|リツイート数|
|tweet.user.id|ユーザーID|
|tweet.user.screen_name|ユーザー名|
|tweet.user.name|アカウント名|
|tweet.user.description|自己紹介文|
|tweet.user.friends_count|フォロー数|
|tweet.user.followers_count|フォロワー数|
|tweet.user.created_at|アカウント作成日時|
|tweet.user.following|自分のフォロー状況|
|tweet.user.profile_image_url|アイコン画像URL|
|tweet.user.profile_background_image_url|ヘッダー画像URL|
|tweet.user.url|WEBサイト|


最後にちょっとまとめて、検索、いいね、フォローまでやってみたいと思います！
```python:twitter_like_bot.py
for tweet in tweets:
    print('------------------')
    try:
        api.create_favorite(tweet.id)
        time.sleep(5)
        api.create_friendship(user_id=tweet.user.id)
        time.sleep(5)
        print(tweet.text)
    except tweepy.TweepyException as e:
        print(e)
```
増えたところは、
`api.create_friendship(user_id=tweet.user.id)`
の行で、ツイートした人をフォローしてます！
「create_friendship」メソッドは「user_id」以外にも、「screen_name」でも取得できます！

# おわり〜
ここまでで今回の内容は以上です！
読んでいただきありがとうございました〜
次回は何しようかな〜DMとか面白そうですよね！
次回お楽しみに〜〜
ばいちゃ〜〜〜〜

https://qiita.com/Naoya_pro/items/e6d2fd875fa61f962fe3