在多个请求中保留Guzzle Cookie

时间:2016-01-06 14:37:30

标签: php laravel guzzle

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

我知道这并不完全理想,但是一开始似乎有效,我不指望有数百人使用它。它应该就位,以防有人确实需要它。

我遇到的问题是cookies。另一个站点显然使用会话/ cookie来保持用户登录。基本上没有登录就无法做任何事情。我已经将所有表单数据等传递给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实例传递给请求,正如文档中提到的那样。有了这个,我就可以登录该网站了,但是当我点击另一个链接时,它就会把我退回去。所以我认为它不会在多个请求中保存cookie。

我必须采取哪些方式?

1 个答案:

答案 0 :(得分:1)

我认为CookieJar选项需要CookieJarInterface类型的实例,但实际情况并非如此。它需要的是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); // ... } 。进一步查看Guzzle库,我找到了FileCookieJar,它保存在一个文件中。

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

  if (readString.indexOf("?b24vb2ZmL2Z1bmN0aW9u") >= 0)
  {
    //What it does.
    actionTransmitter.sendSignal(1, 'C', false);
    switchstatus3 = false;
    delay(3000);
    actionTransmitter.sendSignal(1, 'C', true);
    switchstatus3 = true;
  }