Telegram bot. Как сделать так чтоб бот отправил текстовую ссылку, при нажатии на которую ее текст отправлялся в чат?

Уточню вопрос так:

  1. Можно взаимодействовать с ботом командами, когда в сообщении от бота содержится что либо типа /my_command, при клике на команду, она отправляется в чат, далее идет обработка этой команды...
  2. Можно добавить клавиатуру под поле ввода сообщений с кнопками, нажатие на которые отправит в чат текст на этих кнопках...
  3. Можно взаимодействовать кнопками, отображаемыми сразу под сообщениями бота (inline)...

А как взаимодействовать с ботом гиперссылками? Может быть есть какой-то способ чтобы бот выдал в сообщении текстовую ссылку, при нажатие на которую боту отправлялся текст ссылки, или какой-либо другой текст, или команда, или параметр, или еще что-либо, что можно обработать?

Тут важен момент одного клика, как в примере с командами. Есть варианты? Если нет, то может быть есть еще какие-то способы взаимодействия с ботом в моменте одного клика?

UPD:

Если прям сильно подробно, то задача стоит такая. Бот отправляет сообщение со ссылкой. При клике на ссылку сразу же отправляется исходящее сообщение с командой, текстом ссылки, любым другим текстом, например так:

введите сюда описание изображения

или лучше так:

введите сюда описание изображения

или еще лучше вот так:

введите сюда описание изображения

Или в идеале вообще "молча", без отправки исходящего сообщения (по аналогии с inline-кнопками под сообщением) сразу же отправляются какие либо параметры, которые можно забрать из Update.


Ответы (2 шт):

Автор решения: Rudi

Можно создать текстовую игру используя кнопки. Конфигурация игры пишется в отдельном файле 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 способа, перечисленные в теме вопроса.

→ Ссылка