質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

3528閲覧

DiscordのBotで429 Too Many Requests (error code: 0)エラーが起きないようにするには

_MIZUKI

総合スコア0

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/27 08:51

前提・実現したいこと

DiscordのBotをReplitを使用しBotを常時オンラインにさせようとしていましたが、下記のエラーにより気づいたら止まっていました。
Botの用途は、on_member_joinを使用してチャンネル誘導やadd_rolesを使用してロールの付与を目的にしています。
私自身調べたのですが、commands.cooldownというのを使用すればよくなるというのは分かったのですが、使い方がよくわからず.....
下記のエラーが起こらないようにするにはどうしたらよいのか、教えてほしいです。

発生している問題・エラーメッセージ

429 Too Many Requests (error code: 0)

該当のソースコード

python

1import discord 2from discord.ext import tasks 3import random, string 4import re 5import keep_alive 6 7intents = discord.Intents.default() 8intents.members = True 9client = commands.Bot(command_prefix = '_',intents=intents) 10 11 12#offline dnd online 13@client.event 14async def on_ready(): 15   print("aaa") 16 17GuildID = XXXXXXXX0000000 18GreetingChannel = XXXXXXXX0000000 19First_channel = XXXXXXXX0000000 20@client.event 21async def on_member_join(member): 22 if member.guild.id == GuildID: 23 channel = client.get_channel(GreetingChannel) 24 data = str(member.mention) + "さんようこそ!\n<#"+ str(First_channel) +">を見てね!" 25 await channel.send(data) 26 27 28Determined = [XXXXXXXX0000000,XXXXXXXX0000000] 29@client.event 30async def on_message(message): 31 user = message.guild.get_member(int(message.author.id)) 32 if message.channel.id in Determined: 33 if message.author.bot: 34 return 35 sat = re.search(r'(fcf_)',message.content) 36 if sat: 37 AA = re.search(r'(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~))',message.content) 38 if AA: 39 role = message.guild.get_role(XXXXXXXX0000000) 40 if role not in user.roles: 41 await user.add_roles(role) 42 AA_emoji = "<:AA:XXXXXXXX0000000>" 43 await message.channel.send(message.author.name + ' joined ○○' + AA_emoji) 44 else: 45 await message.channel.send(message.author.name + ' is already in') 46 47keep_alive.keep_alive() 48my_secret = os.environ['TOKEN'] 49client.run(my_secret)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gx1285

2021/07/28 04:19

keep_alive.keep_alive() じゃ無くてkeep_alive() です
guest

回答1

0

コードは見ていませんが、
429 Too Many Requests (error code: 0)
というのはレートリミットを越えてリクエストしたとかではないでしょうか?
ただ、単に超えたくらいではdiscord pyがよしなにしてくれるので遅延する程度で収まるのでもう少し重大な何かが起こっているのかもしれません。

いずれにして、なぜその事態が引き起こされたか原因を調査しないと対策のしようがないと思います。

基本の基本として、本質的に過剰なリクエストが発生する可能性のある動作であるからその事態になったのか、そもそもそんな事にならない筈の動作なのにバグによってそういう事態になったのか切り分けないとどうにもなりません。

またクールダウンなどの「(頻度に基づく)ある条件を満たせば一定期間動作しない」という対応ですが、それで本当にいいかどうか検討する必要があります。

たとえば、on_member_joinに動作を設定してロールを付与するなどしていた場合、クールダウンなどを設けると、人によってjoin時にロールが付与されたり付与されなかったりという大変な問題がおこります。

あとkeep_aliveってなんですか?
通常、ボットで使うことは無さそうですが。
何の為に使っているのでしょうか?

追記
今思いましたが、そのエラーって誰が言ってきてます??
もしかしてdiscordのAPIじゃなくて、ボットの動作しているサーバーが言ってるのですか??

投稿2021/07/27 12:53

編集2021/07/27 12:59
udon-ken

総合スコア657

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_MIZUKI

2021/07/27 13:03

keep_aliveはReplitをしようするとき必要と書いてあったので使用しています。 はい、サーバーが言っています!!!!フルで載せるとこう言っていますね! Command raised an exception: NotFound: 404 Not Found (error code: 0): Interaction is unknown (you have already responded to the interaction or responding took too long)
udon-ken

2021/07/27 13:18 編集

フルで言うと?? 一部でいうと429でフルでいうと404なんて事ありえないと思いますが・・・ > DiscordのBotをReplitを使用しBotを常時オンラインにさせようとしていましたが、 なんとなく、そのサーバーはそういう事を想定しておらず、頻繁な動作は制限を入れているのではないでしょうかね。 いずれにしても、どうしてそうなるのかの原因を調査して、特定できないとしても「こいういう時は問題無かった」的な検証結果の積み重ねで原因を推定するような事をするしかないのではないですかね。 少しでも何か検証しましたか??
_MIZUKI

2021/07/27 13:22

すみません。コピーするところを間違えてしまっていました。ほんとすみません。 429 Too Many Requests (error code: 0): You are being blocked from accessing our API temporarily due to exceeding our rate limits frequently. Please read our docs at https://discord.com/developers/docs/topics/rate-limits to prevent this moving forward. APIを呼びすぎているのかなと思う、ニックネームを変更をBotの機能で入れていたのですが、それを削除し、実行しても同じ結果になりましたね!!
udon-ken

2021/07/27 13:39

全文によると、discordがエラーと言ってきてるのですね。 ということはその【keep_aliveが関係ないのなら】コード上で何か発見できるかもしれませんね。 まあ、かといって最初の回答の最初に書いた事になりますが、そう簡単にそういう状態にはならないのですよね。 また、コードを【チラッと】見た限りではそこまで問題になりそうな【感じ】はしません。 これは、あくまで【感じ】ですので検証する必要はあります。 > ニックネームを変更をBotの機能で入れていたのですが、それを削除し、実行しても同じ結果になりましたね!! なるほど。 であれば、その調子で検証を続ければ何かわかるかもですね。
_MIZUKI

2021/07/27 13:45

分かりました。このまま色々省いていき検証していきます。 また分からなかったら、質問させていただきます。
udon-ken

2021/07/27 14:00

パッと見た感じだけで言うけど… discordのAPIがレートリミットかけてるのは【基本的には】awaitする操作です(一部例外あり)。 というかそもそもdiscord py 的にAPIにリスクエストする操作はawaitが必要ってことですけど。 つまり、getなんとかはAPIにリクエストしないのでレートリミット関係無し。 コードを見た限りでは、awaitする操作をループしたりしていないので、【通常】レートリミットにかかりそうにないし、かかったとしてdiscord pyがよしなにしてくれて遅延するだけと思うんですよね。 秒間何十回もコマンドがきたり、joinがあったりしたらわかりませんが。 となると、そういう状況でないならReplitの影響で何かが起こっている公算が高いです。 とりあえず、ローカルマシンとかで動かしてみてどうかを検証する方が早いかも。 ローカルマシンでも同様ならコードですけど。
Waki285

2021/07/28 00:44

Replitでは有料プランのAlways Onを使用しない限り、Botが5分間でオフラインになってしまうので、keep_aliveを使ってサーバーを立ち上げ、そこにuptimerobotやらなんたらでリクエストを送って常時起動させていた覚えがあります。
Za_discord

2022/04/28 01:05

えーとimport keep_aliveのkeep_aliveはファイルの名前で内容はflaskでコードを書いています ちなみに言うとuptimerobotが時々落ちることがあります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問