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

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

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

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

Flask

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

OAuth 2.0

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

Python

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

Q&A

解決済

1回答

521閲覧

discord.pyでoauth2を機能させる方法

maruta_yadeee

総合スコア1

Discord

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

Flask

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

OAuth 2.0

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

Python

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

0グッド

0クリップ

投稿2023/09/26 15:16

実現したいこと

discord.pyでoauth2を機能させたい

前提

discord.pyでoauth2を機能させたいです

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

"GET /oauth2_callback?error=invalid_scope&error_description=The+requested+scope+is+invalid,+unknown,+or+malformed. HTTP/1.1" 200 -

該当のソースコード

python

1from threading import Thread 2from flask import Flask, redirect, request, session, url_for 3import requests 4 5app = Flask(__name__) 6 7# Discord OAuth2設定 8client_id = 'YOUR_CLIENT_ID' 9client_secret = 'YOUR_CLIENT_SECRET' 10redirect_uri = 'https://localhost:8080/oauth2_callback' 11scope = 'identify guilds guilds.member guilds.join' 12 13# セッションシークレットキー 14app.secret_key = 'YOUR_ACTUAL_SECRET_KEY' 15 16# Discord OAuth2の認証URL 17authorize_url = f'https://discord.com/api/oauth2/authorize?client_id={client_id}&scope={"%20".join(scope)}&redirect_uri={redirect_uri}&response_type=code' 18 19@app.route('/') 20def home(): 21 return "Welcome to your Flask app!" 22 23@app.route('/oauth2_login') 24def oauth2_login(): 25 # Discord OAuth2認証の認証URLにリダイレクト 26 return redirect(authorize_url) 27 28@app.route('/oauth2_callback') 29def oauth2_callback(): 30 auth_code = request.args.get('code') 31 32 token_url = 'https://discord.com/api/oauth2/token' 33 token_data = { 34 'client_id': client_id, 35 'client_secret': client_secret, 36 'grant_type': 'authorization_code', 37 'code': auth_code, 38 'redirect_uri': redirect_uri, 39 } 40 41 response = requests.post(token_url, data=token_data) 42 if response.status_code != 200: 43 return "トークン取得に失敗しました。" 44 45 response_data = response.json() 46 access_token = response_data.get('access_token') 47 48 # Discord APIを使用してユーザー情報を取得 49 user_url = 'https://discord.com/api/v10/users/@me' 50 headers = { 51 'Authorization': f'Bearer {access_token}', 52 } 53 user_response = requests.get(user_url, headers=headers) 54 if user_response.status_code != 200: 55 return "ユーザー情報の取得に失敗しました。" 56 57 user_data = user_response.json() 58 59 # ユーザー情報をコンソールに表示 60 print(user_data) 61 62 # ユーザー情報をHTMLで表示または他の処理を行うことができます 63 return f"認証成功!ユーザー名: {user_data['username']}" 64 65def run(): 66 app.run(host='0.0.0.0', port=8080) 67 68def keep_alive(): 69 t = Thread(target=run) 70 t.start() 71 72if __name__ == "__main__": 73 keep_alive() 74

試したこと

scopeの書き方を

python

1scope = ['bot', 'identify', 'guilds', 'guilds.join']

python

1scope = ['identify', 'guilds', 'guilds.member', 'guilds.join']v

等の書き方に変えたりしました

補足情報(FW/ツールのバージョンなど)

python v3.10.11
discord.py v2.3.2
flask v2.3.3
requests v2.31.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

discord.pyは使ったことがありませんが、エラーメッセージから推測するに /oauth2_callbackが無いんじゃないかと思います。

Flaskをローカルで、開発サーバを使い動作させると、 http://localhost:5000あたりで動作することになりますが、/oauth2_callbackというURLは存在しますか?

discord.pyがどのようなURLで動作しているのか分かりませんが、認証後のコールバックは http://localhost:5000/oauth2_callbackみたいな感じにしないと整合性取れなかったりしませんか?

投稿2023/09/27 00:48

FiroProchainezo

総合スコア2401

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

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

maruta_yadeee

2023/09/27 15:12 編集

回答ありがとうございます `scope = 'identify guilds guilds.member guilds.join'` この部分を削除して `authorize_url = f'https://discord.com/api/oauth2/authorize?client_id={client_id}&scope={"%20".join(scope)}&redirect_uri={redirect_uri}&response_type=code'` この部分を `authorize_url = f'https://discord.com/api/oauth2/authorize?client_id={client_id}&scope=identify+guilds+guilds.join&redirect_uri={redirect_uri}&response_type=code'` このコードに変更するとエラーが発生しなくなりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問