英语周报 APP 扫码获取答案 API 分析

TAT 英语老师布置的周报题真是太多了… 老师复印给我们,一般都会把二维码遮掉,有人问我能不能不用二维码,获取任意某期的答案 23333 所以我决定折腾折腾,实现了这个想法,嘿嘿嘿

首先将任意一张周报上的二维码转为可读的 URL,然后将 URL 扔进浏览器,调用打开英语周报的 APP

通过抓包,得到了 APP 扫码后的第一个请求的地址 http://app.ew.com.cn/Weekly/index.php?c=ResourceController&a=getResourceById&id=00538023X80&from=true 方法为 POST

通过分析两张周报的请求地址得出结论 X 是变量(报纸第 X 期);开头的 00538023 (报纸的代号)和末尾的 80 是常量

于是根据 X 的规则我写成了 PHP 代码:

1
2
3
4
5
6
7
8
9
10
if ($X < 10) {
// 若 X 小于 10 开头加上 0
$X = "0" . $X;
}
if ($X > 99) {
// 没有可以找到的答案了
}
if ($X < 1) {
// 不可能小于 1
}

对 URL 进行 POST 请求。我用 CURL,downloadPage 是一个自定义函数

1
$firstReq = json_decode(downloadPage('http://app.ew.com.cn/Weekly/index.php?c=ResourceController&a=getResourceById&id=00538023'.$X.'80&from=true'));

结果得到了 JSON 数据,结合抓包的结果发现 $firstReq['result'][0]['resource_path'] 即为答案资源根路径

1
$getResourcePath = $firstReq['result'][0]['resource_path'];

通过组合 根路径+/question.txt 再次请求得到答案 txt

1
2
// Curl 二次请求
$secondReq = downloadPage($getResourcePath . '/question.txt');

这样就可以不用二维码,获取任意某期的答案

最后,为了加快答案查询速度,防止重复请求,写了缓存的代码将已请求的数据下载下来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 判断是否有缓存文件
$cacheContent = @json_decode(file_get_contents($cacheFile), true);
if (file_exists($cacheFile) && !empty($cacheContent["AS".$how]))
{
return ['content' => trim($cacheContent["AS".$how])];
}

// 执行远程下载
// ...

// 写入缓存
$cacheContent = array_merge($cacheContent, ["AS$how" => $secondReq]);
@file_put_contents($cacheFile, json_encode($cacheContent));

return ['content'=> trim($secondReq)];

做成了 PHP 和 C# 版供小伙伴们享用 吼吼吼

GitHub: EnglishWeeklyDaSearchToolPhp

GitHub: EnglishWeeklyDaSearchTool


By ZNEIAT

2017-1-8
本站文章除注明转载外均为原创,未经允许不要转载哇. ヾ(゚ー゚ヾ) http://qwqaq.com/3a4d505.html
分享到