どうも、なおです。
今回は前回の続きとして作成したソースコードをサーバ(Heroku)にデプロイします。
サーバを利用することで毎日決められた時間にプログラムを実行することができます。前回の記事をまだ見てない人は先にこちらをご覧ください。
サーバとは

サーバとは簡単に言うと、ユーザーが必要なサービスを提供しているコンピュータのことです。
例えば、このブログ・記事のデータもすべてサーバに保存されています。みなさんは現在そのサーバに接続し記事を読んでいることになります。
他にもYouTubeなどの動画やTwitterやInstagramに投稿される文章・画像もすべてサーバに保存されています。
またサーバは止まることがありません。24時間365日ずっと稼働し続けています。
今回利用するHerokuはこのようなサーバを無料できるサービスです。Herokuを利用することで自分が毎回コードを実行しなくても、サーバが常に実行し続けてくれるわけです。
Gitをインストールする

まずはGitコマンドを使用するためにGitをインストールします。
Macの人は既存でインストールされていますのでWindowsの人だけインストールが必要です。
[Other Git for Windows downloads]と[Portable(“thumbdrive edition”)]の2つがありますが、個人的には[Other Git for Windows downloads]をおすすめします。
自分のパソコンのOSに合わせて32bitか64bitを選択してインストールを開始します。
32bitか64bitを調べる方法・・Windowsロゴを右リックして[システム]を選択。[デバイスの仕様] > [システムの種類]に記載されています。
Heroku CLIをインストールする

次にHerokuコマンドを使用するためにHeroku CLIをインストールします。
【Macユーザーの場合】
Macユーザーの人はターミナルでこちらのコマンドを実行してください。
brew install heroku/brew/heroku
【Windowsユーザーの場合】
Windowsユーザーの人はこちらのサイトより32bitまたは64bitを選択してインストールしてください。
Herokuに新規登録する

次にこちらのサイトよりHerokuのアカウントを作成しましょう。
おそらく表示が英語だと思うので上から順に項目を翻訳しておきます。「*」が付いている項目のみ必須です。
- 名前(名)*
- 苗字(姓)*
- メールアドレス*
- 会社名(任意)
- 役職*
- 居住国*
- 使用する言語(プログラミング言語)*
定期実行用にソースコードを修正する
次にサーバ内で定期実行されるように前回作成したソースコードを少し修正します。
サーバ内ではコードが永遠と実行し続けられるため、一連の処理を繰り返す必要があります。もし繰り返す処理を書かなければ「一度実行して終わり」ということになってしまします。
今回はscheduleというライブラリを使用します。scheduleは簡単にコードを定期実行させることができるので非常に便利です。
まずはscheduleの使い方を少し紹介します。
import schedule
from time import sleep
def index():
print("なおコンサルティングへようこそ")
schedule.every().day.at("12:20").do(index)
while True:
schedule.run_pending()
sleep(1)
①定期実行したい処理を関数にします。このコードではindexですね。
②定期実行する間隔を設定します。10分毎なのか、3日毎なのか、毎週何時なのか、毎週何曜日何時なのか、まで設定することができます。このコードでは毎日12:20ですね。
③scheduleコマンドを永久に実行し続けます。whileは条件がTrueであれば後の処理を繰り返すプログラムですが、このコードのように直接Trueと書くことで永遠と処理を繰り返すことができます。
※sleep(1)はバグ防止で必ず必要です。
ではscheduleをインストールして、前回作成したコードに組み込みましょう。
pip install schedule
from seleniu import webdriver
import random
from time import sleep
import schedule
def line():
#Heroku内にあるChromedriverのパスを指定する
driver = webdriver.Chrome('/app/.chromedriver/bin/chromedriver')
driver.get("https://jp.pornhub.com/recommended")
videos_title = []
videos_url = []
for n in range(20):
xpath = f"/html/body/div[3]/div[2]/div[3]/div[1]/div[3]/ul" + "/li[{n}]/div/div[5]/span/a"
video = driver.find_element_by_xpath(value=xpath)
videos_title.append(video.text)
videos_url.append(video.get_attribute("href"))
video_dict = dict(zip(videos_title,videos_url))
random_title = random.choice(videos_title)
random_url = video_dict[random_title]
driver.quit()
driver.get('https://www.deepl.com/ja/translator')
driver.find_element_by_xpath("/html/body/div[3]/main/div[3]/div[3]/section[1]/div[3]/div[2]/textarea").send_keys(random_title)
sleep(10)
output_word = driver.find_element_by_xpath("/html/body/div[3]/main/div[3]/div[3]/section[2]/div[3]/div[1]/textarea").get_attribute("value")
send_contents = f"【--今日のおすすめ動画--】\r\n\r\n 「{output_word}」\r\n\r\n({random_title})\r\n\r\n {random_url}"
TOKEN = '発行したトークン'
API_URL = 'https://notify-api.line.me/api/notify'
TOKEN_DICT = {'Authorization':'Bearer'+''+TOKEN}
send_dict = {'message':send_contents}
requests.post(API_URL, headers=TOKEN_DICT, data=send_dict)
schedule.every().day.at("13:00").do(line)
while True:
schedule.run_pending()
sleep(1)
注意・・Herokuのサーバはイギリスにあるため時差が生じます。日本はイギリスよりも9時間進んでいるので、日本時間で実行したい時間よりも9時間前をコードに書きましょう。
このコードでは13:00となっていますが、日本時間では22:00に実行されます。
requirements.txtを作成する
HerokuはPythonのコードを実行するために必要なプログラムが既にインストールされていますが、ライブラリやフレームワークはインストールされていません。
サーバもパソコンで開発するとき同様に最初にライブラリをインストールしなければ、コード内でライブラリを使用することはできません。
なのでサーバにコードをデプロイすると同時にコード内で使用したライブラリを記載したファイルをデプロイします。こうすることでサーバはファイルに記載されたライブラリをインストールしてくれ、コードが正常に実行できます。
ファイルはコードと同じフォルダに作成します。名前は「requirements.txt」に変更してください。
今回使用したライブラリがこちら
- random
- time
- selenium
- schedule
このうちrandomとtimeは標準ライブラリと呼ばれるPythonに既存でインストールされているライブラリなのでインストールは不要です。今回はseleniumとscheduleを書きます。
requirements.txtには「ライブラリ名==バージョン」と書きます。バージョンは下記のコマンドで調べることができます。
pip freeze

これをコピーしてrequirements.txtにペーストしましょう。

Procfileを作成する
もう1つ必要なファイルがあります。
それはProcfileと呼ばれるサーバ内でどのファイルを実行するのかを決めるファイルです。ファイル名は「Procfile」です。
今回はpythonファイルを実行するのでこのように書きます。
worker: python ファイル名.py
デプロイする
ここまでの準備ができたら最後はいよいよサーバにデプロイします。
デプロイするファイルはすべて同じフォルダにまとめておきましょう。
- main.py
- requirements.txt
- Procfile
それではMacの人はターミナル、Windowsの人はコマンドプロンプトを起動してください。
Herokuにログインする。
heroku login
「heroku: Press any key to open up the browser to login or q to exit:」と表示されたら[Enter]を押しましょう。するとブラウザが起動しHerokuのログイン画面が表示されると思うので[Login]を押します。
Herokuのプロジェクトを作成する。
heroku create プロジェクト名
これはサーバ内のフォルダのようなもので、プロジェクトごとに新しく作ります。
もしプロジェクト名が既に存在する名前であれば「Name 〇〇 is already taken」と表示されるので、他の名前を探しましょう。

プロジェクトが作成されると2つのURLが発行されます。左はデプロイ後にwebアプリケーションなどであればサイトのURLになります。右はデプロイに必要なURLになり、この後使います。
chromedriverをインストールする


コード内ではパソコンにインストールしたChromedriverを使っていましたが、HerokuではHerokuにインストールされたChromedriverを使用する必要があります。
Herokuのサイトにログインし作成したプロジェクトを選択します。[Settings]の[Buildpacks]より[Add buildpacks]をクリック。
下記のURLを追加します。
- https://github.com/heroku/heroku-buildpack-chromedriver.git
- https://github.com/heroku/heroku-buildpack-google-chrome.git
1つ目がChromedriver、2つ目はChrome(ブラウザ)です。

Gitを初期化する
git init
ここからは作成したプロジェクトに対してデプロイしていきます。git initでgitを初期化しています。何をしているのか分からなくても、必ず必要であることを分かっていればOKです。
プロジェクトと紐付けを行う
git remote add heroku https://git.heroku.com/porn-line-bot.git
先程作成された緑色のURLをここで使います。これはサーバと操作しているパソコンを紐付けています。ここからサーバに対する操作を行っていきます。
ファイルを選択する
git add .
「.」でフォルダ内すべてのファイルを選択することができます。このコマンドのためにフォルダ内には余計なファイルを入れないようにしましょう。
注意・・選択するファイルがある位置に移動してください
フォルダ移動する方法
cdコマンドとdirコマンドまたはlsコマンドを使って、デプロイするフォルダの位置まで移動します。
Macでは「ls」、Windowsでは「dir」と入力すると現在いるフォルダ内のファイルを確認することができます。

そして「cd」を使って別のフォルダに移動することができます。
例えばデスクトップ画面のフォルダに移動したいのであれば、①「デスクトップに移動」②「フォルダに移動」と2回移動します。
cd Desktop
cd フォルダ名
ちなみに入力待機画面横に書かれているのが今自分がいるフォルダの位置です。

ファイルをコミットする
git commit -m'コミット名'
git initで初期化した後に変更した内容を保存します。コミット名はなんでもOKです。GitHubではソースコードを管理する都合上コミット名が重要になるときもありますが、サーバへのデプロイは基本最初だけなのでコミット名は適当でOK。
僕はいつもGitHubの癖で「first」と書きます。
サーバにファイルをデプロイする
git push heroku master
最後にサーバへファイルをデプロイします。このときrequirements.txtに書いたライブラリもインストールされます。
特にエラーが起きなければ成功です。
実行する

デプロイされたPythonファイルをサーバ内で実行します。
Herokuのサイトでログインし、作成したプロジェクトを開きます。
[Overview]という項目の真ん中にある[Dyno formation]の右にある[Configure Dynos]をクリック。

ペンマークを押してスライドをクリックし、[Confirm]をクリック。


これでPythonファイルが実行されます。

最後に
今回の記事は少し長くなってしまいましたが、いかがでしたか?
もし分からないことがあればTwtterのDMにて質問してください。
最後までご覧頂きありがとうございました。
それでは、また!