TG创建小程序交互APP登录以及机器人信息

1、搜索 BotFather ,输入命令**/newbot** 创建机器人。

2、修改机器人信息**/mybots**

编辑名称 : 修改机器人名称

编辑关于: 修改关于 hayden yyds,修改以后打开机器人会出现在下图

编辑描述 : 机器人的描述

编辑描述图片 : 机器人的图片

编辑 Botpic : 点击以后发送图片,修改机器人的头像

编辑命令 : 编辑命令以后机器人对话框旁边会出现菜单,点击菜单可以出现我们编辑d

创建小程序:发送**/newapp**命令,选择关联小程序的机器人。 然后按照提示输入标题和描述。

完成以后会要我们 :现在上传演示 GIF 或发送/empty 以跳过此步骤。

我们跳过以后会让我们输入小程序外部链接的https的url。

完成以后:很好!现在请为您的 Web 应用选择一个简称:3-30 个字符,a-zA-Z0-9_。此简称将用于 t.me/TetrisHayDenBot/myapp 等 URL,并作为您的 Web 应用的唯一标识符。

完成以后返回给我们小程序的访问链接地址

将我们机器人菜单改为自定义按钮。

输入命令:/mybots ,点击 Menu Button

后续。。。。。。

到此我们完成了TG小程序配置

使用TG小程序交互我们web平台,进行登录操作

Telegram Web Apps在启动时会提供一个initData和hash参数,用于验证数据的完整性和来源。你可以使用这些参数来确保数据没有被篡改。

当我们获取到了initData以后可以做一个hash验签:

java 复制代码
package com.app.web;
import org.apache.commons.codec.binary.Hex;
import org.springframework.boot.SpringApplication;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@EnableScheduling
@SpringBootApplication
public class PeipeiApplication {

    public static void main(String[] args) {
        // initData和botToken
        String initData = "user=%7B%22id%22%3A5000109645%2C%22first_name%22%3A%22John%22%2C%22last_name%22%3A%22Zeng%22%2C%22language_code%22%3A%22zh-hans%22%2C%22allows_write_to_pm%22%3Atrue%7D&chat_instance=-1844952925335620055&chat_type=private&auth_date=1720850073&hash=79b805a0d61c577211e63fa8f2df178c87eff97ce162218fffc84faa2f84e900";
        //这个botToken就是我们创建机器人的token,创建的机器人和TG小程序绑定的
        String botToken = "5000906011:AAFqS3Ygb9eKYHJ8jJ_ply_3awwC79DrbeY";

        // 提取hash并解码其余的键值对
        Map<String, String> params = Arrays.stream(initData.split("&"))
            .map(param -> param.split("=", 2))
            .collect(Collectors.toMap(
                arr -> arr[0],
                arr -> {
                    try {
                        return URLDecoder.decode(arr[1], StandardCharsets.UTF_8.name());
                    } catch (UnsupportedEncodingException e) {
                        throw new RuntimeException(e);
                    }
                }
            ));

        // 提取并移除hash
        String hash = params.remove("hash");

        // 按键名排序其余的键值对
        String dataCheckString = params.entrySet().stream()
            .sorted(Map.Entry.comparingByKey())
            .map(entry -> entry.getKey() + "=" + entry.getValue())
            .collect(Collectors.joining("\n"));

        // 生成密钥
        byte[] secretKey = hmacSha256("WebAppData", botToken);

        // 生成HMAC-SHA256签名
        String computedHash = hmacSha256Hex(secretKey, dataCheckString);

        // 验证hash
        if (computedHash.equals(hash)) {
            System.out.println("Data is valid");
        } else {
            System.out.println("Data is invalid");
        }


    }



    private static byte[] hmacSha256(String key, String data) {
        try {
            Mac mac = Mac.getInstance("HmacSHA256");
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
            mac.init(secretKeySpec);
            return mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
        } catch (Exception e) {
            throw new RuntimeException("Failed to calculate hmac-sha256", e);
        }
    }

    private static String hmacSha256Hex(byte[] key, String data) {
        try {
            Mac mac = Mac.getInstance("HmacSHA256");
            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "HmacSHA256");
            mac.init(secretKeySpec);
            byte[] hashBytes = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
            return Hex.encodeHexString(hashBytes);
        } catch (Exception e) {
            throw new RuntimeException("Failed to calculate hmac-sha256 hex", e);
        }
    }
}
相关推荐
明志数科9 小时前
具身智能数据供给的分层:分布式采集与入厂采集的工程边界分析
人工智能·机器学习·机器人
微小冷10 小时前
Python凸优化cvxpy初步
python·机器人·凸优化·数学规划·cvxpy
XMAIPC_Robot13 小时前
CODESYS 实时控制 + RK182X 大模型算力扩展|RK3576 工业边缘控制器设计
人工智能·fpga开发·机器人·rk3588+fpga
福建清洁设备厂家13 小时前
福建洗地机哪个牌子好?工厂物业商用清洁设备选型指南
机器人·洗地机·清洁设备·驾驶式洗地机·手推式洗地机·智能清洁机器人·全自动清洁机器人
初学大模型14 小时前
先剔后识:OpenCV三维预处理与YOLO语义检测协同的机器人视觉系统可行性分析
人工智能·opencv·yolo·计算机视觉·机器人
PascalXie15 小时前
水下机器人除了声纳,还能用什么感知方案?
计算机视觉·机器人
xwz小王子15 小时前
中科院自动化所、智源等 | DIDO:世界动作模型告别多步去噪,交互动态蒸馏进单步,性能不降反增,推理提速32%!
机器人
硅谷秋水15 小时前
RoboEdit:将人类操作视频转化为可扩展的机器人经验
人工智能·机器学习·计算机视觉·机器人
阿尔法工场研究院16 小时前
宇树们不想重蹈新造车的覆辙
大数据·人工智能·科技·机器人
老张老张16 小时前
具身智能三大核心赛道
机器人·具身智能