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

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

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

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

Python 3.x

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

button

HTMLで用いる<button>タグです。

Q&A

解決済

1回答

5102閲覧

discord.py ボタン指定したチャンネルに表示したい

sibainu

総合スコア30

Discord

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

Python 3.x

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

button

HTMLで用いる<button>タグです。

0グッド

0クリップ

投稿2021/07/29 11:30

編集2021/07/30 08:08

前提・実現したいこと

イメージ説明
discordでこのような、ボタンを指定したチャンネルに表示したいです。

発生している問題

ボタンを指定したdiscordのチャンネルに表示したいです。
以下のコードはコマンドを打ったチャンネルに表示してしまいます。

python

1buttons = ButtonsClient(bot) 2@bot.command() 3async def ready(ctx): 4 await buttons.send( 5 content="test", 6 channel=ctx.channel.id, 7 components = [ 8 ActionRow([ 9 Button( 10 label="test", 11 style=ButtonType().Primary, 12 custom_id="join1" 13 ) 14 ]) 15 ] 16 )

試したこと

python

1channel=ctx.guild.get_channel(id)

としましたが

Ignoring exception in command ready: Traceback (most recent call last): File "C:\Users\waon-pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped ret = await coro(*args, **kwargs) File "f:\data\data\test\pythonfill\buttonstest.py", line 88, in ready custom_id="join1" File "C:\Users\waon-pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord_buttons_plugin\__main__.py", line 61, in send "components": retcomp File "C:\Users\waon-pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\http.py", line 254, in request raise HTTPException(r, data) discord.errors.HTTPException: 400 Bad Request (error code: 50035): Invalid Form Body In channel_id: Value "join1" is not snowflake. The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\waon-pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke await ctx.command.invoke(ctx) File "C:\Users\waon-pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\ext\commands\core.py", line 863, in await injected(*ctx.args, **ctx.kwargs) File "C:\Users\waon-pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\ext\commands\core.py", line 94, in raise CommandInvokeError(exc) from exc discord.ext.commands.errors.CommandInvokeError: Command raised an exception: HTTPException: 400 Bad Request (error code: 50035): Invalid Form Body In channel_id: Value "join1" is not snowflake.

となってしまいました。

解決方法

ベストアンサーをご覧ください。

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

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

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

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

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

coolwind0202

2021/07/29 12:27

> channel=ctx.guild.get_channel(id) id変数には何が入っているんですか? あと、なぜこれを試したんですか?
sibainu

2021/07/29 12:30 編集

IdにはチャンネルIdを入れています ctx.channel.idでチャンネルIdを取得していると思ったためです。
coolwind0202

2021/07/29 12:35 編集

> IdにはチャンネルIdを入れています id変数の内容が誤っている可能性を考えましたが、違うかも知れませんね。 これだけでは判断しかねるので、出力されたTracebackをすべてコピーペーストしてください。 > ctx.channel.idでチャンネルIdを取得していると思ったためです。 channel=ctx.channel ではだめなのですか? また、buttons という変数がなにかわかりません。どこで定義されていますか。 omponents は components の誤字のように見えます。
sibainu

2021/07/29 12:49 編集

いろいろご指摘ありがとうございます。 1つめは追記しておきました。 2つめなのですが、コマンドを打ったチャンネルに表示されると思います。また、「.id」をつけないと discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: send() got an unexpected keyword argument 'channel' のようにエラーが出てしまします。 3つめはbuttons = ButtonsClient(bot) と、入力時のミスでした。すみません
guest

回答1

0

ベストアンサー

あなたが利用したのは、 discord-buttons-plugin パッケージで間違いないでしょうか。
実際にこのパッケージを使って、挙動を確認しました。

確認に使ったのは以下のバージョンです。

  • discord-buttons-plugin 0.1.2
  • discord.py 1.6.0

エラーについて

discord.errors.HTTPException: 400 Bad Request (error code: 50035): Invalid Form Body In channel_id: Value "join1" is not snowflake.

channel 引数にはチャンネルのIDを渡すようです。引数名と食い違っていて、不親切に思えますが・・・


discord_buttons_plugin - __main__.py 54行目

r = http.Route('POST', '/channels/{channel_id}/messages', channel_id = channel)

channel 引数を文字列中に埋め込んでいます。
DiscordAPIが期待しているのはチャンネルのIDなので、 channel 引数に discord.TextChannel オブジェクトを渡すと、APIは 400 Bad Request を返却しますね。


指定したチャンネルにボタンを投稿させるなら、

@bot.command() async def create(ctx): await buttons.send( content="test", channel=769408470088286238, # ボタンを投稿させたいチャンネルのIDに変えてください components = [ ActionRow([ Button( label="test", style=ButtonType().Primary, custom_id="join1" ) ]) ] )

というように、 channel 引数に チャンネルID をそのまま渡せばよいでしょう。

私の環境ではこれで動作しています。

投稿2021/07/30 05:23

coolwind0202

総合スコア708

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

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

sibainu

2021/07/30 08:07

大変わかりやすく回答してくださりありがとうございます。 channelにはチャンネルIDを渡すだけで良かったのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問