@sidorchik

Почему не работает Guzzle POST запрос на заполнение сторонней формы?

У библиотеки есть форма поиска книг. Но первоначально на странице нет тега <form> и инпутов с нужными name.
5ae7013230135461721418.png
Пользователь пишет название книги и нажимает кнопку. Как я понимаю, после этого срабатывает скрипт, который считывает заполненные данные, формирует с ними настоящую форму и отправляет методом POST.
5ae70160e1bf9353311085.png
Без перезагрузки страницы пользователь получает результат поиска:
5ae7042f6dcbf777505505.png

Мне нужно программно заполнить эту форму и вывести страницу результата. Анализирую с помощью панели Network, какие данные передаются, повторяю запрос с такими параметрами, но не работает.

require 'vendor/autoload.php';

// Подключаем класс Client
use GuzzleHttp\Client;

// Инициализируем класс для работы с удаленными веб-ресурсами
$client = new Client();

// Делаем запрос, получаем ответ
$response = $client->request("POST", "http://opac.rgub.ru/cgiopac/opacg/opac.exe", [
    "form_params" => [
        "arg0" => "GUEST",
        "arg1" => "GUESTE",
        "TypeAccess" => "FreeAccess",
        "_errorXsl" => "/opacg/html/common/xsl/error.xsl",
        "_wait" => "6M",
        "_xsl" => "/opacg/html/search/xsl/search_results.xsl",
        "_version" => "2.0.0",
        "_service" => "STORAGE:opacfindd:FindView",
        "outform" => "SHOTFORM",
        "length" => "15",
        "query/body" => "%28TI+%CE%E1%EB%EE%EC%EE%E2%29",
        "query/open" => "{NC:<span class='red_text'>}",
        "query/close" => "{NC:</span>}",
        "userId" => "GUEST",
        "session" => "495180",
        "iddb" => "5",
        "level[0]" => "Full",
        "level[1]" => "Retro"
    ]
]);

// Выводим ответ
echo $response->getBody();


Чего не хватает?

UPD
Не хватало данных, которые передаются с opac.rgub.ru/opacg/guest.html в opac.rgub.ru/cgiopac/opacg/opac.exe:
"arg0" => "GUEST",
"arg1" => "GUESTE", 
"TypeAccess" => "FreeAccess"

Уже лучше. Вместо «Не хватает входных данных. Вернитесь к поиску.» выводится хтмл, но на странице ничего не отображается.

Пытаюсь спарсить название первой книги в выдаче, ничего не выводится.
// Находим нужное из хтмла выдачи
$htmlRGBM = $response->getBody();
$docRGBM = new DOMDocument();
@$docRGBM->loadHTML($htmlRGBM);

$xpathRGBM = new DOMXpath($docRGBM);
echo $xpathRGBM->query('//entry[1]/text()')[0]->nodeValue;
  • Вопрос задан
  • 271 просмотр
Пригласить эксперта
Ответы на вопрос 1
akubintsev
@akubintsev
Опытный backend разработчик
Посмотрите в инструментах разработки какой улетает запрос на сервер.
Первое на что обратил внимание это кодирование параметра query/body через urlencode.
Далее пропробуйте прокинуть заголовки: referer и user-agent хотя бы.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы