准备:云服务器(域名可有可无,不过既然都上云,建议买域名做个自己的网站)
技术栈:lnmp+python+android前端
重点学习内容是php和python脚本和android前端
本文重在服务器,不在前端与脚本
一、环境配置
服务端环境配置,基本都是傻瓜式一键操作,没有难度。
云服务器如何搭建,推荐这篇文章
涉及第一次购买服务器的基本配置+LNMP环境搭建
注意:php版本建议选择7.x以上,如果不考虑wordpress搭建网站,看到第六部分之前即可
链接: https://blog.csdn.net/u014557455/article/details/124858175
确认已经搭建好宝塔界面,后续操作全部在宝塔界面实现
下面搭建网站,这里不使用任何框架
宝塔-》网站-》添加站点
添加站点,这里直接用ip创建(有域名的可以用域名)
把177.77.77.77替换成你的公网ip
同时创建个数据库
记得还得在php.ini配置文件中找到
;extension=mysqli
把;符号去掉
因为这个数据库默认用的是mysqli
但在配置文件里默认不用
然后访问http://177.77.77.77/
得到如下界面代表创建成功
至此网站,以及数据库搭建完成
后续在服务器部署python环境
在软件商店里找到python项目管理器,安装
然后设置,版本管理,安装一个版本,这里安装的是3.9.7
安装完成以后python环境就部署好了。
剩下的部分就是android前端,我依然还记得被andorid studio搞崩溃的日子,导入了别人的项目,却怎么都配置不好依赖库…不过android前端肯定还是要学,工具:android studio,用java和kotlin哪个语言去学都可以,熟悉java的话肯定首选Java。重点学习ui,控件事件,http部分。
正常的话就用Android studio开发最后的app了。但我没用Android studio做过完整的项目,正好之前用autojs写过一个运行脚本的android app,所以这里直接套壳使用。如果你一样懒,那么可以尝试autojs开发(这个是专门用来做手机脚本的),下面放上相关学习资料。
链接: Auto.JS 教程(1)
链接: autojs官方文档
链接: autojs实例
二、正式开发
往路径www/wwwroot/ip
这个ip就是你建网站的时候用的公网ip
这个路径下上传php文件
上传个my.php文件,里面随便写点,比如用echo输出一句话
通过下面的网址访问测试一下
http://服务器IP地址/my.php
如果觉得我写的比较简单,这里有一篇非常详细的文章可以参考
链接: https://blog.csdn.net/weixin_44634727/article/details/113641930
php接口测试完毕,下面就是php与android端的交互
这里以php与autojs下的前端交互为例
提交数据用http.post,不要用提交json
http.post
接收用$_POST数组
前端代码:
var url = "http://177.77.77.77/my_sql.php";
var username = "你的用户名";
var password = "你的密码";
var res = http.post(url, {
"TPL_username": "usernavv",
"TPL_password": "passwovv"
});
服务端代码my_sql.php:
$temp1=$_POST['TPL_username'];
$temp2=$_POST['TPL_password'];
echo $temp1;
echo $temp2;
返回数据以json格式传递,前提以上例post方式向服务器发出了请求
服务端:
header('Content-Type:application/json; charset=utf-8');
//以json的格式返回数据
$res_js=["temp1"=>$temp1, "temp2"=>$temp2 ];
exit(json_encode($res_js));
//以json的格式返回查询到的数据
前端代码:
var data=res.body.json();
toast(data.temp1);
toast(data.temp2);
});
python脚本部分
一开始我是想用php curl模块实现模拟登录功能的
通过数据抓包看了一下
我是看到登陆页面传输的数据是我的明文账号+密码+一堆未知字符串
作为一个小白我看到的是这些,心中窃喜,明文也太好搞了吧
结果等到健康信息上报页面,传递的东西就看不懂了,有些字符串你能读出来,有些不知道是什么含义
只能说还是太菜了,到这心凉了半截,白做这么多了
不甘心,去github上一搜,果然有neu健康打卡脚本,其中有两个python脚本都可以成功
链接: 东北大学自动健康打卡体温打卡
链接: 东北大学每日健康打卡脚本
我用的是第一个链接的脚本,作为一个小白去看他脚本里的内容感觉没涉及到加密,逻辑也不是很复杂。日后如果有时间学习,再做说明。(我是很佩服这些大佬的,也很感谢他们的开源)
所以最后我的核心逻辑竟然是别人写的,有点…不过不重要,本文重点是搭建简单服务器以及实现与前端的交互。
后续对于第一个健康上报python脚本的解析来了
链接: https://blog.csdn.net/weixin_51659963/article/details/126543630
下面介绍如何在服务端用php运行python脚本
这篇文章非常不错
链接: https://blog.csdn.net/weixin_43639287/article/details/122632541
system() passthru() shell_exec() 同理
可能会遇到exec函数被禁用,用如下方式开启
链接: https://blog.csdn.net/weixin_34401851/article/details/115143684
链接: exec函数使用方法
python脚本与php文件放在同一目录下
调用代码:
exec("python3 run.py $temp1 $temp2 2>&1",$rec_py,$res_py);
至于为什么是python3,我linux学的不好,不是很懂,可以看这篇文章(话说linux的用户与文件权限问题真地让我头大)
链接: https://yiyuewangchao.blog.csdn.net/article/details/122910412
简单来说就是执行下面这两端代码,然后你会发现pyhton3,pip3已经存在了
ln -s /www/server/panel/pyenv/bin/python3.7 /usr/bin/python3
ln -s /www/server/panel/pyenv/bin/pip3 /usr/bin/pip3
//以json的格式返回查询到的数据
上诉还有一个问题,我们是使用exec调用python脚本,类似win下的cmd输入指令。 t e m p 1 与 temp1与 temp1与temp2是传递的参数,账户与密码,所以不能直接调用gethub上的python脚本项目,要通过sys模块传递参数给run.py
简单解析一下第一个github脚本项目,config.py是配置文件,主要包括账号密码,以及通知打卡成功的邮箱,sendMsg.py主要是发邮件功能实现,我们不需要这两部分,直接用sys配置参数。
改起来你一看就懂,或者看我github上改好的也行
还有一点就是脚本需要requests库,直接在命令行安装就行
pip3 install requests
关于前端,学习的时间太久了,好多细节都忘了,就不做具体阐述了
简单说一下,核心函数是function myPHP ,大约892行左右,这个函数写在了整个代码的最后
function myPHP(idk,passwordk)
{
var url = "http://177.77.77.77/my_sql.php";
log("线程中");
log(idk);
log(password);
var r = http.post(url, {
"TPL_username": idk,
"TPL_password": passwordk
});
var data=r.body.json();
//toast(data.a);
log("返回的数据");
log(data.temp1);
log(data.temp2);
if(data.sql==200)
{
//数据库插入成功
log("登数据库插入成功");
}
else if(data.sql==201){
//数据库修改成功
log("数据库修改成功");
}
else if(data.sql==500){
//数据库操作失败
log("数据库操作失败");
}
if(data.python_login==1200)
{
//登陆成功
log("登陆成功");
}
else if(data.python_login==1500){
//登陆失败
log("登陆失败");
}
if(data.python_daka==2200)
{
//打卡成功
log("打卡成功");
}
else if(data.python_daka==2500){
//打卡失败
log("打卡失败");
}
if(data.python_login==1200 && data.python_daka==2200)
{
toast("打卡成功");
}
else
{
toast("打卡失败");
}
三、neu部分(给东大学子看的):
如果你自己有服务器,或者使用腾讯云的云函数。把py脚本放在云上,可以实现云端每天自动打卡。不需要自己再操作了。这个当然我也可以实现,放到app里,为什么没呢,相信大家懂得都懂,大家自己去实现吧。疫情期间,注意安全。
之前有个叫neu的软件,下面是他们的技术栈,不得不说不是一个级别,太牛了
四、总结
至此配置全部结束,说起来挺简单点,但对我一个新手而言过程很折磨,希望能帮到你。源码全部放在github上了,我抹掉了所有与我ip有关的内容,换成了177.77.77.77。如果有忘记了抹掉的地方露出真ip,也请你不要攻击一个新手的服务器。谢谢谢!!!别拿我练手。
简单说一下文件结构,前端是一个new_app.js文件,用autojs相关的打包插件可以自动打包成apk。
服务端:run.py是python脚本,my_sql.php接受软件数据,调用run.py脚本。
链接: https://github.com/yearn19/NEU_daka_app
相关学习资源我这里有以下电子书:
鸟的linux私房菜:基础学习篇(第四版)
细说php(第四版)
http抓包实战(肖佳 著)
需要在评论区说,看到了会发
五、其他
在ui控件中,控件的id千万不要直接就叫id
<input id="id" lines="1" hint="{{this.id}}" textSize="18sp" margin="5 0 5 10"/>
直接叫id一会使用的时候调用会出错,可以改成idk
<input id="idk" lines="1" hint="{{this.id}}" textSize="18sp" margin="5 0 5 10"/>
下面说一个我在autojs数据库上遇到的一个数据库问题,成功让我通宵,如果你没用auto.js可以点赞推出了。
这样一个报错
android.database.sqlite.SQLiteException: no such column
问题:在数据库里找不到你所说的列
原因:你之前创建过数据库,后来你又创建了一个新的,你在对你的新数据进行操作,但其实连接的还是你的旧数据库,造成操作不必配。真的脑火,明明名字都不一样。
android开发解释如下:
链接: https://blog.csdn.net/weixin_40707866/article/details/79794762
autojs开发解决方法:
在手机文件中找到如下全中两个文件,删除即可(一般就在根目录下,不行搜索也行)