【Twitter API×Python】指定したハッシュタグのツイートをまとめてLINEへ送信してみた

## 指定したハッシュタグのツイートを一括で取得したい！
突然ですが、私は最近まで植物に関するクラウドファンディングを実施していました。
その際に、フォロワーを増やそうと **#植物**のツイートをしている、かつ **フォロワーが100人以上**の場合にフォローをするという活動を定期的にしていましたがこれが結構大変なのです。（全然増えませんでした。。。）
ですので、この活動がもっと簡単にできないかと思い **LINEへ指定した条件のツイートをまとめて送信しする**やり方を考えました。
フォロワーを増やしたい方やツイートの分析をしたい方は是非ご覧になってください！

基本的に↓の記事を参考にしていますが、自分がより使いやすいように改変をしています。
リンクから直でツイートに飛べるのでフォローが簡単にできます！

https://3pysci.com/twitterapi-17/

**↓コードを実行したときの結果↓**
![Tweet取得.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618860/0cd25d24-96d4-aed5-8c2f-0fd7545a1932.gif)

```python:完成版
import tweepy
import requests

# フォロワーの指定
followers = 100

# 取得するツイートのハッシュタグを指定 
keyword = '植物'

account = "@***"

consumer_key = '***'
consumer_secret = '***'
access_token = '***'
access_token_secret = '***'

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

api = tweepy.API(auth, wait_on_rate_limit = True)

line_notify_token = '***'
line_notify_api = 'https://notify-api.line.me/api/notify'

def searchmake():
    ohasenword = f'#{keyword}'

    return ohasenword

def searchtweet(ohasenword):
    tweets = api.search_tweets(q=ohasenword, count=20)
    for tw in tweets: 
        print(tw.created_at)

    return tweets

def collecttweets(tweets):
    collected_accounts = []
    collected_tweetids = []
    collected_text = []
    collected_follower = []

    for tw in tweets:
        if not (tw.text.startswith('RT')) or (tw.text.startswith('@')):
            if tw.user.followers_count >= followers:
                if not tw.id in collected_tweetids:
                    collected_accounts.append(tw.user.screen_name)
                    collected_tweetids.append(tw.id)
                    collected_text.append(tw.text)
                    collected_follower.append(tw.user.followers_count)
            
    return collected_accounts, collected_tweetids, collected_text, collected_follower

def sendlinemessage01(collected_accounts, collected_tweetids):
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    
    message = f'\n<{keyword}に関するツイートを取得>\n'
    for user, twid in zip(collected_accounts, collected_tweetids):
        user_url = f'https://twitter.com/{user}/status/{twid}'
        message = f'{message}{user_url}\n\n'
    
    data = {'message': message}
    requests.post(line_notify_api, headers = headers, data = data)

def sendlinemessage02(collected_text, collected_follower):
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    
    message = f'\n<{keyword}に関するツイートを表示>\n\n'
    for text, follower in zip(collected_text, collected_follower):
        message = f'{message}●フォロワー:{follower}人\n●本文:{text}\n\n' 
    
    data = {'message': message}
    requests.post(line_notify_api, headers = headers, data = data)

def main():
    searchword = searchmake()
    tweets = searchtweet(searchword)
    collected_accounts, collected_tweetids, collected_text, collected_follower= collecttweets(tweets)
    sendlinemessage01(collected_accounts, collected_tweetids)
    sendlinemessage02(collected_text, collected_follower)

if __name__ == '__main__':
    main()
```

## 実行環境
- Python -ver3.9
- tweepy -ver4.10
- requests -ver2.28

## 作り方
### １．Twitterデベロッパーへの登録。
まずは、Twitter APIを使うためにTwitterデベロッパーへの登録へ登録する必要があります。
自分は3年前くらいに登録したのですが、申請をしてから実際に使えるようになるまで1週間くらいかかりました。。。
やり方は↓とかが参考になると思います。

https://zenn.dev/eito_blog/articles/9a17a64ffa3c6b

使えるようになったら、↓の記事を参考に5項目を記載してください。

https://3pysci.com/twitterapi-1/

```python:キーやトークンを記載（10~15行目）
account = "@***"

consumer_key = '***'
consumer_secret = '***'
access_token = '***'
access_token_secret = '***'
```

### ２．LINE Notify APIを使ってメッセージを自分のアカウントにメッセージを送る。
ここからアカウントを登録してトークンを取得します。
https://notify-bot.line.me/ja/

ログイン後は
マイページ⇒トークンを発行する⇒トークン名、トークルームを設定⇒発行する
をすると、トークンが発行されるので22行目にコピペしてください。

```python:トークンを記載（22行目）
line_notify_token = '***'
```

### ３．tweepyのライブラリーをインポート
```
pip install tweepy
```

### ４．取得したい項目を記載
ここでは、LINEへ通知する際に取得をしたいツイートの項目を指定します。

```python:collecttweets（37~52行目）
def collecttweets(tweets):
    collected_accounts = []
    collected_tweetids = []
    collected_text = []
    collected_follower = []
    
    for tw in tweets:
        if not (tw.text.startswith('RT')) or (tw.text.startswith('@')):
            if tw.user.followers_count >= followers:
                if not tw.id in collected_tweetids:
                    collected_accounts.append(tw.user.screen_name)
                    collected_tweetids.append(tw.id)
                    collected_text.append(tw.text)
                    collected_follower.append(tw.user.followers_count)
            
    return collected_accounts, collected_tweetids, collected_text, collected_follower
```

| 指定の仕方 | 取得できる項目 |
|:-:|:-:|
| tw.user.screen_name  | ツイートをしたユーザーの名前  |
| tw.id  | ツイートをしたユーザーのID  |
| tw.text  | ツイートの内容  |
| tw.user.followers_count  | ユーザーのフォローワー数  |

この他にも取得できる項目はたくさんあるので↓を参考にしてみてください。

https://web-lh.fromation.co.jp/archives/10000051001

### ５．LINEへ通知する。
まずは４で取得をしてきたユーザー名とIDを元にツイートに直接アクセスするためのURLを作成し、↓のようなLINE本文を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618860/776d9363-52f5-7347-e74e-81352df9228b.png)
```python:sendlinemessage01(54~63行目)
def sendlinemessage01(collected_accounts, collected_tweetids):
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    
    message = f'\n<{keyword}に関するツイートを一括で取得>\n'
    for user, twid in zip(collected_accounts, collected_tweetids):
        user_url = f'https://twitter.com/{user}/status/{twid}'
        message = f'{message}{user_url}\n\n'
    
    data = {'message': message}
    requests.post(line_notify_api, headers = headers, data = data)
```

次に、４で取得をしてきたツイートの内容やフォロワー数を元に↓のようなLINE本文を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618860/2917422e-fe4f-efdc-df00-67b52b3685be.png)

```python:sendlinemessage02(65~73行目)
def sendlinemessage02(collected_text, collected_follower):
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    
    message = f'\n<{keyword}に関するツイートを表示>\n\n'
    for text, follower in zip(collected_text, collected_follower):
        message = f'{message}●フォロワー:{follower}人\n●本文:{text}\n\n' 
    
    data = {'message': message}
    requests.post(line_notify_api, headers = headers, data = data)
```

## おわりに
今のままだと、ツイートを取得するためにわざわざこのコードを実行しないといけません。
ですので、今後はAWSで1日ごとに実行させる等工夫が必要です。
やる気があったら今後やろうと思いますので是非、LGTMをください！！