【问题标题】:Telegram Javabot. Setting webhook电报 Javabot。设置 webhook
【发布时间】:2019-01-05 09:03:06
【问题描述】:

我已经使用rubenlagus api 在 Java 上创建了电报机器人。现在我无法设置 webhook。我知道 webhook 的这些规则:

*支持 IPv4,Webhooks 目前不支持 IPv6。

*在端口 443、80、88 或 8443 上接受来自 149.154.167.197-233 的传入 POST。

*能够处理 TLS1.0+ HTTPS 流量。

*提供受支持的非通配符、已验证或自签名证书。

*使用与您在设置时提供的域匹配的 CN 或 SAN。

*提供所有中间证书以完成验证链。

我有一个带有经过验证的 ssl 证书的域名。Qualys test 显示 A+ 等级。服务器支持 IPv4。 443 端口正在监听。并且服务器在端口 443 上接受来自 149.154.167.197-233 的传入 POST。我使用这个 rubenlagus api 方法来创建 TelegramApi

private static TelegramBotsApi createNoSelfSignedTelegramBotsApi() throws TelegramApiException { return new TelegramBotsApi( "src/main/resources/server.jks",//path to KeyStore for the server "myPassword", //Key store password for the serve "https://example.com:443", //External url "https://localhost:443"); //Internal url }

我已经通过这些命令获得了 server.jks

  • openssl pkcs12 -export -in mydomain.net.crt -inkey mydomain.key > keypair.p12
    • keytool -importkeystore -srckeystore keypair.p12 -destkeystore server.jks -srcstoretype pkcs12

这是我的代码:

   ApiContextInitializer.init();
    TelegramBotsApi botsApi = new TelegramBotsApi(
                           "src/main/resources/server.jks",
                           "mypassword",
                           "https://example.com:443",
                           "https://localhost:443");
   BotHook webhookBot = new BotHook(options);
   botsApi.registerBot(webhookBot);

当我启动程序时,我会收到这个

2018 年 7 月 28 日下午 3:27:59 org.glassfish.grizzly.http.server.NetworkListener 启动

INFO: 绑定到 [localhost:443] 的已启动监听器

2018 年 7 月 28 日下午 3:27:59 org.glassfish.grizzly.http.server.HttpServer 开始

信息:[HttpServer] 已启动。

但机器人不起作用。我在服务器的日志中看到了这一点:

2018/07/29 15:08:43 [错误] 1166#1166: *453 openat() "/var/www/www->root/data/www/example.net/callback/WebhookClass 失败 (2 :没有这样的文件或>目录), 客户端:149.154.167.227,服务器:example.net 请求:“POST >/callback/WebhookClass HTTP/1.1”,主机:“example.net”

Grizzly 似乎无法处理 http 请求。当我试图通过这个 curl 命令检查它时

curl -X POST -i http://217.0.0.1:443/callback

我收到了

curl: (7) 连接217.0.0.1 443端口失败:连接超时

我多次检查了 TelegramBotsApi 构造函数中传递的所有参数。

【问题讨论】:

  • 您的问题不清楚,从您显示的内容来看,您已成功在计算机上启动服务器。出了什么问题?错误是什么?
  • 我无法回答问题。但是 curl 命令中的 IP 和协议似乎是错误的。应该是:curl -X POST -i -k https://127.0.0.1:443/callback
  • 很难判断哪里出了问题,您应该提供有关您的环境的更多详细信息。最佳选择 - 提供重现您的问题的最小可行示例。

标签: java ssl telegram-bot telegram-webhook


【解决方案1】:

似乎是您的基础架构有问题,而不是代码。 TelegramBotsApi 在端口 443 上启动 http Grizzly 服务器,该服务器处理来自 Telegram 的机器人相关请求。 Telegram 将通过其外部 URL https://example.com:443 访问服务器。

您提供的服务器日志看起来像是 Nginx,对吗?所以我假设你的 Nginx 服务器配置为接受https://example.com:443 的请求。来自 Telegram 的请求由 Nginx 处理,而不是由 Grizzly 服务器处理。 Nginx 以 404 回答,因为它没有在 /callback/* 路径上配置处理程序。

您有多种选择可以将 Telegram 的请求发送到 example.com 以转发给 Grizzly:

  • 在运行 nginx 的服务器上运行您的程序。您需要使用另一个端口,例如 8443。设置服务器的防火墙规则以允许 8443 上的传入连接。
  • 配置 nginx 将所有匹配 /callback/* 的 http 请求转发到您的 Grizzly 服务器。在 nginx 配置文件的 server 部分添加以下内容:

    location /callback {
        proxy_pass https://<YOUR_TELEGRAM_BOT_SERVER>:443;
    }
    

其中 YOUR_TELEGRAM_BOT_SERVER 是运行程序的服务器的主机名或 IP。注册 bot api 时,请确保使用与您的 nginx 服务器相同的证书。

【讨论】:

  • 感谢您的回答。问题确实出在服务器基础架构中。 Nginx 服务器没有正常启动。现在问题已经解决了。
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 2017-11-17
  • 2016-08-02
  • 2021-05-28
  • 2017-06-22
  • 1970-01-01
  • 2018-10-17
  • 2021-02-08
相关资源
最近更新 更多