8
5

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 3 years have passed since last update.

【Python】Herokuを使って無料でTwitterBotを作成してみた

Posted at

#はじめに
アフィリエイターをやっていた頃は、
Twittbotというサービスを使って、Botを量産していたが、
エンジニアになって、自分でもTwitterのBotを作ってみたいなあと思い、挑戦してみました!

#TL;DR

  • Heroku登録
  • Twitter APIへ申請し、アクセスキー&シークレットを取得
  • githeroku CLIのインストール
  • Pythonパッケージの用意
  • HerokuにアプリケーションをPush&Build
  • Herokuのリポジトリに環境変数の内容をエクスポート
  • Heroku Schedulerを設定
  • 動作確認

#Herokuとは
https://jp.heroku.com/what

Heroku はアプリの構築、提供、監視、スケールに役立つクラウドプラットフォームで、アイデアを出してから運用を開始するまでのプロセスを迅速に進めることが可能です。また、インフラストラクチャの管理の問題からも解放されます。

Salesforceが提供するPaaS(Platform as a Service)とのことで、
ざっくりとアプリケーションを実行するための環境を提供してくれて、アプリ公開に必要な手順を代行してくれるサービスです。

データベースサーバーや、アプリケーションサーバーなどの環境を簡単に利用できるメリット◎

####無料枠の範囲内であれば、お金はかからないので便利。

#Herokuへ登録
こちらから登録できます。
必要情報を記入したら、[Create Account]しましょう〜
登録後に他要素認証、例えば、Google Authenticatorアプリを使用してログインするなどアカウントの保護をしておくといいと思います。

FireShot Capture 284 - Heroku - Sign up - signup.heroku.com.jpg

#Twitter APIの申請について
Twitter APIを利用するための、「アクセスキー&シークレット」を取得する方法はこちらを参考ください。

#githeroku CLIのインストール

###Homebrewを事前にインストール
githeroku CLIで使います。

# Reference: https://brew.sh/
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

###gitのインストール

# Reference: https://git-scm.com/download/mac
$ brew install git
$ git --version # インストール確認

Xcode Command Line Toolsがインストールされていなければ、インストールするよう促してくれます。

###heroku CLIのインストール

# Reference: https://devcenter.heroku.com/ja/articles/heroku-cli#download-and-install
$ brew tap heroku/brew && brew install heroku
$ heroku -v # インストール確認

#Pythonパッケージの用意
##ディレクトリ構成

.
├── .env
├── app
│   ├── post_tweet.py
│   └── settings.py
├── requirements.txt
└── runtime.txt

##プログラムコード
###runtime.txt
実行環境として、Python + バージョンを書きます。

python-3.9.4

###requirements.txt
Twitterつぶやき用に、tweepyを使います。
Twitter APIのアクセスキー&シークレットを.envから取得するので、python-dotenvを使います。

python-dotenv==0.17.1
tweepy==3.10.0

###settings.py
.envファイルから定数に値セット

settings.py
# coding: UTF-8
import os
from os.path import join, dirname
from dotenv import load_dotenv

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

# Twitter API
API_KEY = os.environ.get("API_KEY")
API_SECRET_KEY = os.environ.get("API_SECRET_KEY")
ACCESS_TOKEN = os.environ.get("ACCESS_TOKEN")
ACCESS_TOKEN_SECRET = os.environ.get("ACCESS_TOKEN_SECRET")

###post_tweet.py
Auth情報を取得し、apiインスタンス作成。ツイート!

post_tweet.py
# -*- coding: utf-8 -*-
import tweepy
import settings

if __name__ == '__main__':
    # Auth: Set Keys & Secrets for Twitter API
    auth = tweepy.OAuthHandler(settings.API_KEY, settings.API_SECRET_KEY)
    auth.set_access_token(settings.ACCESS_TOKEN, settings.ACCESS_TOKEN_SECRET)

    # Generate Api Instance
    api = tweepy.API(auth)

    api.update_status('Twitterつぶやき投稿!!')

#Herokuでアプリ作成 & Pushするまで
##GUIバージョンの手順

###[Create New App]
スクリーンショット 2021-05-26 16.12.40.png

###アプリの情報を入力
スクリーンショット 2021-05-26 16.13.09.png

###作成したアプリのSettingsHeroku git URLを取得
push先として使えます。
スクリーンショット 2021-05-26 16.14.03.png

###Git ClientでローカルフォルダをGit管理にして、リモートリポジトリと連携
Git Fork使ってます。

####Fileタブから選択
スクリーンショット 2021-05-26 16.22.40.png

####> Remoteで右クリック
スクリーンショット 2021-05-26 16.26.23.png

####Test Connectionするといいですねぇ
スクリーンショット 2021-05-26 16.28.00.png

##Heroku CLIバージョンの手順
.envファイルをプッシュしないように気をつけてください。

$ cd /Users/username/src/app # Git管理したいディレクトリに移動 ※usernameとappは任意
$ heroku login # herokuにログイン
heroku: Press any key to open up the browser to login or q to exit: # ブラウザが立ち上がる

$ heroku create app # アプリ作成
Creating app...done
https://app.herokuapp.com/ | https://git.heroku.com/app.git # リモートリポジトリ情報

$ git init # /Users/username/src/appをgit管理
$ git remote add origin https://git.heroku.com/app.git # リモートにorigin追加
$ git add . # /Users/username/src/appをステージに追加
$ git commit -m "app first commit" # ローカルでcommit(コメント付き)
$ git push origin master # originにローカルmasterブランチをpush

#Herokuのリポジトリに環境変数の内容をエクスポート
.envファイルを用意したら

$ heroku config:push # 環境変数をHerokuに反映

※デフォルトでは、すでにHerokuに設定した環境変数名と.envに書いた環境変数名が同じなら、Heroku側の環境変数の値は上書きされない。上書きする場合は--overwriteオプションつける。

#Heroku Schedulerを設定
##事前にBillingにクレジットカード情報を登録
Home > Account settings > Billing
スクリーンショット 2021-05-26 16.51.10.png

##Heroku SchedulerAdd-Onを追加
スクリーンショット 2021-05-26 16.54.18.png

####コマンド

$ heroku addons:add scheduler:standard --app app # アプリ名をappに

##Heroku Schedulerの設定
すごくシンプルです。
[Add Job]を押して、キャプチャのように設定。
コマンドは、appディレクトリに移動させてから、post_tweet.pyを実行。
自分は1時間おきにしました。
スクリーンショット 2021-05-26 16.56.56.png

ただ、かゆいところに手が届かないな〜10分と1時間と1日おきっていう、ざっくり感・・・w

###改善策
実際、python-crontabなんかを使えば、HerokuのスケジューラーのAdd-Onを使わなくてもできそうだし、
別の方法では、Procfileを作成して、その中にclock: cd ./app && python post_tweet.pyという記述してルートディレクトリにProcfileをPush。heroku clock=1みたいに指定して実行すれば、cronjobを設定できるみたいだ。

そうすれば、もっと細かく定期実行の間隔をコントロールできるようになるから、
今後、制御してみたいと思います〜。

####▼Heroku x Cronjobの参考

#ハマったポイント

  • homebrewが古くなっていて、アップデートしたところ、芋づる式で、GNU Compiler Collectionのインストール、Xcode Command Line Toolsのアップデートなどが走り、意外とスムーズには行かなかった。
    • terminalに出力される情報の確認が大切だった。
  • runtime.txtrequirements.txtをルート(ディレクトリのトップ)に置いておかないと、push後に走るherokuのビルドでエラーが出た。
  • いつもGitクライアントをメインで使っているので、ターミナルでコマンドでgit commitしたら、.envファイルも間違ってコミットしてしまい、一回git rmする必要があった。
    • 後処理が若干面倒だった。
  • Schedulerでコマンド指定した時に、リポジトリのルートディレクトリからcd ./appしてからじゃないと、自分の記述したPythonファイルの相対パス的に実行ができなかった。
    • 実行したいPythonファイルをルートに置くか、cd ./appの選択肢
    • python ./app/post_tweet.pyimportの参照エラーが起こった。
      • なかなかpythonの参照はむずい。という結論

#まとめと感想
初めて、Herokuと聞いた時に、なにそれヘロヘロやんって思ったけど、

Herokuの名称は、「heroic(英雄的な)」と「haiku(俳句)」からなるかばん語である。 日本語の名詞を含めているのは、Rubyの開発者のまつもとゆきひろに敬意を示してのことである。
参照元:wikipedia

らしい。俳句、、、TwitterのBot量産しろってか?!wwwwwww

また、Heroku自体が、Gitリポジトリだったのが、正直驚いた。
アップしたアプリケーションを定期実行したり、他の用途にも使ったり、可能性は無限大であることを知りました。

いや〜奥が深そうなので、もうすこしHeroicHaikuの世界に飛び込んでみたいところですねえ!

ちなみに、今回作ったTwitter BOTは、本田圭佑っぽいつぶやきをするBOTですwww
本田AIが圭佑ばりにツイートし続けますwww

参考までにwww

以上、ありがとうございました!

8
5
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
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?