Telegram bot. Как сделать так чтоб бот отправил текстовую ссылку, при нажатии на которую ее текст отправлялся в чат?
Уточню вопрос так:
- Можно взаимодействовать с ботом командами, когда в сообщении от бота содержится что либо типа
/my_command
, при клике на команду, она отправляется в чат, далее идет обработка этой команды... - Можно добавить клавиатуру под поле ввода сообщений с кнопками, нажатие на которые отправит в чат текст на этих кнопках...
- Можно взаимодействовать кнопками, отображаемыми сразу под сообщениями бота (inline)...
А как взаимодействовать с ботом гиперссылками? Может быть есть какой-то способ чтобы бот выдал в сообщении текстовую ссылку, при нажатие на которую боту отправлялся текст ссылки, или какой-либо другой текст, или команда, или параметр, или еще что-либо, что можно обработать?
Тут важен момент одного клика, как в примере с командами. Есть варианты? Если нет, то может быть есть еще какие-то способы взаимодействия с ботом в моменте одного клика?
UPD:
Если прям сильно подробно, то задача стоит такая. Бот отправляет сообщение со ссылкой. При клике на ссылку сразу же отправляется исходящее сообщение с командой, текстом ссылки, любым другим текстом, например так:
или лучше так:
или еще лучше вот так:
Или в идеале вообще "молча", без отправки исходящего сообщения (по аналогии с inline-кнопками под сообщением) сразу же отправляются какие либо параметры, которые можно забрать из Update.
Ответы (2 шт):
Можно создать текстовую игру используя кнопки. Конфигурация игры пишется в отдельном файле questions.json
файл должен лежать в корневом каталоге, там же где лежит основной файл game.js
код ниже. Так же нужен файл оценки викторины rating.json
.
Файл game.js
const TelegramBot = require('node-telegram-bot-api');
const questions = require('./questions.json');//Загружаем данные из json файла
const rating = require('./rating.json');//Загружаем данные из json файла
const token = "******************************************";//Ваш токен
const bot = new TelegramBot(token, {
polling: true
});
function generateButtons(answers) {
let keyboard = [];
answers = answers.sort(() => Math.random() - 0.5);//Перемешивает массив ответов
answers.forEach((answer, index) => {
keyboard.push([{text: answer}]);
});
return {keyboard};
}
function reply(chatId, text, keyboard) { //Отправляет кнопки с вариантами ответа и вопрос
bot.sendMessage(chatId, text, {
reply_markup: JSON.stringify(keyboard)
});
};
function estimate(chatId, count){//Выбор оценки пройденной викторины
let diapasones = Object.keys(rating);
for (let val of diapasones){
if(count <= Number(val) ){
return reply(chatId, rating[val].text, removeKeyboard);
}
}
reply(chatId, "Очень плохой результат. Вы вышли за диапазон оценок. Начнём заново?", yes_no);
}
function reset(){
control = null;
counter_incorrect_answers = 0;
}
let removeKeyboard = {remove_keyboard: true};
let yes_no = {keyboard:[[{text: 'Да'}],[{text: 'Нет'}]]}
let incorrect = "Не верный ответ. Попробуйте ещё!";
let control = null;
let counter_incorrect_answers = 0;
bot.on('message', function (msg){
let text = msg.text, chatId = msg.from.id;
if (text === "/start") {
reply(chatId, "Поиграем?", yes_no);
}
if (text === "Нет") {
return bot.sendMessage(chatId, "Ok");
}
if (text === "Да") {
control = 'question_1';
reply(chatId, questions[control].question, generateButtons(questions[control].answers));
text = null;
}
if (control && text) {
if (questions[control].end_answer) {//Контроль последнего вопроса, свойство в файле questions.json
estimate(chatId, counter_incorrect_answers);//Оценка викторины
return reset();
}
if (text === questions[control].correct_answer) {
control = questions[control].next_question;
reply(chatId, questions[control].question, generateButtons(questions[control].answers));
} else {
bot.sendMessage(chatId, incorrect);
counter_incorrect_answers++;
}
text = null;
}
});
Файл questions.json
. Свойство end_answer
есть только у последнего вопроса.
{
"question_1": {
"question": "Столица России?",
"correct_answer": "Москва",
"answers": ["Москва", "Питер", "Владивосток", "Казань"],
"next_question": "question_2"
},
"question_2": {
"question": "Столица Франции?",
"correct_answer": "Париж",
"answers": ["Париж", "Марсель", "Лион", "Ницца"],
"next_question": "question_3"
},
"question_3": {
"question": "Столица Египта?",
"correct_answer": "Каир",
"answers": ["Каир", "Хургада", "Луксор", "Асуан"],
"end_answer": true
}
}
Файл rating.json
{
"3": {
"text": "Хороший результат!"
},
"5": {
"text": "Не плохо!"
},
"10": {
"text": "Вам нужно подтянуть знания!"
}
}
Разобравшись в документации, сам отвечу на свой вопрос: В настоящий момент никак. Только 3 способа, перечисленные в теме вопроса.