Python 模拟登录挂号网为何总是出错?

2016-02-17 15:00:07 +08:00
 Graxce

弄了一整天了,还是没什么头绪。
模拟登录成功的话会返回 302 ,可是每次都是不行。
这是代码:
https://gist.github.com/CraxGrix/5bb33e116934f1ebf259

V2ex 不能发图片,那我发我的知乎问题吧。那里写的更清楚。
www.zhihu.com/question/40393212

这里提供一个帐号供各位测试
帐号: 13136180314
密码: 123456

2458 次点击
所在节点    Python
9 条回复
aec4d
2016-02-17 17:32:43 +08:00
用好 CTRL+V 神技
# loginId , validCode
import requests

def login():
s = requests.session()
s.get('http://www.guahao.com/user/login')
captcha_content = s.get('http://www.guahao.com/validcode/genimage/1').content
with open('dic.jpeg', 'wb') as fp:
fp.write(captcha_content)
data = {
"method": "dologin",
"target": "/",
"loginId": "13136180314",
"password": "e10adc3949ba59abbe56e057f20f883e",
"validCode": input('CODE: ')
}
r = s.post('http://www.guahao.com/user/login', data=data, allow_redirects=False)
print(r.status_code)


if __name__ == '__main__':
login()
Graxce
2016-02-17 20:06:42 +08:00
@aec4d 实在是非常感谢,每次我都不记得检查自己的代码。每次出错都是因为我自己疏忽所以才导致的。真是太蠢了我!以后我不会提这种这么蠢的问题了!!谢谢!
slideclick
2016-02-19 14:44:34 +08:00
@aec4d 从你代码看,你是把 password 加密了的。从那个挂号网页面 code 怎么看出来的加密算法?
sololivan
2016-02-19 16:05:44 +08:00
@slideclick 不用知道加密算法, 直接看加密好的发送请求呀.
Graxce
2016-02-21 15:00:13 +08:00
@slideclick 常见的加密算法就那么几个,拿到 password 数据后只需要找在线加解密工具。一个一个试就好啦。
slideclick
2016-02-22 09:48:47 +08:00
@sololivan 确实可以解决这个问题,我感兴趣的是,从该网站的前端页面代码应该可以看到加密算法,但是我前端不够熟悉,不知道怎么看出来的
slideclick
2016-02-22 09:53:04 +08:00
@Graxce http://onlinemd5.com/ 把你的口令填进去就行了。但是你总要试三次。我的问题是,拿到一个前端页面的 code 这个你总可以拿到因为在浏览器里面,你怎么知道它的加密算法?浏览器肯定知道,它发的是 MD5 之后的,它怎么知道的?
slideclick
2016-02-22 17:30:38 +08:00
打开 http://www.guahao.com/user/login 页面看源码,看不到加密 password 的 js 代码。而显然它的 post 的目标 /user/login 要的是 MD5 加密,我的问题是,如果你抽象地拿到这个问题,有什么办法知道它用的什么加密算法。
xqin
2016-02-23 14:16:24 +08:00
1. 得到登陆时提交的数据字段名.(比如你的这个是 password)
2. 然后在浏览器(Chrome)中打开控制台, 按 Ctrl+Shift+F, 在里面输入 password
3. 在查找到的结果中, 以你的为例,会看到一个 new-account.js, 在这个文件里会找到下面这样的代码:
```
i.find("#J_LoginSubmit").click(function() {
return r.find(".g-tips-box-error").hide(),
r.find(".g-tips-box-succ").hide(),
$GUB.isActive($(this)) && e.checkValidity(r) && ($GUB.disable($(this), "处理中..."),
r.find("input[name='password']").val($().crypt({
method: "md5",
source: r.find("#password").val()
})),
r.submit()),
!1
}
),

```

然后你就知道它用的什么加密的了.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/257070

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX