如何配置Goutte客户端使用文件将cookie存储在文件中?我知道它是GuzzleHttp Client的一种包装器。但我无法将其配置为将cookie保存到文件中以在请求之间重用它们。
尝试扩展Goutte客户端,方法doRequest
,但我不明白如何正确执行此操作。
有没有人使用Goutte Client将cookie保存到文件?
答案 0 :(得分:2)
我不认为这是一个简单的方法来实现这一点,因为Goutte强制使用guzzle的CookieJar类,这在脚本执行后并不存在。通过你自己的类来使用像FileCookieJar这样的东西本来是很棒的但是由于CookieJar的硬编码调用,它是不可能的(有人确实为它创建了一个公关,但它已经过了几个月而且还没有#&# 39; Goutte项目中最近的任何活动都是如此。
可以做的是创建访问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));
}
}
答案 1 :(得分:0)
这是您可以使用它的完美方式:
// 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);
答案 2 :(得分:0)
这是一种对我有用的方法,取自 comment by ghost on 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 ) );