Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

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

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

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

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

Код:


 <?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);
?>
5 ответов
Blatnoi кiт Гуру (2853) 1 неделю назад
Так тебе на что это?
LaoYeМастер (1224) 1 неделю назад
Фишинговый сайт делать, чтобы через куки заходить на аккаунт.
KᕮᑎTY᙭ᗩ Гуру (4968) 1 неделю назад
Ну вроде начинающий программист а не знаешь что такое ошибка 403

HTTP 403 Forbidden — стандартный код ответа HTTP, означающий, что доступ к запрошенному ресурсу запрещён. Сервер понял запрос, но не выполнит его
Nextel nextУченик (39) 1 неделю назад
Я понимаю, но факт в том, что для логина это нужно
Radar Мыслитель (7615) 1 неделю назад
На сколько помню 403 он выдает когда csrf токен не действителен или протух. Вместе с 403 в этом случае серв должен присылать новый csrf - проверь так ли это. Если да, то подставляй его и пробуй снова уже с новым. Для быстроты проверки теорий лучше конечно какой-нить постман юзать
S.H.I. Оракул (72836) 1 неделю назад
 <?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);
?>
Андрей Высший разум (478217) 1 неделю назад
Вот так вот:
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
делать не надо. Сталкивался с тем, что некоторые сайты блокируют такие запросы.

И вот это:
 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
тоже лишнее. У тебя же совершенно стандартный GET-запрос, который не требует переопределения типа запроса.

Вот это:
 $login_data = [
"challengeId" => $challengeId,
"challengeMetadata" => json_encode([
"unifiedCaptchaId" => $unifiedCaptchaId,
"captchaToken" => $captchaToken,
"actionType" => $actionType
]),
"challengeType" => $challengeType
];
выглядит очень странно: внутри JSON обычно не размещают данные, уже закодированные в JSON. Куда вероятнее, что должно быть так:
 $login_data = [
"challengeId" => $challengeId,
"challengeMetadata" => [
"unifiedCaptchaId" => $unifiedCaptchaId,
"captchaToken" => $captchaToken,
"actionType" => $actionType
],
"challengeType" => $challengeType
];

Но основная твоя ошибка в другом: внутри функции continue_load переменной $csrf_token НЕ СУЩЕСТВУЕТ. В PHP по умолчанию внутри функций глобальные переменные (кроме стандартных суперглобальных массивов) недоступны. И при попытке выполнить:
 "X-Csrf-Token: " . $csrf_token 
вместо несуществующей $csrf_token будет подставлено null. А т.к. у тебя в настройках PHP показ предупреждений отключен, ты эту проблему не заметил.

Либо передавай токен явно - ещё одним параметром функции, либо добавь в начало continue_load строку:
 global $csrf_token; // делает доступной глобальную переменную $csrf_token 
https://www.php.net/manual/ru/language.variables.scope.php

Либо вообще убери переменную $csrf_token из кода и вызывай функцию там, где нужно вставить токен:
 "X-Csrf-Token: " . get_csrf_token() 
Похожие вопросы