HLC-Botとは(記事はこちら)
実装方法Part1(記事はこちら)
こんにちは、HLCのいろいろエンジニアの掛橋です🧑💻
(最近趣味からガチサウナーになるため、サウナハットを購入したいと考えています🧖♂🧖♂🧖♂)
実装方法Part1では
ローカルでBotを実行し、Discordに書き込みをするとスプレッドシートに記載してくれるものを作成しました。
この記事でできること
・BotをローカルではなくHEROKU上で動かします。
・Botがtenorというサイトからgif画像を取得してくれます。
使用するサービス
1.前回作成したプロジェクトを修正
HEROKU上で動かすために必要なファイルを追加します。
・runtime.txt : どのPythonのバージョンで動かすか
・Procfile : HEROKUで動かすためのコマンド
・requirements.txt : 依存パッケージを管理
runtime.txtのソース
python-3.9.5
workerのソース
worker: python main.py
requirements.txtについて
コマンドで作成します。
$ pip freeze > requirements.txt
(freeze コマンドを使用するためにgunicornが必要です。なければ以下を実行)
$ pip install gunicorn
requirements.txtの中身はこんな感じ。
2.GitHubでプロジェクトを管理
プロジェクトをgithubに上げましょう。
公開設定はPrivate、PublicどちらでもOKです。
※publicの場合、jsonファイルを公開しないように注意しましょう。
jsonファイル内の環境変数はHEROKU上で管理できます。
3.HEROKUの準備
HEROKUのユーザー登録をし、ログインします。
New → Create new app
App name:Heroku上で管理するアプリ名を入力
(他のユーザーが作ったアプリ名と被るとエラーになります。)
Chose region:United Statesを選択
Pipeline:設定しなくて大丈夫です。
Create appを選択します。
作成できたら、Deployの画面に切り替わります。
GitHubを選択しましょう。
GitHubとのアカウント連携後、プロジェクトを検索して、Connect
Manual deploy→ ブランチ確認して、DeployBranchを押す。
Automatic deploysはmainやmasterというブランチ名が更新されれば自動でデプロイしてくれる機能です。
必要であればEnableにしましょう。
デプロイに成功したらこのような表示になります。
デプロイ成功後、Resourcesより、main.pyを実行します。
スイッチが右側になるように、変更を加えます。
Botが正しく動いている場合、DiscordのBotがOnlineになります。
Botが動かない場合、以下のCLIを入れてログを確認します。
https://devcenter.heroku.com/ja/categories/command-line
以下のコマンドでリアルタイムにログを出力します。
heroku logs –tail
pythonのソースの場合 print()の内容をログ出力してくれます。
怪しい箇所にprint()を置いてみましょう。
4.tenorのAPIKEY取得、main.pyのソースを修正
https://tenor.com/gifapi/documentation
googleアカウントよりログインし、tenorのAPIKEYを取得します。
以下
Discordで’ねこ’, ‘ネコ’, ‘猫’, ‘にゃ’, ‘ニャ’, ‘🐱’が入力された時、ランダムで1枚gif画像を送ってくれるソース
変数TENOR_TOKENにはtenorのAPIKEYを入れてください。
# coding: UTF-8
from logging import fatal
from typing import List
import discord
import gspread
import json
import requests
import random
import os
DISCORD_TOKEN = ********
TENOR_TOKEN = ********
# tenor.comからgif取得するメソッド
async def get_gif(channel, searchTerm):
get_count = 50 #取得するgifの数
response = requests.get("https://g.tenor.com/v1/search?q={}&key={}&limit={}".format(searchTerm, TENOR_TOKEN, get_count))
data = response.json()
random_int = random.randint(0, get_count-1) #ランダム値の生成
gif_url = data['results'][random_int]['media'][0]['gif']['url']
embed = discord.Embed()
embed.set_image(url=gif_url)
return await channel.send(embed=embed)
# Discordに文字が入力された時の処理
@client.event
async def on_message(message):
content = message.content
if any(x in content for x in ('ねこ', 'ネコ', '猫', 'にゃ', 'ニャ', '🐱')):
await get_gif(message.channel, 'cat')
client.run(DISCORD_TOKEN)
完成後の動画はこちら!
お疲れ様でした!!!
(あぁ、犬猫もふもふしながら眠りにつきたいなぁ〜🐶🐱)