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

2024/07/30

Discord ラズパイ

  • B!

作りたいもの

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

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

GASの記述

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

GAS
  1. function doGet(e) {
  2. //データ
  3. var dt = e.parameter.dt;
  4. var mail = e.parameter.mail;
  5. var name = e.parameter.name;
  6. var subject = e.parameter.subject;
  7. var contents = e.parameter.contents;
  8. //Activeになっているsheetを取得
  9. var sheet = SpreadsheetApp.getActiveSheet();
  10. //書き込み
  11. sheet.appendRow([dt, mail, name, subject, contents]);
  12. }

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

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

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

Botのプログラム

bot.py
  1. #!/usr/bin/python3
  2. import discord
  3. from discord.ext import commands
  4. import datetime
  5. import requests
  6. import datetime
  7.  
  8. url = 'ウェブアプリURL'
  9.  
  10. #スプレッドシートに記録するためのリクエスト用URLを作成
  11. def mkUrl(url, dt, mail, name, subject, contents):
  12. newUrl = url + '?'
  13. newUrl += 'dt=' + str(dt) + '&'
  14. newUrl += 'mail=' + str(mail) + '&'
  15. newUrl += 'name=' + str(name) + '&'
  16. newUrl += 'subject=' + str(subject) + '&'
  17. newUrl += 'contents=' + str(contents) + '&'
  18. return newUrl
  19.  
  20. intents = discord.Intents.default()
  21. intents.message_content = True
  22.  
  23. bot = commands.Bot(
  24. command_prefix=commands.when_mentioned_or("!"), debug_guilds=[サーバーID], intents=intents
  25. )
  26. client = discord.Client()
  27. channel = チャンネルID
  28.  
  29. @bot.event
  30. async def on_ready():
  31. print('[INFO] <' + str(datetime.datetime.now().replace(microsecond=0)) + '> Bot is active')
  32.  
  33.  
  34. class MyModal(discord.ui.Modal):
  35. def __init__(self, *args, **kwargs) -> None:
  36. #setting mnodal
  37. super().__init__(
  38. discord.ui.InputText(
  39. label="Mail",
  40. placeholder="◯◯◯◯@◯◯◯◯◯◯",
  41. style=discord.InputTextStyle.short,
  42. required = True, #必須項目
  43. ),
  44. discord.ui.InputText(
  45. label="Name",
  46. placeholder="Python×Raspi",
  47. style=discord.InputTextStyle.short,
  48. required = True,
  49. ),
  50. discord.ui.InputText(
  51. label="Subject",
  52. placeholder="〇〇の件について",
  53. style=discord.InputTextStyle.short,
  54. required = True,
  55. ),
  56. discord.ui.InputText(
  57. label="Contents",
  58. placeholder="あsdfghjkl;:」",
  59. style=discord.InputTextStyle.long, #複数行
  60. required = True,
  61. ),
  62. *args,
  63. **kwargs,
  64. )
  65.  
  66. async def callback(self, interaction: discord.Interaction):
  67. #Response
  68. embed = discord.Embed(
  69. title="Request",
  70. fields=[
  71. discord.EmbedField(
  72. name="> Mail", value=self.children[0].value, inline=False
  73. ),
  74. discord.EmbedField(
  75. name="> Name", value=self.children[1].value, inline=False
  76. ),
  77. discord.EmbedField(
  78. name="> Subject", value=self.children[2].value, inline=False
  79. ),
  80. discord.EmbedField(
  81. name="> Contents", value=self.children[3].value, inline=False
  82. ),
  83. ],
  84. color=discord.Color.from_rgb(153,170,181)
  85. )
  86. await interaction.response.defer()
  87.  
  88. #ここからモーダルの処理
  89. dt = str(datetime.datetime.now().replace(microsecond=0))
  90. mail=self.children[0].value
  91. name=self.children[1].value
  92. subject=self.children[2].value
  93. contents=self.children[3].value
  94.  
  95. #スプレッドシートに送信
  96. upUrl = mkUrl(url, dt, mail, name, subject, contents)
  97. requests.get(upUrl)
  98.  
  99. await interaction.followup.send(embeds=[embed])
  100.  
  101.  
  102. @bot.slash_command(name="modal")
  103. async def modal_slash(ctx: discord.ApplicationContext):
  104. """Modal Window"""
  105. modal = MyModal(title="Modal Form")
  106. await ctx.send_modal(modal)
  107.  
  108. bot.run("TOKEN")

実行結果

Writer

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

Ranking

blogmura_pvcount

Community

Search