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

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

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

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

Python 3.x

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

Q&A

1回答

627閲覧

Discord.pyでロールを付与する

KANOKIw

総合スコア0

Discord

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

Python 3.x

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

0グッド

0クリップ

投稿2023/02/22 16:08

編集2023/03/01 16:49

実現したいこと

uiボタンを押した人にロールをあたえる

前提

初心者です

discord.pyでぼたんをつくり、それに反応してメッセージをおくることまではできました。
しかしロールの付与をしようとするとrole.idのおぶじぇくとがない?ようで、roleでidは定義しているはずなんですが、できてないですか?
それともadd_rolesのつかいかたがちがいますか?

へんし

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

Traceback (most recent call last): File "C:\Users\KUMAN\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ui\view.py", line 425, in _scheduled_task await item.callback(interaction) File "c:\Users\KUMAN\OneDrive\デスクトップ\Discord Bots\Coturnix\Coturnix.py", line 111, in getnormalrole await user.add_roles(user.guild.get_role(role)) File "C:\Users\KUMAN\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\member.py", line 1018, in add_roles await req(guild_id, user_id, role.id, reason=reason) ^^^^^^^ AttributeError: 'NoneType' object has no attribute 'id'

該当のソースコード

Python

1import requests 2import json 3import inspect 4import sys 5import discord 6import datetime 7import asyncio 8 9from colorama import Fore, Style 10from discord.ext import commands 11from discord import app_commands 12 13bot = commands.Bot(command_prefix="/", intents=intents) 14intents = discord.Intents.default() 15intents.members = True 16intents.message_content = True 17client = Coturnix(intents=Intents.none()) 18 19class Coturnix(Client): 20 def __init__(self, *, intents: Intents): 21 super().__init__(intents=intents) 22 self.tree = app_commands.CommandTree(self) 23 self.role = 1076411397816201246 24 25 async def setup_hook(self) -> None: 26 """ This is called when the bot boots, to setup the global commands """ 27 await self.tree.sync() 28 29class button(discord.ui.View): 30 def __init__(self): 31 super().__init__(timeout = None) 32 33 @discord.ui.button(label = "市民になる", style = discord.ButtonStyle.green, custom_id = "role") 34 async def getnormalrole(self, interaction: discord.Integration, button: discord.ui.Button): 35 role = 1076411397816201246 36 user = interaction.user 37 38 print(f"> {Style.BRIGHT}{interaction.user}{Style.RESET_ALL} pushed the button.") 39 40 await user.add_roles(user.guild.get_role(role)) #問題発生個所 41 await interaction.response.send_message( 42 "ロールを付与しました", ephemeral=True) 43 44@client.event 45async def on_ready(): 46 """ 47 bot起動== 48 """ 49 bot.add_view(button()) 50 51@client.tree.command() 52async def ba(interaction: Interaction): 53 """ ロールボタンを出します """ 54 55 56 print(f"> {Style.BRIGHT}{interaction.user}{Style.RESET_ALL} appeared the button.") 57 58 await interaction.response.send_message("ボタンを押してロールをもらってください", view = button())

補足情報

discord.py 2.1.1
追記:use.guild.get_roleでろロールが取れていなかったです

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

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

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

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

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

guest

回答1

0

Ln. 34にasyncで関数定義をしているようですが、引数interactionの型がdiscord.Interactionではなくdiscord.Integrationになっているのが原因ではないでしょうか?一度お試しください。

追記(2/23 22:49)
例外処理のコード例です。

Python

1role: discord.Role = user.guild.get_role(role) 2if role == None: 3 await interaction.response.send_message("Error: ロールの取得に失敗しました。", ephemeral=True) 4 return 5await user.add_roles(role) 6 7await interaction.response.send_message("ロールを付与しました", ephemeral=True)

投稿2023/02/23 00:08

編集2023/02/23 13:55
Tateshiki

総合スコア2

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

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

KANOKIw

2023/02/23 00:57

ありがとうございます。しかし、なおしても同じエラーを出してきます。僕としてはadd_rolesがなければボタンはしっかり働くので、add_rolesで間違っていると思っています。できればadd_rolesのサンプル貰えませすか?
Tateshiki

2023/02/23 13:56

回答に例外処理サンプルを書いてきたので、ご参考までに、、、
KANOKIw

2023/02/23 14:07

回答ありがとうざいます ところで、デバックでuse.guilを確認したところroles: SequenceProxy(dict_values([]))となっていて、ほかの項目もほとんどNoneでした。それがroleを取れていない原因だと思うのですが、botの招待リンクの生成でbotしか選んでないからだったりしますか?
Tateshiki

2023/02/23 16:24

ケースバイケースではありますが、 ・ロールのIDを再確認 ・(身内だけで使うなら)Botに管理者権限を与えてあげる ・BotのページからIntentsの設定をしてパラメータで渡してあげる とかどうでしょうか?
KANOKIw

2023/02/24 12:02

リダイレクトURLはどうすればいいですか?
Tateshiki

2023/02/26 09:39

リダイレクトURLとはなんでしょう…?おそらく関係ないかと思いますが一応どの状況で設定されたか教えて頂けますか?
KANOKIw

2023/03/01 07:49

URL generatorでscopeを選択するときにguild情報を入手するにはguildsを選ばなきゃいけないようなことを見つけて、そこでリダイレクトURLが必須になったのですが、URLを適当に指定してみたのですが、そこにbotがアクセスできるようにする方法がわかってないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問