LoginSignup
3
3

More than 1 year has passed since last update.

猫先生のツイートを取得してLINEに通知するテンション爆上げなツールを作ってみた

Last updated at Posted at 2023-01-19

猫先生とは?

「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に通知

main.py
    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に通知することを防ぐためです。

条件にあったツイートを取得すると・・

Screenshot_20230119-104901_LINE.jpg

キターーーーーーーーー(テンションMAX)

以上です。

3
3
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
3
3