猫先生とは?
「Re:ゼロから始める異世界生活」の作者:長月達平先生の愛称です。
https://ja.wikipedia.org/wiki/Re:%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B%E7%95%B0%E4%B8%96%E7%95%8C%E7%94%9F%E6%B4%BB
このツールの目的
目的は「最新話がアップされたことを知る」
小説家になろう というサイトで絶賛連載中のRe:ゼロですが、
最新話の更新日については特に決まっておらず、完全な不定期、神出鬼没です。
ただ、「最新話書いたから○○時にアップするね」的なことをご自身のTwitterで呟かれていることを知り、
じゃあそのツイート取得して通知するようにすれば、いちいちサイト巡回しなくてもいんじゃね?
と考えたことがきっかけでした。。(サイト巡回してた時期がありました・・・
処理の流れ
やっていることはシンプルで、
EventBridgeで毎朝2:00にLambdaを起動
⇩
猫先生の最新ツイート(10件)を取得
⇩
ツイート本文に「更新しました」という文字列が含まれているかチェック
⇩
含まれている場合:DynamoDBに同じツイートIDの登録が無いか確認
・あれば既に通知済のツイートなので処理を終了
・無ければ未通知のツイートなのでLINEに通知
import re
import tweepy
import settings
import line_notify as notify
import dynamodb_function as dynamodb
def lambda_handler(event, context):
# 環境変数を設定
con_key = settings.con_key
con_sec = settings.con_sec
acc_tok = settings.acc_tok
acc_sec = settings.acc_sec
auth = tweepy.OAuthHandler(con_key, con_sec)
auth.set_access_token(acc_tok, acc_sec)
api = tweepy.API(auth)
#タイムラインを取得し、1ツイートずつループ
# 「更新しました」という文字列が含まれているかどうか判定し、Trueの場合のみツイートを表示する
for status in api.user_timeline(id="@{ここにツイッターID}"):
if re.search("更新しました", status.text):
#ユーザ名表示
print('name:' + status.user.name)
#内容表示
print(status.text)
# DBにツイートIDを見に行く
res_id=dynamodb.db_get_item(status.id)
if res_id:
print("登録済み")
else:
# TweetIDをDBへ登録
dynamodb.db_put_item(status.id, status.text)
try:
api.create_favorite(status.id)
api.retweet(status.id)
except:
print("リツイート済み")
# LINEに通知
notify.send_line_notify(status.text)
else:
pass
説明
api.user_timeline(id=”@{ここにツイッターID}”)
ここで取得したいツイートのTwitterアカウントIDを指定しています。
if re.search("更新しました", status.text):
ツイートに「更新しました」という文字列が含まれていた時、status.id (全てのツイートに割り振られているID)をもとに同じIDのツイートが登録されているかどうかをチェック。
未登録であればレコードを登録して、LINEにツイート内容を通知。
ここでツイートIDをチェックする理由は、CRONで毎日自動実行しているので、同じツイートを取得してしまった時に再度LINEに通知することを防ぐためです。
条件にあったツイートを取得すると・・
キターーーーーーーーー(テンションMAX)
以上です。