从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过期目前还不清楚是什么机制,是否有办法一次登录,多次延期?这个可能不同的网站有不同的处理方式。

各种银行贷款利率实际计算方式

背景

由于之前需要用钱接触了一些银行贷款人员,发现这个社会上个人贷款中除了房贷,其他贷款,比如个人信用贷款都是变着花样忽悠人,先不说种类有等额本金,等额本息,先息后本,固定利息等方式,每种方式的细则还都不一样,可能说5%的利率,实际上可能是10%以上,最重要的是,用户并不知情并且觉得还挺划算。
所以在这里总结一下个人贷款中常见的几种不太正常的利率计算方式,并且转换为最为正规的房贷利率,让更多人了解这里面的水有多深。

方式一:先付息,本金等额还款

看到银行的贷款经理这么说,貌似也没什么关系,5%的年利率也合理。但是,事实上它真的是5%吗?
因为首先要付利息500元,实际上到手只有9500元,先换种方式描述这种贷款:
借款9500,等额本息每个月还款833.33,将这个数据放入房贷计算器中:

填上借款9500元,年限1年,不断调整利率,使得每个月还款接近实际还款的值,可以看到,此时实际利率是9.58%,并不是贷款经理说的5%。为什么会这样呢?因为你事先付出了500元利息,而实际到手的9500元最后还要还10000元,相当于又多交了500元左右的利息。换个措辞,利率接近翻倍。

方式二:等额利息,同时等额本金

乍一看,也没什么不合理的地方,既然每个月还款额度固定,那么我们把措辞改变一下:
借款10000,每月等额本息还款875元,将这个数据放入房贷计算器中:

实际年利率9.11%,为什么呢?因为你在银行的本金是每个月递减的,那么相应每个月的利息应该也要递减才对,贷款经理在计算利息的时候,并没有以实际在银行的本金来计算,而是以贷款金额做基准计算。这种方式容易被忽悠为等额本息还款,细则解释就是,每个月本金等额,并且利息也等额。
可能会有读者不理解了,图中利息明明是500元呀?借了10000元,利息500元,这不就是年利率5%吗?
这个很简单,因为你的本金并不是时时刻刻保持在10000元的,如果每个月只给利息41.67元,等一年到期再一次性还10000本金,这个才真的是5%的年利率。

结语

个人信用贷款由于无抵押,银行承担的风险比较高,因此利率不能做到像稳若金汤的房贷那么低,但是总体来说,这又是一块大到不得不吃的蛋糕,竞争也非常激烈,不仅仅有传统银行之间的竞争,还有互联网银行比如微粒贷、蚂蚁微贷等小额贷款加入,而花呗、京东白条和信用卡也占据了网上信用消费大片江山。
因为市场竞争激烈,很多银行都使用了一些表面低利率来吸引客户,但是作为消费者,作为贷款者,必须明白贷款经理描述的贷款的真实利率,这样才能避免吃亏,避免吃亏了自己都不知道。
还有一些其他的案例,后面遇到了再补充。