0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

はじめに

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

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

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

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に通知する関数

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関数

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関数の中について、以下でもう少し詳しく説明します。

# 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

調べたところ、Pythonの時刻はタイムゾーンを意識していない時刻(naive)、タイムゾーンを意識した時刻(aware)の2つがあり、この2つは比較できないみたいです。(※3)ちなみに、naiveが変数now、awareが変数tweet_timeでした。
したがって、どちらかに合わせるしかないとのことでしたので、awareの方に合わせました。

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

3.「Suggested for this repository」の「Publish Python Package」画面の「Configure」をクリック(下写真の赤枠部分)
スクリーンショット 2022-07-23 22.45.22.png

4.[Edit new file]部分のコードの中身を以下のコードに書き換える

# ワークフロー名
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

コード内のワークフロー処理のタイミングについて少し解説します。

# ワークフロー処理のタイミング
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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?