You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telegram Bot:邀请链接生成与统计追踪功能优化求助

解决Telegram Bot邀请链接追踪与统计问题

你的现有代码存在几个关键问题导致无法追踪邀请人数:

  • 使用exportChatInviteLink生成的是群组/频道的通用默认链接,没有唯一标识,无法区分不同来源的邀请
  • getJoinCountByInviteLink方法错误调用了getChatMemberCount接口,这个接口仅能获取群组总成员数,无法统计特定链接的邀请人数
  • 缺少对成员加入事件的监听,无法记录用户通过哪个链接进入群组/频道

下面是完整的修改方案:

一、准备工作

  1. 准备一个MySQL数据库,创建两张表:
-- 存储邀请链接信息
CREATE TABLE `invite_links` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `link` varchar(255) NOT NULL,
  `title` varchar(100) NOT NULL COMMENT '链接标识(比如渠道名称)',
  `chat_id` varchar(50) NOT NULL,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `link` (`link`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 存储邀请统计数据
CREATE TABLE `invite_stats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `link_id` int(11) NOT NULL,
  `user_id` bigint(20) NOT NULL,
  `joined_at` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_link` (`user_id`, `link_id`), -- 避免重复统计同一用户
  FOREIGN KEY (`link_id`) REFERENCES `invite_links`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. 确保你的服务器可以被公网访问,用于设置Telegram Bot的Webhook

二、修改Bot代码

1. 创建可追踪的邀请链接

替换原有的createGroupInviteLink方法,改用createChatInviteLink创建带自定义名称的链接:

<?php
$botToken = 'YOUR_BOT_TOKEN';
$groupId = 'YOUR_GROUP_ID';
// 数据库配置
$dbHost = 'localhost';
$dbUser = 'DB_USER';
$dbPass = 'DB_PASS';
$dbName = 'DB_NAME';

// 初始化数据库连接
function getDbConnection() {
    global $dbHost, $dbUser, $dbPass, $dbName;
    $conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
    if ($conn->connect_error) {
        die("数据库连接失败: " . $conn->connect_error);
    }
    return $conn;
}

// 创建带标识的邀请链接
function createTrackableInviteLink($botToken, $groupId, $linkTitle) {
    $telegramApiUrl = 'https://api.telegram.org/bot' . $botToken . '/createChatInviteLink';
    $data = [
        'chat_id' => $groupId,
        'name' => $linkTitle // 自定义链接标识,用于区分渠道
    ];
    $options = [
        'http' => [
            'method' => 'POST',
            'header' => 'Content-Type: application/json',
            'content' => json_encode($data)
        ]
    ];
    $context = stream_context_create($options);
    $response = file_get_contents($telegramApiUrl, false, $context);
    $result = json_decode($response, true);
    if ($result['ok']) {
        $linkData = $result['result'];
        // 保存到数据库
        $conn = getDbConnection();
        $stmt = $conn->prepare("INSERT INTO invite_links (link, title, chat_id) VALUES (?, ?, ?)");
        $stmt->bind_param("sss", $linkData['invite_link'], $linkTitle, $groupId);
        $stmt->execute();
        $stmt->close();
        $conn->close();
        return $linkData['invite_link'];
    } else {
        return false;
    }
}

2. 设置Webhook监听成员加入事件

创建webhook.php文件,用于接收Telegram的更新事件:

<?php
$botToken = 'YOUR_BOT_TOKEN';
$update = json_decode(file_get_contents('php://input'), true);

// 处理新成员加入事件
if (isset($update['message']['new_chat_members'])) {
    $chatId = $update['message']['chat']['id'];
    $inviteLink = $update['message']['invite_link']['invite_link'] ?? '';
    
    if (!empty($inviteLink)) {
        $conn = getDbConnection();
        // 获取链接ID
        $stmt = $conn->prepare("SELECT id FROM invite_links WHERE link = ?");
        $stmt->bind_param("s", $inviteLink);
        $stmt->execute();
        $result = $stmt->get_result();
        if ($linkRow = $result->fetch_assoc()) {
            $linkId = $linkRow['id'];
            // 遍历新加入的用户,统计邀请
            foreach ($update['message']['new_chat_members'] as $user) {
                $userId = $user['id'];
                // 检查是否已统计过该用户
                $checkStmt = $conn->prepare("SELECT id FROM invite_stats WHERE user_id = ? AND link_id = ?");
                $checkStmt->bind_param("ii", $userId, $linkId);
                $checkStmt->execute();
                $checkResult = $checkStmt->get_result();
                if ($checkResult->num_rows === 0) {
                    $insertStmt = $conn->prepare("INSERT INTO invite_stats (link_id, user_id) VALUES (?, ?)");
                    $insertStmt->bind_param("ii", $linkId, $userId);
                    $insertStmt->execute();
                    $insertStmt->close();
                }
                $checkStmt->close();
            }
        }
        $stmt->close();
        $conn->close();
    }
}

// 回复Telegram服务器,避免重复推送
echo 'ok';

然后通过API设置Webhook(执行一次即可):

function setWebhook($botToken, $webhookUrl) {
    $telegramApiUrl = 'https://api.telegram.org/bot' . $botToken . '/setWebhook?url=' . urlencode($webhookUrl);
    $response = file_get_contents($telegramApiUrl);
    $result = json_decode($response, true);
    return $result['ok'];
}

// 使用示例
// setWebhook($botToken, 'https://your-domain.com/webhook.php');

3. 获取邀请统计数据

添加方法用于获取每个链接的邀请人数:

function getInviteStats() {
    $conn = getDbConnection();
    $sql = "SELECT il.link, il.title, COUNT(is.id) AS join_count 
            FROM invite_links il 
            LEFT JOIN invite_stats is ON il.id = is.link_id 
            GROUP BY il.id 
            ORDER BY join_count DESC";
    $result = $conn->query($sql);
    $stats = [];
    while ($row = $result->fetch_assoc()) {
        $stats[] = $row;
    }
    $conn->close();
    return $stats;
}

4. 仪表盘展示

创建一个简单的仪表盘页面dashboard.php:

<?php
$stats = getInviteStats();
?>
<!DOCTYPE html>
<html>
<head>
    <title>邀请链接统计仪表盘</title>
    <style>
        table { width: 80%; margin: 20px auto; border-collapse: collapse; }
        th, td { padding: 10px; border: 1px solid #ddd; text-align: left; }
        th { background-color: #f2f2f2; }
    </style>
</head>
<body>
    <h1 style="text-align: center;">邀请链接统计</h1>
    <table>
        <tr>
            <th>链接标识</th>
            <th>邀请链接</th>
            <th>邀请人数</th>
        </tr>
        <?php foreach ($stats as $stat): ?>
        <tr>
            <td><?php echo htmlspecialchars($stat['title']); ?></td>
            <td><a href="<?php echo htmlspecialchars($stat['link']); ?>" target="_blank"><?php echo htmlspecialchars($stat['link']); ?></a></td>
            <td><?php echo $stat['join_count']; ?></td>
        </tr>
        <?php endforeach; ?>
    </table>
</body>
</html>

三、使用说明

  1. 先执行setWebhook方法配置Webhook
  2. 使用createTrackableInviteLink创建带标识的邀请链接(比如createTrackableInviteLink($botToken, $groupId, '微信群渠道'))
  3. 用户通过这些链接加入群组/频道时,Webhook会自动统计数据
  4. 访问dashboard.php即可查看各链接的邀请人数统计

内容的提问来源于stack exchange,提问作者Javad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:53:12