我已经用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构造函数中传递的所有参数很多次。
答案 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将所有与/ callback / *匹配的http请求转发到您的Grizzly服务器。将以下内容添加到Nginx配置文件的服务器部分:
location /callback {
proxy_pass https://<YOUR_TELEGRAM_BOT_SERVER>:443;
}
其中YOUR_TELEGRAM_BOT_SERVER是运行程序的服务器的主机名或IP。注册bot api时,请确保使用与您的nginx服务器相同的证书。