用过草料二维码的人都知道,他有一个特色功能就是"活码",生成的二维码指向的是cli.im官网活吗接口,后面跟了编号,然后判断,获取后台输入的地址来进行跳转(很像fh),今天我在逛github上的时候发现了一个有趣的开源项目,就是下面这位

#WeChat-Group-HuoMa

微信群二维码活码工具,生成微信群活码,随时可以切换二维码!微信官方群二维码有效期是7天,过期后无法扫码进群,或者是群人数满200人就无法扫码进群,如果我们在推广的时候,群满人或者过期了,别人还想进群,我们将会失去很多推广效果,所以有了群活码,可以在不更换链接和二维码的前提下,切换扫码后显示的内容,灵活变换!

这是github上一个开源项目"WeChat-Group-HuoMa",这个程序是针对微信群二维码分享只有7天的一个小工具,简单来说,他就是能生成一个活码,可以在后台管理指定目标,属于然只是加了一个了方式,但是我们如果改改源代码就能做到活码的功能,说不定以后用得到,先记录下来

#折腾过程

在开始之前,先把数据库配置好,我们登录了后台准备添加,是用ajax交互,但数据库没填写错却一直报系统处理好的错,返回后端已经处理好的信息

所以返回的也是请检查数据库是否填写正确,但是这还是一点小挫折,我只要把:
echo $sql . mysqli_error($conn);
加上去就OK了,然后看Network的返回信息:

“Table 'testtest.qun_huoma' doesn't exist”就是这一句话,原来这表都没有建好,这程序对iis是不是有点不友好...,接着,接着!我登陆了phpmyadmin,报错返回500,我懵了,你这500让我在哪找???我又开始在web.config里添加debug的规则,但由于之前有一些规则,我不敢去动,只能一点点的加,然后:

这特么也太无情了,接着我又常识加utf-8的编码:

很好,很好,我套的越多就越难调,于是我下定决心直接备份原web.config,然后把debug的代码直接覆盖,把错误找出来之后改完再把之前的web.config还回去,结果,直接可以访问了???!!!这...只能说菜逼的运气好!
然后,去找到当前数据库,点击sql,把开源简介上的sql跑一遍:
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `qun_huoma`;
CREATE TABLE `qun_huoma` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`hm_id` varchar(32) DEFAULT NULL COMMENT '活码id',
`title` varchar(32) DEFAULT NULL COMMENT '标题',
`qun_qrcode` text COMMENT '群二维码',
`wx_qrcode` text COMMENT '微信二维码',
`creat_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` varchar(32) DEFAULT '' COMMENT '更新时间',
`wxid` varchar(32) DEFAULT NULL COMMENT '微信号',
`page_view` varchar(32) DEFAULT '0' COMMENT '访问量',
`biaoqian` varchar(32) DEFAULT NULL COMMENT '标签',
`wxstatus` varchar(32) DEFAULT NULL COMMENT '是否隐藏微信号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4;

SET FOREIGN_KEY_CHECKS = 1;
就OK了。

#分析代码

可以看到,在后台把数据添加进去后,给了我们一个链接:http://www.lihouse.xyz/wechat/index.php?hmid=XXXXX(那个XXX因为是真实数据所以不透露了),然后我们可以看到index.php里面的代码:活码研究记,他呢,确实是获取后面?hmid的值,然后去判断是否为空,是否存在和是否输出,如果为空就跳转登录,有数据就输出,如果不存在就输出页面不存在,这个源码的作者还特意做了一个访客记录:mysqli_query($conn,"UPDATE qun_huoma SET page_view=page_view+1 WHERE hm_id =".$hmid);还是很用心呀,现在呢,我们已经知道了这个程序的逻辑,我们也可以开始来做跳转了,也就是<script type="text/javascript">window.location.href="你所要跳转的页面";</script>,我们就把当时在输入界面的获取代码改一改,先说一下,如果想动手你就先把这个源码在服务器安装好,把数据库等配置搞好,然后把我的代码复制到原来代码里,那么我先晒出我/admin/add_qun.php的源码:

<?php
header("Content-type:text/html;charset=utf-8");
?>
<!DOCTYPE html>
<html>
<head>
<title>活码管理系统 - 添加群活码</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
<link rel="stylesheet" type="text/css" href="../css/style.css">
<link rel="icon" href="https://bit-images.bj.bcebos.com/bit-new/file/20200629/3vum.jpg" type="image/x-icon" />
</head>
<body style="background:#fff;">
<div class="container">
<h2>活码管理系统 - 添加活码</h2>
<br>
<!-- Nav pills -->
<ul class="nav nav-pills" role="tablist">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#home">添加活码</a>
</li>
<li class="nav-item">
<a class="nav-link" href="index.php">返回首页</a>
</li>
</ul>

<!-- Tab panes -->
<div class="tab-content">
<div id="home" class="tab-pane active"><br>
<?php
session_start();
if(isset($_SESSION["huoma.admin"])){
echo '<form role="form" action="##" onsubmit="return false" method="post" id="update">
<div class="form-group">
<label style="font-size:16px;" class="badge badge-secondary">活码地址</label>
<input type="text" class="form-control" name="title" placeholder="请输入群活码地址">
</div>

<button type="button" class="btn btn-dark" onclick="addqun()">添加活码</button>
</form>';
}else{
// 未登录
echo "<script>location.href='login.php';</script>";
}

?>

</div>
</div>
<!-- Result -->
<div class="Result" style="margin-top: 30px;display: none;"></div>
</div>

<script>
function closesctips(){
$(".container .Result").css('display','none');
}
</script>
<!-- 编辑提交 -->
<script type="text/javascript">
function addqun(){
$.ajax({
type: "POST",
url: "add_qun_do.php",
data: $('#update').serialize(),
success: function (data) {
// 更新成功
if (data.result == "101") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "102") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "103") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "104") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "105") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "106") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "107") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "100") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-success\"><strong>"+data.msg+"</strong></div>");
location.href='index.php';
}else{
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>添加失败,发生错误</strong></div>");
}
// 关闭提示
setTimeout('closesctips()', 2000);
},
error : function() {
// 更新失败
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>添加失败,服务器发生错误</strong></div>");
setTimeout('closesctips()', 2000);
}
});
}
</script>
</body>
</html>

然后add_qun_do.php里面也要跟上:

<?php
header("Content-type:application/json");
session_start();
if(isset($_SESSION["huoma.admin"])){

// 数据库配置
require_once("../MySql.php");

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 获得表单POST过来的数据
$title = $_POST["title"];

$hm_id = rand(10000,99999);

// 当前时间
$date = date("Y-m-d G:H:s");
// 插入数据库
$sql = "INSERT INTO qun_huoma (title,hm_id) VALUES ('$title', '$hm_id')";

if ($conn->query($sql) === TRUE) {
$result = array(
"result" => "100",
"msg" => "添加成功"
);
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
$result = array(
"result" => "106",
"msg" => "添加失败,请检查数据库配置是否正确"

);
}

$conn->close();
}
// 返回结果
echo json_encode($result,JSON_UNESCAPED_UNICODE);

?>

接下来呢,是根目录index.php的源代码,在这,我要说一句话,这个程序除了这三个文件都不要改,万一你改错了就要重新搞,但是如果你有经验的话你可以在network里找到数据,我已经添加了报错的语句,你可以去看看,搜搜

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="color-scheme" content="light dark">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no">
</head>
<body>

<?php
$hmid = $_GET["hmid"];
if (empty($hmid)) {
echo "<h2 style='text-align:center;margin-top:50px;'>请在管理后台添加活码后,点击分享,微信扫码即可查看你的活码</h2>";
}else{

// 数据库配置
require_once("MySql.php");

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}

$sql = "SELECT * FROM qun_huoma WHERE hm_id =".$hmid;
$result = $conn->query($sql);

// 更新访问量
mysqli_query($conn,"UPDATE qun_huoma SET page_view=page_view+1 WHERE hm_id =".$hmid);

if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {

$title = $row["title"];
echo '<script>window.location.href="'.$title. '";</script>';

}
} else {
echo "不存在该页面";
}
$conn->close();
}
?>

</body>
</html>

接下来是edi_qun.php:

<?php
header("Content-type:text/html;charset=utf-8");
?>
<!DOCTYPE html>
<html>
<head>
<title>活码管理系统 - 群活码编辑</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
<link rel="stylesheet" type="text/css" href="../css/style.css">
<link rel="icon" href="https://bit-images.bj.bcebos.com/bit-new/file/20200629/3vum.jpg" type="image/x-icon" />
</head>
<body style="background:#fff;">
<div class="container">
<h2>活码管理系统 - 群活码编辑</h2>
<br>
<!-- Nav pills -->
<ul class="nav nav-pills" role="tablist">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#home">群活码编辑</a>
</li>
<li class="nav-item">
<a class="nav-link" href="index.php">返回首页</a>
</li>
</ul>

<!-- Tab panes -->
<div class="tab-content">
<div id="home" class="tab-pane active"><br>
<?php
session_start();
if(isset($_SESSION["huoma.admin"])){

//数据库配置
require_once("../MySql.php");

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}

$sql = "SELECT * FROM qun_huoma WHERE hm_id =".$_GET["hmid"];
$result = $conn->query($sql);

if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {

$id = $row["id"];
$hm_id = $row["hm_id"];
$title = $row["title"];
$update_time = $row["update_time"];

echo '<form role="form" action="##" onsubmit="return false" method="post" id="update">
<div class="form-group">
<label style="font-size:16px;" class="badge badge-secondary">活码标题</label>
<input type="text" class="form-control" name="title" value="'.$title.'">
</div>
<div class="form-group">

<div class="form-group" style="display:none;">
<label style="font-size:16px;" class="badge badge-secondary">hmid</label>
<input type="text" class="form-control" name="hm_id" value="'.$hm_id.'">
</div>
<button type="button" class="btn btn-dark" onclick="update()">更新</button>
</form>';
}
} else {
echo "0 结果";
}
$conn->close();
}else{
// 未登录
echo "<script>location.href='login.php';</script>";
}

?>

</div>
</div>
<!-- Result -->
<div class="Result" style="margin-top: 30px;display: none;"></div>
</div>

<script>
function closesctips(){
$(".container .Result").css('display','none');
}
</script>
<!-- 编辑提交 -->
<script type="text/javascript">
function update(){
$.ajax({
type: "POST",
url: "edi_qun_do.php",
data: $('#update').serialize(),
success: function (data) {
// 更新成功
if (data.result == "101") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "102") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "103") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "104") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "105") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>"+data.msg+"</strong></div>");
}else if (data.result == "100") {
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-success\"><strong>"+data.msg+"</strong></div>");
location.href='index.php';
}else{
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>更新失败,发生错误</strong></div>");
}
// 关闭提示
setTimeout('closesctips()', 2000);
},
error : function() {
// 更新失败
$(".container .Result").css('display','block');
$(".container .Result").html("<div class=\"alert alert-danger\"><strong>更新失败,服务器发生错误</strong></div>");
setTimeout('closesctips()', 2000);
}
});
}
</script>
</body>
</html>

edi_qun_do.php:

<?php
header("Content-type:application/json");
session_start();
if(isset($_SESSION["huoma.admin"])){

// 数据库配置
require_once("../MySql.php");

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 获得表单POST过来的数据
$title = $_POST["title"];
$qun_qrcode = $_POST["qun_qrcode"];
$wx_qrcode = $_POST["wx_qrcode"];
$wxid = $_POST["wxid"];
$hm_id = $_POST["hm_id"];
$biaoqian = $_POST["biaoqian"];

if(empty($title)){
$result = array(
"result" => "101",
"msg" => "标题不得为空"
);
}else{
// 当前时间
$date = date("Y-m-d G:H:s");
// 更新数据库
mysqli_query($conn,"UPDATE qun_huoma SET title='$title' WHERE hm_id=".$hm_id);
$result = array(
"result" => "100",
"msg" => "更新成功"
);
}
// 返回结果
echo json_encode($result,JSON_UNESCAPED_UNICODE);
}else{
$result = array(
"result" => "105",
"msg" => "未登录"
);
// 未登录
echo json_encode($result,JSON_UNESCAPED_UNICODE);
}

?>

现在,这就是一套完整的活码系统了,你可以在https://github.com/Liyuanzhe2008/huoma里下载,这就是本次我折腾的所有内容啦,再见~


走自己的路