はじめに
本記事では、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」をクリック(下写真の赤枠部分)
3.「Suggested for this repository」の「Publish Python Package」画面の「Configure」をクリック(下写真の赤枠部分)
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