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

用 request 模块遇到网站的 vue 的$nextTick(),无法获取返回数据

  •  
  •   yxnwh · 2022-01-12 18:52:07 +08:00 · 7443 次点击
    这是一个创建于 1028 天前的主题,其中的信息可能已经有所发展或是发生改变。
    网站: https://www.kejiwanjia.com/mission/today

    现象描述:

    通过 fiddler 抓包,得到该网站的签到链接为: https://www.kejiwanjia.com/wp-json/b2/v1/userMission
    熟练的构造好所需的 cookie 和其他 headers ,以及 useragent 后,第二天 post 发送构造好的链接,结果一直返回前一天的签到值,登录网页后,发现实际未签到,保持网页的登录状态,返回 fiddler 再 post 一次构造链接,结果顺利签到。。。


    情况分析:
    分析 fiddler 抓到的相关 html 和 js 文件,发现主要的可疑点见下图


    imgur.com/a/M3nZSe4


    深度分析 aka 小白的一派胡言:
    直接 post 发送构造链接,因为$nextTick()的存在,导致服务器无法返回最新的 response ,而是继续返回前一天签到成功后的 response


    最后附上我的核心代码


    imgur.com/a/5SGcCYB


    希望各位大佬提供下解题思路
    第 1 条附言  ·  2022-01-13 09:11:55 +08:00
    经过 @maichael 的提示,已经顺利完成签到,非常感谢!

    源代码就不贴了,如果在这个网站真有看帖发帖需求,给博主充值 6 元获得超级金主称号,即可随意看帖发帖

    简单说一下签到实现思路,懂得都懂吧~

    1. 分析下含有 jwt-auth 这个关键字的链接
    2. 分析下含有 getUserMission 这个关键字的链接
    3. 分析下含有 UserMission 这个关键字的链接
    12 条回复    2022-01-13 11:10:39 +08:00
    liliclinton
        1
    liliclinton  
       2022-01-12 18:57:56 +08:00
    和 vue 无关
    yxnwh
        2
    yxnwh  
    OP
       2022-01-12 18:59:03 +08:00
    @liliclinton 好吧,我果然是在一派胡言。。。
    shenyu1996
        3
    shenyu1996  
       2022-01-12 19:30:27 +08:00
    试试把登录流程也加上呢 接口拿到实时的 token 再走 sign
    yxnwh
        4
    yxnwh  
    OP
       2022-01-12 19:35:15 +08:00
    @shenyu1996 有的,那个很简单就没贴,思路就是通过 username 和 password ,拿到实时 token ,拿到的 token 再传到这个 sign 函数里面,拼接成 authorization ,就可以签到了

    很奇怪的地方就是,直接 post 构造链接,无论如何都不能签到,但一旦登录次,再 post 链接,马上就能签到成功
    powersee
        5
    powersee  
       2022-01-12 19:50:21 +08:00 via Android
    刚好最近也研究这个网站的签到,其实只需要 authorization 就行的,不需要 cookie 也能签到。不过这网站登录一次的有效时长只有 3 天左右好像。估计只能按照你上面的思路,先弄好登录这一步才行。
    yxnwh
        6
    yxnwh  
    OP
       2022-01-12 20:19:37 +08:00
    登录这一步,你可以在抓包时关注下含有 jwj-auth 这个关键词的网址,会有惊喜
    yxnwh
        7
    yxnwh  
    OP
       2022-01-12 20:20:04 +08:00
    @yxnwh jwt-auth
    maichael
        8
    maichael  
       2022-01-12 20:20:15 +08:00
    1. 和 vue 没关系
    2. 没报 403 ,token 应该没问题
    3. 如果已经登录的直接打开页面也能签到,说明跟登录接口没什么关系,应该是有一个前置接口没有调用,而这个接口在登录状态打开页面会自动调用,可以再看看登录状态下打开页面调用了那些接口。
    yxnwh
        9
    yxnwh  
    OP
       2022-01-12 20:24:05 +08:00
    @maichael 多谢大佬的思路,我在 fiddler 抓包时,发现登录网页后,stream 流里面还紧跟着一个登录 hi.kejiwanjia.com 链接的 login 信息,我试试把这个 login 也写进去
    powersee
        10
    powersee  
       2022-01-12 21:26:33 +08:00
    那就容易了,先使用 post 去登录,然后它返回的内容里有 token 的值,用 'Bearer ' + token 就是 authorization

    然后再用这个 authorization 去 post 签到的那个接口就可以了
    yxnwh
        11
    yxnwh  
    OP
       2022-01-13 09:07:11 +08:00
    @maichael 再次感谢大佬,昨晚分析了一会,大致是这个流程(小白个人分析,不一定完全对):这个网站是先调用了 getUserMission 这个接口,获取服务器端用户的一些数据(等级,积分,用户名等等)其中包含了 mission 字段,随后再调用 UserMission 接口签到,并将签到数据写入 mission 字段,从而实现用户签到数据的更新,如果不经调用 getuserinfo 这个接口,则导致无法获得 mission 字段,进而导致签到后的数据无法写入
    gadfly3173
        12
    gadfly3173  
       2022-01-13 11:10:39 +08:00
    nexttick 的作用是等待 DOM 更新后再执行操作,你把它当成 setTimeout 来看就可以
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1069 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:44 · PVG 03:44 · LAX 11:44 · JFK 14:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.