卷曲 gmail 帐户时无法使用 cookie

cannot use cookies while curling gmail account

我正在尝试在 gmail 上授权,但它没有看到 cookie。

Error. Most likely, your browser does not set a cookie. Check this setting, or open a new browser window.

这是我的代码:

    $tmpfname = dirname(__FILE__).'/cookie.txt';
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/ServiceLoginAuth");
    curl_setopt($ch, CURLOPT_POSTFIELDS, "GALX=MS-tSuNi3pg&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F&service=mail&hl=ru&_utf8=%E2%98%83&bgresponse=%21A0Lf0QLPRaBwlUTp7ftMkStPvwIAAAAWUgAAAAcqAQFYvp-abJNRjR3DH8MqLNMd2V1lZIUZ8WD7-V22z_v8Lc-TfjBVXX8E0ElzA2hSNiaMERRhArrPj3NR1EuQ7UUE7KbsJ3DPYmn7jsKtGklYfxzO3Uonm6nKj_cfATL8wXFt_ngIdwFI0rY8J_2Kb51KDoxtcx6eEYfD8P0m-t6NcAITwyy3_0EG-1R12MNb2Lc7uLcMW76sHRTt2vc1zV1SjofqaYf73xJ5r-uatz_VTHQ_mT2JBU-92L32nx8qu9JF5__SAcj3-2umIjEiQvqd7KVxuFrSpKHiOGWkzr7CG9DMwFJVYeNvaE0liWW549s7yNcWIu_ERgau0KR0wyIC9A&pstMsg=1&dnConn=&checkConnection=youtube%3A137%3A1&checkedDomains=youtube&Email=*******&Passwd=*******&signIn=%D0%92%D0%BE%D0%B9%D1%82%D0%B8&PersistentCookie=yes&rmShown=1");
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIESESSION, true );
    curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
    $result = curl_exec($ch);

但 Cookie 只是一个非常小的问题。

Google 不方便使用 curl 登录。因为 Google 使用隐藏在 301 重定向中的 cookie,curl 可能不会保留它们。有时你还必须抓取 HTML 我们的隐藏字段 <input type=hidden name=”_NAME” value=”_VALUE”>

您还有一些工作要做。它并不像您想象的那么简单。一个 curl HTTP GET 肯定做不到。 gMail 是一场噩梦。

除了重定向之外的大约 50 个 HTTP GET 和 POST 请求,Google 还使用了 100 多个 JS XHR GET 和 POST 请求以及大量 JSON.信息嵌入为 cookie、URL 查询字符串和 POST 数据。

最大的障碍是如果没有 javaScript,gMail 将无法运行。 Curl没有内置JavaScript。如果没有 JavaScript,您将无法从 gMail 获得任何信息。

这不是不可能的壮举。可以 100% 确定它可以完成。你需要多长时间?是问题。我的猜测是您需要大约一年的时间才能从 log-in 进入以检索和发送邮件。这就是为什么我建议您先尝试一个功能。然后你会尝到你面前的东西。

您可以转到您想要 post 的页面或从中抓取数据,记录当前 cookie,然后单击该功能,然后获取所有 HTML, JS 和 XHR 请求和响应。您可以在没有 JavaScript 的情况下复制该函数。但是您必须使用 curl 将 some/most/all(不确定是哪个)JS 请求替换为您自己的请求之一。

准备好花一些时间更新您的代码,因为 Google 是一个移动的目标。他们不断改变做事的方式,您必须跟上他们的步伐。

但是饼干很简单

这是我登录 Google Voice

的工作

首先我会去 https://www.google.com/voice/ Google 将 cookie 放入 301 重定向。然后还有四个 302 重定向到更远的地方。

所以我不使用:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

我使用:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

然后我需要访问 headers

curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

从响应中获取 Cookie Header

$data = curl_exec($ch);
if (curl_errno($ch)){
    $data .= 'Retrieve Base Page Error: ' . curl_error($ch);
}
else {
  $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
  $head = substr($data,0,$skip);
  $e = 0;
  while(true){
    $s = strpos($head,'Set-Cookie: ',$e);
    if (!$s){break;}
    $s += 12;
    $e = strpos($head,';',$s);
    $cookie = substr($head,$s,$e-$s) ;
    $s = strpos($cookie,'=');
    $key = substr($cookie,0,$s);
    $value = substr($cookie,$s);
    $cookies[$key] = $value;

  }

然后为请求创建 cookie header:

 $cookie = '';
 $delim = '';
 foreach ($cookies as $k => $v){
   $cookie .= "$delim$k$v";
   $delim = '; ';
 }

然后捕获他们的重定向位置url

$info = curl_getinfo($ch);
$url = $info['redirect_url']; 

看看是不是重定向。

if (strlen($url) < 8){
   $url='https://accounts.google.com/ServiceLogin';
}
sleep(2);

然后把cookie放在header:

$request = array();
$request[] = "Host: accounts.google.com";
$request[] = "Pragma: no-cache";
$request[] = "Cookie: $cookie";
$request[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$request[] = "User-Agent: MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0";
$request[] = "Accept-Language: en-US,en;q=0.5";
$request[] = "Connection: keep-alive";
$request[] = "Cache-Control: no-cache";

curl_setopt($ch, CURLOPT_HTTPHEADER, $request);

当有 Referer 时(我不是这样拼 Referrer 的,把它添加到 HTTP 的人拼错了)

$request[] = 'Referer: https://accounts.google.com/ServiceLogin?service=grandcentral&passive=1209600&continue=https%3A%2F%2Fwww.google.com%2Fvoice&followup=https%3A%2F%2Fwww.google.com%2Fvoice&ltmpl=open';

以与以前相同的方式从重定向页面获取 cookie

然后获取 GALX cookie。然后执行下一个请求。

$galax = $cookies['GALX'];

$post = "GALX=$galax&continue=https://www.google.com/voice&followup=https://www.google.com/voice&service=grandcentral&ltmpl=open&_utf8=%E2%98%83&bgresponse=js_disabled&Email=assratbastard@gmail.com&Passwd=$password&signIn=Sign+in&PersistentCookie=yes&rmShown=1";

curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_POST, true);

在你进去之前还有很多。

进一步的例子。这只是一个 HTTP POST 请求

查询字符串数据

continue=https://mail.google.com/mail/
service=mail
sarp=1

Cookies

Cookie:GAPS=1:tx6dl5mwyjNKgiOEtjcvTvzGSNZqQQ:X9TX1quYjhjQfjho; GALX=kBQZRL4MXuU; GMAIL_RTT=216; GMAIL_LOGIN=T1420606553375/1420606553375/1420606580476; NID=67=LbIeO3Xwxjs0nGgZaTOTLrhdJ5bb7_Ce-de10-rKYZVzKVdM4XoKVr3T18sb9NLg_ghRkDoa-G-6vb66FdMR6uIMstAPd0qdQa18s1zGTHtvSOv8lRXaAdDDzqp8p8mguo0xA6VZnz_vV1JnoHMfulS9yoO4PA; SID=DQAAAAkBAADu9krli4XZTP6IWYOSEsmDBjYazF_ywtDmORhqZ8OeVGaC_K-3lSy4cNosYYXfG_-hrMd31fLPbAljFRt3Z5tpOAMLUPmzluYZC0_y1NTWMJ4D7I_bpIgiAsZO5oT9EFobf0vX50KfHLVKTHCetrgckDmLtMd4EkrOqsLkAAK9prD440GMqgCRoICNxLRVu-kS_-5N9mRrIuC3xsOsdi27Qfk4wPOqYNcO5sT1RGGgv1y7jwLqvHzHtz5DmlfARHv9lDtnKM8Gy3jo2Ax_7u8OrwIUP7Tcmz_9FJcj_q_Cz1cu94DbMHDN_qiUIwL1xYzClsdu3Z8EFiHDiEc8esXLg5_HkXPOPOvy-iGO9gTdLQ; LSID=ss:DQAAAAsBAABw1hSyS55goXFvcpcXQZQALGca7K26kfQ6HBc4c_agj3DJe_qMBMzqh0WXc3KNQ8OwP0lCPauBEhr3AdD0DyhCZQDFuIoglHPiw91_r-KIEZ62KjSmuTepv1UYDDEDiZeB5rYEOw4L6l2sOpOBmgBOZOyLfum4azJBLpEYo9kvMsX-OPUlqEJF0z0UMKM-R8Wh1Oxydr0j5R97U_juccmU6DqVsm0DTrP7rjPfv7cfZJ1wdqVemacZdfWjabrExrsXC21fin8ZUtXQI1dL8twk7fM7vo4fvKNdKoACBRUZpxltL9sTtBV-6QcynJF6Km5J6ICynuU3rtZvQNOS5VPIeajbcea7MI5p85XgweiVnw; HSID=A_8tAVmju5qj5J98Y; SSID=A_mBRb5lH8DXaOmm7; APISID=iNCCKNUIqLSXwe-P/AY-19Si5OAZhIv1aj; SAPISID=otuPxzrzp-BltlGm/AKleRqZyVwfhwwCB0; ACCOUNT_CHOOSER=AFx_qI5lJUnyOaSRIf2vxUKACWjny3nvliEw3h7h6NlUUHsklUqbMGc5NH7u6m6u4OSw8s5QqcsmV_fYx7-szFy4TVyvuA6A_itoAFoG-6B9txvdhP2T9gXFJzeRVMKHCQlRie0vibTz

POST数据

GALX=kBQZRL4MXuU&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F&service=mail&rm=false<mpl=default&scc=1&ss=1&_utf8=%E2%98%83&bgresponse=%21A0JLwawFPV34bUQ3xjl5OdgBcQIAAABfUgAAABcqAQSqazjYJpDg-kapblPmSujml011OygP0EUqjVds9Vk_fynd6-gmQ4WyRLVnd1EWIKp_M68OiYoQpy-BsmXpxQoIqbS7pIne_scYIkttMyj3BqWGjYqKEQBS0Ynb39G7n7gVBo_e406b1Ww7Ny9f3nouYPJbOG-kMRdGsuhzBAGwT9v-vMum2Z36_N8gThf12ZQ0gNa1hmEUALqwF0H5leXH7Ex7JhXtGppJ7SiuFjvJYgs0SO_L1ptI5o6eHgud_ti8178KC5KXi0WheHrl5kM2NK6Dn3HhH85-5FTD4P74_HKAbqgH72IeKOosril6qqWekPx_ChXOmSLr6itlnhZjdbEr7g&pstMsg= 1&dnConn=&checkConnection=youtube%3A384%3A0&checkedDomains=youtube&Email=g%40assratbastard@gamil.com&$password&signIn=Sign+in&PersistentCookie=yes&rmShown=1