Telegram Bot:邀请链接生成与统计追踪功能优化求助
解决Telegram Bot邀请链接追踪与统计问题
你的现有代码存在几个关键问题导致无法追踪邀请人数:
- 使用
exportChatInviteLink生成的是群组/频道的通用默认链接,没有唯一标识,无法区分不同来源的邀请 getJoinCountByInviteLink方法错误调用了getChatMemberCount接口,这个接口仅能获取群组总成员数,无法统计特定链接的邀请人数- 缺少对成员加入事件的监听,无法记录用户通过哪个链接进入群组/频道
下面是完整的修改方案:
一、准备工作
- 准备一个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;
- 确保你的服务器可以被公网访问,用于设置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>
三、使用说明
- 先执行
setWebhook方法配置Webhook - 使用
createTrackableInviteLink创建带标识的邀请链接(比如createTrackableInviteLink($botToken, $groupId, '微信群渠道')) - 用户通过这些链接加入群组/频道时,Webhook会自动统计数据
- 访问
dashboard.php即可查看各链接的邀请人数统计
内容的提问来源于stack exchange,提问作者Javad
相关产品推荐
相关产品推荐

