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

2022-01-12 18:52:07 +08:00
 yxnwh
网站: 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


希望各位大佬提供下解题思路
7488 次点击
所在节点    Node.js
12 条回复
liliclinton
2022-01-12 18:57:56 +08:00
和 vue 无关
yxnwh
2022-01-12 18:59:03 +08:00
@liliclinton 好吧,我果然是在一派胡言。。。
shenyu1996
2022-01-12 19:30:27 +08:00
试试把登录流程也加上呢 接口拿到实时的 token 再走 sign
yxnwh
2022-01-12 19:35:15 +08:00
@shenyu1996 有的,那个很简单就没贴,思路就是通过 username 和 password ,拿到实时 token ,拿到的 token 再传到这个 sign 函数里面,拼接成 authorization ,就可以签到了

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

然后再用这个 authorization 去 post 签到的那个接口就可以了
yxnwh
2022-01-13 09:07:11 +08:00
@maichael 再次感谢大佬,昨晚分析了一会,大致是这个流程(小白个人分析,不一定完全对):这个网站是先调用了 getUserMission 这个接口,获取服务器端用户的一些数据(等级,积分,用户名等等)其中包含了 mission 字段,随后再调用 UserMission 接口签到,并将签到数据写入 mission 字段,从而实现用户签到数据的更新,如果不经调用 getuserinfo 这个接口,则导致无法获得 mission 字段,进而导致签到后的数据无法写入
gadfly3173
2022-01-13 11:10:39 +08:00
nexttick 的作用是等待 DOM 更新后再执行操作,你把它当成 setTimeout 来看就可以

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

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

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

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

© 2021 V2EX