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

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

新規登録して質問してみよう
ただいま回答率
85.31%
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回答

501閲覧

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/27 15:21

実現したいこ### ヘディングのテキストと

codeを利用してアクセスtokenを取得したい
取得したtokenを利用してユーザー情報の取得、サーバーの参加させたい

前提

flaskでoauth2を機能させるコードを書いています

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

codeを使用してtokenの取得をすることができない

該当のソースコード

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' # Discord Developer Portalから取得したクライアントID 9client_secret = 'YOUR_CLIENT_SECRET' # Discord Developer Portalから取得したクライアントシークレット 10redirect_uri = 'https://localhost:8080/oauth2_callback' 11 12@app.route('/') 13def home(): 14 return "Welcome to your Flask app!" 15 16@app.route('/oauth2_login') 17def oauth2_login(): 18 # Discord OAuth2認証の認証URLにリダイレクト 19 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' 20 return redirect(authorize_url) 21 22@app.route('/oauth2_callback') 23def oauth2_callback(): 24 # 認証後のURLを受け取る 25 auth_url = request.url 26 27 # URLを解析してクエリパラメータを取得 28 from urllib.parse import urlparse, parse_qs 29 url_components = urlparse(auth_url) 30 query_parameters = parse_qs(url_components.query) 31 32 # codeパラメータの値を取得 33 auth_code = query_parameters.get('code', [])[0] if 'code' in query_parameters else None 34 print(auth_code) 35 if auth_code: 36 # 認証コードが存在する場合、アクセストークンを取得 37 token_url = 'https://discord.com/api/oauth2/token' 38 token_data = { 39 'client_id': client_id, 40 'client_secret': client_secret, 41 'grant_type': 'authorization_code', 42 'code': auth_code, 43 'redirect_uri': redirect_uri, 44 } 45 46 # アクセストークンを取得 47 response = requests.post(token_url, data=token_data) 48 response_data = response.json() 49 50 if 'access_token' in response_data: 51 access_token = response_data['access_token'] 52 53 # Discord APIを使用してユーザー情報を取得 54 user_url = 'https://discord.com/api/v10/users/@me' 55 headers = { 56 'Authorization': f'Bearer {access_token}', 57 } 58 59 user_response = requests.get(user_url, headers=headers) 60 user_data = user_response.json() 61 62 # ユーザー情報をコンソールに表示 63 print(user_data) 64 65 # ユーザーをサーバーに参加させる 66 guild_id = '1116022020090638376' # サーバーのIDを指定 67 join_url = f'https://discord.com/api/v10/guilds/{guild_id}/members/{user_data["id"]}' 68 join_data = { 69 'access_token': access_token, 70 } 71 72 join_response = requests.put(join_url, json=join_data) 73 74 if join_response.status_code == 201: 75 return "認証成功!ユーザーがサーバーに参加しました。" 76 else: 77 return "認証成功!サーバーへの参加に失敗しました。" 78 79 return "認証失敗" 80 81def run(): 82 app.run(host='0.0.0.0', port=8080) 83 84def keep_alive(): 85 t = Thread(target=run) 86 t.start() 87 88if __name__ == "__main__": 89 keep_alive()

試したこと

codeを使用してtokenを取得するコードを別の書き方に変えたりした

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

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

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

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

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

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

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

guest

回答1

0

やったことが無い回答で申し訳ないですが、Qiita: PythonでDiscordのOAuth2をやってみるを参考に調整してみてはいかがですか?

また、「tokenを取得できない」というのは

  1. if 'access_token' in response_data:がtrueにならない
  2. そもそも認証が通らない

のどちらなんでしょうか?

なんらかのメッセージが表示・取得されているならその文章を省略せず質問に書くと回答が付きやすいです。

また、「codeを使用してtokenの取得をすることができない」と判断した根拠も書いた方が良いです。

access_tokenが無いから相判断したのか、認証に失敗しているのかで回答が異なると思います。

投稿2023/09/28 02:25

FiroProchainezo

総合スコア2443

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問