@Vadtea

Как закинуть пользователя на сервер дискорда?

В общем мне нужен следующий функционал, при переходе по ссылке, пользователь нажимает кнопку авторизоваться и попадает сразу на мои сервера их 3 шт , но тест провожу пока на 1, но в коде ловлю ошибки по запросу 401 и уже который день не могу понять в чем дело

import httpx
from quart import Quart, redirect, request

app = Quart(__name__)

CLIENT_ID = "тут мой клиент ид"
CLIENT_SECRET = "тут мой клиентский секрет"
SERVER_ID = "тут мой ид сервера на который над вступить"


async def request_access_token(code):
    async with httpx.AsyncClient() as client:
        response = await client.post(
            "https://discord.com/api/oauth2/token",
            data={
                "client_id": CLIENT_ID,
                "client_secret": CLIENT_SECRET,
                "code": code,
                "grant_type": "authorization_code",
                "redirect_uri": "http://localhost:5000/redirect",
                "scope": "identify+guilds.join",
            }
        )
    return response.json()


async def join_server(access_token):
    headers = {"Authorization": f"Bearer {access_token}"}

    # Выведем токен доступа в консоль
    print("Access Token:", access_token)

    # Получаем информацию о текущем пользователе
    async with httpx.AsyncClient() as client:
        user_info_response = await client.get("https://discord.com/api/users/@me", headers=headers)

    if user_info_response.status_code != 200:
        print("Код состояния ответа при получении информации о пользователе:", user_info_response.status_code)
        return False

    user_info = user_info_response.json()
    user_id = user_info.get("id")

    # Присоединение пользователя к серверу
    async with httpx.AsyncClient() as client:
        response = await client.put(f"https://discord.com/api/v10/guilds/{SERVER_ID}/members/{user_id}",
                                     headers=headers)

    if response.status_code != 201:
        print("Код состояния ответа при добавлении пользователя на сервер:", response.status_code)
        return False

    return True


@app.route("/")
async def home():
    return "Привет, это домашняя страница!"


@app.route("/login")
async def login():
    auth_url = (
        "https://discord.com/api/oauth2/authorize"
        f"?client_id={CLIENT_ID}"
        "&redirect_uri=http://localhost:5000/redirect"
        "&response_type=code"
        "&scope=identify+guilds.join"
        f"&guild_id={SERVER_ID}"
    )
    return redirect(auth_url)


@app.route("/redirect")
async def redirect_handler():
    code = request.args.get("code")

    # Обмен кода на токен
    token_response = await request_access_token(code)
    access_token = token_response.get("access_token")

    if access_token:
        # Присоединение пользователя к серверу
        join_response = await join_server(access_token)

        if join_response:
            return "Пользователь успешно добавлен на сервер!"
        else:
            print("Не удалось добавить пользователя на сервер")
            return "Не удалось добавить пользователя на сервер", 500
    else:
        return "Не удалось получить токен доступа", 500


if __name__ == "__main__":
    app.run(debug=True)
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Используй нормальные дискордовские инвайт-ссылки. Другого варианта нет, иначе спамеры бы засовывали свои серверы всем подряд.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы