0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Tweepyで作った画像を呟くBOTをGCPで定期実行させる(素人)

Last updated at Posted at 2022-12-28

目次

  1. はじめに
  2. TwitterAPIkeyを入手してTweepyでツイート
    2.1 TwitterAPIkeyを入手
    2.2 Tweepyでツイート
  3. GCPで定期実行
    3.1 Cloud Functionにデプロイ
    3.2 Cloud Schedularでデプロイしたプログラムを定期実行
  4. Cloud Function上にて画像つきでツイート
    4.1Firebaseに画像を保存 その画像を読み取るkeyを生成
    4.2入手したkeyを用いて画像を読み取り一緒にツイート
  5. 参考にさせていただいたサイト

はじめに 

ド素人ですがTwitterのBOTを作成したので1から備忘録として書いておきます。
十分に説明できる能力があるか怪しいので、こんなことしたよ~といった記録的な感じです。

注意点として今回使っているGCPやFirebaseは従量課金のサービスとなっています。
新規Googleアカウントだとしばらくは無料枠が使えますが、プログラムを実行させる度に課金が進んでしまいます。

また、セキュリティに関する設定はほとんど触っていません。
そのため、最悪の場合だと
改ざんされる→課金額が膨大になる
となる危険性も考えられます。

参考にする際は自己責任でお願いします 。

TwitterAPIkeyを入手してTweepyでツイート

(ここら辺は調べたら他に分かりやすい記事がたくさん出てきます)

TwitterAPIkeyを入手

BOT用のGoogle・Twitterアカウントを作る。
(GCPやFirebaseを使うため、BOT用のGoogleアカウントがあった方が便利。GCP新規登録の無料枠も使える。)
(Googleアカウントを作る → そのアカウントでTwitterアカウントを作るのが楽。)

Googleアカウント作成ページ
Twitter

TwitterDeveloperPlatformにTwitterアカウントでログイン・登録
メールアドレス・電話番号をTwitterアカウントに登録しておく必要あり
Twitter Developer Platform


登録できるとこんな風にkeyがもらえたが、ここのキーは使わない。
スクリーンショット 2022-12-28 152828.png


左のproject&AppsからELEVATEDの申請
スクリーンショット 2022-12-28 153537.png
色々と聞かれたが、適当に書いていいのか不明
酷いとELEVATEDを剥奪されたりするのかも

成功すると右上に"ELEVATED"の文字
スクリーンショット 2022-12-28 154629.png

初めから作られているAppの設定をする
スクリーンショット 2022-12-28 155422.png
スクリーンショット 2022-12-28 160010.png


ここは丁寧に入力した方が良さげ。
ただ今回は適当に遊ぶためだけなので何も考えず入力している。
スクリーンショット 2022-12-28 160225.png


その後このRegenerateから各Keyが入手できる。
スクリーンショット 2022-12-28 161157.png

Tweepyでツイート

入手したキーを使って簡単なプログラムを作成

HalloWorld.py
#"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')

実行。ツイートできた。
image.png

GCPで定期実行

https://console.cloud.google.com/
image.png

Cloud Functionにデプロイ

Cloud Functionを選択
スクリーンショット 2022-12-28 175259.png

image.png
有効にする

スクリーンショット 2022-12-28 175612.png
関数の作成
・関数名 → 任意で設定
・トリガーのタイプ → Pub/Sub
・トピックを適当に名前を付けて作成、選択

スクリーンショット 2022-12-28 180265.png
ランタイム → 今回はpythonを選択
ソースコード → インラインエディタ
エントリポイント → プログラムの開始位置(関数)

main.pyに実行したいプログラムを入れる。

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の設定
スクリーンショット 2022-12-28 182140.png
ローカルでプログラムを実行できたターミナルにて

pip freeze > requirements.txt

を実行したら生成されるのでそれをコピペ。

→デプロイ

失敗したら項目"ログ"から"ログエクスプローラーで表示"
ログ見ながらエラー修正して再度デプロイ

成功したら赤丸のようにチェックが付く
スクリーンショット 2022-12-28 183129.png

デプロイに成功したら'テスト中'の項目の'関数をテストする'で実行
スクリーンショット 2022-12-28 183309.png

スクリーンショット 2022-12-28 183533.png
うまくツイートできた。

Cloud Schedularでデプロイしたプログラムを定期実行

左のメニューから'Cloud Schedular'を選択、ジョブを作成。
スクリーンショット 2022-12-28 185438.png
スクリーンショット 2022-12-28 185638.png

スクリーンショット 2022-12-28 185833.png
名前 - Cloud Functionの関数名と同じ必要あり??
頻度 - cronコマンド形式で。今回は「* * * * *」で毎分実行するように設定
タイムゾーン - 日本
ターゲットタイプ - Pub/Sub
トピック - Cloud Functionで作成、選択したトピックと同じやつ

入力し終わったら作成

このようにジョブが追加される
スクリーンショット 2022-12-28 190543.png

ツイートも問題なくされている。
image.png

Cloud Function上にて画像つきでツイート

Firebaseに画像を保存 その画像を読み取るkeyを生成

firebaseにGoogleアカウントを登録
https://console.firebase.google.com/

スクリーンショット 2022-12-28 191353.png
プロジェクトを作成しておく

メニューの構成→Storageを選択
スクリーンショット 2022-12-28 191922.png

画像ファイルをアップロードしておく
image.png

Rulesを以下のように書き換え
image.png

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read;
    }
  }
}

注意:このStorageは他ユーザーが見る・読み取ることを許可するように設定しています。
重要なファイルは置かないように


ストレージ内のファイルを読み取るためのKEYを入手する。

左上のメニューからプロジェクトの管理→プロジェクトの設定
image.png

pythonを選択して'新しい秘密鍵の生成'を押し、jsonファイルをDL
image.png

入手したkeyを用いて画像を読み取り一緒にツイート

pic_tweet.py
#このままデプロイ

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のフォルダパスはこの部分
スクリーンショット 2022-12-28 194810.png
'gs://'の部分は含めない(4時間嵌った)

get_twitter_api() - 上のと同様

picDL() -
firebaseのstorageのkeyを通して画像をtmpディレクトリにダウンロード
Cloud Function上ではtmpディレクトリにしかDLができない ←嵌った
そしてtmp内の画像ファイルのパスを返す

わざわざ一度DLする必要があるのかは分からない、絶対もっといいやり方がある。
課金が一気に進むのがこの部分なので気をつける。

上でやったのと同様にCloud Functionにブチ込む
スクリーンショット 2022-12-28 201349.png
 ↑ 赤丸部分の+から、firebase秘密鍵のjsonファイルを入力

 スクリーンショット 2022-12-28 201959.png
requirements.txtの更新も忘れずに。デプロイして実行

ツイートできた。
image.png

後は上と同様にCloud Schedularで定期実行してBOTの完成です。

参考にさせていただいたサイト

【Python】苦闘、丸3日。Google Cloud Function (コード実行環境)を使って、Twitterの自動リツイートを実装した話。

GCPでPythonプログラムを定期実行する【GCP/Python】

Firebase: Cloud Firestore と Cloud Storage をPythonから使う

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?