Telegram mini app 登录小部件 | 自定义登录按钮 或 静默登录

先说我遇到的问题,我按照流程接入了 telegram 登录小部件,在 PC 或者 H5 可以拿到数据(不管是选择回调函数还是回调地址的形式都可以),但是在 telegram mini app 中登录拿不到数据,在 telegram 中 我点击登录的小部件后是在浏览器中打开授权网址,然后授权后回调也是在浏览器中打开一个新标签页,而不是在 telegram 中打开

设置机器人域名

这里我假设你已经有一个机器人了(没有的网上有很多 文章 教怎么创建机器人),在 @BotFather 中输入 /myapps

image.png

image.png

点击 Edit Web App Url 后输入你的域名地址(这里也可以输入你的开发地址,以 https 开头,但是不能使用 登录小部件 因为你的网址和 telegram-widget.js 生成的 iframe 域名不一致会导致浏览器安全策略问题)

然后再输入 /setdomain, 同样的选择你的机器人然后输入你的网址

image.png

到这一步前置条件已完成。

登录

第一步

设置回调函数

// ...<Scriptid="get-telegramAuth"dangerouslySetInnerHTML={{__html: `function onTelegramAuth(user) {console.log('user =>>>', user)alert('Logged in as ' + user.first_name + ' ' + user.last_name + ' (' + user.id + (user.username ? ', @' + user.username : '') + ')');}
`,}}></Script>
// ...

第二步

这里我是使用 Next 框架编写的代码,在只需要改一下格式在其他框架中也可以使用。

import Script from 'next/script';
export const TGLogin = () => {return <><Script async src='https://telegram.org/js/telegram-widget.js?22' data-telegram-login='<你的机器人用户名>' data-request-access='write' data-size='large' data-radius='10' data-onauth='onTelegramAuth(user)'></Script><div id="my-special-div" onClick={() => {window.location.href = 'https://oauth.telegram.org/auth?bot_id=6889929762&origin=https%3A%2F%2Fwww.telegramloveai.com&embed=1&request_access=write&return_to=https%3A%2F%2Fwww.telegramloveai.com%2Fen%2Flogin'}}>LOGIN</div></>;
};

href 中地址是点击登录小部件进入新标签页的地址

image.png

机器人用户名不需要 @

image.png

Mini Apps 成功示例

image.png

静默登录

引入 js 文件 TG 文档 。

'/api/tg-login' 接口是我自己定义的,里面处理校验数据等逻辑。

'use client';import Script from 'next/script';
import { toast } from 'sonner';export const TGInitScript = () => {let initData = '';const TGWebAppReady = () => {const WebApp = window.Telegram.WebApp;/*** 静默登录*/if (WebApp.initDataUnsafe.user) {console.log(WebApp.initDataUnsafe);initData = `query_id=${WebApp.initDataUnsafe.query_id}&user=${encodeURIComponent(JSON.stringify(WebApp.initDataUnsafe.user))}&auth_date=${WebApp.initDataUnsafe.auth_date}&hash=${WebApp.initDataUnsafe.hash}`;const sendRequest = async () => {try {const { result, code, message } = await (await fetch('/api/tg-login', {method: 'POST',body: JSON.stringify({ initData }),})).json();if (code != '200') {throw new Error(message);}} catch (err: any) {toast(err.message);}};sendRequest();}};return (<><Scriptsrc="https://telegram.org/js/telegram-web-app.js"onReady={TGWebAppReady}></Script></>);
};

api 文件代码

import { NextRequest } from 'next/server';
import { validate } from './check';
import axios from 'axios';const handle = async (req: NextRequest) => {const body = await req.json();const BaseUrl ='';try {// 验证数据完整性validate(body.initData, process.env.NEXT_PUBLIC_TOKEN!);const searchParams = new URLSearchParams(body.initData);const user = JSON.parse(searchParams.get('user')!);// 和后端接口进行交互const { data: ApiData } = await axios(BaseUrl + '/authLogin',{method: 'POST',data: {loginType: 'telegram-mini-apps',email: '',nickname:user.first_name + (user.last_name ? ' ' + user.last_name : ''),openId: user.id,avatarUrl: user.photo_url,loginName: user.username,},});return Response.json(ApiData, {status: 200,});} catch (error: any) {return Response.json({code: '500',message: error.message || '',},{ status: 500 });}
};
export { handle as POST };

check 文件代码是复制的 tma.js 仓库中 文件数据 validate.ts

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见排序算法(Java代码实现)

前言 学习算法和数据结构必备算法逻辑动态演示网站&#xff0c;收藏到就是赚到&#xff0c;链接: 数据结构动态演示网站 下面的代码单独理解会比较抽象&#xff0c;建议结合动态演示学习&#xff0c;更加直观 常见排序算法&#xff08;时间复杂度&#xff09; O(n^2)&#x…

【Nginx】(三) Nginx配置文件精解:从入门到精通的完整指南

Nginx&#xff0c;作为一款功能强大的 Web 服务器和反向代理软件&#xff0c;已经成为实现这些目标的行业标准。然而&#xff0c;Nginx的强大功能往往伴随着复杂的配置需求。对于想快速掌握 Nginx 配置的人来说&#xff0c;理解其配置文件的结构至关重要。 在本文中&#xff0…

RabbitMQ笔记(基础篇)

视频&#xff1a; MQ基础-01.RabbitMQ课程介绍_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1mN4y1Z7t9?p1&vd_sourced0ea58f1127eed138a4ba5421c577eb1 一、RabbitMQ简介 1.同步调用 优势&#xff1a;时效性强&#xff0c;等待结果后才返回 劣势&#xff1…

虚拟化与Docker基本概念与Docker的安装

Docker Docker 是一个开源的应用容器引擎&#xff0c;它最初是用 Go 语言开发的。Docker 允许开发者将应用程序及其依赖、库和环境打包到一个可移植的容器中&#xff0c;这个容器可以在任何支持 Docker 的 Linux 或 Windows 机器上运行&#xff0c;保证了应用在不同环境之间的…

【行为型模式】备忘录模式

一、备忘录模式概述 备忘录模式定义&#xff1a;又称之为快照模式(Snapshop Pattern)或者令牌模式(Token Pattern)&#xff0c;是指在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态&#xff0c;这样我们就可以在需要的时候将该对…

STM32几种库的比较,HAL、标准库、LL库!

STM32是一系列由STMicroelectronics公司生产的微控制器系列。它们基于ARM Cortex-M内核&#xff0c;提供了广泛的性能和功能。STM32系列拥有多个型号和系列&#xff0c;每个型号都有不同的特性和功能。 STMicroelectronics提供了名为STM32Cube的软件生态系统&#xff0c;其中包…

【14-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

InstantMesh:利用稀疏视图大规模重建模型从单张图像高效生成3D网格

作者&#xff1a;Jiale Xu&#xff0c;Weihao Cheng&#xff0c;Yiming Gao等 编译&#xff1a;东岸因为一点人工一点智能 InstantMesh&#xff1a;利用稀疏视图大规模重建模型从单张图像高效生成3D网格在这项工作中&#xff0c;我们提出了InstantMesh&#xff0c;一个开源的…

【C语言】红黑树详解以及C语言模拟

一、红黑树的性质二、红黑树的旋转操作三、红黑树的插入操作四、红黑树的删除操作五、红黑树的应用六、C语言模拟红黑树七、总结 红黑树是一种自平衡二叉查找树&#xff0c;它能够保持树的平衡&#xff0c;从而确保查找、插入和删除的最坏情况时间复杂度为O( l o g n log_n log…

批量控制教程-Ansible管理windows

背景 你厌恶要手动操作多台机器进行某些重复的操作吗&#xff1f;想象一下&#xff0c;在周五的晚上你想要下班了&#xff0c;但是你得在很多台机器手动发布一些东西&#xff0c;每台机器都要整半小时&#xff0c;整整8台机器&#xff0c;一晚上几个小时可以预见又没了。 ans…

LoRA: 大模型的低秩适配

笔记整理&#xff1a;陈一林&#xff0c;东南大学硕士&#xff0c;研究方向为不确定知识图谱规则学习 链接&#xff1a;https://arxiv.org/abs/2106.09685 1、动机 自然语言处理的一个重要范式包括在通用领域数据上进行大规模预训练&#xff0c;然后对特定任务或领域进行适应性…

CentOS命令大全

系统信息查询命令 在CentOS系统中&#xff0c;了解如何查询系统信息对于系统管理和性能监控至关重要。以下是一些基本而强大的命令&#xff0c;用于获取关于您的系统的各种信息。 1. uname - 获取系统信息 uname命令用于打印系统信息&#xff0c;例如内核版本、主机名等。使…

python之schedule

在Python中&#xff0c;可以使用schedule模块来执行定时任务。这个模块提供了简单易用的API&#xff0c;可以让你按照指定的时间间隔或特定时间点执行函数或任务。 首先&#xff0c;需要使用pip安装schedule模块&#xff1a; pip install schedule下面是一个简单的例子&#…

JAVA10迭代更新

文章目录 1 概述2 语法层次的变化1_局部变量的类型推断 3 API层次的变化1_集合中新增copyOf创建只读集合2_Optional 新增了orElseThrow方法 4 其他1_垃圾回收器接口2_G1 并行 Full GC3_应用程序类数据共享(扩展 CDS 功能)4_实验性的基于 Java 的 JIT 编译器 1 概述 2018年3月21…

新能源汽车小米su7

小米su7汽车 function init() {const container document.querySelector( #container );camera new THREE.PerspectiveCamera( 20, window.innerWidth / window.innerHeight, 1, 50000 );camera.position.set( 0, 700, 7000 );scene new THREE.Scene();scene.background ne…

vue项目中基于fabric 插件实现涂鸦画布功能

vue项目中基于fabric 插件实现涂鸦画布功能 一、效果图二、安装依赖三、main.js引入四、主要代码 一、效果图 二、安装依赖 npm install fabric 三、main.js引入 import fabric from fabric Vue.use(fabric);四、主要代码 //封装成了一个组件 <template><el-dialogt…

Java中static关键字的使用与练习

Java中static关键字的使用与练习 在Java编程中&#xff0c;static关键字是一个非常重要的概念&#xff0c;它用于修饰类的成员变量和方法。通过static关键字&#xff0c;我们可以创建与类本身关联而不是与类的实例关联的成员。下面&#xff0c;我们将详细探讨static关键字在Ja…

FlashSpeech、ID-Animator、TalkingGaussian、FlowMap、CutDiffusion

本文首发于公众号&#xff1a;机器感知 FlashSpeech、ID-Animator、TalkingGaussian、FlowMap、CutDiffusion Gradient Guidance for Diffusion Models: An Optimization Perspective Diffusion models have demonstrated empirical successes in various applications and ca…

C语言中的指针常量的常量指针

指针常量和常量指针是C/C编程语言中两个重要的概念&#xff0c;它们都与指针有关&#xff0c;但具有不同的含义和用途。 1. 指针常量&#xff08;Pointer to Constant&#xff09; 指针常量指的是一个指针的值&#xff08;即它所指向的地址&#xff09;在初始化之后不能再被改…

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制婴儿性别比例饼图

在MATLAB 中可以使用 pie 函数来创建饼图。饼图是一种展示不同部分占总体的相对比例的图表。 本示例从“婴儿出生数据.csv”文件读取婴儿出生数据&#xff0c;然后计算男性和女性婴儿的数量&#xff0c;使用MATLAB绘制饼图。 配套图书链接&#xff1a;https://item.jd.com…