node.js gbk编码_如何使用Node.js将Chrome的霸王龙编码为电报游戏

node.js gbk编码

by Fernando García Álvarez

通过费尔南多·加西亚·阿尔瓦雷斯

如何使用Node.js将Chrome的霸王龙编码为电报游戏 (How to code Chrome’s T-Rex as a Telegram game using Node.js)

Last month I was really interested in learning how the Telegram game platform works. And as I was also really bored of playing Chrome’s T-Rex game alone, I decided to make it work as a Telegram game.

上个月,我对学习Telegram游戏平台的工作方式非常感兴趣。 而且,由于我也对独自玩Chrome的T-Rex游戏感到非常无聊,因此我决定将其作为Telegram游戏使用。

While developing it I noticed there weren’t many Telegram game bot tutorials. Tutorial would explain the whole process of building it, from start to finish. So I decided to write about it.

在开发它时,我注意到并没有太多Telegram游戏机器人教程。 教程将从头到尾说明构建它的整个过程。 因此,我决定写这篇文章。

If you want to see the result, the game is available as trexjumpbot in Telegram and is hosted here.

如果您想查看结果,可以在Telegram中以trexjumpbot的形式获得该游戏, 并在此处托管。

要求 (Requirements)

You need to have Node.js installed

您需要安装Node.js

第1步:创建我们的机器人 (Step 1: Creating our bot)

In order to create a game, we must first create an inline bot. We do this by talking to BotFather and sending the command

为了创建游戏,我们必须首先创建一个嵌入式机器人。 我们通过与BotFather交谈并发送命令来做到这一点

/newbot

/newbot

Then, we are asked to enter a name and a username for our bot and we are given an API token. We need to save it as we will need it later.

然后,要求我们输入机器人的名称和用户名,并获得一个API令牌。 我们需要保存它,因为稍后将需要它。

We can also complete our bot info by changing its description (which will be shown when a user enters a chat with our bot under the “What can this bot do?” section) with

我们还可以通过更改其说明(当用户在“此机器人可以做什么?”部分下与我们的机器人进行聊天时显示)来完成我们的机器人信息。

/setdescription

/setdescription

And also set its picture, in order to make it distinguishable from the chat list. The image must be square and we can set it with the following command:

并设置其图片,以使其与聊天列表区分开。 图片必须为正方形,我们可以使用以下命令进行设置:

/setuserpic

/setuserpic

We can also set the about text, which will appear on the bot’s profile page and also when sharing it with other users

我们还可以设置About文本,该文本将显示在机器人的个人资料页面上以及与其他用户共享时

/setabouttext

/setabouttext

Our bot has to be inline in order to be able to use it for our game. In order to do this, we simply have to execute the following and follow the instructions

我们的机器人必须是内联的,以便能够在我们的游戏中使用它。 为此,我们只需执行以下步骤并按照说明进行操作

/setinline

/setinline

步骤2:建立游戏 (Step 2: Creating our game)

Now that we have our inline bot completely set up, it’s time to ask BotFather to create a game:

现在我们已经完全设置了内联机器人,现在是时候让BotFather创建游戏了:

/newgame

/newgame

We simply follow the instructions and finally we have to specify a short name for our game. This will act as a unique identifier for it, which we will need later along with our bot API token

我们只需按照说明进行操作,最后我们必须为我们的游戏指定一个简短的名称。 这将充当它的唯一标识符,我们稍后将需要它以及bot API令牌

步骤3:获取T-Rex游戏源代码 (Step 3: Getting T-Rex game source code)

As Chromium is open source, some users have extracted the T-Rex game from it and we can easily find its source code online.

由于Chromium是开源的,因此一些用户已经从中提取了T-Rex游戏,我们可以轻松地在网上找到其源代码。

In order to make the game, I have used the code available in this GitHub repo, so go ahead and clone it:

为了制作游戏,我使用了此GitHub存储库中可用的代码,因此继续进行克隆:

git clone https://github.com/wayou/t-rex-runner.git

步骤4:设置依赖关系 (Step 4: Setting up dependencies)

First, go into the cloned folder and move all its files into a new folder called “public”

首先,进入克隆的文件夹,并将其所有文件移动到名为“ public”的新文件夹中

mkdir public && mv * public/.

And init the project

并启动项目

npm init

You can fill the requested info as you want (you can leave the default values), leave the entry point as index.js

您可以根据需要填写所需的信息(可以保留默认值),将入口点保留为index.js

We will need Express and node-telegram-bot-api in order to easily interact with Telegram’s API

我们将需要Express和node-telegram-bot-api以便轻松与Telegram的API进行交互

npm install express --savenpm install node-telegram-bot-api --save

We are going to add a start script, since it’s necessary in order to deploy the game to Heroku. Open package.json and add the start script under the scripts section:

我们将添加一个启动脚本,因为将游戏部署到Heroku是必需的。 打开package.json并在脚本部分下添加启动脚本:

"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node index.js"
}

第5步:对服务器进行编码 (Step 5: Coding our server)

Now that we have all dependencies set up, it’s time to code the server for our bot. Go ahead and create the index.js file:

现在我们已经设置了所有依赖项,是时候为我们的机器人编写服务器代码了。 继续创建index.js文件:

const express = require("express");
const path = require("path");
const TelegramBot = require("node-telegram-bot-api");
const TOKEN = "YOUR_API_TOKEN_GOES_HERE";
const server = express();
const bot = new TelegramBot(TOKEN, { polling: true } );
const port = process.env.PORT || 5000;
const gameName = "SHORT_NAME_YOUR_GAME";
const queries = {};

The code above is pretty straightforward. We simply require our dependencies and set the token we got from BotFather and also the short name we defined as the game identifier. Also, we set up the port, initialize Express and declare a queries empty object. This will act as a map to store the Telegram user object under his id, in order to retrieve it later.

上面的代码非常简单。 我们只需要我们的依赖关系,并设置从BotFather获得的令牌,以及我们定义为游戏标识符的简称。 同样,我们设置端口,初始化Express并声明一个查询为空的对象。 这将用作将电报用户对象存储在其ID下的映射,以便以后检索。

Next, we need to make the contents of the public directory available as static files

接下来,我们需要将公共目录的内容作为静态文件提供

server.use(express.static(path.join(__dirname, 'public')));

Now we are going to start defining our bot logic. First, let’s code the /help command

现在,我们将开始定义机器人逻辑。 首先,让我们编写/ help命令的代码

bot.onText(/help/, (msg) => bot.sendMessage(msg.from.id, "This bot implements a T-Rex jumping game. Say /game if you want to play."));

We have to specify the command as a regex on the first parameter of onText and then specify the bot’s reply with sendMessage. Note we can access the user id in order to reply by using msg.from.id

我们必须在onText的第一个参数上将命令指定为正则表达式,然后使用sendMessage指定漫游器的回复。 请注意,我们可以使用msg.from.id来访问用户ID以便进行回复

When our bot receives the /start or /game command we are going to send the game to the user using bot.sendGame

当我们的机器人收到/ start或/ game命令时,我们将使用bot.sendGame将游戏发送给用户

bot.onText(/start|game/, (msg) => bot.sendGame(msg.from.id, gameName));

Now the user will be shown the game’s title, his high score and a button to play it, but the play button still doesn’t work. So, we are going to implement its logic

现在,将向用户显示游戏的标题,他的高分和一个播放游戏的按钮,但是播放按钮仍然不起作用。 因此,我们将执行其逻辑

bot.on("callback_query", function (query) {
if (query.game_short_name !== gameName) {
bot.answerCallbackQuery(query.id, "Sorry, '" + query.game_short_name + "' is not available.");
} else {
queries[query.id] = query;
let gameurl = "https://YOUR_URL_HERE/index.html?  id="+query.id;
bot.answerCallbackQuery({
callback_query_id: query.id,
url: gameurl
});
}
});

When the user clicks the play button Telegram sends us a callback. In the code above when we receive this callback first we check that the requested game is, in fact, our game, and if not we show an error to the user.

当用户单击播放按钮时,Telegram向我们发送回叫。 在上面的代码中,当我们首先收到此回调时,我们检查所请求的游戏是否确实是我们的游戏,如果没有,则向用户显示错误。

If all is correct, we store the query into the queries object defined earlier under its id, in order to retrieve it later to set the high score if necessary. Then we need to answer the callback by providing the game’s URL. Later we are going to upload it to Heroku so you’ll have to enter the URL here. Note that I’m passing the id as a query parameter in the URL, in order to be able to set a high score.

如果一切正确,我们会将查询存储到先前在其ID下定义的查询对象中,以便稍后进行检索以在必要时设置高分。 然后,我们需要通过提供游戏的网址来回答回调。 稍后,我们将其上传到Heroku,因此您必须在此处输入URL。 请注意,我将id作为查询参数传递给URL,以便能够设置较高的分数。

Right now we have a fully functional game but we still are missing high scores and inline behavior. Let’s start with implementing inline and offering our game:

目前,我们有一个功能齐全的游戏,但我们仍然缺少高分和内联行为。 让我们从内联实现和提供游戏开始:

bot.on("inline_query", function(iq) {
bot.answerInlineQuery(iq.id, [ { type: "game", id: "0", game_short_name: gameName } ] );
});

Last, we are going to implement the high score logic:

最后,我们将实现高分逻辑:

server.get("/highscore/:score", function(req, res, next) {
if (!Object.hasOwnProperty.call(queries, req.query.id)) return   next();
let query = queries[req.query.id];
let options;
if (query.message) {
options = {
chat_id: query.message.chat.id,
message_id: query.message.message_id
};
} else {
options = {
inline_message_id: query.inline_message_id
};
}
bot.setGameScore(query.from.id, parseInt(req.params.score),  options,
function (err, result) {});
});

In the code above, we listen for URLs like /highscore/300?id=5721. We simply retrieve the user from the queries object given its id (if it exists) and the use bot.setGameScore to send the high score to Telegram. The options object is different if the user is calling the bot inline or not, so we check both situations as defined in the Telegram Bot API

在上面的代码中,我们侦听/ highscore / 300?id = 5721之类的URL。 我们只需从查询对象中检索给定其ID(如果存在)的用户,并使用bot.setGameScore将高分发送给Telegram。 如果用户是否内联调用bot,options对象是不同的,因此我们检查了Telegram Bot API中定义的两种情况

The last thing we have to do on our server is to simply listen in the previously defined port:

我们在服务器上要做的最后一件事就是简单地侦听先前定义的端口:

server.listen(port);

第6步:修改霸王龙游戏 (Step 6: Modifying T-Rex game)

We have to modify the T-Rex game we cloned from the GitHub repo in order for it to send the high score to our server.

我们必须修改从GitHub存储库中克隆的T-Rex游戏,以将高分发送给我们的服务器。

Open the index.js file under the public folder, and at the top of it add the following lines in order to retrieve the player id from the url:

打开公用文件夹下的index.js文件,并在其顶部添加以下行,以便从url中检索播放器ID:

var url = new URL(location.href);
var playerid = url.searchParams.get("id");

Last, we are going to locate the setHighScore function and add the following code to the end of it, in order to submit the high score to our server:

最后,我们将定位setHighScore函数并将以下代码添加到它的末尾,以便将高分提交给我们的服务器:

// Submit highscore to Telegram
var xmlhttp = new XMLHttpRequest();
var url = "https://YOUR_URL_HERE/highscore/" + distance  +
"?id=" + playerid;
xmlhttp.open("GET", url, true);
xmlhttp.send();

步骤7:部署到Heroku (Step 7: Deploying to Heroku)

Our game is complete, but without uploading it to a server we can’t test it on Telegram, and Heroku provides us a very straightforward way to upload it.

我们的游戏已经完成,但是没有将其上传到服务器,就无法在Telegram上对其进行测试,而Heroku为我们提供了一种非常简单的上传方式。

Start by creating a new app:

首先创建一个新应用:

Change our URL placeholders with the actual URL (replace with your own):

用实际的URL更改我们的URL占位符(用您自己的URL代替):

Replace the URL with the setHighScore function

用setHighScore函数替换URL

var url = "https://trexgame.herokuapp.com/highscore/" + distance +
"?id=" + playerid;

And also on the callback on the server:

以及服务器上的回调:

let gameurl = "https://trexgame.herokuapp.com/index.html?id="+query.id;

Finally, let’s upload our game to Heroku. Let’s follow the steps detailed on the Heroku page: After installing Heroku CLI, from the project folder login and push the files:

最后,让我们将游戏上传到Heroku。 让我们按照Heroku页面上详述的步骤进行操作:安装Heroku CLI后 ,从项目文件夹登录并推送文件:

heroku logingit initheroku git:remote -a YOUR_HEROKU_APP_NAMEgit add .git commit -m "initial commit"git push heroku master

And that’s it!, now you finally have a fully working Telegram game. Go ahead and try it!

就是这样!现在,您终于有了一个可以正常运行的Telegram游戏。 继续尝试!

Full source code of this example is available on GitHub

该示例的完整源代码可在GitHub上找到

参考文献 (References)

  • http://wimi5.com/como-crear-un-bot-para-juegos-en-telegram-con-nodejs/

    http://wimi5.com/como-crear-un-bot-para-juegos-en-telegram-con-nodejs/

  • https://core.telegram.org/bots/api#setgamescore

    https://core.telegram.org/bots/api#setgamescore

  • https://github.com/wayou/t-rex-runner

    https://github.com/wayou/t-rex-runner

翻译自: https://www.freecodecamp.org/news/how-to-code-chromes-t-rex-as-a-telegram-game-using-node-js-cbcf42f76f4b/

node.js gbk编码

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

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

相关文章

二进制文件更新程序_APR 6.17程序文件更新

兰博基尼程序文件更新Lamborghini Huracan EURO MY2018 5.2L V10 DKBC 4T0907552L S0002 Stage 1 V1.1 [APR Mobile]奥迪程序文件更新Audi A3 / VW GTI NA MY2014 2.0TSI CNTC 5G0906259A S0001 Stage 1 V2.0.3 [2WD] [Single Program]Audi A3 / VW GTI NA MY2014 2.0TSI CNTC …

android 事件拦截 (Viewpager不可以左右滑动)

以前没有做过真正的需求,所以从来没有觉得事件拦截分发处理有什么好懂的。 现在做需求了,真的是什么需求都有,你作为开发都要去研究实现。比如说,只能点不能滑动的viewpager。其实这都可以不用viewpager了。直接用fragment的repl…

mysql安装设置数据目录下,linux下安装mysql数据+配置

《linux下安装mysql数据配置》由会员分享,可在线阅读,更多相关《linux下安装mysql数据配置(2页珍藏版)》请在人人文库网上搜索。1、Redhat下安装MySQL数据库 说明:安装环境:本地VMWare虚拟机redhat MySQL安装目录:/hom…

力扣——k个一组翻转链表

给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。 示例 : 给定这个链表:1->2->3->4…

拨盘Demo大赛,获奖公布-20170710

2019独角兽企业重金招聘Python工程师标准>>> 为了答谢微信小程序联盟的新老会员,极乐科技支持举办的拨盘大赛终于落幕,本次大赛有662人关注,报名参赛8位,获奖名单如下: ##一、获得1000元现金奖励的参赛者 会…

2018年编程语言排行榜_这是2018年学习的最佳编程语言

2018年编程语言排行榜by Alexander Petkov通过亚历山大佩特科夫(Alexander Petkov) 这是2018年学习的最佳编程语言 (Here are the best programming languages to learn in 2018) This is the definitive guide for anyone wanting to choose the right programming language …

ZJUTACM

描述 这回是浙江工业大学的ACM程序设计竞赛,欢迎你的到来!但是,请稍等!裁判Joe说了,必须正确回答他的问题,才可以看到PIPI的气球MM,KUKU的气球GG.Joe手上有7张卡片,每张卡片上有一个大写字母,分别是Z,J,U,T,A,C,M.现在他开始表演魔术,每次只交换其中的两张卡片.等表…

vscode 不能运行h5c3代码_让开发效率“飞起”的VS Code 插件

前言VSCode,是一个免费的、开源的跨平台编辑器,也是我最满意的编辑器之一。本文向大家推荐一些我喜欢的vscode插件,不出意外的话,这些插件将对你的工作效率提升有不小的帮助!GitLensVS Code中的 Git 体验在易用性和完整性之间取得…

dedecms plus/download.php,dedecms教程:DedeCMS 5.7SP1 /plus/download.php url重定向漏

最近使用scanv网站体检发现有DedeCMS 5.7SP1 /plus/download.php url重定向漏洞(如下图),对比官方网站最新下载包发现该漏洞未进行补丁,但官方自身网站已经补上了,而官方演示站点均未补上。参考了下网上给出的漏洞原因和解决思路如下&#xf…

C language day1

2019独角兽企业重金招聘Python工程师标准>>> http://www.eclipsecolorthemes.org/?viewtheme&id66设置eclispe编辑器主题 http://www.cnblogs.com/csulennon/p/4231405.html 配置黑色主题 Dogs.c 第一段代码片段 /*Name : Dogs.cAuthor : MichaelV…

Xftp远程连接出现“无法显示文件夹”的问题补充

网上有很多朋友出现相同的问题,各位热心网友都给出了自己的解决方案,其中大多数网友给出的解决方案都是:将Xftp更换成“被动连接模式”。但是很不幸的是,本人通过这种方式并没有得到有效的解决,网上的各大方法都尝试&a…

Bootstrap中水平排列的表单form-inline

1 <html>2 <head>3 <title>初识Bootstrap</title>4 <meta charset"utf-8">5 <meta name"viewport" content"widthdevice-width, initial-scale1.0">6 <link rel"stylesheet" href"http:/…

minio 授予永久访问权限_应对 iOS 14 权限管理 应用手把手教你打开“所有照片”权限...

DoNews 11月3日消息(记者 刘文轩)苹果在 iOS 14 中带来全新的隐私管理功能&#xff0c;其中最亮眼的就是相册权限方面&#xff0c;可以为应用程序授予单独授予某张照片的访问权限&#xff0c;无需交出整个相册。作为 iOS 14 主推新功能之一&#xff0c;这项功能也很快得到开发者…

ios pusher使用_使用.NET和Pusher构建实时评论功能

ios pusher使用by Ogundipe Samuel由Ogundipe Samuel 使用.NET和Pusher构建实时评论功能 (Build a real-time commenting feature using .NET and Pusher) Today, we will build a mini-blog engine with live commentary features using .NET and Pusher.今天&#xff0c;我们…

计算机基础,你知道蓝屏的原因吗

2019独角兽企业重金招聘Python工程师标准>>> 电脑蓝屏的现象是经常见到的一件家常便饭了&#xff0c;它是属于突发事件&#xff0c;电脑蓝屏让我们猝手不及&#xff0c;很多时候是很让人心烦。电脑蓝屏首先要找到原因&#xff0c;然后进行维修。那么电脑蓝屏到底是怎…

discuz admin.php无法登录,忘记管理员密码无法登录Discuz后台管理员的解决方法汇总...

Discuz管理员无法登陆后台的情况有多种下面会对这些问题提供一些解决方法&#xff1b;也会有可以登陆前台却无法登陆后台的一系列解决办法&#xff0c;下面是无忧主机小编总结的其中方法&#xff0c;希望对大家有所帮助。1.管理员用户组变为普通用户组了 进入不了后台&#xff…

D进制的A+B

/*题目描述 //注意像二进制的数位比较长&#xff0c;只能用数组来做 输入两个非负10进制整数A和B(<2 30-1)&#xff0c;输出AB的D (1 < D < 10)进制数。 输入描述: 输入在一行中依次给出3个整数A、B和D。 输出描述: 输出AB的D进制数。 输入例子: 123 45…

2个字节能存多少个16进制_Java语言中最大的整数再加1等于多少?看完秒懂

短文涨姿势&#xff0c;看了不白看&#xff0c;不关注等啥&#xff1f;已知Java语言中int类型所能表示的最大整数为2147483647,请问以下代码执行结果是什么&#xff1f;一部分人都会认为这段程序压根就无法通过编译&#xff0c;也有人认为&#xff0c;这段程序能够通过编译&…

摆脱加卡他卡_如何通过三个简单的步骤摆脱“故事卡地狱”。

摆脱加卡他卡Your backlog is full of detailed user stories. Your team is no longer able to manage them, or rank them.您的待办事项列表中包含详细的用户故事。 您的团队不再能够对其进行管理或排名。 You wonder what the product you’re building is all about. The …

套接字结构

套接字编程简介 最近在看《UNIX网络编程卷一》,算是写的读书笔记吧. IPv4套接字地址结构 IPv4套接字地址结构定义在 < netinet/in.h > 头文件中.它以 sockaddr_in 命名.下面是它的结构体: struct in_addr {in_addr_t s_addr; 32位IPv4地址,网络字节序 …