V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
autoname
V2EX  ›  Java

有没有爬虫大佬,问个模拟登录的问题。关于 discuz

  •  
  •   autoname · 2020-07-06 09:40:39 +08:00 · 3642 次点击
    这是一个创建于 1389 天前的主题,其中的信息可能已经有所发展或是发生改变。

    模拟登录 藏宝湾 一直都是失败

    其他论坛都可以,

    head 头也看过了,cookie 也看过了,没什么差

    死活就是登录不了,用 okhttp3 或 jsoup 没一个能登录上的

    跪求大佬指点迷津

    45 条回复    2020-07-06 17:04:53 +08:00
    bzj
        1
    bzj  
       2020-07-06 09:55:30 +08:00
    亲测可行,都不需要带什么请求头,你确定自己会模拟登录?

    https://ftp.bmp.ovh/imgs/2020/07/bb1113133d3ebe21.png
    ydpro
        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
    autoname
        3
    autoname  
    OP
       2020-07-06 10:28:00 +08:00
    @bzj 大佬你测试下 jsoup 呀,不要用 postman
    autoname
        4
    autoname  
    OP
       2020-07-06 10:30:42 +08:00
    @bzj https://cdn.jsdelivr.net/gh/post-get/static/891b815fd6514c11975cbd9a21b320f4.png

    loc discuz 什么的 都能登录成功,就宝湾失败了
    autoname
        5
    autoname  
    OP
       2020-07-06 10:36:12 +08:00
    @ydpro 这也是 jar 库吗
    autoname
        6
    autoname  
    OP
       2020-07-06 10:44:00 +08:00
    vcheckzen
        7
    vcheckzen  
       2020-07-06 10:44:10 +08:00 via Android
    formhash
    wangsongyan
        8
    wangsongyan  
       2020-07-06 10:49:37 +08:00
    @autoname 你的 header 呢?
    autoname
        9
    autoname  
    OP
       2020-07-06 10:50:38 +08:00
    @vcheckzen 不知道为什么,按照 4 楼 图里面的传参登录可以不用 formhash
    autoname
        10
    autoname  
    OP
       2020-07-06 10:52:08 +08:00
    @wangsongyan header postman 空空的, 但是用 jsoup head 是默认的 我只设置了 User-Agent
    lixuda
        11
    lixuda  
       2020-07-06 10:52:27 +08:00
    @bzj 这个 post 是什么工具?谢谢,是浏览器自带吗?
    autoname
        12
    autoname  
    OP
       2020-07-06 10:53:40 +08:00
    @wangsongyan postman 传了一个 User-Agent Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) 还是失败
    autoname
        13
    autoname  
    OP
       2020-07-06 10:55:00 +08:00
    @bzj 不是说不要请求头嘛,给我看看你的 head 头, 9 个是什么参数呀 谢谢大佬
    ydpro
        14
    ydpro  
       2020-07-06 10:55:13 +08:00
    @autoname python 库,直接 pip 下载就好,然后下载一个和当前浏览器版本一样的浏览器驱动直接用
    xxxy
        15
    xxxy  
       2020-07-06 11:07:07 +08:00
    建议贴完整的请求响应包
    autoname
        16
    autoname  
    OP
       2020-07-06 11:09:40 +08:00
    @xxxy 响应包就是和 6 楼一样,失败了,
    autoname
        17
    autoname  
    OP
       2020-07-06 11:12:31 +08:00
    @ydpro 大佬我这用 java 呀,你跟我来 python 不合适吧
    bzj
        18
    bzj  
       2020-07-06 11:15:38 +08:00
    @autoname 用的 postman 客户端,header 里面是默认的参数,没什么用,discuz 有防火墙功能,会不会是你频繁请求 ip 被限制了。
    autoname
        19
    autoname  
    OP
       2020-07-06 11:18:39 +08:00
    @bzj 不是吧 限制的话 也不是这个登录密码错误的提示吧,我也重播过好几次 路由。ip 换好几个,应该不是这问题。
    bzj
        20
    bzj  
       2020-07-06 11:25:58 +08:00
    @autoname

    那么只有一种可能,你账号密码错了
    jiejiss
        21
    jiejiss  
       2020-07-06 11:27:30 +08:00
    @autoname #6 没抄对,你的 referer 少了个末尾斜杠
    autoname
        22
    autoname  
    OP
       2020-07-06 11:28:04 +08:00
    @bzj 不能啊!就算 ide 里面写错了, 我这 postman 总不会再错吧,我也在浏览器登录,退出,好几次了,都很正常的呀
    autoname
        23
    autoname  
    OP
       2020-07-06 11:30:20 +08:00
    @bzj 大佬 发下你的 header 头,我再传传,这太郁闷了,dz 官方和 lochost 都登的好好的。独独藏宝湾不行
    jiejiss
        24
    jiejiss  
       2020-07-06 11:31:01 +08:00
    @autoname #22 对不起,但你 postman 的 referer 头错了,遇到这种问题不应该首先检查有没有抄错参数吗
    liubian
        25
    liubian  
       2020-07-06 11:33:18 +08:00
    jiejiss
        26
    jiejiss  
       2020-07-06 11:35:22 +08:00
    @autoname #23 看到 #25,那就不是 Referer 的问题,你去看下浏览器 Network 栏的 HTTP Header 吧
    autoname
        27
    autoname  
    OP
       2020-07-06 11:35:47 +08:00
    @jiejiss 我也加上了没用,这只是告诉他 登陆后跳到什么地方,传什么都可以的
    autoname
        28
    autoname  
    OP
       2020-07-06 11:39:29 +08:00
    @liubian wocao 我打算 重新注册一个号看看, 我原来的是中文账号,。目前密码错误 15 次,尝试不了
    locoz
        29
    locoz  
       2020-07-06 11:41:42 +08:00   ❤️ 1
    给你个建议:打开抓包工具,先抓一遍浏览器发出去的登录包,然后再抓一遍你自己程序发出去的登录包,接着拿这两个包进行对比,有差异的地方就是你需要注意的地方了。两个静态参数一样、动态参数生成方式一样的请求,是不可能得到不一样的结果的。
    locoz
        30
    locoz  
       2020-07-06 11:43:43 +08:00
    @locoz #29 补充一下,参数指整个 HTTP 请求流程中的所有东西,包括但不限于 URL 、Headers 、Body 、SSL/TLS 的一些参数等。
    autoname
        31
    autoname  
    OP
       2020-07-06 11:54:43 +08:00
    @locoz 感谢大佬建议,但 jsoup 或者 okhttp3 走的都是 java 内部的 我用 Fiddler 抓不到他.用代理发出来又要设置证书,非常麻烦啊,

    刚才重新注册了一个号,登录成功了,发现是账号问题,估计他那 dz3.4 版本比较老,不支持中文账号模拟登录,

    可惜了,又要用小号权限不够高。不好爬帖子,
    jiejiss
        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'

    我这样都成功了
    jiejiss
        33
    jiejiss  
       2020-07-06 11:56:10 +08:00
    @autoname #31 你是不是中文账号没有 encodeURIComponent 啊……那不能怪人家版本低啊
    locoz
        34
    locoz  
       2020-07-06 12:00:43 +08:00
    @autoname #31 抓包跟是不是走的 Java 内部无关,你代码里是可以设置代理的,直接设置个代理然后设置忽略证书就好了。
    你新号可以但旧号不行的原因多半是因为你没有对中文进行编码操作,毕竟你浏览器可以...
    autoname
        35
    autoname  
    OP
       2020-07-06 12:36:36 +08:00
    @locoz 是啊,我也用过 Fiddler 抓包里面发送 http 编码的用户名,

    类似这样%e4%b8%ad%e6%96%87

    也用过 unicode \u4e2d\u6587

    都失败了,今天才发现是用户名问题,请问大佬 这用户名要怎么编码
    autoname
        36
    autoname  
    OP
       2020-07-06 12:38:40 +08:00
    @jiejiss 确实没有,一般用 dz 的都不会去弄这些反扒什么,加密什么
    locoz
        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")这样。
    autoname
        38
    autoname  
    OP
       2020-07-06 12:45:12 +08:00
    @locoz 谢谢大佬指点。gb2312 就用这个 java.net.URLEncoder.encode(str, "GB18030") 一般都可以吗
    谢谢大佬
    locoz
        39
    locoz  
       2020-07-06 12:45:52 +08:00
    @locoz #37 顺便再补充一下,字库量 gb2312 < gbk < gb18030,通常情况下直接使用 gb18030 处理 gb 系列的编码即可,它是向下兼容的。
    locoz
        40
    locoz  
       2020-07-06 12:47:22 +08:00
    @autoname #38 一般碰到这种一串%xx 的就是 urlencode 了,直接拿到 http://tool.chinaz.com/tools/urlencode.aspx 里面试一下,哪个解出来的结果正常就是基于哪个编码的。
    autoname
        41
    autoname  
    OP
       2020-07-06 12:52:20 +08:00
    locoz
        42
    locoz  
       2020-07-06 12:59:47 +08:00
    @autoname #41 抓包对比吧,可能还有别的区别
    autoname
        43
    autoname  
    OP
       2020-07-06 16:18:07 +08:00
    @locoz 不行,我用 java.net.URLEncoder.encode(str, "GBK") 编码后 和浏览器里面一样的,提交还是失败了,

    大佬知道怎么处理回帖验证码吗,有相关 demo 参考吗 谢谢
    locoz
        44
    locoz  
       2020-07-06 16:29:35 +08:00
    @autoname #43 不应该啊?你英文的都可以成功,说明就是用户名的问题了,还是失败就很奇怪了,感觉是触发了什么别的东西...建议发个抓包对比图看看。

    验证码分很多种,简单的纯文字还是要鼠标轨迹之类的拼图、滑块那些?纯文字的话网上有些免费的打码模型可以用一下,难搞的那些你自己搞不定可以接打码平台。
    supermoonie
        45
    supermoonie  
       2020-07-06 17:04:53 +08:00
    @locoz 一看这头像就知道是大佬了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3653 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:44 · PVG 12:44 · LAX 21:44 · JFK 00:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.