【備忘録】Linux上でDiscordのbotをPythonで動かす

なんかいきなりアルファベット並べだして何だこいつと思われた方すみません。

Discordという世界最高コミュニケーションツールがあるのはご存知の方も多いかと思われますが、今回はそのbotをPythonで動かしてみたというお話です。

まあまあややこしい部分があったので、忘れないように以下にやり方を書いておきます。

※Python3です。細かい環境は忘れた。動かなかったらごめんね

※ブログの仕様上コードがクソ見にくいです。

①Pythonを書く

discord.pyというライブラリを使います。discord.pyの使い方やインストール方法はググってください。

とりあえず以下は、起動したときや話しかけられたとき、特定ワードが投稿されたときなどに反応するごく簡単なbotのソースです。

import discord

TOKEN = 'トークンを書く'

client = discord.Client()

# チャンネルID
CHANNEL_ID = 1103354300000000

# 投稿
async def post(hoge):
    channel = client.get_channel(CHANNEL_ID)
    await channel.send(hoge)

# 返信
async def reply(message):
    reply = message.author.mention + ' ' + 'こんにちは!' # 返信メッセージ
    await message.channel.send(reply) # 返信を送信

# 起動時
@client.event
async def on_ready():
    await post('こんにちは')

# メッセージ受信時
@client.event
async def on_message(message):
    # メッセージ発信元がbotである場合は無視
    if message.author.bot:
        return
    # 誰かが「bot」と発言したら返す
    if message.content == 'bot':
        await post('今俺のこと呼んだ?')
        return
    if client.user in message.mentions: # 話しかけられたら返信
        await reply(message)

# botを起動
client.run(TOKEN)

チャンネルIDとかトークンとかは適切なものに直す必要があります。

このコードをたとえばdiscobot.pyみたいな名前で保存したとすると、ターミナル上で「python3 discobot.py」みたいに入力してやればとりあえずは実行できます。

ただ、このやり方だと、botが起動している間は他の作業ができないうえに、ターミナルを閉じてしまうと終了してしまうためbotを常駐させられません。

そこで、「nohup python3 discobot.py < /dev/null&」としてやることで、ターミナルを閉じた後もbotを実行し続けてくれます。

botを落とすときは、「killall “python3 discobot.py”」で落とすか、「ps x」でプロセスIDを探して「kill」で番号指定して落とします。

②cronを設定

不慮の事故でbotが落ちた時に、いちいち「nohup python3 discobot.py < /dev/null&」するのはクソめんどくさいので、落ちていたら自動で再起動させるという風にしたいと思います。

Linuxについている「cron」という機能を利用します。cronの使い方がそもそもわからない人はググってください。

cronに以下のように指定します。

* * * * * pidof -x python3 dicobot.py >/dev/null || python3 discobot.py(※フルパスで書く)

pidof -x ※※※ >/dev/null」は、「※※※」というプロセスが実行中なら0、プロセスが存在しないなら1を返すという動作をします。

つまり、プロセスが存在しないときに限ってbotを起動するという動作をcronに仕込んでおくのです。

これで1分ごとに落ちているかどうかを確認して、落ちていたら再起動するようになりました。

多分これでbotがだいぶ安定的に動作するようになったんじゃあないでしょうか。

まとめ

いかがでしたか?

Kasumi

投稿者: Kasumi

東京都青梅市在住。大学生。

コメントを残す

メールアドレスが公開されることはありません。