【ラズパイ×Python】Discord Botで作る入力フォーム

2024/07/30

Discord ラズパイ

  • B!

作りたいもの

Discord Botにあるモーダルウィンドウを活用してフォーム的な物を作成する。

Discord Botに実装した他の機能と合わせて使用できる、記録フォーム的なツールとして活用したい。

GASの記述

スプレッドシートを作成し、「拡張機能」から「Apps Script」をクリックしてエディタを開き、以下を記述する。

GAS
function doGet(e) {
  //データ
  var dt = e.parameter.dt;
  var mail = e.parameter.mail;
  var name = e.parameter.name;
  var subject = e.parameter.subject;
  var contents = e.parameter.contents;
  
  //Activeになっているsheetを取得
  var sheet = SpreadsheetApp.getActiveSheet();
 
  //書き込み
  sheet.appendRow([dt, mail, name, subject, contents]);
}

「デプロイ」から「新しいデプロイ」→「ウェブアプリ」→アクセスできるユーザーを全員に設定する。

これにより、URLを知っている全員がアクセス可能な状態になるため、URLの管理には注意する。

作成したウェブアプリのURLをメモする。

Botのプログラム

bot.py
#!/usr/bin/python3
import discord
from discord.ext import commands
import datetime
import requests
import datetime

url = 'ウェブアプリURL'

#スプレッドシートに記録するためのリクエスト用URLを作成
def mkUrl(url, dt, mail, name, subject, contents):
    newUrl = url + '?'
    newUrl += 'dt=' + str(dt) + '&'
    newUrl += 'mail=' + str(mail) + '&'
    newUrl += 'name=' + str(name) + '&'
    newUrl += 'subject=' + str(subject) + '&'
    newUrl += 'contents=' + str(contents) + '&'
    return newUrl

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(
    command_prefix=commands.when_mentioned_or("!"), debug_guilds=[サーバーID], intents=intents
)
client = discord.Client()
channel = チャンネルID

@bot.event
async def on_ready():
    print('[INFO] <' + str(datetime.datetime.now().replace(microsecond=0)) + '> Bot is active')


class MyModal(discord.ui.Modal):
    def __init__(self, *args, **kwargs) -> None:
        #setting mnodal
        super().__init__(
            discord.ui.InputText(
                label="Mail",
                placeholder="◯◯◯◯@◯◯◯◯◯◯",
                style=discord.InputTextStyle.short,
                required = True, #必須項目
            ),
            discord.ui.InputText(
                label="Name",
                placeholder="Python×Raspi",
                style=discord.InputTextStyle.short,
                required = True,
            ),
            discord.ui.InputText(
                label="Subject",
                placeholder="〇〇の件について",
                style=discord.InputTextStyle.short,
                required = True,
            ),
            discord.ui.InputText(
                label="Contents",
                placeholder="あsdfghjkl;:」",
                style=discord.InputTextStyle.long, #複数行
                required = True,
            ),
            *args,
            **kwargs,
        )

    async def callback(self, interaction: discord.Interaction):
        #Response
        embed = discord.Embed(
            title="Request",
            fields=[
                discord.EmbedField(
                    name="> Mail", value=self.children[0].value, inline=False
                ),
                discord.EmbedField(
                    name="> Name", value=self.children[1].value, inline=False
                ),
                discord.EmbedField(
                    name="> Subject", value=self.children[2].value, inline=False
                ),
                discord.EmbedField(
                    name="> Contents", value=self.children[3].value, inline=False
                ),
            ],
            color=discord.Color.from_rgb(153,170,181)
        )
        await interaction.response.defer()

        #ここからモーダルの処理
        dt = str(datetime.datetime.now().replace(microsecond=0))
        mail=self.children[0].value
        name=self.children[1].value
        subject=self.children[2].value
        contents=self.children[3].value

        #スプレッドシートに送信
        upUrl = mkUrl(url, dt, mail, name, subject, contents)
        requests.get(upUrl)

        await interaction.followup.send(embeds=[embed])


@bot.slash_command(name="modal")
async def modal_slash(ctx: discord.ApplicationContext):
    """Modal Window"""
    modal = MyModal(title="Modal Form")
    await ctx.send_modal(modal)

bot.run("TOKEN")

実行結果

Writer

アイコン
Python×Raspi IoTシステム・Bot・ラズパイの記録
  • プログラミング
  • IoT
  • Python
\FOLLOW ME/ 𝕏

Ranking

Community

Search