Goutte клиент сохраняет куки в файл
Как настроить клиент Goutte для использования файла для хранения файлов cookie в файле? Я знаю, что это своего рода обертка вокруг клиента GuzzleHttp. Но я не смог настроить его, чтобы сохранить куки в файл и использовать их между запросами.
Пытался расширить Goutte Client, метод doRequest
но я не понимаю, как это сделать правильно.
Кто-нибудь использовал Goutte Client с сохранением cookie в файл?
4 ответа
Я не думаю, что есть простой способ сделать это, поскольку Гут заставляет использовать класс CookieJar от Guzzle, который не сохраняется после выполнения скрипта. Было бы здорово пропустить свой собственный класс, чтобы использовать такие вещи, как FileCookieJar, но из-за жестко закодированного вызова CookieJar это невозможно (кто-то создал PR для него, но прошло уже несколько месяцев, и в последнее время не было никакой активности внутри проект Гутта).
Что можно сделать, так это создать методы, которые обращаются к CookieJar BrowserKit и сохраняют его содержимое. Пример кода ниже:
// 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));
}
}
Вот способ, который сработал для меня, взят из комментария ghost на 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 ) );
Это сработало для меня:
public function login()
{
$client = new Client();
$crawler = $client->request('GET', 'site/login');
$form = $crawler->filter('.btn-success')->first()->form();
$crawler = $client->submit($form, array('email' => 'email@yahoo.com',
'password' => 'password'));
return $client;
}
Вот идеальный способ его использования:
// 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);