diff --git "a/2018-11-29-\347\202\271\350\257\204\347\231\273\345\275\225\350\207\252\345\212\250\345\214\226.md" "b/2018-11-29-\347\202\271\350\257\204\347\231\273\345\275\225\350\207\252\345\212\250\345\214\226.md" index 085fa2a..6a4e0b8 100644 --- "a/2018-11-29-\347\202\271\350\257\204\347\231\273\345\275\225\350\207\252\345\212\250\345\214\226.md" +++ "b/2018-11-29-\347\202\271\350\257\204\347\231\273\345\275\225\350\207\252\345\212\250\345\214\226.md" @@ -7,10 +7,10 @@ tags: - dianping --- -# 0x00 写在前面 +## 0x00 写在前面 这篇文章是尝试用`Python`模拟点评账号自动化登录的记录。仅仅保证当前能正确执行,任何的变化都可能造成这篇文章提及的方法失效。 -# 0x01 锁定目标 +## 0x01 锁定目标 目前点评的登录方式主要有扫码登录、手机短信登录、手机号密码登录以及第三方登录。很显然,只有手机号密码登录这一条途径最容易实现自动化登录。 打开登录页面`https://account.dianping.com/login?redir=http%3A%2F%2Fwww.dianping.com%2F`,用`Charles`抓包工具来查看登录过程使用到了哪些API。(点评启用了`https`,所以你得设置一下你的PC和Charles来支持抓取`https`的包)。 @@ -41,7 +41,7 @@ _token: ***************... 一眼望去,这两个参数都是经过Base64编码的。不管三七二十一,先解码看一看。但是很遗憾,解码完后并没有什么有用的信息,一串乱码,应该是经过了加密操作。 既然反着不能来,那我们就正着来,看一看密码密文和token到底是怎么生成的。 -# 0x02 搞定encryptPassword +## 0x02 搞定encryptPassword 打开Chrome的Debug模式,找一找这个页面加载了哪些js文件,马上一个目标又出现了`https://www.dpfile.com/mod/app-easy-login-frame/0.1.47/app-easy-login-frame.js`。生产环境的js文件都是经过压缩的,找一个在线格式化js的工具格式化一下看着比较舒服。 格式化后的js文件大概有1000行左右,搜索`passwordLogin`关键字,很快就找到了登录的代码。 @@ -125,7 +125,7 @@ print(ciphertext) 至此,我们已经解决了一个问题,但是又引入了一个新的问题,要获取`uuid`,就必须模拟一个`checkRisk`的请求。查看这个请求的参数你会发现,它也需要`_token`这个参数。正好与我们需要解决的第二个问题相同。 -# 0x03 搞定token +## 0x03 搞定token 我原本以为搞定了`encryptPassword`已经完成了大部分的工作,可事实上在`token`上花费了更多的时间。 `_token`的计算方式在上面的js代码中也能发现。 @@ -346,7 +346,7 @@ data = { 至此,我们已经弄明白了`encrypPassword`和`_token`的生成方式,下一步,就是构造自己的Request。 -# 0x04 实战 +## 0x04 实战 有了前两节的基础,实现起来也不会很难了。需要注意的是在构造请求的时候,不能忽视请求头的内容,我们要伪装的像正常的web行为。获取请求头也简单,抓包直接复制过来就是。但是你可能会发现请求头中已经有了`Cookies`字段。经过测试,没有这个字段也能正常的访问,只要有下面这些请求头就行了: ```py headers = { @@ -499,7 +499,7 @@ class DianPingAccount: return True ``` -# 0x05 结语 +## 0x05 结语 像上面所说的一样,这只是一个简易版的登录脚本。登录过程中还会遇到很多其他的情况,比如验证码,登录限制等等。这些情况都没有处理,也不是那么容易处理。另外使用不当可能会造成账号短暂被锁,限制密码登录甚至账号被ban等后果,请注意。 点评的反爬虫机制还是很严格的,请小心使用。 关于验证码的部分,现在的ML这么火热,验证码识别已经是可以解决的问题了,有时间的话再来试一试验证码的识别。