目次
- はじめに
-
TwitterAPIkeyを入手してTweepyでツイート
2.1 TwitterAPIkeyを入手
2.2 Tweepyでツイート -
GCPで定期実行
3.1 Cloud Functionにデプロイ
3.2 Cloud Schedularでデプロイしたプログラムを定期実行 -
Cloud Function上にて画像つきでツイート
4.1Firebaseに画像を保存 その画像を読み取るkeyを生成
4.2入手したkeyを用いて画像を読み取り一緒にツイート - 参考にさせていただいたサイト
はじめに
ド素人ですがTwitterのBOTを作成したので1から備忘録として書いておきます。
十分に説明できる能力があるか怪しいので、こんなことしたよ~といった記録的な感じです。
注意点として、今回使っているGCPやFirebaseは従量課金のサービスとなっています。
新規Googleアカウントだとしばらくは無料枠が使えますが、プログラムを実行させる度に課金が進んでしまいます。
また、セキュリティに関する設定はほとんど触っていません。
そのため、最悪の場合だと
改ざんされる→課金額が膨大になる
となる危険性も考えられます。
参考にする際は自己責任でお願いします 。
TwitterAPIkeyを入手してTweepyでツイート
(ここら辺は調べたら他に分かりやすい記事がたくさん出てきます)
TwitterAPIkeyを入手
BOT用のGoogle・Twitterアカウントを作る。
(GCPやFirebaseを使うため、BOT用のGoogleアカウントがあった方が便利。GCP新規登録の無料枠も使える。)
(Googleアカウントを作る → そのアカウントでTwitterアカウントを作るのが楽。)
TwitterDeveloperPlatformにTwitterアカウントでログイン・登録
メールアドレス・電話番号をTwitterアカウントに登録しておく必要あり
Twitter Developer Platform
登録できるとこんな風にkeyがもらえたが、ここのキーは使わない。
左のproject&AppsからELEVATEDの申請
色々と聞かれたが、適当に書いていいのか不明
酷いとELEVATEDを剥奪されたりするのかも
初めから作られているAppの設定をする
ここは丁寧に入力した方が良さげ。
ただ今回は適当に遊ぶためだけなので何も考えず入力している。
その後このRegenerateから各Keyが入手できる。
Tweepyでツイート
入手したキーを使って簡単なプログラムを作成
#"Hello World"とツイートする
import tweepy
def get_twitter_api():
#--------------------------------------------
#ここを各々変える(↓のは例としてテキトーな英数字です)
API_KEY = 'sadfhgkjhiuerg'
API_SECRET = 'gjasgjas;lkgjasgjowi'
ACCESS_TOKEN = 'fdgagadgdfgrjrjtj'
ACCESS_TOKEN_SECRET = 'lhglytor6k'
#--------------------------------------------
auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
return api
api = get_twitter_api()
api.update_status('Hello World')
GCPで定期実行
https://console.cloud.google.com/
Cloud Functionにデプロイ
関数の作成
・関数名 → 任意で設定
・トリガーのタイプ → Pub/Sub
・トピックを適当に名前を付けて作成、選択
ランタイム → 今回はpythonを選択
ソースコード → インラインエディタ
エントリポイント → プログラムの開始位置(関数)
main.pyに実行したいプログラムを入れる。
#デプロイ用
import tweepy
import random
def get_twitter_api():
API_KEY = 'sadfhgkjhiuerg'
API_SECRET = 'gjasgjas;lkgjasgjowi'
ACCESS_TOKEN = 'fdgagadgdfgrjrjtj'
ACCESS_TOKEN_SECRET = 'lhglytor6k'
auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth,wait_on_rate_limit=True)
return api
def test(data,context):
api = get_twitter_api()
i = random.randint(0,1000)
api.update_status('Hello World'+" "+f"{i}")
プログラムの開始位置として関数を指定する必要があるため、新しく関数を作っている。
その関数の引数に(data,context)を与えておく ←今回1番嵌った
(トリガーがHTTPの場合は(request)を与える)
また、同じ内容のツイートを連続でするとエラーになるため1000までのランダムな整数を付け加えている。
requirements.txtの設定
ローカルでプログラムを実行できたターミナルにて
pip freeze > requirements.txt
を実行したら生成されるのでそれをコピペ。
→デプロイ
失敗したら項目"ログ"から"ログエクスプローラーで表示"
ログ見ながらエラー修正して再度デプロイ
デプロイに成功したら'テスト中'の項目の'関数をテストする'で実行
Cloud Schedularでデプロイしたプログラムを定期実行
左のメニューから'Cloud Schedular'を選択、ジョブを作成。
名前 - Cloud Functionの関数名と同じ必要あり??
頻度 - cronコマンド形式で。今回は「* * * * *」で毎分実行するように設定
タイムゾーン - 日本
ターゲットタイプ - Pub/Sub
トピック - Cloud Functionで作成、選択したトピックと同じやつ
入力し終わったら作成
Cloud Function上にて画像つきでツイート
Firebaseに画像を保存 その画像を読み取るkeyを生成
firebaseにGoogleアカウントを登録
https://console.firebase.google.com/
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read;
}
}
}
注意:このStorageは他ユーザーが見る・読み取ることを許可するように設定しています。
重要なファイルは置かないように
ストレージ内のファイルを読み取るためのKEYを入手する。
pythonを選択して'新しい秘密鍵の生成'を押し、jsonファイルをDL
入手したkeyを用いて画像を読み取り一緒にツイート
#このままデプロイ
import tweepy
import random
import firebase_admin
from firebase_admin import credentials
from firebase_admin import storage
def picDL():
#投稿したい画像ファイル名を入れる
fileName = "chipmunk-g5ada4a3c0_1920.jpg"
#DLしたjsonファイル名を入れる
credFilePath = "analog-medium-373008-firebase-adminsdk-ge0ro-dabc27337d.json"
picPath = "/tmp/" + fileName
cred = credentials.Certificate(credFilePath)
default_app = firebase_admin.initialize_app(cred)
#Storageのフォルダパスを入れる
bucket = storage.bucket("analog-medium-373008.appspot.com", default_app)
blob = bucket.blob(fileName)
blob.make_public()
blob.download_to_filename(picPath)
return picPath
def get_twitter_api():
API_KEY = 'sadfhgkjhiuerg'
API_SECRET = 'gjasgjas;lkgjasgjowi'
ACCESS_TOKEN = 'fdgagadgdfgrjrjtj'
ACCESS_TOKEN_SECRET = 'lhglytor6k'
auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
return api
def tweet(data,context):
picPath = picDL()
api = get_twitter_api()
i = random.randint(0,1000)
api.update_status_with_media('Hello World'+" "+f"{i}", filename = picPath)
プログラムの説明
Storageのフォルダパスはこの部分
'gs://'の部分は含めない(4時間嵌った)
get_twitter_api() - 上のと同様
picDL() -
firebaseのstorageのkeyを通して画像をtmpディレクトリにダウンロード
Cloud Function上ではtmpディレクトリにしかDLができない ←嵌った
そしてtmp内の画像ファイルのパスを返す
わざわざ一度DLする必要があるのかは分からない、絶対もっといいやり方がある。
課金が一気に進むのがこの部分なので気をつける。
上でやったのと同様にCloud Functionにブチ込む
↑ 赤丸部分の+から、firebase秘密鍵のjsonファイルを入力
requirements.txtの更新も忘れずに。デプロイして実行
後は上と同様にCloud Schedularで定期実行してBOTの完成です。
参考にさせていただいたサイト
【Python】苦闘、丸3日。Google Cloud Function (コード実行環境)を使って、Twitterの自動リツイートを実装した話。