Goutte客户端将cookie保存到文件

时间:2015-10-04 17:49:29

标签: php cookies guzzle goutte

如何配置Goutte客户端使用文件将cookie存储在文件中?我知道它是GuzzleHttp Client的一种包装器。但我无法将其配置为将cookie保存到文件中以在请求之间重用它们。

尝试扩展Goutte客户端,方法doRequest,但我不明白如何正确执行此操作。

有没有人使用Goutte Client将cookie保存到文件?

3 个答案:

答案 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 ) );