Клиент Goutte сохраняет файлы cookie в файл

Как настроить клиент Goutte для использования файла для хранения файлов cookie в файле? Я знаю, что это своего рода оболочка вокруг клиента GuzzleHttp. Но я не мог настроить его для сохранения файлов cookie в файл, чтобы повторно использовать их между запросами.

Пытался расширить Goutte Client, метод doRequest но не понимаю как это правильно сделать.

Кто-нибудь использовал Goutte Client с сохранением файлов cookie в файл?


person Marin Bînzari    schedule 04.10.2015    source источник
comment
Это очень помогло мне: github.com/FriendsOfPHP/Goutte/pull/ 250#issuecomment-274504635   -  person Ryan    schedule 29.06.2018


Ответы (3)


Я не думаю, что есть простой способ сделать это, поскольку Goutte заставляет использовать класс CookieJar guzzle, который не сохраняется после выполнения скрипта. Было бы здорово передать свой собственный класс для использования таких вещей, как FileCookieJar, но из-за жестко запрограммированного вызова CookieJar это невозможно (кто-то создал для него PR, но уже несколько месяцев, и не было никакой недавней активности внутри проект Гутте).

Что можно сделать, так это создать методы, которые обращаются к BrowserKit CookieJar и сохраняют его содержимое. Пример кода ниже:

// Will hold path to a writable location/file
protected $cookieFilePath;

public function setCookieFilePath($cookieFilePath)
{
    $this->cookieFilePath = $cookieFilePath;
    if (is_file($cookieFilePath)) {
        // Load cookies and populate browserkit's cookie jar
        $cookieJar = $this->client->getCookieJar();
        $cookies = unserialize(file_get_contents($cookie));
        foreach ($cookies as $cookie) {
            $cookieJar->set($cookie);
        }
    }
}

// Call this whenever you need to save cookies. Maybe after a request has been made since BrowserKit repopulates it's CookieJar from the Response returned.
protected function saveCookies()
{
    $cookieFilePath = $this->getCookieFilePath();
    $goutteClient = $this->getGoutteClient();
    $cookieJar = $goutteClient->getCookieJar();
    $cookies = $cookieJar->all();
    if ($cookies) {
        file_put_contents($cookieFilePath, serialize($cookies));
    }
}
person georaldc    schedule 30.06.2016
comment
Ага. Идея отличная. Печально, что обновлений нет уже 8 месяцев :( - person Marin Bînzari; 01.07.2016

Вот идеальный способ его использования:

// Get all cookies
$cookies = $client->getCookieJar()->all();

$cookies = array_map('strval', $cookies); // Cookie::__toString
file_put_contents('cookies.json', json_encode($cookies));

Чтобы использовать файл cookie:

use Goutte\Client;
use Symfony\Component\BrowserKit\CookieJar;

$client = new Client();
$cookieJar = new CookieJar();
$cookies = json_decode(
    file_get_contents('cookies.json'),
    true
);

$cookieJar->updateFromSetCookie($cookies);

$client = new Client(null, null, $cookieJar);
person Ging    schedule 25.04.2021

Вот способ, который сработал для меня, взятый из комментария призрака на github

<?php
//file to store cookie data
$cookieFile = 'app/cookiejar.txt';

// Start with an empty jar if we don't have any cookies saved yet
$cookieJar = is_file($cookieFile) ?
    unserialize( file_get_contents($cookieFile)) :
    null;

// Initialize the client with the cookie jar
$client = new Client(null, null, $cookieJar);

// Requests and stuff you need to do

// save cookies:
$cookieJar = $client->getCookieJar();
file_put_contents( $cookieFile, serialize( $cookieJar ) );
person Alexander Taubenkorb    schedule 12.05.2021