Top.Mail.Ru
Ответы

PHP - Логин в роблоксе через API запросы, continue

вообщем, я пытаюсь сделать логин в роблоксе через API запросы, но я столкнулся с такой проблемой, что при отправке запроса на https://apis.roblox.com/challenge/v1/continue , я получаю в ответе это:

{
""status Code": 403,
"statusText": "Forbidden",
"errors": [
{
"code": 1,
"message": "an internal error occurred"
}
]
}

Сколько бы я не пробовал что либо менять, добавлять и так далее - ничего не помогает, я уже не знаю, что делать.

Ответы от ии - идут лесом.

Код:


123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
 <?php 
 
$request_body = file_get_contents('php://input'); 
$request_body = json_decode($request_body, true); 
 
function get_csrf_token() { 
    $csrf_url = "https://www.roblox.com"; 
    $csrf_headers = ["User-Agent: Mozilla/5.0"]; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $csrf_url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
     
    curl_setopt($ch, CURLOPT_HTTPHEADER, $csrf_headers); 
    $csrf_response = curl_exec($ch); 
    curl_close($ch); 
     
    preg_match('/meta name="csrf-token" data-token="(.*?)"/', $csrf_response, $matches); 
    $csrf_token = $matches[1] ?? null; 
    return $csrf_token; 
}; 
$csrf_token = get_csrf_token(); 
 
function continue_load($challengeId, $unifiedCaptchaId, $captchaToken, $actionType, $challengeType) { 
    $login_url = "https://apis.roblox.com/challenge/v1/continue"; 
    $login_data = [ 
        "challengeId" => $challengeId, 
        "challengeMetadata" => json_encode([ 
            "unifiedCaptchaId" => $unifiedCaptchaId, 
            "captchaToken" => $captchaToken, 
            "actionType" => $actionType 
        ]), 
        "challengeType" => $challengeType 
    ]; 
     
    $headers = [ 
        "Content-Type: application/json", 
        "User-Agent: Mozilla/5.0", 
        "X-Csrf-Token: " . $csrf_token 
    ]; 
     
    $options = [ 
        CURLOPT_URL => $login_url, 
        CURLOPT_POST => true, 
        CURLOPT_POSTFIELDS => json_encode($login_data), 
        CURLOPT_HTTPHEADER => $headers, 
        CURLOPT_RETURNTRANSFER => true, 
        CURLOPT_COOKIEJAR => $cookie_string, 
        CURLOPT_COOKIEFILE => $cookie_string 
    ]; 
     
    $ch = curl_init(); 
    curl_setopt_array($ch, $options); 
    $response = curl_exec($ch); 
    curl_close($ch); 
    return $response; 
} 
$login_response = continue_load($request_body['challengeId'], $request_body['unifiedCaptchaId'], $request_body['captchaToken'], "Login", "captcha"); 
print_r($login_response); 
print_r($login_data); 
?> 
По дате
По рейтингу
Аватар пользователя
Высший разум
3мес

Вот так вот:

12
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  

делать не надо. Сталкивался с тем, что некоторые сайты блокируют такие запросы.

И вот это:

1
 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 

тоже лишнее. У тебя же совершенно стандартный GET-запрос, который не требует переопределения типа запроса.

Вот это:

123456789
 $login_data = [
    "challengeId" => $challengeId,
    "challengeMetadata" => json_encode([
        "unifiedCaptchaId" => $unifiedCaptchaId,
        "captchaToken" => $captchaToken,
        "actionType" => $actionType
    ]),
    "challengeType" => $challengeType
]; 

выглядит очень странно: внутри JSON обычно не размещают данные, уже закодированные в JSON. Куда вероятнее, что должно быть так:

123456789
 $login_data = [
    "challengeId" => $challengeId,
    "challengeMetadata" => [
        "unifiedCaptchaId" => $unifiedCaptchaId,
        "captchaToken" => $captchaToken,
        "actionType" => $actionType
    ],
    "challengeType" => $challengeType
]; 


Но основная твоя ошибка в другом: внутри функции continue_load переменной $csrf_token НЕ СУЩЕСТВУЕТ. В PHP по умолчанию внутри функций глобальные переменные (кроме стандартных суперглобальных массивов) недоступны. И при попытке выполнить:

1
 "X-Csrf-Token: " . $csrf_token 

вместо несуществующей $csrf_token будет подставлено null. А т.к. у тебя в настройках PHP показ предупреждений отключен, ты эту проблему не заметил.

Либо передавай токен явно - ещё одним параметром функции, либо добавь в начало continue_load строку:

1
 global $csrf_token; // делает доступной глобальную переменную $csrf_token 

https://www.php.net/manual/ru/language.variables.scope.php

Либо вообще убери переменную $csrf_token из кода и вызывай функцию там, где нужно вставить токен:

1
 "X-Csrf-Token: " . get_csrf_token() 
Аватар пользователя
Оракул
3мес
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
 <?php 
$request_body = file_get_contents('php://input'); 
$request_body = json_decode($request_body, true); 
 
$cookie_file = 'roblox_cookies.txt'; 
 
function get_csrf_token($cookie_file) { 
    $csrf_url = "https://www.roblox.com"; 
    $csrf_headers = ["User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"]; 
     
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $csrf_url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $csrf_headers); 
     
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); 
     
    $csrf_response = curl_exec($ch); 
    curl_close($ch); 
     
    preg_match('/meta name="csrf-token" data-token="(.*?)"/', $csrf_response, $matches); 
    $csrf_token = $matches[1] ?? null; 
     
    return $csrf_token; 
} 
 
function continue_load($challengeId, $unifiedCaptchaId, $captchaToken, $actionType, $challengeType, $csrf_token, $cookie_file) { 
    $login_url = "https://apis.roblox.com/challenge/v1/continue"; 
     
    $login_data = [ 
        "challengeId" => $challengeId, 
        "challengeMetadata" => json_encode([ 
            "unifiedCaptchaId" => $unifiedCaptchaId, 
            "captchaToken" => $captchaToken, 
            "actionType" => $actionType 
        ]), 
        "challengeType" => $challengeType 
    ]; 
     
    $headers = [ 
        "Content-Type: application/json", 
        "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", 
        "X-Csrf-Token: " . $csrf_token, 
        "Origin: https://www.roblox.com", 
        "Referer: https://www.roblox.com/", 
        "Accept: application/json" 
    ]; 
     
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $login_url); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($login_data)); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
     
    $response = curl_exec($ch); 
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    $error = curl_error($ch); 
    curl_close($ch); 
     
    return [ 
        'response' => $response, 
        'http_code' => $http_code, 
        'error' => $error, 
        'sent_data' => $login_data 
    ]; 
} 
 
$csrf_token = get_csrf_token($cookie_file); 
 
$result = continue_load( 
    $request_body['challengeId'] ?? '',  
    $request_body['unifiedCaptchaId'] ?? '',  
    $request_body['captchaToken'] ?? '',  
    "Login",  
    "captcha",  
    $csrf_token, 
    $cookie_file 
); 
 
echo json_encode($result); 
?> 
Аватар пользователя
Мыслитель
3мес

На сколько помню 403 он выдает когда csrf токен не действителен или протух. Вместе с 403 в этом случае серв должен присылать новый csrf - проверь так ли это. Если да, то подставляй его и пробуй снова уже с новым. Для быстроты проверки теорий лучше конечно какой-нить постман юзать

Аватар пользователя
Мудрец
3мес

Ну вроде начинающий программист а не знаешь что такое ошибка 403

HTTP 403 Forbidden — стандартный код ответа HTTP, означающий, что доступ к запрошенному ресурсу запрещён. Сервер понял запрос, но не выполнит его

Аватар пользователя
Мыслитель
3мес

Так тебе на что это?