从Chrome导出Cookie给curl使用

背景

由于自己折腾的一些Linux小工具,有的功能需要登录网站才能够获得,遇到这种问题一般就是用Chrome自带的F12找到并分析一下登录包,一般登录协议都是类似表单的提交,使用HTTP POST协议,然后将登录协议使用Linux下命令行curl工具尝试一下POST数据(-d “登录数据”)看看返回包是否与浏览器登录的结果一致。如果不一致,就尝试增加一些HTTP头,比如Referer或者User-Agent头,有的后端会检查这些字段,最坏的可能就是把所有浏览器中发过去的HTTP头都带上,这样一般情况下都可以登录成功。
但是由于一些网站登录时在登录包中会发一些特殊的标记字符串过去,我们并不了解它发过去的字符串是什么含义,也不那么容易找到这个字符串是怎么计算出来的。为了更加方便地说明问题,我随便找了一个安全系数非常高的淘宝网,淘宝网的登录相信不少人已经研究过了,这篇文章不打算深入研究。

使用Chrome抓到淘宝的登录协议,需要勾选Preserve log防止页面跳转清空抓到的包,得到的请求表单如下,相关的隐私数据我已经替换成*或者其他的内容。

可以看到登录协议里有几个字段是经过编码或者是特殊标记的,比如ncoToken,gvfdcre,TPL_password_2,um_token和ua。如果需要分析出淘宝的登录协议,需要找到这几个字段是否必须,如何计算。
如果遇到验证码或者一些特殊的验证方式,比如拼图之类的,自动登录就难上加难了。

折中的解决方法

为了绕过这种登录协议比较复杂的网站的登录,可以采用浏览器人工登录,然后导入Cookie的方式,不过这样也会带来几个比较严重的问题:

  • 登录必须人工登录,并且还要把Cookie导出到服务器。
  • Cookie有过期时间,不持久,容易失效。

如果接受上述两个条件的话,那么就可以进入实操阶段了。

使用chrome导出Cookie

Chrome有很多插件用于编辑、导入和导出Cookie,我试用了几款,最终选择了EditThisCookie这款功能比较多的插件。

安装好插件后,可以在选项中设置导出Cookie的格式,我们选择Netscape HTTP Cookie File,因为curl支持这种格式。

现在登录淘宝,完成后点击插件,然后点击导出Cookie按钮:

导出的Cookie文件内容大约是这样,其中隐私内容已经被替换掉。

把这些内容保存成Linux下的一个文件,名字随便取,我取成taobao.cookie好了。
要注意的是,Netscape Cookies文件的格式是这样的,每一行代表一个Cookie值,每一行从左到右分别由下面的字段组成,中间使用Tab分隔,来源Netscape’s cookie.txt file

使用Cookies

从Chrome中导出Cookie后,可以使用下面的命令请求一下淘宝个人主页,加-L是为了让curl跟随页面跳转:

可以看到返回了页面内容,但是仔细看的话,会发现其中并没有我们的淘宝用户名,页面的状态还是未登录的。这是因为EditThisCookie导出的Cookies文件其实不符合curl的规范的,目前有2个问题:

  • EditThisCookie导出的Cookie在过期时间(Expiration)没填写的时候,不会填充0或者其他数据,相应的位置会空着,使用2个Tab键分割,然而curl会将2个Tab键当做一个分割,于是后面的Name字段就被当做Expiration字段了。临时解决方法是,当Expiration没填写时,填个默认值0。
  • EditThisCookie导出的Cookie的Flag(也叫做Host Only)字段与curl填充的习惯不符合,比如导出的.taobao域名对应的Cookie大多是FALSE,那么在curl中,访问https://i.taobao.com就不会将本行的Cookie填充到HTTP头中。临时解决方法比较简单粗暴,即这一个字段全改成TRUE就好了,这样可能会存在一些安全问题。

为了更加方便得获得curl可用的Cookies文件,我临时写了一个简单的PHP对EditThisCookie导出的Json格式(在EditThisCookie的配置中可以配置成JSON格式导出)Cookies进行转换,文件名为cookies.php,它会将提交的json格式的Cookies文件内容转换为curl可识别的Cookies文件,保存在/tmp/cookies路径中:

做了修改后,Cookies文件看起来是这样的:

再使用curl请求,此时就可以从回包中得到用户名了,说明Cookies已经成功导出并且可以使用,至于后面要抢月饼还是拉取数据,就看个人需要咯。
其中**表示登录的淘宝用户名:

遗留问题
  • Netscape Cookie的每个字段的含义还不是特别清楚,有时间可以看看Netscape Cookie每个字段的具体用法。
  • 不知道有什么比PHP提交更好的提交Cookies文件的方法。
  • Cookies过期目前还不清楚是什么机制,是否有办法一次登录,多次延期?这个可能不同的网站有不同的处理方式。
anyShare分享到:

原文地址:http://godmoon.wicp.net/blog/index.php/post_340.html,转载请注明出处

Moon发表于2016年9月29日
打赏作者

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

发布者

sytzz

学会用简单的语言将复杂的问题说清楚。

发表评论

电子邮件地址不会被公开。