如果想做一個telegram 群管機器人,除了取得各種管理權限外,最重要的就是要能識別新人入群。
如果沒有很注意bot api 的細節,其實現在新人入群的信息是記錄在chat_member 的updates 裏,已經不是在message下面的new_chat_members。
「bot.學習.人」也是試了很久,才終於發現上面這個重點,所以特此記錄一下。如果想用google app script 寫一個入群打招呼,那要怎麼做呢?function doPost(e) {
if (!e.postData) {
return;
}
const update = JSON.parse(e.postData.contents);
// A. 處理加入 TARGET_CHAT_IDS 的群組
const chatId = update.chat_member.chat.id ;
const isTargetSubscriptionChannel = TARGET_CHAT_IDS.includes(chatId);
if (isTargetSubscriptionChannel) {
handleSubscriptionUpdate(update.chat_member);
}
}
function handleSubscriptionUpdate(chatMemberUpdate) {
const oldStatus = chatMemberUpdate.old_chat_member.status;
const newStatus = chatMemberUpdate.new_chat_member.status;
const member = chatMemberUpdate.new_chat_member.user;
if (member.is_bot) {
Logger.log(`Bot 自身的狀態變化,跳過。`);
return;
}
const userId = member.id;
const username = member.username ? `@${member.username}` : (member.first_name + (member.last_name ? ` ${member.last_name}` : '')); // 1. 判斷為「新成員加入」事件:從 left/kicked 變為 member/administrator/creator
const isNewJoin = (oldStatus === 'left' || oldStatus === 'kicked') && (newStatus === 'member' || newStatus === 'administrator' || newStatus === 'creator'); // 2. 判斷為「成員離開/被踢」事件:狀態變為 left 或 kicked
const isLeftOrKicked = (newStatus === 'left' || newStatus === 'kicked');
if (isNewJoin) {
Logger.log(`有人新加入`);
} else if (isLeftOrKicked) {
Logger.log(`有人離開`);
} else {
Logger.log(`有人: ${oldStatus} -> ${newStatus}`);
}
}
單純作個記錄,希望自己以後還記得。















