前提
DiscordpyでDiscordのBotを開発しています。
Oauth2を利用して認証用のWebサイトをFlaskで立てて、/callback/へリダイレクトした際にロールを付与する機能を実装ていましたが、以下のようなエラーが発生します。
実現したいこと
- リダイレクト時にロールを付与できるようにしたいです。
発生している問題・エラーメッセージ
Timeout context manager should be used inside a task
該当のソースコード
Python
1import discord 2from flask import Flask, request, render_template 3from discord.ext import commands 4import threading 5import requests 6import json 7 8prefix="?" 9TOKEN = 'Botのトークン' 10intents = discord.Intents.all() 11bot = commands.Bot(command_prefix=prefix,intents=intents) 12 13app = Flask(__name__) 14port = 5000 15client_id = '' 16client_secret = '' 17callback_url = 'http://localhost:'+ str(port) +'/callback/' 18login_url = 'https://discord.com/api/oauth2/authorize?response_type=code&client_id='+ client_id +'&scope=identify&redirect_uri='+ callback_url + '&prompt=consent' 19 20@app.route('/callback/') 21async def callback(): 22 authorization_code = request.args.get("code") 23 request_postdata = {'client_id': client_id, 'client_secret': client_secret, 'grant_type': 'authorization_code', 'code': authorization_code, 'redirect_uri': callback_url} 24 accesstoken_request = requests.post('https://discord.com/api/oauth2/token', data=request_postdata) 25 responce_json = accesstoken_request.json() 26 access_token = responce_json['access_token'] 27 token_type = responce_json['token_type'] 28 expires_in = responce_json['expires_in'] 29 refresh_token = responce_json['refresh_token'] 30 scope = responce_json['scope'] 31 responce_txt = open('responce.txt', 'w') 32 responce_txt.write('access_token: '+ access_token +'\ntoken_type: '+ token_type +'\nexpires_in: '+ str(expires_in) +'\nrefresh_token: '+ refresh_token +'\nscope: '+ scope) 33 responce_txt.close() 34 print(access_token) 35 headers = { 36 'Authorization': f'Bearer {access_token}', 37 } 38 response = requests.get('https://discordapp.com/api/users/@me', headers=headers) 39 user_json = response.json() 40 user_id = user_json["id"] 41 guild = bot.get_guild(サーバーID) 42 user = guild.get_member(int(user_id)) 43 role = guild.get_role(ロールID) 44 await user.add_roles(role) 45 return render_template('complete_window.html', title='Complete') 46 47def DiscordBot(): 48 bot.run(TOKEN) 49 50if __name__ == "__main__": 51 discordbot = threading.Thread(target=DiscordBot) 52 discordbot.start() 53 app.run(port=port) 54
補足情報(FW/ツールのバージョンなど)
python 3.10
Discord.py 2.0
Flask 2.2.2
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。