Ad Widget

Collapse

Sending a notification to a topic in a telegram group

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Epigraphe
    Junior Member
    • Jul 2023
    • 2

    #1

    Sending a notification to a topic in a telegram group

    Good day.
    How to fix the script so that the telegram is sent not only to the group, but to the topic in this group?
    In fact, topics are responses to a message, so I need to add “reply_to_message_id” to the script so that the final URL looks like

    Code:
    [URL]https://api.telegram.org/botToken/sendMessage?chat_id=-100xxxxx&reply_to_message_id=xxx&parse_mode=Markdown&text=[/URL]«Text»​
    Unfortunately, I don't understand Java so I can't do it myself.

    Can you please tell me how to add it?

    Script from the well-known media_telegram.yaml

    Thank you​

    Code:
     script: |
    var Telegram = {
    token: null,
    to: null,
    message: null,
    proxy: null,
    parse_mode: null,
    
    escapeMarkup: function (str, mode) {
    switch (mode) {
    case 'markdown':
    return str.replace(/([_*\[`])/g, '\\$&');
    
    case 'markdownv2':
    return str.replace(/([_*\[\]()~`>#+\-=|{}.!])/g, '\\$&');
    
    default:
    return str;
    }
    },
    
    sendMessage: function () {
    var params = {
    chat_id: Telegram.to,
    text: Telegram.message,
    disable_web_page_preview: true,
    disable_notification: false
    },
    data,
    response,
    request = new HttpRequest(),
    url = 'https://api.telegram.org/bot' + Telegram.token + '/sendMessage';
    
    if (Telegram.parse_mode !== null) {
    params['parse_mode'] = Telegram.parse_mode;
    }
    
    if (Telegram.proxy) {
    request.setProxy(Telegram.proxy);
    }
    
    request.addHeader('Content-Type: application/json');
    data = JSON.stringify(params);
    
    // Remove replace() function if you want to see the exposed token in the log file.
    Zabbix.log(4, '[Telegram Webhook] URL: ' + url.replace(Telegram.token, '<TOKEN>'));
    Zabbix.log(4, '[Telegram Webhook] params: ' + data);
    response = request.post(url, data);
    Zabbix.log(4, '[Telegram Webhook] HTTP code: ' + request.getStatus());
    
    try {
    response = JSON.parse(response);
    }
    catch (error) {
    response = null;
    }
    
    if (request.getStatus() !== 200 || typeof response.ok !== 'boolean' || response.ok !== true) {
    if (typeof response.description === 'string') {
    throw response.description;
    }
    else {
    throw 'Unknown error. Check debug log for more information.';
    }
    }
    }
    };
    
    try {
    var params = JSON.parse(value);
    
    if (typeof params.Token === 'undefined') {
    throw 'Incorrect value is given for parameter "Token": parameter is missing';
    }
    
    Telegram.token = params.Token;
    
    if (params.HTTPProxy) {
    Telegram.proxy = params.HTTPProxy;
    }
    
    params.ParseMode = params.ParseMode.toLowerCase();
    
    if (['markdown', 'html', 'markdownv2'].indexOf(params.ParseMode) !== -1) {
    Telegram.parse_mode = params.ParseMode;
    }
    
    Telegram.to = params.To;
    Telegram.message = params.Subject + '\n' + params.Message;
    
    if (['markdown', 'markdownv2'].indexOf(params.ParseMode) !== -1) {
    Telegram.message = Telegram.escapeMarkup(Telegram.message, params.ParseMode);
    }
    
    Telegram.sendMessage();
    
    return 'OK';
    }
    catch (error) {
    Zabbix.log(4, '[Telegram Webhook] notification failed: ' + error);
    throw 'Sending failed: ' + error + '.';
    }
    timeout: 10s​
  • Epigraphe
    Junior Member
    • Jul 2023
    • 2

    #2
    We need to add just one line:
    Code:
    reply_to_message_id: XXX,
    As a result, it will look like this:

    Code:
    sendMessage: function () {
    var params = {
    chat_id: Telegram.to,
    reply_to_message_id: XXX,
    text: Telegram.message,
    disable_web_page_preview: true,
    disable_notification: false
    Last edited by Epigraphe; 11-07-2023, 07:58.

    Comment

    • kenanilgun
      Junior Member
      • Feb 2024
      • 1

      #3
      Originally posted by Epigraphe
      Good day.
      How to fix the script so that the telegram is sent not only to the group, but to the topic in this group?
      In fact, topics are responses to a message, so I need to add “reply_to_message_id” to the script so that the final URL looks like

      Code:
      [URL]https://api.telegram.org/botToken/sendMessage?chat_id=-100xxxxx&reply_to_message_id=xxx&parse_mode=Markdown&text=[/URL]«Text»​
      Unfortunately, I don't understand Java so I can't do it myself.

      Can you please tell me how to add it?

      Script from the well-known media_telegram.yaml

      Thank you​

      Code:
       script: |
      var Telegram = {
      token: null,
      to: null,
      message: null,
      proxy: null,
      parse_mode: null,
      
      escapeMarkup: function (str, mode) {
      switch (mode) {
      case 'markdown':
      return str.replace(/([_*\[`])/g, '\\$&');
      
      case 'markdownv2':
      return str.replace(/([_*\[\]()~`>#+\-=|{}.!])/g, '\\$&');
      
      default:
      return str;
      }
      },
      
      sendMessage: function () {
      var params = {
      chat_id: Telegram.to,
      text: Telegram.message,
      disable_web_page_preview: true,
      disable_notification: false
      },
      data,
      response,
      request = new HttpRequest(),
      url = 'https://api.telegram.org/bot' + Telegram.token + '/sendMessage';
      
      if (Telegram.parse_mode !== null) {
      params['parse_mode'] = Telegram.parse_mode;
      }
      
      if (Telegram.proxy) {
      request.setProxy(Telegram.proxy);
      }
      
      request.addHeader('Content-Type: application/json');
      data = JSON.stringify(params);
      
      // Remove replace() function if you want to see the exposed token in the log file.
      Zabbix.log(4, '[Telegram Webhook] URL: ' + url.replace(Telegram.token, '<TOKEN>'));
      Zabbix.log(4, '[Telegram Webhook] params: ' + data);
      response = request.post(url, data);
      Zabbix.log(4, '[Telegram Webhook] HTTP code: ' + request.getStatus());
      
      try {
      response = JSON.parse(response);
      }
      catch (error) {
      response = null;
      }
      
      if (request.getStatus() !== 200 || typeof response.ok !== 'boolean' || response.ok !== true) {
      if (typeof response.description === 'string') {
      throw response.description;
      }
      else {
      throw 'Unknown error. Check debug log for more information.';
      }
      }
      }
      };
      
      try {
      var params = JSON.parse(value);
      
      if (typeof params.Token === 'undefined') {
      throw 'Incorrect value is given for parameter "Token": parameter is missing';
      }
      
      Telegram.token = params.Token;
      
      if (params.HTTPProxy) {
      Telegram.proxy = params.HTTPProxy;
      }
      
      params.ParseMode = params.ParseMode.toLowerCase();
      
      if (['markdown', 'html', 'markdownv2'].indexOf(params.ParseMode) !== -1) {
      Telegram.parse_mode = params.ParseMode;
      }
      
      Telegram.to = params.To;
      Telegram.message = params.Subject + '\n' + params.Message;
      
      if (['markdown', 'markdownv2'].indexOf(params.ParseMode) !== -1) {
      Telegram.message = Telegram.escapeMarkup(Telegram.message, params.ParseMode);
      }
      
      Telegram.sendMessage();
      
      return 'OK';
      }
      catch (error) {
      Zabbix.log(4, '[Telegram Webhook] notification failed: ' + error);
      throw 'Sending failed: ' + error + '.';
      }
      timeout: 10s​
      Hello, you can use below code on script, It's working and tested.

      Code:
      var Telegram = {
          token: null,
          to: null,
          message: null,
          proxy: null,
          threadId: null,
          parse_mode: null,
      
          escapeMarkup: function (str, mode) {
              switch (mode) {
                  case 'markdown':
                      return str.replace(/([_*\[`])/g, '\\$&');
      
                  case 'markdownv2':
                      return str.replace(/([_*\[\]()~`>#+\-=|{}.!])/g, '\\$&');
      
                  default:
                      return str;
              }
          },
      
          sendMessage: function () {
              var params = {
                  chat_id: Telegram.to,
                  text: Telegram.message,
                  disable_web_page_preview: true,
                  disable_notification: false,
                  message_thread_id: Telegram.threadId
              },
              data,
              response,
              request = new HttpRequest(),
              url = 'https://api.telegram.org/bot' + Telegram.token + '/sendMessage';
      
              if (Telegram.parse_mode !== null) {
                  params['parse_mode'] = Telegram.parse_mode;
              }
      
              if (Telegram.proxy) {
                  request.setProxy(Telegram.proxy);
              }
      
              request.addHeader('Content-Type: application/json');
              data = JSON.stringify(params);
      
              // Remove replace() function if you want to see the exposed token in the log file.
              Zabbix.log(4, '[Telegram Webhook] URL: ' + url.replace(Telegram.token, '<TOKEN>'));
              Zabbix.log(4, '[Telegram Webhook] params: ' + data);
              response = request.post(url, data);
              Zabbix.log(4, '[Telegram Webhook] HTTP code: ' + request.getStatus());
      
              try {
                  response = JSON.parse(response);
              }
              catch (error) {
                  response = null;
              }
      
              if (request.getStatus() !== 200 || typeof response.ok !== 'boolean' || response.ok !== true) {
                  if (typeof response.description === 'string') {
                      throw response.description;
                  }
                  else {
                      throw 'Unknown error. Check debug log for more information.';
                  }
              }
          }
      };
      
      try {
          var params = JSON.parse(value);
      
          if (typeof params.Token === 'undefined') {
              throw 'Incorrect value is given for parameter "Token": parameter is missing';
          }
      
          if (params.HTTPProxy) {
              Telegram.proxy = params.HTTPProxy;
          }
      
          params.ParseMode = params.ParseMode.toLowerCase();
          
          if (['markdown', 'html', 'markdownv2'].indexOf(params.ParseMode) !== -1) {
              Telegram.parse_mode = params.ParseMode;
          }
      
          Telegram.token = params.Token;
          if (typeof params.ThreadId !== 'undefined') {
              Telegram.threadId = params.ThreadId;
          }
          Telegram.to = params.To;
          Telegram.message = params.Subject + '\n' + params.Message;
      
          if (['markdown', 'markdownv2'].indexOf(params.ParseMode) !== -1) {
              Telegram.message = Telegram.escapeMarkup(Telegram.message, params.ParseMode);
          }
      
          Telegram.sendMessage();
      
          return 'OK';
      }
      catch (error) {
          Zabbix.log(4, '[Telegram Webhook] notification failed: ' + error);
          throw 'Sending failed: ' + error + '.';
      }​

      Comment


      • cgood
        cgood commented
        Editing a comment
        Спасибо, работает. Для ситуации, когда надо отправлять в разные чаты и, соответственно, топики - пока нашел решение в прописывании message_thread_id в Inventory URL A (например) и задании параметра в media type Telegram ThreadId: {INVENTORY.URL.A}. Как сделать это в поле Send To: чтобы скрипт парсил и id и message_thread_id - не разобрался
    Working...