tosumalog~ IT的備忘とパパ的備忘を書き綴ります ~

tosumalog

~ IT的備忘とパパ的備忘を書き綴ります ~

Twitter API と 自動投稿 と レコードキーパー

こんにちは、tosumaです。

今回は以前の「Twitter API」の続きです。
今回は自動投稿の仕組を前回の内容にプラスしてファイナルファンタジーレコードキーパーと連動してみます。

※前回の記事

1.目的

前回は「検索」を自動化して、検索ヒット数を集計を行いましたが、今回は「投稿」を自動化します。
よくTwitterBotと呼ばれる投稿を見る事がありますがあれですね。
前回の検索の仕組みを使って「FFRK」関連のキーワードで投稿数をカウントして、1日のツイート件数を自動で投稿まで行いたいと思います。
前回の続きなのでPythonを使用かつ環境は整っている前提です。

2.準備

2.1.別アカウントでTwitter認証

自動投稿を行うにあたって普段使ってるTwitterアカウントは使いたくないので別アカウントで投稿を行います。
そのためにはアプリ認証を行ってPINの取得を行います。
投稿時にアプリ名も表示されてしまうので他のアプリと併用したくない場合はAPI用にアプリも別に作成する必要があります。

今回は以下のサイトを参考にさせて頂きました
(自動投稿についても記載されてます)

自動投稿用のアカウントはTwitterで作成しておきます。
(昔作って使ってなかったやつを再利用)

f:id:tay_tosuma:20211223105253p:plain

この素敵な笑顔。

2.2.メインプログラムの作成

以下はメインの処理で、流れはこちらです。
①該当キーワードのツイート数の検索&カウント
②別アカウントでTwitterへの認証
Twitterへ投稿

#メイン処理
from twitter import *
from config import *
from sub import *
import json

#変数宣言
ttl_count = 0
tweet_text = ''

#キーワード件数のカウント
for arr_keyword in arr_keyword_ffrk:
    ttl_count = ttl_count + search_count_function(arr_keyword[0],arr_keyword[1])

#Tweeterへの認証
t = Twitter(auth=OAuth(gb_sub_access_token, gb_sub_access_token_secret,gb_consumer_key,gb_consumer_key_secret))

#結果を自動Tweet
tweet_text = "ファイナルファンタジーレコードキーパーに関する昨日のツイート数は " + str(ttl_count) + " 件でした、さすがです!" + '\n' + "#FFRK"
t.statuses.update(status=tweet_text)

2.3.サブルーチンプログラムの作成

何度も呼び出すような処理は部品化しておきます。
SearchのAPIで検索してカウントをリターンする関数とSearchのAPIで取得した時間がMMM形式なので変換する関数を作っておきます。
ポイントとしては検索した際に7日分取得されてしまうので日付をチェックして前日だった場合にはカウントをプラスするような仕組みにしています。

#共通処理
from config import *
from sub import *
from requests_oauthlib import OAuth1Session, OAuth1
import requests

#処理概要:月名称から月番号へ変換処理
def change_month_nm(in_month_nm: str):

    if in_month_nm=="Jan":
        MM="01"
    elif in_month_nm=="Feb":
        MM="02"
    elif in_month_nm=="Mar":
        MM="03"
    elif in_month_nm=="Apr":
        MM="04"
    elif in_month_nm=="May":
        MM="05"
    elif in_month_nm=="Jun":
        MM="06"
    elif in_month_nm=="Jul":
        MM="07"
    elif in_month_nm=="Aug":
        MM="08"
    elif in_month_nm=="Sep":
        MM="09"
    elif in_month_nm=="Oct":
        MM="10"
    elif in_month_nm=="Nov":
        MM="11"
    else:
        MM="12"

    return MM

#処理概要:Twitter SearchAPI 指定キーワード数の取得処理
def search_count_function(in_search_word: str,in_search_nm: str):

    #グローバル変数の宣言
    global gb_system_date
    #検索文字列設定
    search_keyword = in_search_word
    #twitterAPIアクセス
    search_url = gb_base_url + search_keyword
    auth = OAuth1(gb_consumer_key, gb_consumer_key_secret, gb_access_token, gb_access_token_secret)
    response = requests.get(search_url, auth = auth)
    data = response.json()['statuses']
    tweet_Count = 0

    while True:
        for tweet in data:
            strTweetText = tweet["text"]
            strTweetTime = tweet["created_at"]
            YYYY=strTweetTime[26:30]
            MM=change_month_nm(strTweetTime[4:7])
            DD=strTweetTime[8:10]
            strTweetDate=YYYY + MM + DD
            maxid = int(tweet["id"]) - 1

            if gb_system_date in strTweetDate:
                if in_search_nm in strTweetText:
                    tweet_Count = tweet_Count + 1
                else:
                    pass
            else:
                pass

        #ツイートがない場合ループ終了
        if len(data) == 0:
            break

        search_url = gb_base_url + search_keyword + "&max_id=" + str(maxid)
        auth = OAuth1(gb_consumer_key, gb_consumer_key_secret, gb_access_token, gb_access_token_secret)
        response = requests.get(search_url, auth = auth)
        data = response.json()['statuses']

    return tweet_Count

2.4.静的(パラメータ)プログラムの作成

認証で使用するキーなど定数化できるものは外だしで管理しておきます。
検索したいキーワードは配列化して、登録した分だけループしてチェックできるようにします。

#定数
import datetime

#apiキー情報設定
gb_app_name = "hogehoge" #アプリ名
gb_consumer_key = 'hogehoge' #Webで確認したconsumer_keyを入力
gb_consumer_key_secret = 'hogehoge' #Webで確認したconsumer_key_secretを入力
gb_access_token = 'hogehoge' #Webで確認したaccess_tokenを入力
gb_access_token_secret = 'hogehoge' #Webで確認したaccess_token_secretを入力

#apiキー情報設定(サブ)
gb_sub_access_token = 'hogehoge' #PIN入力して取得したaccess_tokenを入力(別アカ)
gb_sub_access_token_secret = 'hogehoge' #PIN入力して取得したaccess_token_secretを入力(別アカ)

#API関連
gb_base_url = "https://api.twitter.com/1.1/search/tweets.json?count=100&lang=ja&q="

#日付関連
gb_time_delta = datetime.timedelta(hours=9)
gb_time_zone = datetime.timezone(gb_time_delta, 'JST')
gb_system_timestamp = datetime.datetime.now(gb_time_zone)
gb_yesterday = gb_system_timestamp - datetime.timedelta(days=1)
gb_system_date = gb_yesterday.strftime('%Y%m%d')

#キーワードリスト(FFRK用)
arr_keyword_ffrk = []
arr_keyword_ffrk.append(["FFRK","FFRK"])
arr_keyword_ffrk.append(["ファイナルファンタジーレコードキーパー","ファイナルファンタジーレコードキーパー"])
arr_keyword_ffrk.append(["レコードキーパー-\"ファイナルファンタジー\"","レコードキーパー"])
arr_keyword_ffrk.append(["レコパ","レコパ"])
arr_keyword_ffrk.append(["FINAL FANTASY Record Keeper","FINAL FANTASY Record Keeper"])
arr_keyword_ffrk.append(["FINALFANTASYRecordKeeper","FINALFANTASYRecordKeeper"])
arr_keyword_ffrk.append(["Record Keeper","Record Keeper"])
arr_keyword_ffrk.append(["RecordKeeper","RecordKeeper"])

3.実行

あとは上記の3つのファイルを同じディレクトリに配置して、Pythonで実行するだけです。

デバッグしてたら早速エラー。
なんだなんだ??と思ったら同じ内容の投稿をするとエラーになるようでした。
この点はタイムスタンプをつけるとかすると解消可能ですね。
(今回は既存投稿を削除して対処しました)

※解決には以下サイトを参考にさせて頂きました。


投稿した結果が以下です。
f:id:tay_tosuma:20211223101032p:plain

自動投稿、面白いですね。そしてこの素敵な笑顔。

やはり「昨日知らなかったことを知る」、「昨日できなかったことができる」この2つに勝る快感はありませんね。
それでは皆さんも良いテクニカルライフを!!


お読み頂き有難うございました。


※よければもう1本 関連記事をお読み頂けると幸いです