You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js验证Telegram频道成员时遇400错误求助

解决Telegram频道验证时的"chat not found"错误

问题背景

开发Next.js应用时,需要验证用户是否已加入指定Telegram频道。使用Telegraf机器人初始化后,调用getChat接口获取频道ID时触发错误:TelegramError: 400: Bad Request: chat not found,且机器人已获取群组全部所需权限。

相关代码

import { NextResponse } from "next/server";
import { Telegraf } from "telegraf";

const botToken = process.env.NEXT_PUBLIC_TELEGRAM_BOT_TOKEN;
const channelUsername = "thechannelname";

let bot;
try {
  bot = new Telegraf(botToken);
  console.log("Bot initialized successfully");
} catch (error) {
  console.error("Failed to initialize Telegram bot:", error);
}

// 处理客户端POST请求
export async function POST(req) {
  console.log("Received POST request");

  if (!bot) {
    console.error("Bot not initialized");
    return NextResponse.json(
      { message: "Telegram bot not initialized" },
      { status: 500 }
    );
  }

  try {
    const payload = await req.json();
    const { session } = payload;
    const telegram = session?.user?.telegram;

    if (!telegram) {
        return NextResponse.json(
        { message: "Telegram username not provided" },
        { status: 400 }
      );
    }

    // 获取频道信息
    let channelId;
    try {
      console.log("Attempting to get channel info for:", channelUsername);
      const channel = await bot.telegram.getChat(`@${channelUsername}`);
      channelId = channel.id;
    } catch (error) {
       return NextResponse.json(
        {
          message: `Failed to get channel info: ${error.description || error.message}`,
        },
        { status: 400 }
      );
    }

    // 验证用户会员身份
    try {
      const chatMember = await bot.telegram.getChatMember(channelId, telegram);
      
      const isMember = ["member", "administrator", "creator"].includes(
        chatMember.status
      );

      return NextResponse.json(
        {
          verified: isMember,
          message: isMember
            ? "用户已加入频道"
            : "用户未加入频道",
        },
        { status: 200 }
      );
    } catch (error) {
      console.error("Error checking channel membership:", error);

      // 自动验证失败时返回替代方案
      return NextResponse.json(
        {
          verified: false,
          message:
            "无法自动验证会员身份,请让用户直接给机器人发送一条消息。",
          action: "request_message",
        },
        { status: 202 }
      );
    }
  } catch (error) {
    console.error("Unexpected error in Telegram verification:", error);
    return NextResponse.json(
      { message: "验证过程中发生意外错误" },
      { status: 500 }
    );
  }
}

错误信息

客户端请求地址:http://localhost:3000/api/verify_telegram,请求负载包含会话详情

Error getting channel info: TelegramError: 400: Bad Request: chat not found
    at Telegram.callApi 

解决方案

  • 确认频道用户名有效性

    • 检查channelUsername是否完全匹配目标频道的公开用户名,注意大小写和特殊字符;私有频道无法通过用户名查询,必须设置为公开
    • 直接在Telegram客户端搜索该用户名,确认能正常找到目标频道
  • 确保机器人已加入频道并拥有管理员权限

    • 仅将机器人添加为频道成员不够,必须设置为频道管理员(即使只授予"查看消息"的基础权限),否则Telegram API会拒绝机器人的查询请求
    • 进入频道设置→管理员,确认机器人已在列表中,且权限未被限制
  • 直接使用频道ID替代用户名

    • 通过Telegram机器人(如@username_to_id_bot)获取频道的数字ID,将代码中bot.telegram.getChat(@${channelUsername})替换为bot.telegram.getChat(频道数字ID),避免用户名解析错误
  • 验证机器人令牌与初始化状态

    • 确认NEXT_PUBLIC_TELEGRAM_BOT_TOKEN环境变量已正确配置,令牌无拼写错误
    • 检查控制台输出的"Bot initialized successfully"日志,确保机器人初始化过程无异常

内容的提问来源于stack exchange,提问作者Shailendra Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:10:01