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

如何在grammy js中集成Telegram无缝登录功能?

如何在grammy.js机器人中集成Telegram无缝登录?

当然有开发者实现过这个功能,核心是结合Telegram的URL授权机制和grammy的消息处理能力,以下是具体实现步骤:

1. 构造授权链接

按照Telegram的URL授权规则生成链接,需要包含几个关键参数:

  • bot_id:你的机器人ID(可通过调用getMe接口获取)
  • scope:需要获取的用户权限范围,比如read(获取基本用户信息)
  • redirect_uri:你的服务中处理授权回调的端点地址(必须是在BotFather中已验证的域名)
  • state:随机生成的字符串,用于防止CSRF攻击,需要和用户ID绑定存储(比如用Redis)

2. 在grammy中触发授权流程

给机器人添加一个触发登录的命令(比如/login),当用户发送该命令时,机器人返回带有授权链接的消息(用内联键盘按钮可提升体验):

const { Bot } = require('grammy');
const bot = new Bot('你的机器人Token');

// 示例省略具体存储逻辑,建议用Redis存储state与用户ID的映射
bot.command('login', async (ctx) => {
  // 生成随机state值
  const state = Math.random().toString(36).slice(2, 18);
  // 保存state和当前用户ID的关联
  // await redis.set(`state:${state}`, ctx.from.id, 'EX', 3600);

  // 构造授权链接
  const authUrl = `https://oauth.telegram.org/auth?bot_id=你的机器人ID&scope=read&redirect_uri=你的回调地址&state=${state}`;

  await ctx.reply('点击下方按钮完成登录:', {
    reply_markup: {
      inline_keyboard: [[{ text: 'Telegram登录', url: authUrl }]]
    }
  });
});

bot.start();

3. 处理授权回调

搭建一个HTTP服务(比如用Express)接收Telegram的回调请求,完成验证和用户信息获取:

const express = require('express');
const axios = require('axios');
const app = express();

app.get('/telegram-auth', async (req, res) => {
  const { code, state } = req.query;

  // 验证state的有效性
  // const userId = await redis.get(`state:${state}`);
  // if (!userId) return res.status(403).send('无效的请求');
  // await redis.del(`state:${state}`);

  // 调用Telegram API获取访问令牌与用户信息
  try {
    const tokenRes = await axios.get(`https://api.telegram.org/bot你的机器人Token/oauth/getAccessToken`, {
      params: { code, bot_id: '你的机器人ID' }
    });

    const { access_token, user } = tokenRes.data;
    // 这里可以将用户信息与机器人中的用户ID关联,存入数据库
    // await db.saveUser(userId, user);

    res.send('登录成功!请返回机器人继续操作。');
  } catch (err) {
    res.status(500).send('登录失败,请重试');
  }
});

app.listen(3000, () => console.log('回调服务运行在3000端口'));

4. 后续关联逻辑

回调处理完成后,你可以给对应的用户发送机器人消息,告知登录状态,或者根据获取的用户信息更新机器人内的用户权限、个性化设置等。

注意事项

  • 必须在BotFather中设置domain参数,确保redirect_uri的域名已被Telegram验证。
  • state参数一定要唯一且设置过期时间,避免被恶意利用。
  • 处理API请求时要添加错误捕获,应对code过期、无效请求等异常情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:42:54