背景;
昨天晚上一个朋友问我能不能做 给我发了几个要求 一看非常简单 开搞!
功能:
1. 功能概述:构建一个API,实现基于QQ号的签到积分获取功能,并对签到时间进行限制。
2. 积分规则:每次签到所获积分在0.3至0.8之间随机生成。
3. 参数要求:仅接受一个参数,即QQ号。
4. 数据处理:
- 签到成功后,将签到信息(QQ号、获取积分、签到时间)存入数据库。
- 向调用方返回当日获取积分与该QQ号的总积分。
5. 签到限制: - 设定开启签到时间与关闭签到时间,不在此时间段内签到,判定为无效签到。
- 每个QQ号每日仅能有效签到一次,所有签到记录作为日志留存。
使用方法:
域名/api.php?qq=QQ账号
修改代码里面的数据库账号密码 就可以直接使用
代码:
数据库SQL:
签到数据:
CREATE TABLE sign_in (
id INT AUTO_INCREMENT PRIMARY KEY,
qq_number VARCHAR(20) NOT NULL,
points FLOAT NOT NULL,
sign_in_time DATETIME NOT NULL,
UNIQUE (qq_number, sign_in_time)
);
签到日志:
CREATE TABLE sign_in_log (
id INT AUTO_INCREMENT PRIMARY KEY,
qq_number VARCHAR(20) NOT NULL,
sign_in_time DATETIME NOT NULL,
points FLOAT NOT NULL
);
Api接口:
{hide}
<?php
// api.php
header('Content-Type: application/json');
// 数据库配置
$dbHost = 'localhost';
$dbUsername = '123456';
$dbPassword = '123456';
$dbName = '123456';
// 创建数据库连接
$conn = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);
// 检查数据库连接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 获取QQ号
$qqNumber = $_GET['qq'] ?? '';
// 检查QQ号是否提供
if (empty($qqNumber)) {
echo json_encode(['error' => 'QQ号未提供']);
exit;
}
// 获取当前时间和允许的签到时间段
$currentTime = new DateTime();
$startTime = new DateTime('today 08:00:00');
$endTime = new DateTime('today 23:59:59');
// 检查是否在签到时间内
if ($currentTime < $startTime || $currentTime > $endTime) {
echo json_encode(['error' => '不在签到时间内']);
exit;
}
$stmt = $conn->prepare("SELECT * FROM sign_in WHERE qq_number=? AND DATE(sign_in_time)=CURDATE()");
$stmt->bind_param("s", $qqNumber);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
// 如果今日已签到,查询总积分
$totalStmt = $conn->prepare("SELECT SUM(points) as total_points FROM sign_in WHERE qq_number=?");
$totalStmt->bind_param("s", $qqNumber);
$totalStmt->execute();
$totalResult = $totalStmt->get_result();
$totalPoints = $totalResult->fetch_assoc()['total_points'] ?? 0;
// 返回错误信息及总积分
echo json_encode(['error' => '今日已签到', 'total_points' => $totalPoints]);
$totalStmt->close();
exit;
}
// 生成随机积分
$points = rand(3, 8) / 10;
// 插入签到记录
$insertStmt = $conn->prepare("INSERT INTO sign_in (qq_number, points, sign_in_time) VALUES (?, ?, NOW())");
$insertStmt->bind_param("sd", $qqNumber, $points);
if ($insertStmt->execute()) {
// 记录日志
$logStmt = $conn->prepare("INSERT INTO sign_in_log (qq_number, sign_in_time, points) VALUES (?, NOW(), ?)");
$logStmt->bind_param("ds", $qqNumber, $points);
$logStmt->execute();
// 计算总积分
$selectStmt = $conn->prepare("SELECT SUM(points) as total_points FROM sign_in WHERE qq_number=?");
$selectStmt->bind_param("s", $qqNumber);
$selectStmt->execute();
$selectResult = $selectStmt->get_result();
$totalPoints = $selectResult->fetch_assoc()['total_points'] ?? 0;
// 返回结果
echo json_encode(['points' => $points, 'total_points' => $totalPoints + $points]);
} else {
// 如果签到记录插入失败,输出错误信息
echo json_encode(['error' => '签到失败']);
}
// 关闭语句和连接
$stmt->close();
$insertStmt->close();
$logStmt->close();
$selectStmt->close();
$conn->close();
?>
{/hide}