$client = new \GuzzleHttp\Client();
$jar = new \GuzzleHttp\Cookie\CookieJar();
$res = $client->request('GET', 'https://xxx.com',[
'cookies' => $jar
]);
$cookJar = $jar->getIterator(); //获取的是一个GuzzleHttp\Cookie\SetCookie对象
$cookies = [];
foreach ($cookJar as $k=>$v){
$ck = $v->toArray(); //转为数组,更多方法见GuzzleHttp\Cookie\CookieJar
$cookies[$ck['Name']] = $ck['Value']; //注意键为大写
}
var_dump($cookies);
//++++++++++++++++++++++++或者++++++++++++++++++++++++++++++
$jar = new \GuzzleHttp\Cookie\CookieJar();
$client = new \GuzzleHttp\Client(['cookies' => $jar]);
$r = $client->request('GET', 'https://xxx.com');
$cookJar = $jar->getIterator(); //后续一样
设置cookie
$cookieJar = CookieJar::fromArray([
'PHPSESSID' => 'b68212de1826c64d77b69dc514c2a9cb'
], 'www.devkang.com'); // 此处记得请求域名需要保持跟请求的url host一致,否则不会携带此cookie。
guzzle 自身的重定向功能好像不支持携带cookie
public function getCookies($redirect, $cookies = '')
{
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', $redirect, [
'allow_redirects' => false //关闭自动重定向
]);
if ($response->getStatusCode() === 302) {
$redirect = $response->getHeaderLine('Location'); //手动跳转,
//$cookieArr = $response->getHeaderLine('Set-Cookie'); //返回字符串
$cookieArr = $response->getHeader('Set-Cookie'); //返回数组
//Set-Cookie的数据如:passport_csrf_token=2fee97d9235aa7d2c1a0ce4cc78fefc1; Path=/; Domain=douyin.com; Max-Age=5184000; Secure; SameSite=None //需要处理
$newCookie = $this->cookieVal($cookieArr);
$cookies = $cookies .$newCookie;
$this->getCookies($redirect, $cookies); //重定向的页面可能还有cookie
}else{
$cookieArr = $response->getHeader('Set-Cookie');
$newCookie = $this->cookieVal($cookieArr);
$cookies = $cookies .$newCookie;
}
$cookies = rtrim($cookies,'; ');
return $cookies;
}
//整理cookie
private function cookieVal($arr)
{
$cookies = '';
foreach ($arr as $k => $v) {
$cookieArr = explode(';', $v);
$cookies = $cookies .$cookieArr[0] .'; ';
}
return $cookies;
}