电报Javabot。设置webhook

电报Javabot。设置webhook,java,ssl,telegram-bot,telegram-webhook,Java,Ssl,Telegram Bot,Telegram Webhook,我已经用在Java上创建了电报机器人,现在我无法设置webhook。我知道webhook的这些规则: *支持IPv4,Webhook当前不支持IPv6 *接受来自端口443、80、88或8443上149.154.167.197-233的传入邮局 *能够处理TLS1.0+HTTPS流量 *提供受支持的、非通配符的、经过验证的或自签名的证书 *使用与安装程序中提供的域匹配的CN或SAN *提供所有中间证书以完成验证链 我有一个已验证ssl证书的域名。显示+等级。服务器支持IPv4。443 波特正在听

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

*支持IPv4,Webhook当前不支持IPv6

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

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

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

*使用与安装程序中提供的域匹配的CN或SAN

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

我有一个已验证ssl证书的域名。显示+等级。服务器支持IPv4。443 波特正在听。服务器接受来自端口443上149.154.167.197-233的传入帖子。我使用这个rubenlagusapi方法来创建电报api

private static TelegramBotsApi createNoSelfSignedTelegramBotsApi()抛出TelegramApiException{
返回新的API(
“src/main/resources/server.jks”,//服务器密钥库的路径
“myPassword”,//服务的密钥存储密码
"https://example.com:443“,//外部url
"https://localhost:443“”;//内部url
}

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

  • openssl pkcs12-导出-在mydomain.net.crt中-inkey mydomain.key>keypair.p12
    • keytool-importkeystore-srckeystore keypair.p12-destkeystore server.jks-srcstoretypkcs12
这是我的代码:

   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-X POST-i

我收到这个

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


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

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

您提供的服务器日志看起来像是Nginx,对吗?所以我假设您的Nginx服务器配置为接受对的请求。来自电报的请求由Nginx处理,而不是Grizzly服务器。Nginx使用404应答,因为它在/callback/*路径上没有配置处理程序

您有几个选项可以从发送到example.com的电报中请求转发到Grizzly:

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

    location /callback {
        proxy_pass https://<YOUR_TELEGRAM_BOT_SERVER>:443;
    }
    
    位置/回调{
    代理通过https://:443;
    }
    

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

您的问题不清楚,从您的演示来看,您成功地在您的计算机上启动了服务器。出现了什么问题?错误是什么?我无法帮助您回答这个问题。但它确实存在似乎curl命令中的IP和协议错误。应该是:
curl-X POST-i-khttps://127.0.0.1:443/callback
很难判断问题出在哪里,您应该提供有关您的环境的更多详细信息。最好的选择是提供再现您的问题的最小可行示例。感谢您的回答。问题出现在服务器信息中确实是架构。Nginx服务器没有正确启动。现在问题已经解决。