LINUX.ORG.RU

PHP - скачиваем страницу сперенаправлениями и куками

 ,


0

1

Скажите, видел кто нибуть код на php - который мог бы скачивать страницу используя куки и перенаправления?

Пытаюсь скачать страницу, но там проблема в том что сервер пересылает кук, а потом перенапраляет на другую страницу которая этот кук проверяет перед тем как отдать данные.

Попытался организовать все через: fsockopen (т.к. через него можно получить куки), но он работает на раз и не очень безопастно!


И ужасно, и опасно
Букву Т писать напрасно!
Всем известно, как прелестно
Букву Т писать уместно!

Deathstalker ★★★★★
()

Через CURL все это можно

$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/'; 
$curl_handle = curl_init('enter_external_url_here'); 
curl_setopt( $curl_handle, CURLOPT_COOKIE, $strCookie ); 
curl_exec($curl_handle); 
curl_close($curl_handle); 

не помню что с редиректами, но в крайнем случае можно обернуть в while пока не найдешь нужную тебе страницу.

BaBL ★★★★★
()

Скажите, видел кто нибуть код на php - который мог бы скачивать страницу используя куки и перенаправления?

composer require guzzle/guzzle=*

Там тебе механизм с автоматическим учётом сессий и кук. Что-то типа (кусок из реального кода):

require 'vendor/autoload.php';

use Guzzle\Http\Client;
use Guzzle\Plugin\Cookie\CookiePlugin;
use Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar;

$cookiePlugin = new CookiePlugin(new ArrayCookieJar());

$session_request    = [ 'req' => [[
                            'username' => $login,
                            'productType' => 'XXXX',
                            'password' => $passwd,
                        ]]
                    ];

$client = new Client();
$client->addSubscriber($cookiePlugin);

// Инициируем куки
$client->post($login_url, [ 'Accept' => 'application/json', 'Content-type' => 'application/json'], json_encode($session_request))
    ->send();

// Получаем данные
$csv_string = (string) $client->get($currency_url)
    ->send()
    ->getBody();

https://github.com/guzzle/guzzle

http://docs.guzzlephp.org/en/latest/

KRoN73 ★★★★★
()
Последнее исправление: KRoN73 (всего исправлений: 2)
Ответ на: комментарий от fish_ka

как-то оно громоздко

Там половина примера — JSON-данные для POST-запроса :) Фактически пример в две команды делается. Одна шлёт авторизационные данные и массив с параметрами запроса и получает сессионную куку. Вторая в контексте предыдущего запроса (т.е. текущей сесии) получает нужные данные. Если всё делать на голом curl-php, то получится десятка полтора-два строк с не самой наглядной логикой (вырезать куки, послать их в следующий запрос и т.п.). Я, как раз, этот пример сперва на голом PHP делал, потом задолбало разбирать заголовки запроса, сделал на packagist.org несколько запросов на тему url request, почитал описания пары библиотек, пощупал пару вариантов и выбрал эту библиотеку. По времени работы примерно столько же вышло, зато потом поддерживать и расширять стало намного удобнее и в будущих подобных применениях всё будет в 10 раз быстрее решаться. Надо бы и в своём фреймворке свои велосипеды blib_http переписать на использование этой библиотечки. Сразу объём кода раз в 5 уменьшится, если не больше :)

Не легче ли просто с помощью потоков выбрать куки и данные?

Гораздо длиннее выйдет.

KRoN73 ★★★★★
()
Ответ на: комментарий от fish_ka

Если мусор выкинуть, пространство имён не активировать и использовать только серию запросов с сохранением куки-сессии, то останется:

$client = new Guzzle\Http\Client();
$client->addSubscriber($cookiePlugin);

$client->get($_url1)
    ->send();

$data = (string) $client->get($url2)
    ->send()
    ->getBody();

Уже не так и громоздко ;) Куда нагляднее, чем что-то типа:

        $curl_options = array(
            CURLOPT_TIMEOUT => $timeout,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_MAXREDIRS => 5,
            CURLOPT_ENCODING => 'gzip,deflate',
            CURLOPT_REFERER => defval($params, 'referer', $original_url),
            CURLOPT_AUTOREFERER => true,
            CURLOPT_HTTPHEADER => $header,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
        );

        $ch = curl_init($url);
        curl_setopt_array($ch, $curl_options);

        $data = curl_exec($ch);
        $info = curl_getinfo($ch);
// ...
// ...

KRoN73 ★★★★★
()
Ответ на: комментарий от fish_ka

Composer — это лучшее явление в PHP за всю его историю :D Реально очень удобно.

KRoN73 ★★★★★
()
Последнее исправление: KRoN73 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.