Telegram Bot на NodeJS
Пишу вот бота для Node JS, и пытаюсь написать собственную библиотеку для Telegram
const request = require("../../module/request/request.js");
class TelegramAPI {
constructor(token) {
this.token = token;
this.lastUpdateId = undefined;
}
buildURL(method) {
let url = `api.telegram.org/bot${this.token}/${method}`;
return url;
}
getMe() {
}
getUpdate() {
let data = {
hostname: this.buildURL("getUpdates"),
body: {
offset: this.lastUpdateId
},
method: 'POST'
}
return request(data);
}
on(type, callBack) {
this.getUpdate().then(value => {
value = value.result;
if (value[0]) {
this.lastUpdateId = ++value[value.length - 1].update_id;
}
for (let i = 0; i < value.length; i++) {
if (!value[i].edited_message && value[i].message.text && type === "message") {
callBack(value[i].message);
} else if (value[i].edited_message && type === "editMessage") {
callBack(value[i].edited_message);
} else if (!value[i].edited_message && value[i].message.poll && type === "poll") {
callBack(value[i].message);
}
}
setTimeout(() => { this.on(type, callBack) }, 1000);
})
}
sendMessage(id, text, settings = { "pagePreview": false, "disNotification": false, "replyMessageId": null }) {
let url = this.buildURL("sendMessage");
let data = {
hostname: url,
method: 'POST',
body: {
"chat_id": id,
"text": text,
"disable_web_page_preview": settings.pagePreview || false,
"disable_notification": settings.disNotification || false,
"reply_to_message_id": settings.replyMessageId,
"reply_markup": settings.reply_markup
}
}
request(data).catch(err => {
console.log(err);
});
}
}
module.exports = TelegramAPI;
Использую свой request :
const https = require('https');
let options = {
hostname: undefined,
path: undefined,
method: undefined,
headers: {
"Content-Type": 'application/json',
"Content-Length": undefined,
}
};
let request = function(data) {
let reg = /[\w.]+\/[\w.]/;
let body = JSON.stringify(data.body);
if (reg.test(data.hostname)) {
options.path = data.hostname.replace(/[\w.]+/, "");
options.hostname = data.hostname.replace(/\/.+/, "");
}
if (data.method === "POST") {
options.method = "POST";
options.headers["Content-Length"] = body.length;
return new Promise((resolve, reject) => {
const req = https.request(options, (res) => {
console.log(`Status code: ${res.statusCode}`);
res.on("data", value => {
resolve(JSON.parse(value.toString()));
})
});
req.on('error', (error) => {
reject(error)
});
req.write(body);
req.end();
})
}
}
module.exports = request;
И вот в чем вопрос... Я не могу создать кнопки в чате используя код ниже. Помогите мне создать кнопки. Каким должен быть запрос?
let tg = new tgApi(id);
tg.on("message", (value) => {
let id = value.chat.id;
if (value.text === "/start") {
tg.sendMessage(id, "бла", {
reply_markup: JSON.stringify({
inline_keyboard: [{ text: "size", callback_data: "2" }]
}),
})
}
});
Ответы (1 шт):
Автор решения: nörbörnën
→ Ссылка
У вас не правильный формат данных в inline_keyboard
В любой непонятной ситуации нас выручает чтение документации
Field
inline_keyboard
Type
Array of Array of InlineKeyboardButton
Description
Array of button rows, each represented by an Array of InlineKeyboardButton objects
Тут написано, что inline_keyboard - это массив рядов кнопок, где каждый ряд представляет собой массив кнопок, т.е. правильный код должен выглядеть так:
inline_keyboard: [
// Ряд 1
[
// Ряд 1 Кнопка 1
{ text: "size", callback_data: "2" }
]
]