之前写的一个小东西,虽然开发出来,但是由于涉及到封建迷信并不能上架。对于这个问题,我也很是不解,现在各个平台星座类的小程序大行其道,弄点传统文化娱乐项目就成了封建迷行了。
首先需要声明,本项目的小程序源码参考了此项目。另,本项目仅提供用于学习目的,若不遵守,后果自负。
1.项目效果
2.数据来源
前端项目仅提供页面程序,数据来源于周公解梦网
需要使用php提供搜索和详情两个接口。
2.1搜索接口源码
<?php
/**
* Created by PhpStorm.
* User: ucsheep
*/
require 'vendor/autoload.php';
use QL\QueryList;
$timestamp = intval($_GET['timestamp']);
$keyword = $_GET['keyword'];
$sign = $_GET['sign'];
//第一道屏障,发起请求时间戳与请求到达服务端时间戳之差不得超过8s,否则视为非法请求
$xtime = time()-$timestamp;
if($xtime >= 8||$xtime<-5){
echo json_encode(array('mstate' => -1,'msg' => '非法请求'));
return;
}
//第二道屏障,请求参数合并后md5加密,服务端做校验,若校验失败视为非法请求
$real_sign = md5('da_'.$timestamp.'_'.$keyword.'_cn');
if($sign != $real_sign){
echo json_encode(array('mstate' => -2,'msg' => '非法请求'));
return;
}
//正式处理请求
$data = QueryList::get('https://m.zgjm.org/search/?wd='.$keyword)
// 设置采集规则
->rules([
'itemText'=>array('#main > div.libox.ibox.box > ul > li:nth-child(n) > a','text'),
'itemPath'=>array('#main > div.libox.ibox.box > ul > li:nth-child(n) > a','href')
])
->queryData();
for($i = 0;$i<sizeof($data);$i++){
$tmp_itemPath = $data[$i]['itemPath'];
$data[$i]['itemPath'] = base64_encode($tmp_itemPath);
}
echo json_encode(array('data' => $data,'mstate' => 0,'msg' => 'success'));
如上,提供了一个具有时效性签名验证的搜索接口。
2.2详情接口
<?php
/**
* Created by PhpStorm.
* User: ucsheep
*/
require 'vendor/autoload.php';
use QL\QueryList;
$timestamp = intval($_GET['timestamp']);
$item_path = $_GET['itempath'];
$sign = $_GET['sign'];
//第一道屏障,发起请求时间戳与请求到达服务端时间戳之差不得超过8s,否则视为非法请求
$xtime = time()-$timestamp;
if($xtime >= 8||$xtime<-5){
echo json_encode(array('mstate' => -1,'msg' => '非法请求'));
return;
}
//第二道屏障,请求参数合并后md5加密,服务端做校验,若校验失败视为非法请求
$real_sign = md5('da_'.$timestamp.'_'.$item_path.'_cn');
if($sign != $real_sign){
echo json_encode(array('mstate' => -2,'msg' => '非法请求'));
return;
}
$item_path = base64_decode($item_path);
//正式处理请求
$ql = QueryList::get('https://m.zgjm.org'.$item_path);
$data = $ql->find('#read-content > p:nth-child(n)')->texts();
for($i = 0;$i<sizeof($data);$i++){
$data[$i] = str_replace("(周公解梦官网m.zgjm.org)","",$data[$i]);
$data[$i] = str_replace("解梦","心理分析",$data[$i]);
//这里有人看懂了没?对抗平台审核,把敏感词替换
}
echo json_encode(array('data' => $data,'mstate' => 0,'msg' => 'success'));
上述代码,提供了一个时效性签名验证词条详情接口。
就喜欢PHP,写点小东西方便又快捷。
3.小程序源码
3.1搜索核心代码
var mTimestamp = Math.round(new Date().getTime() / 1000);
var mSign = md5("da_" + mTimestamp + "_" + key + "_cn");
wx.request({
url: 'https://your-server/api/search.php',
data: {
timestamp: mTimestamp,
keyword: key,
sign: mSign
},
method: 'GET',
header: {
'content-type': 'application/json'
},
success(res) {
console.log(res)
for (let i in res.data.data) {
let item = res.data.data[i]
arr.push(item)
}
that.setData({
isLoading: false,
results: arr
})
}
})
3.2 词条详情核心代码
var mTimestamp = Math.round(new Date().getTime() / 1000);
var mSign = md5("da_" + mTimestamp + "_" + itempath + "_cn");
wx.request({
url: 'https://your-server/api/details.php',
data: {
timestamp: mTimestamp,
itempath: itempath,
sign: mSign
},
success(res) {
for (let i in res.data.data) {
let item = res.data.data[i]
arr.push(item)
}
that.setData({
isLoading: false,
results: arr
})
}
})
4.总结
本项目使用php实现了一个简易的爬虫,可以向数据源网页发起请求并提取关键数据,并进行包装返回给小程序客户端。小程序客户端和后台接口之间借助hash形式实现具有实效性的签名验证,可以加大被别人抓包和恶意调用(PS:只是可以提高破解成本而已,类似我写的解析系列,逆向js其实也没有什么难度)。