4月だったか5月だったか、旧twitterのapi有料化の影響でbot(@improv_bot)の更新が止まってしまった。これまでは、EasyBotterというフリーで配布されているPHPのプログラムをサーバーに置いてbotを運用していたのだけれど、その従来の方法ではうまくいかないので、新しいapiのfreeのプランで、pythonとGoogle Cloud Platformを使ってbotを運用することになる。以下は、その方法についてのざっくりとした覚書。
参考にした記事
botと言ってもいろいろあるけれど、これはあらかじめ用意されたツイートをランダムに投稿していくbotをつくる方法。
まず、以下の二つの記事を参考にさせて頂いた。
- twittbotが停止したので自力でtwitterのBotを作成する(APIv2対応)
- Cloud Storage に存在する CSV ファイルを pandas.DataFrame として取得する方法
ここを読めば、botを作るために必要なことはすべて書いてあるので、このリンクだけで十分なのだけれど、こちらの環境ではプログラムが上手く動作しなかったことなど付け足して書いておきたいと思う。
エラーの対処など
基本的に一番目のリンク記事の記述の通りに作業を進めた。強いて言えば、Cloud Functionsの設定で第二世代を選択したが、この点については特に問題なく動作している。
リンク記事のコードをそのまま参照して実行したものの、こちらの環境ではエラーが生じた。ツイートは実行されるが、一度実行するごとに二つツイートされるという不具合。pythonの基本的な文法としては関数のreturn文は省略できると思うが、あえてreturn文をつけることによって、不具合は解消された。
import tweepy
import random
from io import BytesIO
import pandas as pd
from google.cloud import storage
def tweet_improv(request):
# クライアントをインスタンス化
client = storage.Client()
# CloudStorageのバケット名を指定して、バケットを取得
bucket = client.get_bucket('tweet_contents')
# バケット内のツイートのデータファイルを BLOB(Binary Large OBject)として取得
blob = bucket.blob('data.csv')
# オブジェクトのデータを取得
content = blob.download_as_bytes()
list_tweets = pd.read_csv(BytesIO(content),header=None).values.tolist()
# ツイートのリストから投稿用ツイートをランダムで取得
num = random.randint(0,len(list_tweets))
tweet = list_tweets[num][0]
# API情報
ck = 'API_KEY'
cs = 'API_KEY_SECRET'
at = 'ACCESS_TOKEN'
ats = 'ACCESS_TOKEN_SECRET'
api = tweepy.Client(consumer_key=ck, consumer_secret=cs, access_token=at, access_token_secret=ats)
api.create_tweet(text=tweet)
return tweet
tweepy
pandas
google-cloud-storage
Cloud Schedulerで実行の「頻度」を設定する際、unix-cron形式で記述することになるが、何時間おきに実行したいとか、毎週何曜日の何時に実行したいとかいうようなことをどのように記述するかということは、’unix-cron形式’などで検索すれば必要な情報は出てくるので、それらの記事を見て設定する。