2

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

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

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

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

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

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

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

我有一个带有经过验证的 ssl 证书的域名。Qualys 测试显示 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 开始

信息:已启动侦听器绑定到 [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 构造函数中传递的所有参数。

4

1 回答 1

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 配置文件的服务器部分:

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

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

于 2018-08-02T09:19:57.477 回答