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

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

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

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

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Python

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

Q&A

2回答

2185閲覧

[Discord.py]Web認証時にロールを付与したい

BLUE43

総合スコア2

Discord

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

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Python

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

0グッド

0クリップ

投稿2023/01/22 02:56

前提

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

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

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

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

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

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

guest

回答2

0

もし、公開されているライブラリからコピペするならばFlask-Discord-Extendedを使うと良いと思います。
また、403が出るので、headerに"User-Agent": ""を追加すれば、できるようになります。

投稿2023/02/05 10:15

8ka1alu

総合スコア38

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

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

0

自分もやってみましたが、
RuntimeError: Install Flask with the 'async' extra in order to use async views.
が来ます。
これは pip install -U asgiref すれば直りました。


ただ、thread立てて実行してみてもbotがオンラインにならなかったので自分もちょっと挑戦してみます。

投稿2023/01/27 03:32

pecop

総合スコア411

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問