在多个请求中保留 Guzzle Cookie

Hold Guzzle Cookies across multiple requests

我想为特定网站创建代理,以便无法访问该网站(例如,由于网站 IP 被其 ISP 阻止)的用户可以通过我的代理访问它。我会使用 Guzzle 发出 HTTP 请求,将所有 link 交换到我自己的站点,然后显示它。

我知道这不是很理想,但一开始它似乎很管用,我不希望有数百人使用它。它应该就位,以防万一有人需要它。

我遇到的问题是 cookie。另一个站点显然使用 sessions/cookies 来保持用户登录。基本上,如果不登录,您将无能为力。我已经将所有表单数据等传递给 HTTP 请求,但 cookie 一直让我失望。

protected function makeRequest($path, $parameters)
{
    $cookieJar = new CookieJar;

    $client = new Client(['base_uri' => self::$staticURL]);
    $response = $client->request($parameters['method'], self::buildUrl($path), [
        'form_params' => Request::all(),
        'cookies'     => $cookieJar,
    ]);

    // Session::flash can only flash strings, but CookieJar is not serializable.
    // Session::flash('cookie', $cookieJar);

    return self::replaceURLs($parameters['original'], self::$staticURL, $response->getBody(), $parameters['base']);
}

如您所见,我正在向请求传递一个 CookieJar 实例,如文档中所述。有了这个,我就可以登录到该站点,但是只要我单击另一个 link,它就会让我退出。所以我假设它不会在多个请求中保存 cookie。

我必须通过哪些方式来做到这一点?

我认为 cookies 选项需要类型 CookieJar 的实例,但事实并非如此。它需要的是一个CookieJarInterface。进一步查看 Guzzle 库,我发现 FileCookieJar,它保存在一个文件中。

我现在为每个会话生成一个 ID,并使用该 ID 将 cookie 写入文件。这样我页面的每个用户都会保存 cookie,并在每个后续请求中加载它们。

protected function makeCookiePath()
{
    $sessionId = $this->request->session()->get('cookie.id', str_random(40));

    $this->request->session()->put('cookie.id', $sessionId);
    return storage_path('cookies/' . $sessionId);
}

protected function makeRequest($path, $parameters)
{
    $cookieJar = new FileCookieJar($this->makeCookiePath(), true);

    // ...
}