【问题标题】:Telegram Bots: Encoding Plus Character / Plus Sign电报机器人:编码加号/加号
【发布时间】:2023-03-22 08:46:01
【问题描述】:

我正在开发一个电报机器人,它将电话号码发送到我的电报帐户。问题是,“+”被转换为“”空白。所以每个电话号码都是错误的。
例如“+4915733000000”变成“4915733000000”。我尝试使用 HTML 代码 + unicode 版本 \u002B 和 url 编码字符 %2B ,但它们都不起作用。

https://api.telegram.org/botTOKEN/sendMessage?chat_id=MYID&text=Test:\u2031 Unicode:\u002B HTML:+ URL:%2B 

结果:测试:‱ Unicode:HTML:

您知道发送加号的任何可能性吗?

谢谢!

【问题讨论】:

    标签: character-encoding telegram-bot


    【解决方案1】:

    可以使用 POST 方法发送加号。

    这里是示例 Google 应用脚本代码(可以很容易地适应 JavaScript)。

    var options = {
      method : "post",
      payload: {
        method: "sendMessage",
        chat_id: "<chat_id_here>",
        text: "+something",
        parse_mode: "HTML"
      }
    };
    
    var response = UrlFetchApp.fetch("https://api.telegram.org/bot<YOUR_TOKEN>/", options);
    

    加号也可以通过 parse_mode="Markdown" 轻松发送。
    刚刚检查(这次是在 Python 上使用 Telebot 库)这两个选项都有效:

    bot.send_message(CHAT_ID, "Phone number: +1234567890", parse_mode='Markdown')
    bot.send_message(CHAT_ID, "Phone number: +1234567890", parse_mode='HTML')
    

    【讨论】:

    • 不知道为什么这被否决了,这是一个可行的解决方案。编辑了答案并在那里添加了一些信息。
    【解决方案2】:

    我遇到了同样的问题。我使用的是 Java 和 Spring 的 WebClient。使其工作的唯一方法是使用DefaultUriBuilderFactory 构建WebClient 并将编码模式设置为NONE

    DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(url);
    factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
    WebClient webClient = WebClient.builder().uriBuilderFactory(factory).filter(logRequest()).build();
    

    默认为EncodingMode.TEMPLATE_AND_VALUES,因此如果将+ 替换为%2B,则生成的URL 为%252B。将编码模式设置为NONE 不会替换任何特殊字符,因此我必须手动替换它们。

    private String replaceUrlSpecialCharacters(String message) {
        return message.replace("%", "%25").replace("+", "%2B").replace(" ", "%20").replace("|", "%7C").replace(System.lineSeparator(), "%0A");
    }
    

    现在+ 符号显示在我的消息中。

    【讨论】:

      【解决方案3】:

      我正在使用 PHP,这个案例是用 rawurlencode 解决的。下面是代码:

      public function send_message($tg_msg)
      {
          $tg_token = ''; // Bot Token
          $chat_id = ''; // Chat ID
          $url = 'https://api.telegram.org/bot' . $tg_token . '/sendMessage?parse_mode=markdown&chat_id=' . $chat_id;
          $curlopt_url = $url . '&text=' . rawurlencode($tg_msg);
          $ch = curl_init();
          $optArray = array(
              CURLOPT_URL => $curlopt_url,
              CURLOPT_RETURNTRANSFER => true
          );
          curl_setopt_array($ch, $optArray);
          curl_exec($ch);
          curl_close($ch);
      }
      
      $msg = 'The message';
      send_message($msg);
      

      现在我的消息中显示了 + 号。

      【讨论】:

        【解决方案4】:

        如果有人使用 VBA 发送带有 + 的 Telegram 消息,你可以像这样替换你的字符串:

        Dim URL as String
        Dim reURL as String
        
        URL = "https://www.webpage.com/product+name/specifics+number" 'etc....
        reURL = replace(URL, "+, "%2B")
        
        'send message to telegram code here
        

        更多编码信息可以访问:https://www.w3schools.com/tags/ref_urlencode.ASP

        【讨论】:

          【解决方案5】:

          我通过使用这个 php 函数解决了这个问题:

          utf8_encode(text_to_send)
          

          【讨论】:

            猜你喜欢
            • 2018-07-18
            • 2017-08-18
            • 1970-01-01
            • 2016-11-11
            • 2020-12-19
            • 2016-10-22
            • 2020-03-22
            • 2015-11-25
            • 1970-01-01
            相关资源
            最近更新 更多