背景
最近听学弟说要毕业了,还要实习打卡,问我有没有什么办法。我原以为今年依然是蘑菇钉,那直接用现成的就好了,但学弟说今年全江西省都更换了实习打卡平台,换到了"江西智慧教育"。话不多说,开搞。

抓包
直接上 Stream 开始抓包(苹果用这个抓包还是比较方便的):
- 打开 Stream,开启抓包
- 进入登录页面,开始登录
- 过滤多余的抓包数据,只针对
http://sxsx.jxeduyun.com这个域名进行筛选
最终看到这样一个接口:
http://sxsx.jxeduyun.com:7779/portal-api/app/index/login这肯定就是登录接口了,尝试模拟走一遍?
登录接口
先看到它的参数有这些:
$datas = [
"appLogin" => true,
"loginAccount" => $data['loginAccount'],
"password" => $data['password'],
"appUserId" => "",
"loginUserType" => "student",
"enrollmentYear" => $data['enrollmentYear']
];注意 password 字段——本来准备下手分析它是怎么加密的,结果碰巧直接用明文密码登录,竟然成功了???
那 password 直接传明文就可以了,开始封装代码:
/**
* 登录
*/
public function login()
{
$data = Request::post();
// 验证数据
if ($data['loginAccount'] == '') {
return ResponseUtils::error('账号不允许为空');
} else if ($data['password'] == '') {
return ResponseUtils::error('密码不允许为空');
} else if ($data['enrollmentYear'] == '') {
return ResponseUtils::error('请选择毕业年份');
}
$url = 'http://sxsx.jxeduyun.com:7779/portal-api/app/index/login';
$datas = [
"appLogin" => true,
"loginAccount" => $data['loginAccount'],
"password" => $data['password'],
"appUserId" => "",
"loginUserType" => "student",
"enrollmentYear" => $data['enrollmentYear']
];
$res = $this->curl_post($url, $datas);
$responseData = json_decode($res, true);
if ($responseData['code'] == 200) {
$token = $responseData['data']['token'];
// 记录到用户表,方便后续自动打卡
Db::table('sign_user')->insert([
'loginAccount' => $data['loginAccount'],
'password' => $data['password'],
'enrollmentYear' => $data['enrollmentYear'],
'addTime' => date('Y-m-d H:i:s'),
'last_login_time' => date('Y-m-d H:i:s'),
'last_login_ip' => Request::ip(),
'token' => $token
]);
return ResponseUtils::successData(['token' => $token, 'message' => '登录成功']);
}
return ResponseUtils::error($responseData['msg']);
}打卡接口
登录成功还远远不够。从登录接口的返回信息里可以看到一个 token,把它拼到 Authorization 请求头里,就可以调用后续接口了。
模拟一次打卡操作,同时抓包,同样很轻松地拿到了打卡接口:
http://sxsx.jxeduyun.com:7779/portal-api/practice/autonomyClock/add参数如下:
$sign_data = [
"autonomyId" => $id,
"userId" => $userId,
"nickName" => $name,
"clockAddress" => $user['address'],
"fileId" => $uploadResult['data'],
"clockTime" => date("Y-m-d H:i:s"),
"clockType" => "签到",
"clockContent" => ""
];剩下的就是封装模拟一遍,配合定时任务,就能实现每天自动打卡了。
交流微信:run1255