带有Discord API的cURL PUT / PATCH请求导致错误400(错误请求)

时间:2020-08-07 21:59:57

标签: php curl oauth-2.0 discord

我正在使用php,oAuth2(来自Discord)和cURL连接到Discord API,在用户授权连接后,他将自动输入具有特定昵称和角色的服务器(行会),但是如果用户已经在服务器上,只需更改昵称并自动添加角色即可。

我在Auth2上取得了成功,因此我正在研究它。他使用identyguilds.joinemail范围返回了我想要的所有内容。但是,在将成员添加到服务器或编辑成员的过程中,它返回错误400(错误请求)。而且我真的不知道它是什么,所以我所看到的似乎没事。

奇怪的是,昨天它只能在匿名浏览器选项卡中运行,但是今天,它甚至可以在我的普通浏览器中运行,但是对于其他用户而言,则不起作用。

说实话,我已经出现了错误400和403,这确实非常令人困惑。

我的完整代码:

class Discord extends CodonModule {
    private static $OAUTH2_CLIENT_ID = 'CLIENT_ID';
    private static $OAUTH2_CLIENT_SECRET = 'CLIENT_SECRET';
    private static $BOT_TOKEN = 'CLIENT_TOKEN';

    private static $guildID = 453922275248265175;
    private static $roleID = 45129328442467690261;

    public static $authorizeURL = 'https://discordapp.com/api/oauth2/authorize';
    public static $tokenURL = 'https://discordapp.com/api/oauth2/token';
    public static $apiURLBase = 'https://discordapp.com/api/users/@me';
    
    public function login() {
        $params = array(
            'client_id' => Discord::$OAUTH2_CLIENT_ID,
            'redirect_uri' => 'LINK/request',
            'response_type' => 'code',
            'scope' => 'identify guilds.join email'
        );

        // Redirect the user to Discord's authorization page
        header('Location: https://discordapp.com/api/oauth2/authorize' . '?' . http_build_query($params));
        die();
    }

    public function request() {
        if($this->get('code')) {
            // Exchange the auth code for a token
            $token = $this->apiRequest(Discord::$tokenURL, array(
                "grant_type" => "authorization_code",
                'client_id' => Discord::$OAUTH2_CLIENT_ID,
                'client_secret' => Discord::$OAUTH2_CLIENT_SECRET,
                'redirect_uri' => 'LINK/request',
                'code' => $this->get('code')
            ));
            $logout_token = $token->access_token;
            $_SESSION['access_token'] = $token->access_token;

            header('Location: ' . $_SERVER['PHP_SELF']);
        }

        if($this->session('access_token')) {
            $user = $this->apiRequest(Discord::$apiURLBase);
            $userID = intval($user->id);
            $userTAG = $user->username.'#'.$user->discriminator;

            $newName = 'Teste';
            
            $params = '{"access_token": "'.$_SESSION['access_token'].'", "nick": "'.$newName.'", "roles": ['.Discord::$roleID.']}';
            $code = $this->membersRequest($userID, 'PUT', $params);

            // The pilot is not on the guild
            if($code == 201) {
                $this->show('discord/discord_success.php');
                return true;
            } elseif($code == 204) {
                // The pilot is already on the server
                $params2 = '{"nick": "'.$newName.'", "roles": ['.Discord::$roleID.']}';
                $http = $this->membersRequest($userID, 'PATCH', $params2);

                if($http == 204) {
                    $this->show('discord/discord_success.php');
                    return true;
                } else {
                    $this->show('discord/discord_error.php');
                    return false;
                }
            } else {
                $this->show('discord/discord_error.php');
                return false;
            }
        } else {
            $this->index();
        }
    }

    function apiRequest($url, $post=FALSE, $headers=array()) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

        $response = curl_exec($ch);

        if($post)
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));

        $headers[] = 'Accept: application/json';

        if($this->session('access_token'))
            $headers[] = 'Authorization: Bearer ' . $this->session('access_token');

        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        $response = curl_exec($ch);
        return json_decode($response);
    }

    function membersRequest($userID, $post, $params) {
        $membersURL = 'https://discordapp.com/api/guilds/'.Discord::$guildID.'/members/';
        $url = $membersURL.$userID;

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $post);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Authorization: Bot ' . Discord::$BOT_TOKEN,
            'Content-Type: application/json'
        ));
        
        curl_exec($ch);
        $http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        
        return $http;
    }

    function get($key, $default=NULL) {
        return array_key_exists($key, $_GET) ? $_GET[$key] : $default;
    }

    function session($key, $default=NULL) {
        return array_key_exists($key, $_SESSION) ? $_SESSION[$key] : $default;
    }
}

任何帮助将不胜感激。非常感谢。

0 个答案:

没有答案