模拟登录 藏宝湾 一直都是失败
其他论坛都可以,
head 头也看过了,cookie 也看过了,没什么差
死活就是登录不了,用 okhttp3 或 jsoup 没一个能登录上的
跪求大佬指点迷津
1
bzj 2020-07-06 09:55:30 +08:00
|
2
ydpro 2020-07-06 10:14:59 +08:00
不是大佬,但是用 selenium 模拟登录正常
from selenium import webdriver from time import sleep wb = webdriver.Chrome() #指定驱动 wb.get('https://www.iopq.net/home.php?mod=spacecp&ac=profile&op=password') #指定网址 #定位用户名 userName = wb.find_element_by_id('ls_username') userName.send_keys('你的用户名') #定位密码框 userPassword = wb.find_element_by_id('ls_password') userPassword.send_keys('你的密码') #点击登录元素 userClick = wb.find_element_by_xpath('//td[@class="fastlg_l"]/button').click() sleep(15) #等待时长 15s |
4
autoname OP @bzj https://cdn.jsdelivr.net/gh/post-get/static/891b815fd6514c11975cbd9a21b320f4.png
loc discuz 什么的 都能登录成功,就宝湾失败了 |
6
autoname OP |
7
vcheckzen 2020-07-06 10:44:10 +08:00 via Android
formhash
|
8
wangsongyan 2020-07-06 10:49:37 +08:00
@autoname 你的 header 呢?
|
10
autoname OP @wangsongyan header postman 空空的, 但是用 jsoup head 是默认的 我只设置了 User-Agent
|
12
autoname OP @wangsongyan postman 传了一个 User-Agent Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) 还是失败
|
15
xxxy 2020-07-06 11:07:07 +08:00
建议贴完整的请求响应包
|
18
bzj 2020-07-06 11:15:38 +08:00
@autoname 用的 postman 客户端,header 里面是默认的参数,没什么用,discuz 有防火墙功能,会不会是你频繁请求 ip 被限制了。
|
19
autoname OP @bzj 不是吧 限制的话 也不是这个登录密码错误的提示吧,我也重播过好几次 路由。ip 换好几个,应该不是这问题。
|
22
autoname OP @bzj 不能啊!就算 ide 里面写错了, 我这 postman 总不会再错吧,我也在浏览器登录,退出,好几次了,都很正常的呀
|
23
autoname OP @bzj 大佬 发下你的 header 头,我再传传,这太郁闷了,dz 官方和 lochost 都登的好好的。独独藏宝湾不行
|
24
jiejiss 2020-07-06 11:31:01 +08:00
@autoname #22 对不起,但你 postman 的 referer 头错了,遇到这种问题不应该首先检查有没有抄错参数吗
|
25
liubian 2020-07-06 11:33:18 +08:00
|
26
jiejiss 2020-07-06 11:35:22 +08:00
@autoname #23 看到 #25,那就不是 Referer 的问题,你去看下浏览器 Network 栏的 HTTP Header 吧
|
29
locoz 2020-07-06 11:41:42 +08:00 1
给你个建议:打开抓包工具,先抓一遍浏览器发出去的登录包,然后再抓一遍你自己程序发出去的登录包,接着拿这两个包进行对比,有差异的地方就是你需要注意的地方了。两个静态参数一样、动态参数生成方式一样的请求,是不可能得到不一样的结果的。
|
30
locoz 2020-07-06 11:43:43 +08:00
@locoz #29 补充一下,参数指整个 HTTP 请求流程中的所有东西,包括但不限于 URL 、Headers 、Body 、SSL/TLS 的一些参数等。
|
31
autoname OP @locoz 感谢大佬建议,但 jsoup 或者 okhttp3 走的都是 java 内部的 我用 Fiddler 抓不到他.用代理发出来又要设置证书,非常麻烦啊,
刚才重新注册了一个号,登录成功了,发现是账号问题,估计他那 dz3.4 版本比较老,不支持中文账号模拟登录, 可惜了,又要用小号权限不够高。不好爬帖子, |
32
jiejiss 2020-07-06 11:55:16 +08:00
你确定这个站有做一毛钱的反爬?
curl 'https://www.iopq.net/api/mobile/index.php?version=4&module=login&loginsubmit=yes&mapifrom=wx&charset=utf-8' \ -H 'content-type: application/x-www-form-urlencoded' \ --data-raw 'username=username&password=password' 我这样都成功了 |
34
locoz 2020-07-06 12:00:43 +08:00
@autoname #31 抓包跟是不是走的 Java 内部无关,你代码里是可以设置代理的,直接设置个代理然后设置忽略证书就好了。
你新号可以但旧号不行的原因多半是因为你没有对中文进行编码操作,毕竟你浏览器可以... |
35
autoname OP @locoz 是啊,我也用过 Fiddler 抓包里面发送 http 编码的用户名,
类似这样%e4%b8%ad%e6%96%87 也用过 unicode \u4e2d\u6587 都失败了,今天才发现是用户名问题,请问大佬 这用户名要怎么编码 |
37
locoz 2020-07-06 12:43:11 +08:00
@autoname #35 具体用什么编码要抓包看的,乱试没有用。我刚刚看了一下你说的这个网站,它用的是基于 gb2312 ( gb 系列)的 urlencode,比较老;而现在一般的 urlencode 会是基于 utf-8 的,所以你前面的尝试失败了就是因为这个原因。
解决办法就是把代码里的 urlencode 部分设置使用 gb2312 或更高版本的 gb 系列编码,java 的代码应该是 java.net.URLEncoder.encode(str, "GB18030")这样。 |
38
autoname OP @locoz 谢谢大佬指点。gb2312 就用这个 java.net.URLEncoder.encode(str, "GB18030") 一般都可以吗
谢谢大佬 |
39
locoz 2020-07-06 12:45:52 +08:00
@locoz #37 顺便再补充一下,字库量 gb2312 < gbk < gb18030,通常情况下直接使用 gb18030 处理 gb 系列的编码即可,它是向下兼容的。
|
40
locoz 2020-07-06 12:47:22 +08:00
@autoname #38 一般碰到这种一串%xx 的就是 urlencode 了,直接拿到 http://tool.chinaz.com/tools/urlencode.aspx 里面试一下,哪个解出来的结果正常就是基于哪个编码的。
|
41
autoname OP |
43
autoname OP @locoz 不行,我用 java.net.URLEncoder.encode(str, "GBK") 编码后 和浏览器里面一样的,提交还是失败了,
大佬知道怎么处理回帖验证码吗,有相关 demo 参考吗 谢谢 |
44
locoz 2020-07-06 16:29:35 +08:00
@autoname #43 不应该啊?你英文的都可以成功,说明就是用户名的问题了,还是失败就很奇怪了,感觉是触发了什么别的东西...建议发个抓包对比图看看。
验证码分很多种,简单的纯文字还是要鼠标轨迹之类的拼图、滑块那些?纯文字的话网上有些免费的打码模型可以用一下,难搞的那些你自己搞不定可以接打码平台。 |
45
supermoonie 2020-07-06 17:04:53 +08:00
@locoz 一看这头像就知道是大佬了
|