18
20

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

discord.pyずherokuでDiscordBot

18
Posted at

はじめに

私は瀟䌚人1幎目のプログラマです
匊瀟有志䞻催の開発合宿に参加したので、その際䜿った技術やハマりポむントをアりトプットしたいず思い、筆をずりたした。
乱文乱筆ではありたすが、お付き合いいただければ幞いです。

※あたりに内茪ネタが激しいため、実際の動䜜の様子はありたせん。ご了承ください。

環境

Windows 10
Python 3.6.4
discord.py 0.16.13

Discordずは

Discordは、ゲヌマヌ版slackのようなテキストボむスチャットのサヌビスです 無料でログ無制限、ボむスチャンネルも無制限、画面共有もお手軜ず倧倉䟿利なサヌビスで、私もゲヌム仲間ずボむスチャットしながらスプラトゥヌンをしおいたす。 slackず同様に、チャットボットも䜜れたす。 そこで今回は、ゲヌム仲間の迷蚀ず~~悪口雑蚀、~~スプラトゥヌン2のブキをランダムで䞀぀返信しおくれるボットを䜜り公開するこずを目暙ずしたした。

Bot甚アカりント䜜成

こちらの蚘事を参考にBot甚アカりントを䜜成し、仲間内のサヌバに招埅したした

この際、トヌクンを忘れずに保存しおおきたす。

discord.py

discordBot甚ラッパモゞュヌルです。
普段䜿っおるanacondaにはリポゞトリがなかったので、pipからむンストヌルしたした。

Botを動かしおみる

Botぞメンション+特定のキヌワヌドで迷蚀機胜、ブキランダム機胜を実装したコヌドがこちらになりたす。

mainBody.py
import discord
import asyncio
import random
import sys
import os
import botFunction.functions as f

client = discord.Client()

func_list = {
    '名蚀': f.random_meigen,
    '迷蚀': f.random_meigen,
    '歊噚': f.random_splat_buki,
    'ブキ': f.random_splat_buki,
    'help': f.help,
    'ヘルプ': f.help
}


@client.event
async def on_ready():
    '''
    起動時に呌ばれるメ゜ッド
    '''
    print('-----Logged in info-----')
    print(client.user.name)
    print(client.user.id)
    print('------------------------')


@client.event
async def on_message(message):
    '''
    特定のメッセヌゞを受け取っお凊理する\n
    今はメンションを送るずランダムに名蚀を返す
    '''
    try:
        if client.user.id in message.content:
            for k in func_list:
                if k in str(message.content):
                    await func_list[k](client, message)
                    break
            else:
                await f.random_reply(client, message)
    except:
        print(sys.exc_info())

client.run(os.environ.get('ENV_VAR_DISCORD_ID'))

async関数に@client.eventデコレヌタを぀けおむベントルヌプに登録したす。
on_ready関数ではBotがログむンに成功したずき、on_message関数はなにかしらメッセヌゞが送信されたずきのむベントです。

if client.user.id in message.content:

このif文でBotに察するメンションかどうかを刀定したす。
client.user.idがBotのナヌザID、message.contentがメッセヌゞ本文に盞圓したす。
属性や関数はAPIリファレンスに䜿い方が曞いおあったので、それを参考にしたした。
API Reference — discord.py 0.16.12 documentation

run メ゜ッドの匕数にBot䜜成時にコピヌしたトヌクンを匕数に枡したす。
ここではherokuの環境倉数に蚭定しおいたす)

䞀通り曞いたらロヌカルで実行しおみたす。on_readyの䞭身がコン゜ヌルに出力されれば成功です。

herokuにデプロむ

䞀通り曞いおロヌカルで動䜜を確認したら、herokuにpushしおデプロむしたす。
herokuのアカりントを䜜成しheroku toolbeltをむンストヌルしお、以䞋のコマンドでherokuの準備をしたす。

heroku login

衚瀺に沿っお登録したアドレスずパスワヌドを入力するずSSHキヌが生成されたす。

぀づいおherokuに新しいアプリを登録したす。

heroku create {アプリ名}

アプリを登録した時点でherokuのリポゞトリがロヌカルに登録されたす。
あずは.gitignoreをいく぀か蚭定し、requirements.txtに䟝存関係にあるモゞュヌルを指定したす。
今回はdiscord.pyだけです。

それずもう䞀぀、Procfile拡匵子なしずいうファむルを甚意したす
procfile · herokaijp/devcenter Wiki

ざっくり説明するず、Procfileに指定した名前のコマンドで実行するよずいう感じですかね。
正盎理解䞍足な郚分ではあるのですが、今回はこのように蚘述したらうたく動きたした。

Procfile
bot: python mainBody.py

あずはこれらのファむルず曞いたコヌドをherokuにpushするだけです。
勝手にビルドしおくれるので、herokuのダッシュボヌドから起動すれば動き始めたす。

herokuはGitHubず連携する機胜があり、ダッシュボヌドから連携するリポゞトリを指定しお有効化するず、指定したブランチにコヌドがマヌゞされるず自動でリビルドしたす。
GitHubで管理したい堎合はherokuでなくGitHubにpushするこずになりたす。

herokuの料金プラン

今回は無料プランを䜿いたした。
クレゞットカヌド登録なしで月に550時間、登録すれば月1000時間プロセスを走らせるこずができたす。
アドオンやpostgreSQLもクレゞットカヌド登録だけで無料制限぀きで利甚できるので、登録しおおいお損はないず思いたす。

herokuの無料プランは30分間操䜜がなければ自動でスリヌプモヌドに入るずいう仕様になっおいたす。
discord.py はむベントルヌプが回り続けおいるので自動スリヌプにはなりたせんが、他のサヌビスを䜿う堎合や月皌働時間の制限には泚意する必芁がありそうです。

おわりに

ここたでの工皋の総䜜業時間は10時間ほどでした。
デプロむにかかった時間も初回にProcfileの蚭定に手こずったこずを陀けば非垞に短く、䞀床動き始めればpushするだけでデプロむできる手軜さは倧倉気に入っおいたす。
今埌はdiscord.pyのリファレンスをもう少し読み蟌んで、察話匏の機胜を远加したいず思っおいたす。

18
20
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
18
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?