小试牛刀-Telebot区块链游戏机器人(TS升级)
目录
1.编写目的
2.为什么使用TypeScript实现?
3.实现功能
3.1 AI图片生成
3.2 签到
3.3 邀请
3.4 WalletConnect连接
4.功能实现详解
4.1 AI图片生成
4.2 签到
4.3 邀请
4.4 WalletConnect连接
5.功能截图
6.问题整理
Welcome to Code Block's blog
本篇文章主要介绍了
[Telebot区块链游戏机器人TS升级]
❤博主广交技术好友,喜欢文章的可以关注一下❤
1.编写目的
本篇文章是小试牛刀-Telebot区块链游戏机器人(python版本)的typescript版本开发记录,实现该版本的主要目的是为了集成walletconnect,以实现用户wallet的无存储公私钥的交互功能.
2.为什么使用TypeScript实现?
首先walletconnct对TypeScript有着良好的支持,它可以直接使用@walletconnect/sign-client中的组件对wc协议进行配对监听,方便后续的事务签名。而python几乎没有相关的组件库(也可能是我没找到).
如果没有库,替代方法可以是python直接调用js文件,但这会让整个项目显得不伦不类.或者python去做request请求,请求部署的js文件服务.但这会让项目整体的稳定性变低.
基于以上的种种考虑,所以这边将整个项目修改为TS版本.
3.实现功能
实现的功能包括在小试牛刀-Telebot区块链游戏机器人已经实现的所有功能,将其集成到TS版本中.在此基础上,我又增加了以下功能:
3.1 AI图片生成
用户可以通过输入/genimg+[描述]命令生成一张与描述相关的艺术画作图片.
3.2 签到
用户可以每天进行签到以获得代币奖励.
3.3 邀请
用户可以通过/shill命令生成邀请链接,并通过分享该链接在用户通过该链接使用机器人时获得代币奖励.
3.4 WalletConnect连接
用户可以通过输入/wclink命令,获得walletconnect二维码,当用户通过支持walletconnect协议的钱包扫码时,可以连接到机器人.
4.功能实现详解
4.1 AI图片生成
AI图片生成是通过huggingface上运行的AI模型接口实现(为什么不用国内的?答:少,且要钱).首先你需要在huggingface上注册一个token,当然如果你不想申请也可以直接用代码内的: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,然后使用post请求直接调用相关模型,具体使用方法可以在huggingface官网进行查看.
import TelegramBot from 'node-telegram-bot-api';
import { getCommandsText } from '../filter/Intercept'
import axios from 'axios';
// 定义 API_TOKEN 和数据接口
const API_TOKEN: string = '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'; // 替换为你的 API Tokeninterface QueryData {inputs: string;
}
// 处理分享链接命令
async function handleGenImg(bot:TelegramBot,message: TelegramBot.Message): Promise<void> {const inviterUserId = message.from?.id;const username = message.from?.username;const text=getCommandsText(message);query({inputs:text}).then((response) => {const helpText="<b>Beautiful!\nThis is the image you created! @"+{username}+"</b>\n"bot.sendPhoto(message.chat.id, response, {caption: helpText,parse_mode: 'HTML'});}).catch((error) => {console.error('Error:', error);});
}
// 注册命令处理程序
export function registerGenImgHandlers(bot:TelegramBot): void {bot.onText(/\/genimg/, async (msg) => {await handleGenImg(bot,msg);});
}async function query(data: any): Promise<any> {try {const response = await axios.post("https://api-inference.huggingface.co/models/alvdansen/littletinies",JSON.stringify(data),{headers: { Authorization: `Bearer ${API_TOKEN}` },responseType: 'arraybuffer'},);return response.data;} catch (error) {console.error('请求错误:', error);throw error;}
}
4.2 签到
用户签到即用户每天可点击一次按钮并获得奖励,这里注意用户点击后该用户id要进行记录,防止重复签到,实现代码如下:
async function dailyCheck(bot: TelegramBot, call: TelegramBot.CallbackQuery) {const fromUserId = call.from.id;const username = call.from.username;//防止连续点击if (!passGameTime(fromUserId)) {bot.sendMessage(call.message!.chat.id, "<b>Please do not send duplicate messages</b>", { parse_mode: 'HTML' });bot.answerCallbackQuery(call.id, { text: "", show_alert: false });return;}dailyCommandTime[fromUserId] = Date.now();if (await notHasWallet(String(fromUserId))) {bot.sendMessage(call.message!.chat.id, `<b>You not have wallet info, you need send [/create] create one game wallet! @${call.from.username}</b>`, { parse_mode: 'HTML' });bot.answerCallbackQuery(call.id, { text: "", show_alert: false });return;}//限定签到数量if (await checkDailyNumber()) {bot.sendMessage(call.message!.chat.id, `<b>There are only 50 people per day, please come again tomorrow! @${call.from.username}</b>`, { parse_mode: 'HTML' });bot.answerCallbackQuery(call.id, { text: "", show_alert: false });return;}if (await checkDaily(String(fromUserId))) {bot.sendMessage(call.message!.chat.id, `<b>You have already daily check! @${call.from.username}</b>`, { parse_mode: 'HTML' });bot.answerCallbackQuery(call.id, { text: "", show_alert: false });return;}//发送奖励const [ amount, tx ] = await drawDailyCheck(String(SEND_USER_ID), String(fromUserId));if (tx === "error") {bot.sendMessage(call.message!.chat.id, "<b>Daily Check Error!</b>", { parse_mode: 'HTML' });bot.answerCallbackQuery(call.id, { text: "", show_alert: false });return;}if (tx=="error:account"){bot.sendMessage(call.message!.chat.id, `<b>You must first send some BOGGY into the wallet before you can [DaliyCheck] and [invite] @${username}</b>`, { parse_mode: 'HTML' });bot.answerCallbackQuery(call.id, { text: "", show_alert: false });return;}//添加每日签到数据addDaily(String(fromUserId));const markup = {inline_keyboard: [[{ text: "Check Tx", url: `https://solscan.io/tx/${tx}` }]]};bot.sendMessage(call.message!.chat.id, `<b>The Daily Check amount ${amount} BOGGY transfer end, Click 'Check Tx' Button Check @${call.from.username}</b>`, { reply_markup: markup, parse_mode: 'HTML' });bot.answerCallbackQuery(call.id, { text: "", show_alert: false });
}
4.3 邀请
邀请实际是通过在机器人链接后拼接命令,格式为:https://t.me/{机器人名}?start={邀请人id},这样当邀请人点击你的链接并使用start命令启动机器人时,则可以获取到链接后的邀请人Id,然后给邀请人发消息并发送代币奖励.实现代码如下:
// 检查是否有邀请码
if (checkCommandsParams(message, "start")) {const inviterUserId = getCommandsParams(message);const fromUserId = message.from?.id??0;//连续点击监测if (!passGameTime(fromUserId)) {bot.sendMessage(message.chat.id, "<b>Please do not send duplicate messages</b>", { parse_mode: 'HTML' });return;}dailyCommandTime[fromUserId] = Date.now();//自己邀请自己检测if (Number(inviterUserId) === fromUserId) {bot.sendMessage(message.chat.id, "<b>You cannot invite yourself!</b>", { parse_mode: 'HTML' });return;}//游戏钱包检测if (await notHasWallet(inviterUserId)) {bot.sendMessage(message.chat.id, "<b>The inviter has not created a wallet and cannot receive rewards</b>", { parse_mode: 'HTML' });return;}//已被邀请检测if (await hasShildUser(String(fromUserId))) {bot.sendMessage(message.chat.id, "<b>Invited users cannot receive rewards</b>", { parse_mode: 'HTML' });return;}//发送奖励const [amount, tx ] = await drawDailyCheck(String(SEND_USER_ID), inviterUserId);if (tx === "error") {bot.sendMessage(message.chat.id, "<b>send rewards Error!</b>", { parse_mode: 'HTML' });return;}if (tx == "error:account"){bot.sendMessage(message.chat.id, `<b>You must first send some BOGGY into the wallet before you can [DaliyCheck] and [invite] @${username}</b>`, { parse_mode: 'HTML' });return;}const markup = {inline_keyboard: [[{ text: "Check Tx", url: `https://solscan.io/tx/${tx}` }]]};bot.sendMessage(message.chat.id, `<b>You have accepted the inviter's invitation and the reward ${amount} BOGGY has been sent to the inviter. Click 'Check Tx' Button Check @${message.from?.username}</b>`, { reply_markup: markup, parse_mode: 'HTML' });bot.sendMessage(inviterUserId, `<b>The Invited amount ${amount} BOGGY transfer end, Click 'Check Tx' Button Check</b>`, { reply_markup: markup, parse_mode: 'HTML' });addShildUser(String(fromUserId), inviterUserId);
4.4 WalletConnect连接
用户输入/wclink命令后,则调用initWalletConnect进行配对,并发送连接请求,同时通过传入的approval监听用户的连接情况,实现代码如下:
import Client, { SignClient } from "@walletconnect/sign-client";import TelegramBot from "node-telegram-bot-api";
const metadata={name: 'BoggyGame',description: 'BoggyGame Bot',url: 'https://www.boggycoin.com',icons: ["https://i.postimg.cc/sftPCk3M/photo-2024-07-12-14-12-43.jpg"]
}
const projectId="申请的ProjectId"
let signClient: Client | null = null;
async function getSignClient() {if (!signClient) {signClient = await SignClient.init({projectId: projectId, // 替换为你的项目IDmetadata: metadata});}return signClient;
}export async function initWalletConnect(onApproval: (approval: any,signClient:any,bot:any,message:any) => void,bot:TelegramBot,message:TelegramBot.Message):Promise<String|undefined> {const signClient = await getSignClient()// 创建会话并发送签名请求const {topic} = await signClient.core.pairing.create()const { uri,approval } = await signClient.connect({pairingTopic: topic,requiredNamespaces: {solana: {methods: ["solana_signTransaction","solana_signMessage"],chains: ["solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"],events: []}}})// 调用回调函数处理 approvalif (approval) {onApproval(approval,signClient,bot,message);}return uri;}
5.功能截图
AI图片生成

签到

邀请
获取链接:

奖励发放:

walletconnect连接



6.问题整理
在集成node-telegram-bot-api组件时,出现网络问题,有时消息不回复,但是python版本运行良好.在Github上找到相关解决方法,给出的解释是要使用ipv4设置或者降低node版本,修改后代码运行良好,方法如下:
const botToken = "123123123:testAAAAA";
const telegramAPI = require("node-telegram-bot-api");
const bot = new telegramAPI(config.botToken, { polling: true, request: {agentOptions: {keepAlive: true,//ipv4family: 4}
}});
bot.on("message", async function(msg) {await bot.sendMessage(msg.chat.id, "test");
});
感谢您的关注和收藏!!!!!!

相关文章:
小试牛刀-Telebot区块链游戏机器人(TS升级)
目录 1.编写目的 2.为什么使用TypeScript实现? 3.实现功能 3.1 AI图片生成 3.2 签到 3.3 邀请 3.4 WalletConnect连接 4.功能实现详解 4.1 AI图片生成 4.2 签到 4.3 邀请 4.4 WalletConnect连接 5.功能截图 6.问题整理 Welcome to Code Blocks blog 本篇文章主…...
MySQL:Prepared Statement 预处理语句
预处理语句(Prepared Statement) 是一种在数据库管理系统中使用的编程概念,用于执行对数据库进行操作的 SQL 语句。 使用预处理语句的具体方式和语法依赖于所用的编程语言和数据库管理系统。常见的编程语言如 Java、PHP、Python 和 C# 都提供…...
Java:Thread类以及线程状态
文章目录 Thread类等待一个线程 - join()获取当前线程的引用sleep 线程状态 Thread类 等待一个线程 - join() 操作系统,针对多个线程的执行,是一个"随机调度,抢占式执行“的过程. 线程等待就是在确定两个线程的"结束顺序”. 我们无法确定两个线程调度执行的顺序,但…...
如何通过前端表格控件实现自动化报表?
背景 最近伙伴客户的项目经理遇见一个问题,他们在给甲方做自动化报表工具,项目已经基本做好了,但拿给最终甲方,业务人员不太买账,项目经理为此也是天天抓狂,没有想到合适的应对方案。 现阶段主要面临的问…...
Upload-labs靶场Pass01-Pass21全解
文章目录 Pass-01 前端JSJS绕过上传或者用burp抓包的方式 Pass-02 MIME检测Pass-03 特殊文件后缀黑白名单绕过特殊文件名绕过 Pass-04 .htacess上传Pass-05 user.ini文件上传Pass-06 大小写绕过Pass-07 空格绕过Pass-08 .绕过Pass-09 ::$DATA绕过Pass-10 .空格.绕过Pass-11 双写…...
使用openpyxl库对Excel数据有效性验证
哈喽,大家好,我是木头左! 本文将重点介绍如何使用openpyxl库进行Excel数据验证。 什么是Excel数据验证 Excel数据验证是一种功能,可以限制单元格中输入的数据类型和范围。例如,可以设置一个单元格只能输入日期,或者只能输入大于0的数字。这样,可以确保数据的准确性和一…...
【算法】浅析深度优先搜索算法
深度优先搜索算法:深入探索,穷尽可能 1. 引言 在计算机科学中,深度优先搜索(Depth-First Search,简称DFS)是一种用于遍历或搜索树或图的算法。这种算法会沿着一个分支走到底,直到这个分支结束…...
鸿蒙系统开发【ASN.1密文转换】安全
ASN.1密文转换 介绍 本示例对使用kit.CryptoArchitectureKit加密后的密文格式进行转换。kit.CryptoArchitectureKit加密后的密文格式默认为以base64显示的ASN.1格式问题,通过对密文进行base64变换后得到字符数组,以16进制数字显示,再此基础…...
【期末复习】软件质量保证与测试
考试内容 a卷 前三个部分(就业前景、岗位、发展前景(第一部分最后一个知识点),第四部分缺陷管理不考) 单选 10*2 判断 12*1 简单3*10 四个小题 (7个 pta部分涵盖+ppt) 设计 10+18 简答题(PTA简答题+PPT) 背完80分以上基本没问题 一、什么是软件。 软件是计算…...
CTFHub——XSS——反射型
1、反射型: 发现为表单式,猜测哪个可能存在注入漏洞,分别做测试注入发现name框存在xss漏洞 输入发现有回显但不是对方cookie,参考wp发现要用xss线上平台 将xss平台测试语句注入,将得到的url编码地址填入url框…...
docker 部署 libreoffice
创建 jdk 镜像 1、创建 Dockfile 文件 FROM centos:7 ADD jdk-8u212-linux-x64.tar.gz /usr/local RUN mv /usr/local/jdk1.8.0_212 /usr/local/jdk ENV JAVA_HOME=/usr/local/jdk ENV JRE_HOME=$JAVA_HOME/jre ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH ENV P…...
预测各种开发语言的市场占比
预测各种开发语言的市场占比是一个复杂且动态的任务,因为它受到多种因素的影响,包括市场需求、技术趋势、项目类型、开发团队的经验和偏好等。然而,我可以根据当前的技术趋势、编程语言排行榜以及市场需求情况,给出一个大致的预测…...
mybatisplus 通用字段自动赋值与更新
1、数据库级别的自动赋值与更新 比如自动更新时间和插入时间 default current_timestamp 插入的时候获取当前 default current_timestamp on update current_timestamp 修改的时候更新时间 无法用数据库更新的通用字段 借助 mybatisplus 的 metaobjecthandler 实现metaob…...
图像生成中图像质量评估指标—FID介绍
文章目录 1. 背景介绍2. 实际应用3. 总结和讨论 1. 背景介绍 Frchet Inception Distance(\textbf{FID})是一种衡量生成模型性能的指标,它基于Inception网络提取的特征来计算模型生成的图像与真实图像集合之间的距离。 FID利用了Inception模…...
uniapp全局分享功能实现方法(依赖小程序右上角的分享按钮)
1、uniapp开发小程序时默认是关闭分享功能的。点击右上角三个点可查看,效果图如下: 2、在utils文件夹下新建share.js文件,名字任起。(使用的是全局分享,因为一个一个页面的去分享太麻烦且没必要。) export…...
Redis中BigKey的判定查找建议
判定依据 key本身的数据量过大:string类型的key它的值为5MBkey中的成员数量过多:一个zset类型的key成员数量为10000个key中的成员数据量过大:一个hash类型的key他的成员只有1000个但是这些value总大小超过100MB查看内存命令 127.0.0.1:6379> hset k1 name 123 age 123 sex…...
Swift-语法基础
一、声明 变量声明 以关键字 var 开头的声明引入变量,该变量在程序执行期间可以具有不同的值。 var str: String "hello" str "hello, world" 常量声明 以关键字 let 开头的声明引入只读常量,该常量只能被赋值一次。 let s…...
面向对象进阶:多态、内部类、常用API
目录 Java中的接口 Java中的内部类 常用API StringBuilder类 Java高级面向对象编程 在这篇博客文章中,我们将探索Java中的高级面向对象编程概念,包括接口、内部类和常用API。每个概念都将通过代码示例来演示它们的应用。 Java中的接口 什么是接口&…...
寸(英寸)、码、斤、公顷等日常中大概的换算单位你清楚吗
这些单位和概念是我们日常生活和工作中不可或缺的部分,理解它们的用途和转换关系可以让我们更有效地处理信息、进行交流和解决问题。 1、寸(英寸) 1寸(或英寸)等于0.0254米,2寸等于:20.0254&a…...
Python面试宝典第26题:最长公共子序列
题目 一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。比如:"ace" 是 "abcde" 的子序列,但 "…...
ChatSVA:多智能体框架革新硬件验证中的SVA生成
1. ChatSVA:硬件验证领域的SVA生成革命在集成电路设计领域,功能验证已成为制约开发效率的最大瓶颈。据统计,现代芯片开发周期中超过50%的时间消耗在功能验证环节,而SystemVerilog断言(SVA)作为形式化验证和…...
SoC早期流片策略:风险控制与工程实践深度解析
1. 早期流片的风险与回报:一次深度权衡在系统级芯片开发这个行当里干了十几年,验证始终是悬在每个项目团队头顶的达摩克利斯之剑。面对动辄数亿门级、集成数十个异构核心的复杂SoC,想要在流片前达到“万无一失”的验证覆盖率,所需…...
计算机视觉与3D重建:模型加速与质量优化的全栈实践
1. 项目概述:当计算机视觉遇见效率与精度革命最近,微软研究院在计算机视觉领域的两项进展引起了我的注意。一项是关于如何让模型“看”得更快更准,另一项则是关于如何让3D扫描模型从“毛坯”变成“精装”。这听起来像是两个独立的方向&#x…...
HUM4D数据集:无标记人体动作捕捉的挑战与评估
1. HUM4D数据集概述HUM4D是一个专门针对无标记人体动作捕捉技术评估的基准数据集,由计算机视觉研究团队开发。这个数据集的核心价值在于填补了现有动作捕捉基准在复杂场景下的空白——那些包含快速运动、严重遮挡、深度突变和身份混淆的真实挑战。在动作捕捉领域&am…...
Casbin Talent 2026:高校开发者开源进阶与工业级项目实战指南
1. 项目概述:Casbin Talent 2026,一个为高校开发者量身定制的开源进阶通道如果你是一名在校大学生,对开源世界充满好奇,渴望在真实的工业级项目中打磨技术,但又觉得像Google Summer of Code(GSoC࿰…...
ACE Awards:电子行业年度创新风向标与工程师成长指南
1. 项目概述:一场属于电子工程师的年度庆典如果你在半导体或电子设计行业待过几年,肯定对“EE Times”和“EDN”这两个名字不陌生。它们就像是电子工程师的“行业圣经”,每天刷一刷,看看又有哪些新芯片发布、哪些技术路线在争论&a…...
5分钟快速上手:用FanControl打造你的Windows电脑静音散热系统
5分钟快速上手:用FanControl打造你的Windows电脑静音散热系统 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tren…...
鸣潮自动化工具ok-ww终极指南:3步配置解放双手的智能助手
鸣潮自动化工具ok-ww终极指南:3步配置解放双手的智能助手 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 你是否厌倦了…...
光伏并网系统谐波抑制控制策略【附程序】
✨ 长期致力于锁相环、谐波电流检测、二阶广义积分器、LMS滤波器研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于双二阶广义积分器-锁频环的自适应…...
Perplexity Stack Overflow查询响应延迟超8秒?紧急修复指南:从token压缩到领域微调的4层加速方案
更多请点击: https://intelliparadigm.com 第一章:Perplexity Stack Overflow查询响应延迟超8秒?紧急修复指南:从token压缩到领域微调的4层加速方案 当Perplexity在Stack Overflow数据源上出现平均响应延迟 > 8s 的告警时&am…...
