如何获取公开群组新用户的邀请人?chat_join_request无invite_link解决方案
解决Telegram Bot关联新用户与邀请人的问题
核心问题说明
chat_join_request事件触发时,用户还未正式加入群组,Telegram官方不会在此事件的消息对象中返回邀请链接或邀请人信息,所以你无法直接从msg中获取invite_link属性。
可行解决办法
方法1:使用chat_member事件(推荐)
当用户成功加入群组后,chat_member事件会被触发,此时的更新对象中包含完整的invite_link信息,可直接关联邀请人与新用户。
示例代码:
bot.on('chat_member', async (update) => { const chatMemberUpdate = update.chat_member; // 仅处理用户加入群组的动作 if (chatMemberUpdate.new_chat_member.status === 'member') { const inviteLink = chatMemberUpdate.invite_link; if (inviteLink) { // 获取邀请人信息 const inviterId = inviteLink.creator.id; const inviterUsername = inviteLink.creator.username; // 获取新用户信息 const newUserId = chatMemberUpdate.new_chat_member.user.id; console.log(`新用户 ${newUserId} 通过用户 ${inviterId}(${inviterUsername}) 的邀请链接加入`); console.log(`邀请链接:${inviteLink.invite_link}`); // 这里可以执行关联逻辑,比如存入数据库 } } });
注意:需要确保你的Bot是群组管理员,且拥有manage_chat权限,否则无法获取invite_link字段。
方法2:自定义邀请链接参数(申请阶段关联)
如果需要在用户提交加入申请时就完成关联,可提前为每个邀请人生成带唯一标识的邀请链接,通过参数匹配关联:
- 生成邀请链接时,添加自定义
start_param参数,比如给邀请人ID为123的用户生成链接时,设置start_param=inviter_123; - 用户点击该链接后,会先触发Bot的
start命令,此时可将用户ID与start_param中的邀请人标识存入数据库; - 当
chat_join_request事件触发时,通过用户ID从数据库中查询对应的邀请人标识,完成关联。
示例代码片段:
// 处理start命令,存储用户与邀请人的关联 bot.onText(/\/start (.+)/, async (msg, match) => { const userId = msg.from.id; const inviterTag = match[1]; // 获取inviter_123这样的标识 // 存入数据库,比如key为userId,value为inviterTag await db.set(`user_${userId}_inviter`, inviterTag); }); // 处理加入申请,查询关联信息 bot.on('chat_join_request', async (msg) => { const userId = msg.from.id; const inviterTag = await db.get(`user_${userId}_inviter`); if (inviterTag) { console.log(`用户 ${userId} 的邀请人标识为:${inviterTag}`); // 执行关联逻辑 } });
注意:这种方法依赖用户点击带参数的链接后触发start命令,若用户直接搜索群组申请加入,会无法匹配到邀请人。
内容的提问来源于stack exchange,提问作者BoJack Sam
相关产品推荐
相关产品推荐

