Telegram 搭建私聊机器人教程(转发私聊信息+ 保护隐私)这是一个基于Cloudflare Workers版本

部署方法

1,在 Cloudflare Workers 中创建新的 Worker

图片[1]-Telegram 搭建私聊机器人教程(转发私聊信息+ 保护隐私)这是一个基于Cloudflare Workers版本

2,去刚创建的设置,变量和机密添加下面3个 环境变量

类型 变量名称

纯文本ENV_ADMIN_UID1344566 是你的ID号 不知道就去@weiwei666bot查看你id
纯文本ENV_BOT_SECRET66666614612d54-a641-4f62-9133-91e16e486c1c自己去UUID网站生成一个填进里面
纯文本ENV_BOT_TOKEN12345678:AAGjZK0o-kI4ph2ayiaZYhUIPiNkR25cURE是你的机器人TOKEN

图片[2]-Telegram 搭建私聊机器人教程(转发私聊信息+ 保护隐私)这是一个基于Cloudflare Workers版本

演示图

3,创建一个kv数据库命名为 nfd

图片[3]-Telegram 搭建私聊机器人教程(转发私聊信息+ 保护隐私)这是一个基于Cloudflare Workers版本

去设置绑定KV 命名空间选择刚才创建的nfd

图片[4]-Telegram 搭建私聊机器人教程(转发私聊信息+ 保护隐私)这是一个基于Cloudflare Workers版本

4,编辑代码复制添加下面全部代码部署保存

图片[5]-Telegram 搭建私聊机器人教程(转发私聊信息+ 保护隐私)这是一个基于Cloudflare Workers版本
const TOKEN = ENV_BOT_TOKEN // 从 @BotFather 获取
const WEBHOOK = '/endpoint'
const SECRET = ENV_BOT_SECRET // 包含字母、数字、_和-
const ADMIN_UID = ENV_ADMIN_UID // 通过 @userinfobot 获取

const SYSTEM_MESSAGES = {
  startMessage: `📮 匿名留言箱使用指南:

【发送消息】直接输入内容给管理员
【消息安全】完全端到端匿名
【隐私声明】不存储任何聊天内容`,
  adminHelp: `管理员命令:
/ban - 封禁当前对话用户
/unban - 解除封禁
/checkban - 查看封禁状态`,
  userBlocked: '⛔ 此账户已被限制使用',
  newMessageAlert: '您有新消息'
}

addEventListener('fetch', event => {
  const url = new URL(event.request.url)
  if (url.pathname === WEBHOOK) {
    event.respondWith(handleWebhook(event))
  } else if (url.pathname === '/registerWebhook') {
    event.respondWith(registerWebhook(event, url))
  } else {
    event.respondWith(new Response('服务正常', { status: 200 }))
  }
})

async function handleWebhook(event) {
  if (event.request.headers.get('X-Telegram-Bot-Api-Secret-Token') !== SECRET) {
    return new Response('未授权访问', { status: 403 })
  }

  const update = await event.request.json()
  event.waitUntil(processUpdate(update))
  return new Response('OK')
}

async function processUpdate(update) {
  if (update.message) {
    await handleMessage(update.message)
  }
}

async function handleMessage(msg) {
  if (msg.text === '/start') {
    return sendMessage({
      chat_id: msg.chat.id,
      text: SYSTEM_MESSAGES.startMessage,
      parse_mode: 'Markdown'
    })
  }

  if (isAdmin(msg.chat.id)) {
    return handleAdminCommand(msg)
  }

  if (await isBannedUser(msg.chat.id)) {
    return sendMessage({
      chat_id: msg.chat.id,
      text: SYSTEM_MESSAGES.userBlocked
    })
  }

  // 转发用户消息给管理员
  const forwardResult = await forwardMessage({
    chat_id: ADMIN_UID,
    from_chat_id: msg.chat.id,
    message_id: msg.message_id
  })

  if (forwardResult.ok) {
    await storeMessageLink(forwardResult.result.message_id, msg.chat.id)
    sendMessage({
      chat_id: ADMIN_UID,
      text: SYSTEM_MESSAGES.newMessageAlert,
      reply_to_message_id: forwardResult.result.message_id
    })
  }
}

async function handleAdminCommand(msg) {
  if (!msg.reply_to_message) {
    return sendMessage({
      chat_id: ADMIN_UID,
      text: SYSTEM_MESSAGES.adminHelp
    })
  }

  const userChatId = await getLinkedChat(msg.reply_to_message.message_id)
  
  // 处理封禁命令
  switch (msg.text?.trim()) {
    case '/ban':
      await banUser(userChatId)
      return sendMessage({
        chat_id: ADMIN_UID,
        text: `已封禁用户 ${userChatId}`
      })
      
    case '/unban':
      await unbanUser(userChatId)
      return sendMessage({
        chat_id: ADMIN_UID,
        text: `已解除封禁 ${userChatId}`
      })
      
    case '/checkban':
      const status = await checkBanStatus(userChatId)
      return sendMessage({
        chat_id: ADMIN_UID,
        text: `用户状态:${status ? '已封禁' : '正常'}`
      })
      
    default:
      return copyMessage({
        chat_id: userChatId,
        from_chat_id: ADMIN_UID,
        message_id: msg.message_id
      })
  }
}

// 基础功能函数
function apiUrl(method, params) {
  return `https://api.telegram.org/bot${TOKEN}/${method}?` + new URLSearchParams(params)
}

async function sendMessage(params) {
  return fetch(apiUrl('sendMessage', params), { 
    method: 'POST',
    headers: { 'Content-Type': 'application/json' }
  })
}

async function forwardMessage(params) {
  return fetch(apiUrl('forwardMessage', params), { 
    method: 'POST',
    headers: { 'Content-Type': 'application/json' }
  }).then(r => r.json())
}

async function copyMessage(params) {
  return fetch(apiUrl('copyMessage', params), { 
    method: 'POST',
    headers: { 'Content-Type': 'application/json' }
  })
}

// 数据存储相关
async function storeMessageLink(adminMsgId, userChatId) {
  await nfd.put(`msgLink:${adminMsgId}`, userChatId.toString())
}

async function getLinkedChat(adminMsgId) {
  return nfd.get(`msgLink:${adminMsgId}`)
}

async function banUser(chatId) {
  await nfd.put(`banned:${chatId}`, 'true')
}

async function unbanUser(chatId) {
  await nfd.delete(`banned:${chatId}`)
}

async function checkBanStatus(chatId) {
  return !!await nfd.get(`banned:${chatId}`)
}

async function isBannedUser(chatId) {
  return !!await nfd.get(`banned:${chatId}`)
}

function isAdmin(chatId) {
  return chatId.toString() === ADMIN_UID.toString()
}

// Webhook注册
async function registerWebhook(event, url) {
  const webhookUrl = `${url.protocol}//${url.hostname}${WEBHOOK}`
  const result = await fetch(apiUrl('setWebhook', {
    url: webhookUrl,
    secret_token: SECRET
  }))
  
  return new Response(await result.text())
}

最后用访问链接后面加上/registerWebhook 浏览器打开一次注册websoket显示ok就大功告成了

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
tianwei的头像-幸福111
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容