近期文章:如何设置Telegram纸飞机用户名username及其功能详解
问题描述
近几个月来,有朋友反映,他们被限制了私人聊天,无法给我发消息。有时他们会遇到双向限制。其实这种情况,你可以向官方机器人申请或者创建专属私聊。 bot,彻底解决这个问题。在向官方机器人申诉之前,我已经写了详细的申诉教程。只需点击下面的内容即可查看。这里我就不详细说了。本文的目的是:如何零成本创建自己的Telegram纸飞机 私人聊天机器人。
在Telegram电报 上创建您自己的私人聊天机器人。以下是详细步骤:
首先申请Bot API Token
1.向官方@BotFather申请机器人并获取Bot API Token。此API Token 将在以下两种方法中使用。
telegram a href=httpstmeBotFather target=blank rel=noopener nofollow title=BotFathera 为机器人申请获得Bot API Token 关注,截图中的HTTP API就是 token,不要泄露给任何人2. 发送/setjoingroups 阻止此Bot 通过以下方式添加到群组其他人,发送/setjoingroups 选择您的机器人并发送禁用。
Telegram电报 如何创建您自己的私人聊天机器人。创建机器人后,还有一个api 令牌。接下来,使用以下两种方法创建专属的私密聊天机器人。
方案一、使用 @LivegramBot,打造专属私密聊天机器人
1.私聊@LivegramBot,发送“/addbot”或点击“添加机器人”,
创建Telegram 专属私聊机器人2,并输入申请的Bot API Token。
创建Telegram中文版 专属私聊机器人LivegramBot缺点如下
1.是有广告,必须要购买才能去除2. 从技术上讲,使用此方法创建的私人聊天机器人的聊天内容可以被@LivegramBot所有者查看或存储,并且私人聊天内容的安全性和隐私性得不到保证。建议使用下面的方案,比较安全
方案二、 基于cloudflare worker 零成本实现telegram私聊机器人好处是:基于cloudflareworker,可以实现以下效果
零成本,一个js文件即可完成搭建
不需要额外域名,使用工人自己的域名即可
基于worker kv实现数据永久存储,让数据更安全
稳定,全球cdn转发
搭建方法:步骤1. 从uuidgenerator 获取随机uuid 作为秘密
创建Telegram 专属私人聊天机器人步骤2. 从@sosoo 获取您的用户ID
telegram 获取用户ID 步骤3.登录cloudflare,点击左侧菜单中的Workers and Pages,创建worker
创建Telegram 专属私密聊天机器人步骤4. 创建-> 创建Worker -> 输入名称telegrambot
创建Telegram中文版 专属私密聊天机器人
创建Telegram客户端 专属私密聊天机器人
创建Telegram客户端 专属私密聊天机器人部署完成后,点击右上角【继续处理该项目】
创建Telegram专属私密聊天机器人第五步.配置worker的变量,进入设置-》变量-》添加变量
创建Telegram 中文频道专属私人聊天机器人,并添加ENV_BOT_TOKEN 变量,其值应用于官方机器人Bot API Token添加ENV_BOT_SECRET 变量,其值从步骤1 获得
添加ENV_ADMIN_UID 变量,值为步骤2 中获取的用户id
创建Telegram中文频道 专属私密聊天机器人步骤6. 创建命名空间telegrambot 的KV 数据库
创建Telegram 专属私密聊天机器人步骤7. 绑定KV 数据库。在设置- 变量中,向下滚动找到KV 命名空间绑定:telegrambot – telegrambot
创建Telegram 专属私人聊天机器人步骤8. 编辑代码
创建Telegram专属私人聊天机器人将复制worker下面的所有代码
const TOKEN=ENV_BOT_TOKEN;
const WEBHOOK=’/端点’;
const SECRET=ENV_BOT_SECRET;
常量ADMIN_UID=ENV_ADMIN_UID;
const KV_NAMESPACE=telegrambot;
const LAST_USER_KEY=’最后用户’;
const USER_MESSAGES_KEY_PREFIX=’user_message_’;
const ADMIN_RESPONSES_KEY_PREFIX=’admin_response_’;
addEventListener(‘获取’, 事件={
const url=新URL(event.request.url);
if (url.pathname===WEBHOOK) {
event.respondWith(handleWebhook(event));
} else if (url.pathname===’/registerWebhook’) {
event.respondWith(registerWebhook(事件, url, WEBHOOK, 秘密));
} else if (url.pathname===’/unRegisterWebhook’) {
event.respondWith(unRegisterWebhook(event));
} 别的{
event.respondWith(new Response(‘此请求没有处理程序’));
}
});
异步函数handleWebhook(事件){
if (event.request.headers.get(‘X-Telegram-Bot-Api-Secret-Token’) !==SECRET) {
return new Response(‘未经授权’, { status: 403 });
}
const update=wait event.request.json();
event.waitUntil(onUpdate(更新));
返回新的响应(’好的’);
}
异步函数onUpdate(更新) {
if(更新中的“消息”){
等待onMessage(update.message);
}
}
异步函数onMessage(消息) {
const chatId=message.chat.id;
const userName=message.from.username ? `@${message.from.username}` : message.from.first_name;
if (chatId==ADMIN_UID) {
//处理管理员消息
让userChatId;
如果(消息.reply_to_message){
const returnedMessageId=message.reply_to_message.message_id;
userChatId=等待KV_NAMESPACE.get(`admin_message_${repliedMessageId}`);
if (!userChatId) {
wait sendPlainText(ADMIN_UID, ‘找不到要回复的用户消息。’);
返回;
}
} 别的{
//获取最后一个活跃用户
userChatId=等待KV_NAMESPACE.get(LAST_USER_KEY);
if (!userChatId) {
wait sendPlainText(ADMIN_UID, ‘最近没有活动的用户会话。’);
返回;
}
}
//根据管理员发送的消息类型,转发给对应的用户
让responseText=”;
如果(消息.照片){
const photo=message.photo[message.photo.length – 1];
等待sendPhoto(userChatId, photo.file_id);
responseText=`管理员发送了图片: ${photo.file_id}`;
} else if (message.sticker) {
等待sendSticker(userChatId, message.sticker.file_id);
responseText=`管理员发送了贴纸: ${message.sticker.file_id}`;
} else if (消息.语音) {
等待sendVoice(userChatId, message.voice.file_id);
responseText=`管理员发送了一条语音消息: ${message.voice.file_id}`;
} else if (消息.文档) {
等待sendDocument(userChatId, message.document.file_id);
responseText=`管理员发送了文件: ${message.document.file_id}`;
} else if (message.video) {
等待sendVideo(userChatId, message.video.file_id);
responseText=`管理员发送了视频: ${message.video.file_id}`;
} else if (消息.位置) {
等待sendLocation(userChatId, message.location.latitude, message.location.longitude);
responseText=`管理员发送了位置: 纬度${message.location.latitude},经度${message.location.longitude}`;
} 别的{
const text=消息.text || ‘收到非短信’;
等待sendPlainText(userChatId, 文本);
响应文本=文本;
}
等待KV_NAMESPACE.put(`${ADMIN_RESPONSES_KEY_PREFIX}${userChatId}`, responseText);
} 别的{
//处理用户消息
让userMessageText=”;
让响应;
如果(消息.照片){
const photo=message.photo[message.photo.length – 1];
userMessageText=`用户发送了一张图片: ${photo.file_id}`;
响应=等待sendPhoto(ADMIN_UID, photo.file_id,`来自用户${userName}的图片`);
} else if (message.sticker) {
userMessageText=`用户发送了贴纸: ${message.sticker.file_id}`;
响应=等待sendSticker(ADMIN_UID, message.sticker.file_id);
} else if (消息.语音) {
userMessageText=`用户发送了一条语音消息: ${message.voice.file_id}`;
响应=等待sendVoice(ADMIN_UID, message.voice.file_id);
} else if (消息.文档) {
userMessageText=`用户发送了一个文件: ${message.document.file_id}`;
响应=等待sendDocument(ADMIN_UID, message.document.file_id);
} else if (message.video) {
userMessageText=`用户发送了视频: ${message.video.file_id}`;
响应=等待sendVideo(ADMIN_UID, message.video.file_id);
} else if (消息.位置) {
userMessageText=`用户发送了位置: 纬度${message.location.latitude},经度${message.location.longitude}`;
响应=等待sendLocation(ADMIN_UID, message.location.latitude, message.location.longitude);
} 别的{
const text=消息.text || ‘用户发送了一条非短信’;
用户消息文本=文本;
response=wait sendPlainText(ADMIN_UID, `来自用户${userName}\n${text} 的消息:`);
}
//保存管理员消息ID和用户聊天ID的映射关系
if (响应response.resultresponse.result.message_id) {
const adminMessageId=response.result.message_id;
等待KV_NAMESPACE.put(`admin_message_${adminMessageId}`, chatId.toString());
}
等待KV_NAMESPACE.put(`${USER_MESSAGES_KEY_PREFIX}${chatId}`, userMessageText);
//更新最后一个活跃用户
等待KV_NAMESPACE.put(LAST_USER_KEY, chatId.toString());
}
}
函数apiUrl(方法名) {
返回`https://api.telegram.org/bot${TOKEN}/${methodName}`;
}
异步函数sendPlainText(chatId, text) {
const 响应=等待fetch(apiUrl(‘sendMessage’), {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ chat_id: chatId, 文本})
});
返回response.json();
}
异步函数sendSticker(chatId, fileId) {
const 响应=等待fetch(apiUrl(‘sendSticker’), {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ chat_id: chatId, Sticker: fileId })
});
返回response.json();
}
异步函数sendPhoto(chatId, fileId, 标题=”) {
const 响应=等待fetch(apiUrl(‘sendPhoto’), {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ chat_id: chatId, photo: fileId, 标题})
});
返回response.json();
}
异步函数sendVoice(chatId, fileId) {
const 响应=等待fetch(apiUrl(‘sendVoice’), {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ chat_id: chatId, voice: fileId })
});
返回response.json();
}
异步函数sendDocument(chatId, fileId) {
const 响应=等待fetch(apiUrl(‘sendDocument’), {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ chat_id: chatId, document: fileId })
});
返回response.json();
}
异步函数sendVideo(chatId, fileId) {
const 响应=等待fetch(apiUrl(‘sendVideo’), {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ chat_id: chatId, video: fileId })
});
返回response.json();
}
异步函数sendLocation(chatId, 纬度, 经度) {
const 响应=等待fetch(apiUrl(‘sendLocation’), {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ chat_id: chatId, 纬度, 经度})
});
返回response.json();
}
异步函数registerWebhook(事件,requestUrl,后缀,秘密){
const webhookUrl=`${requestUrl.protocol}//${requestUrl.hostname}${suffix}`;
const 响应=等待fetch(apiUrl(‘setWebhook’), {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ url: webhookUrl, Secret_token: 秘密})
});
const r=等待response.json();
return new Response(‘ok’ in r r.ok ? ‘Ok’ : JSON.stringify(r, null, 2));
}
异步函数unRegisterWebhook(event) {
const 响应=等待fetch(apiUrl(‘setWebhook’), {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({ url: ” })
});
const r=等待响应.json();
return new Response(‘ok’ in r r.ok ? ‘Ok’ : JSON.stringify(r, null, 2));
}
步骤9、替换默认代码后,点击右上角的部署,然后点击上方中间的worker.dev即可访问
创建Telegram专属私人聊天机器人10并完成机器人部署
url后添加/registerWebhook 注册webhook(unRegisterWebhoo取消注册)
注意:如果无法打开网址,则需要绕过防火墙,因为cloudflareworker.dev域名在中国大陆被禁止。也可以给worker绑定域名来解决问题。
创建Telegram 专属私人聊天机器人并显示OK。部署完成。接下来,测试私人聊天机器人。
测试私人聊天机器人
测试私聊机器人
测试私聊机器人经过多人反复测试,发现文字、图片、贴纸、视频、语音、文件消息均能成功发送,且无延迟。
特征:
消息会保存在kv库中,安全
当多人同时向机器人发送消息时,如果多人发送消息,点击消息并选择回复用户。
当多人同时向机器人发送消息时,最后一条消息是当前对话,您可以直接回复。
如果您有任何建议或者发现任何bug,可以在Telegram中文社区讨论
Telegram中文频道