Blogブログ

【HLC-Bot】Discordで動くBotを作ってみた。具体的な実装方法をご紹介!-Part2-

HLC-Botとは(記事はこちら)

実装方法Part1(記事はこちら)

こんにちは、HLCのいろいろエンジニアの掛橋です🧑‍💻
(最近趣味からガチサウナーになるため、サウナハットを購入したいと考えています🧖‍♂🧖‍♂🧖‍♂)

実装方法Part1では

ローカルでBotを実行し、Discordに書き込みをするとスプレッドシートに記載してくれるものを作成しました。

この記事でできること

・BotをローカルではなくHEROKU上で動かします。
・Botがtenorというサイトからgif画像を取得してくれます。

使用するサービス

github
HEROKU
Tenor API

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)

完成後の動画はこちら!

お疲れ様でした!!!
(あぁ、犬猫もふもふしながら眠りにつきたいなぁ〜🐶🐱)