电报Javabot。设置网络挂钩

时间:2018-07-28 12:38:12

标签: java ssl telegram-bot telegram-webhook

我已经用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-导出-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]已启动。

但是bot无法正常工作。我在服务器日志中看到了这一点:

  

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

我收到了

  

卷曲:(7)无法连接到217.0.0.1端口443:连接超时

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

1 个答案:

答案 0 :(得分:0)

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

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

您有多种选择,可以将电报发送到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服务器相同的证书。