1
1

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 1 year has passed since last update.

クリスマスまでにPythonを使ってDiscordのBOTを作るAdvent Calendar 2022

Day 13

【13日目】正規表現と最近できた落とし穴①【PythonでDiscordBOTを作ろう!】

Last updated at Posted at 2022-12-12

正規表現???? 落とし穴???

正規表現とは、正規な表現です。
つまり、正規な表現ということです。

落とし穴については少し後で紹介します。

例えば、「猫」のメッセージに反応するBOTを作ってください。と言われたとします。
その場合、皆さんならどうするでしょうか。

一般的な例

まず、送られてくるメッセージに対して反応するため、on_messagemessageを取得して、message.contentが猫どうかを判定します。
判定にはifを使えばいいですね。

main.py - async def on_message
@bot.event
async de on_message(message: nextcord.Message):
    if message.content == "":
        await message.reply("にゃーん")

こんな感じに。

しかし依頼主からこんなことを言われました。

猫て!
「ねこ」とか「ネコ」とか「ネコ」にも対応せいや!

するとどうでしょう。

main.py - async def on_message
@bot.event
async de on_message(message: nextcord.Message):
    if message.content == "" or message.content == "ねこ" or message.content == "ネコ" or message.content == "ネコ":
        await message.reply("にゃーん")

だいぶ見にくくなりました。
しかし、更に依頼主から言われます。

「ネこ」とかも猫だからそれも反応してくれや

いやまぁ注文が多いってのは仕方ないですが...

これで、さっきと同じように「message.content == "ねコ"」みたいなのを無限に追加してもいいんですけど...

めんどくさいですよね!!!

というわけで「正規表現」の出番です。

正規表現をつかうと

正規表現を使うには、デフォルトモジュールのreをインポートする必要があります。

とりあえず「猫」に反応させてみましょう。

main.py - async def on_message
import re

@bot.event
async def on_message(message: nextcord.Message):
    if re.search("", message.content):
        await message.reply("にゃーん")

re.searchは、第2引数の文字列を第1引数のパターンで判定します。
searchは「検索」で、どこか一部分でも判定に合えばマッチオブジェクトを返し、まったく合わなければNoneを返します。
ifは、NoneまたはFalseでないようなオブジェクトとかであれば、基本的にTrue判定となって、そのまんま中のコードを実行します。

つまり、メッセージ本文に「猫」という文字が含まれていれば、中のreplyが実行されるという訳です。

さぁこれで動かしてみましょう!!!

...

動きます?
動きませんよね。(ほかに設定をしていなければ)

これが、最近できた落とし穴Message Content Intentです。

通常は、message.contentに、ちゃんとメッセージ本文が送信されますが、ちゃんと設定を行わないとmessage.contentが常に空文字になります。

ンジャハンテイデキンヤンケ!
というわけでちゃんと設定を説明するので!

Intentの有効化

Intent(インテント)とは、おおざっぱに言うと...なんでしょう...Discord側に、この機能使うよ~!みたいなのを説明するようなあれでしょうか...?

しかし、一部のintentはセキュリティー上の観点とかなんか色々から、設定を行わないと使用できません。
というわけで、まずはDiscord Developer Portalに行きましょう。

左からApplicationを選択して、自分のBOTを選択します。
左のメニューからBotを選択して、Botページに行きましょう。

すると、少し下にPrivileged Gateway Intentsという項目があると思います。
これが、intentの設定です。

image.png

書いてあることを訳すと、「Gateway Intentの中には、BOTが認証されている場合は承認を必要とするものがある。あなたのBOTが認証されていないなら、ここから有効化出来るよ」と書いてあります。

認証...?となった方もご安心ください。
BOTの認証については最終日に紹介したいなと思っております。

有効化しよう

オンオフスイッチが3つあります。
上から「Presense Intent」(Discord Presenseを取得する時とかに必要なインテント)「Server Members Intent」(サーバーのメンバー数を取得する時とかに必要なインテント)「Message Content Intent」(メッセージ本文を取得する時とかに必要なインテント)となります。
考えるのがめんどくさいので全部チェックを入れましょう!!♪
すべてチェックを入れたら、下の「Save Changes」を押しましょう。
image.png

そしたら次にコード修正を行います。

main.py
intents = nextcord.Intents.all()
intents.typing = False

bot = commands.Bot(intents=intents)

bot = commands.Botの部分を修正します。
nextcord.Intentsに色々なインテントの関数があります。
これのall(すべてのインテントをつっこんだもりもりインテント)から、typingを引いたものを使います。
typingというのは、「○○が入力中...」のインテントです。
image.png
あまり詳しくはわかりませんが、typingTrueにしてると重くなるらしいです。

修正できたかな?

とりあえずコードを確認してみましょう。

main.py
import re
import nextcord
from nextcord.ext import commands

intents = nextcord.Intents.all()
intents.typing = False

bot = commands.Bot(intents=intents)

@bot.event
async def on_ready():
    print(bot.user.name)

@bot.event
async def on_message(message: nextcord.Message):
    if re.search("", message.content):
        await message.reply("にゃーん")

bot.run("TOKEN")

とりあえず、これで起動させてみましょう。
そして「猫」と送ってみましょう。
image.png

とりあえずこれで「猫」には反応しますね。

次回予告

文量が多くなってしまいそうなので、一旦ここで切らさせていただきます。
次回はこれの続きです!
というわけで、今日の記事はここまでです。
もしよろしければ記事へのいいねをして、次回記事をお楽しみに!

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?