即刻在2020年6月10号上午回归了,回归还做了一个特别有意思的活动,寻找果果。活动本身的解谜即友都有做汇总,技术上很多即友也发现了可以剧透的内容,这里做一个收集。本文需要一点点基本的前端知识,算是另一个视角下的解谜。

第零天:预览关卡内容

第零天,官方发布了一张污损的海报预告有一个大型解谜活动,通过补全二维码可以获得活动入口。

1
https://h5.codefuture.top/hybrid-gone-cat

由于活动于第一天开始,所以无法进入活动,甚至因为界面设置问题无法看到规则。

通过浏览页面JS可以发现这样一些代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 代码段一
baseURL: W ? "/proxy" : "https://meow.codefuture.top/api",
withCredentials: !0,
headers: {
Accept: "application/json",
"Content-Type": "application/json"
}
// 代码段二
list: function(e, t) {
return regeneratorRuntime.async((function(n) {
while (1)
switch (n.prev = n.next) {
case 0:
return n.abrupt("return", $("/chapters/list", {
skip: e,
limit: t
}));
case 1:
case "end":
return n.stop()
}
}
))
}
// 代码段三
setPollingData: function(e, t) {
e.cats.data = t.data,
e.cats.currentIndex = t.currentIndex
}
// 代码段四
var t = JSON.parse(localStorage.getItem("gone-cat-intro") || "false");
if (t && 0 !== e.currentIndex) {
if (void 0 === e.currentIndex)
return void H.replace("/prev");
if (6 !== e.currentIndex)
return void H.replace("/ch/".concat(e.currentIndex));
H.replace("/final6")
} else
0 !== e.currentIndex && (H.replace("/intro"),
localStorage.setItem("gone-cat-intro", "true"))

通过代码段四可以分析出通过currentIndex判断页面,通过代码段二、三可以发现该值通过/chapters/list获取,通过代码段一可以获得完整的地址https://meow.codefuture.top/api/chapters/list

虽然当时返回的是空值,但通过代码段三可以大致猜测一下返回值的结构,应该类似:

1
{"data":[{"index":6,"feeds":[{"content":"content"}]}],"currentIndex":6}

通过伪造返回值,将这段数据返回给网页,就可以在第零天预览规则和全部关卡的美工。

具体关卡的内容就需要等待上线后后端服务器在content字段中返回。这段数据可以获得这样一个界面:伪造数据预览

第一天:获得两个彩蛋

第一天通过宠语翻译器可以进入第一个彩蛋,网址为:

1
https://h5.codefuture.top/hybrid-gone-cat-eggs/translator-egg.html

在这个网站的头部,可以看到有由于失误加入的其他代码。

1
2
3
4
<link as="style" href="https://static.codefuture.top/hybrid-gone-cat-eggsstatic/css/calendar-egg.132d081f1832e4ca3ac6.css" rel="preload">
<link as="style" href="https://static.codefuture.top/hybrid-gone-cat-eggsstatic/css/translator-egg.b14590d3779db1625490.css" rel="preload">
<link as="script" href="https://static.codefuture.top/hybrid-gone-cat-eggsstatic/js/calendar-egg.8fee2dc09008986e5c9f.js" rel="preload">
<link as="script" href="https://static.codefuture.top/hybrid-gone-cat-eggsstatic/js/translator-egg.5f9b4347afea071ef8c4.js" rel="preload">

所以可以猜到第二个彩蛋和calendar有关,虽然这些文件存在错误,但是通过第一个彩蛋js和css正确的网址可以拼接出第二个彩蛋的js和css文件。

伪造第二个彩蛋

于是可以通过第二个彩蛋的css文件找到第二个彩蛋的猫图:

1
https://static.codefuture.top/hybrid-gone-cat-eggs/static/image/calendar-egg.png

通过将第二个彩蛋的css当成第一个彩蛋的css返回,将页面中的一改成二,就可以伪造出第二个彩蛋的页面。当然,如果第二个彩蛋的提示更改了那也是没办法的事情。

获取彩蛋网址

在第二个彩蛋的js中,可以找到这样的代码:

1
2
3
4
5
6
i.default.updateShareInfo({
title: "GoneCat解谜日历",
desc: "我在GoneCat解谜日历寻找线索,帮帮忙!",
imgUrl: "https://static.codefuture.top/hybrid-decrypt-calendar/img/home-center.c10e5681.png",
link: location.href
})

结合第一天翻译器及彩蛋页面的域名:

1
2
https://h5.codefuture.top/hybrid-cat-translator
https://h5.codefuture.top/hybrid-gone-cat-eggs/translator-egg.html

不难猜出第二天的活动页面及彩蛋域名:

1
2
https://h5.codefuture.top/hybrid-decrypt-calendar
https://h5.codefuture.top/hybrid-gone-cat-eggs/calendar-egg.html

不过第一天的时候这两个页面由于时间没到没有开,会返回403。

但在第二天活动没开始之前页面就可以访问了,并且和伪造的第二个彩蛋没有区别。

第三天:提前进入回归页面

对于重要的内容和文件一般都会有个提醒和监控,具体实现可能不一样,用着习惯就好。

第零天由于没有预告几点开始活动,当时是监控这个网址的返回值变化做的活动开启提醒:

1
https://meow.codefuture.top/api/chapters/list

通过监控主活动页面的JS,可以发现final的JS有更新一开始内容为:

1
var g = ["喵~喵~喵呜呜呜~", "汪~汪~汪汪", "吱~吱吱", "喵~喵呜呜~"],

后来更新为:

1
var g = ["喵~喵~喵呜呜呜~"]

第一天就把这一段内容在翻译器中试过,所以活动的时候也没想到这就是最终线索。

但回头回顾这个活动,翻译器返回值每天都更新,第三天翻译器返回值有更新也在情理之中。

也不知道这个返回值是南北大战活动结束更新还是定时更新。

其他彩蛋

即刻的后端返回HTTP数据包,”x-server”一项返回的是”Potato-Server”。

南北大战活动的解锁需要给babel-t单条点赞600,结果点了一天没点满,估计是故意的。最后第二天十点满了500点赞以后babel-t发了一张歌手伍佰的图,开启了南北大战活动。对,就是那个所以暂时将你眼睛闭了起来。

最后一页还更新了一张图,可惜的是,常规方法大部分人没办法看到,这里一起放出来:

thank-cat

其余彩蛋如果有人分享再继续更新,恭喜即刻回归 🎉!