Pythonを使用してTwitterで「いいね」した最新ツイートを日次でLineに送る

# はじめに
本記事では、Tweepy、LINE Notify、GitHub Actionsを使用します。トークン取得や使い方等の詳細は記載しないので、参考文献等を参照してください。

本記事は、以下のような流れで進んでいきます。
<strong>① Twiiter APIを使用して、「いいね」した最新のツイートを取得</strong>
<strong>② LINE Notify APIを使用して、①で取得したツイートをLINEに通知する</strong>
<strong>③ GitHub Actionsを使用して、日次で最新ツイートをLineに送る</strong>


### ① Twitter APIを使用して「いいね」した最新のツイートを取得する関数
```python
import tweepy
import datetime

def get_api():
    # TwitterAPIの認証を受けた後、取得したAPIkeyを代入
    consumer_key = 'your_consumer_key'
    consumer_secret = 'your_consumer_secret'
    access_token = 'your_access_token'
    access_token_secret = 'your_access_token'
    # oauth認証を行う：OAuthHandlerインスタンスを作成
    auth = tweepy.OAuthHandler(consumer_key,consumer_secret)
    # アクセストークンとアクセストークンシークレットをセット 
    auth.set_access_token(access_token,access_token_secret)
    api = tweepy.API(auth)
    return api

def my_favorites_tweet(api, num):
    """
    「いいね」したツイートのテキスト取得
    """
    tweet_text = api.get_favorites()[num]._json['text']
    return tweet_text
```
### ② LINE Notify APIを使用して、①で取得したツイートをLINEに通知する関数
```python
def notify_message(message):
    """
    LINEに通知する
    """
    LINE_NOTIFY_TOKEN = 'your_line_token'
    url = 'https://notify-api.line.me/api/notify'
    headers = {
        'Authorization': f'Bearer {LINE_NOTIFY_TOKEN}'
    }
    data = {
        'message':message
    }    
    requests.post(
    url,
    headers=headers,
    data=data)
```
### main関数
```python
def main():
    # TwitterAPIKEYとか取得
    api = get_key()
    
    # timezoneオブジェクトを指定
    # JST（日本標準時）に合わせるため+9時間の差分を指定
    now = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9)))
    delta = datetime.timedelta(days=10)
    yesterday = now - delta
    
    # 「いいね」したツイートの個数取得（default=20）
    my_favorites_len = len(api.get_favorites())
    
    for i in range(my_favorites_len):
        tweet_time = api.get_favorites()[i]._json['created_at']
        # 取得したcreated_atがstr型なのでdatetime型に変換
        tweet_time = datetime.datetime.strptime(tweet_time, '%a %b %d %H:%M:%S %z %Y')
        # 「いいね」したツイートが今日のツイートだったらlineに送る
        if  tweet_time >= yesterday:
            # 「いいね」したツイートのテキスト取得
            favorites_text = my_favorites_tweet(api, i)
            # Lineに通知
            notify_message(favorites_text)
        else:
            pass

if __name__ == "__main__":
    main()
```
main関数の中について、以下でもう少し詳しく説明します。
```python
# timezoneオブジェクトを指定
# JST（日本標準時）に合わせるため+9時間の差分を指定
now = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9)))
delta = datetime.timedelta(days=10)
yesterday = now - delta
```
まずは、上記コードの変数nowでタイムゾーン(datetime.timezone())を設定した理由についてです。
タイムゾーンを設定しなかった場合、main関数内のif文で下記のエラーが吐かれます。
```ターミナル
TypeError: can't compare offset-naive and offset-aware datetimes
```
調べたところ、<strong>Pythonの時刻はタイムゾーンを意識していない時刻(naive)、タイムゾーンを意識した時刻(aware)の2つがあり、この2つは比較できない</strong>みたいです。（※3）ちなみに、naiveが変数now、awareが変数tweet_timeでした。
したがって、どちらかに合わせるしかないとのことでしたので、awareの方に合わせました。
```python
if  tweet_time >= yesterday:
    # 「いいね」したツイートのテキスト取得
    favorites_text = my_favorites_tweet(api, i)
    # Lineに通知
    notify_message(favorites_text)
else:
    pass
```
表題にある『「いいね」した最新ツイート』の最新ツイートとは、『24時間以内に投稿されたツイート』とします。
したがって、上記コードでは「いいね」を押したツイートが24時間以内に投稿されていればLINEに通知を送るようにしています。
「いいね」を押したツイートが24時間以内に投稿されていればLINEに通知を送ります。（本当は、その日に「いいね」したツイートのみを取得できるようにしたかったのですが、やり方がよく分かりませんでした。どなたかやり方わかる方いたら教えてください、、、、🙇‍♂️）

### ③ GitHub Actionsを使用して、日次で最新ツイートをLineに送る
1.まずは、Githubで新しいレポジトリを作って、先ほどのコードを.pyファイルに格納してgit pushします。（※5）

2.git push完了後、今回の.pyファイルが格納されているページの「Actions」をクリック（下写真の赤枠部分）
![スクリーンショット 2022-07-23 22.33.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520566/14bcbca4-bb4b-c8c7-edd3-63246f4b7180.png)

3.「Suggested for this repository」の「Publish Python Package」画面の「Configure」をクリック（下写真の赤枠部分）
![スクリーンショット 2022-07-23 22.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520566/cba131d3-894c-c074-638e-975cb473b750.png)

4.[Edit new file]部分のコードの中身を以下のコードに書き換える
```yaml
# ワークフロー名
name: line_notify

# ワークフロー処理のタイミング
on:
  schedule:
    - cron: '59 14 * * *'

jobs:
  build:
    # Ubuntuの最新版環境内で処理
    runs-on: ubuntu-latest

    # 実行する処理＆コマンド指定
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python 3.8
        uses: actions/setup-python@v1
        with:
          python-version: 3.8
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install tweepy
      - name: Run script
        run: |
          # 自分で定めた.pyの実行
          python main.py
```
コード内のワークフロー処理のタイミングについて少し解説します。
```yaml
# ワークフロー処理のタイミング
on:
  schedule:
    - cron: '59 14 * * *'
```
今回のワークフロー処理の実行時間を示しているのが、「cron: ~~」の部分です。左から「分・時・日・月・曜日」を表しています。（詳しくはcron構文等でググってください。一応参考文献載せます。※6）
今回は日本時間の23時59分に設定。つまり、その日に「いいね」したツイートを23時59分にLINEに通知してくれます。

5.「Start commit」をクリック後、「Commit changes」をクリック。コミット完了

6.Done。夜を待ちましょう。

# おわりに
Twitter,LINEのAPIを駆使して、「いいね」した最新のツイートを自動取得することができました。
Tweepyでは、ツイート文を取得する以外にもフォロワーの情報等が分かるので、工夫して色々なことができますね。僕も色々試してみたいと思います。
本記事を読んでくださりありがとうございました。

# 参考文献
※1：Twitter APIキーとアクセストークンの取得・利用申請までの流れメモ
https://qiita.com/ume-san/items/c32e5378e66cd888758c
※2：LINE Notifyトークン取得メモ
https://qiita.com/akeome/items/e1e0fecf2e754436afc8
※3：タイムゾーンの扱いについてメモ
https://qiita.com/takaki@github/items/b1a380a0a644170f5885
※4：GitHub Actions 使い方メモ
https://helve-blog.com/posts/git/introduction-to-github-actions/
※5：githubにpushするメモ
https://qiita.com/e-onm/items/9d9cd34173b9970cb707
※6：cron構文メモ
https://docs.microsoft.com/ja-jp/azure/devops/pipelines/process/scheduled-triggers?view=azure-devops&tabs=yaml