背景;

昨天晚上一个朋友问我能不能做 给我发了几个要求 一看非常简单 开搞!
m58wut2j.png

功能:

1. 功能概述:构建一个API,实现基于QQ号的签到积分获取功能,并对签到时间进行限制。
2. 积分规则:每次签到所获积分在0.3至0.8之间随机生成。
3. 参数要求:仅接受一个参数,即QQ号。
4. 数据处理:

  • 签到成功后,将签到信息(QQ号、获取积分、签到时间)存入数据库。
  • 向调用方返回当日获取积分与该QQ号的总积分。
    5. 签到限制:
  • 设定开启签到时间与关闭签到时间,不在此时间段内签到,判定为无效签到。
  • 每个QQ号每日仅能有效签到一次,所有签到记录作为日志留存。

使用方法:

域名/api.php?qq=QQ账号

修改代码里面的数据库账号密码 就可以直接使用

m58x18zy.png
m58x1lu4.png

代码:

数据库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}

最后修改:2024 年 12 月 29 日
如果觉得我的文章对你有用,请随意赞赏