在多个请求中保留 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);
// ...
}
我想为特定网站创建代理,以便无法访问该网站(例如,由于网站 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);
// ...
}