错误 R10 - Web 进程在启动后 60 秒内未能绑定到 $PORT

Posted

技术标签:

【中文标题】错误 R10 - Web 进程在启动后 60 秒内未能绑定到 $PORT【英文标题】:Error R10 - Web process failed to bind to $PORT within 60 seconds of launch 【发布时间】:2019-04-20 13:50:37 【问题描述】:

我正在用 Python 构建一个 Telegram 机器人,它根据命令获取组织的 Github 存储库的星星并显示它们。

机器人运行并显示欢迎消息,但不响应任何命令,然后崩溃并给出错误,

错误 R10(启动超时)-> Web 进程未能在启动后 60 秒内绑定到 $PORT 2018-11-17T17:13:40.232216+00:00

heroku[web.1]:使用 SIGKILL 停止进程

2018-11-17T17:13:40.309943+00:00 heroku[web.1]:进程退出 状态 137

2018-11-17T17:13:40.370462+00:00 heroku[web.1]: 状态 从开始变成崩溃了

2018-11-17T17:13:41.899621+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=gcijbossbot.herokuapp.com request_id= 4cf3c8f0-940b-4c73-aee7-842b1949e395 fwd="115.97.36.250" dyno= connect= service= status=503 bytes= protocol=https

2018-11-17T17:13:44.029680+00:00 heroku[路由器]: at=error code=H10 desc="应用程序崩溃" 方法=GET path="/favicon.ico" 主机=gcijbossbot.herokuapp.com request_id=94937fe2-56d2-4f4c-bad9-1fe679442db4 fwd="115.97.36.250" dyno=连接=服务=状态=503字节=协议=https

我尝试从

切换 Procfile
web: python Stars.py 

worker: python Stars.py

但是应用程序根本无法运行。

Stars.py 代码:

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
import requests

def start(bot, update):
    update.message.reply_text('Ahoy ! Welcome to JBossStarsBot. \n\nTo get started, use the /stars command to fetch the stars from the GitHub repos of JBoss'.format(update.message.from_user.first_name))


def stars(bot, update):
    api = requests.get('https://api.github.com/orgs/JBossOutreach/repos')
    json = api.json()
    stars = ''
    for i in range(len(json)):
        stars = stars + '\n' + res[i]['name'] + ' : ' + str(res[i]['stargazers_count'])

    update.message.reply_text('Here\'s the list of all the JBoss repositories on GitHub along with their respective star count. \n\n' + stars + '\n\nTo get the stars of a specific repository, enter the name of the repository.')


def repo_stars(bot, update):
    api = requests.get('https://api.github.com/orgs/JBossOutreach')
    json = api.json()
    star = ''
    for i in range(len(json)):
        cur = res[i]['name']
        if cur == update.message.text:
            star = star + cur + ' : ' + str(res[i]['stargazers_count'])
        if cur == '':
            star = 'No such repository found.'

    bot.send_message(update.message.chat_id, star)

def main():
    updater = Updater(token)

    dp = updater.dispatcher
    dp.add_handler(CommandHandler('start', start))
    dp.add_handler(CommandHandler('stars', stars))
    dp.add_handler(MessageHandler(Filters.text, repo_stars))

    updater.start_polling()
    updater.idle()


if __name__ == '__main__':
    main()

我没有使用过 Django 或 Flask。只需 python-telegram-bot 和请求。

【问题讨论】:

您的应用提供网络服务吗?它是否侦听 HTTP 请求并以 HTTP 响应进行响应?这就是 Heroku 的用途。如果您的代码不这样做,那就不合适了。 是的。这是一个电报机器人。 好的,那么Stars.py 中有什么内容?你如何设置你的服务器来监听?我们无法帮助我们看不到的代码。 这里是代码:github.com/arihantbansal/JBossTelegramStarsBot 关于 Stack Overflow 的问题必须是独立的。我们不会去异地挖掘您的存储库来查找问题。请以minimal reproducible example 的形式发布相关部分此处 【参考方案1】:

我不熟悉 Telegram,但看起来您实际上并没有运行 HTTP 服务器。相反,您的代码是 periodically polling for updates:

更新程序可以作为轮询服务启动,或者在生产环境中使用 webhook 来接收更新。

在 Heroku 上,您需要运行一个实际的 HTTP 服务器,绑定到由 PORT 环境变量提供的端口。看起来start_webhook 可以做到这一点,例如像

import os

def main():
    # ...
    port = os.getenv('PORT', default=8000)
    updater.start_webhook(port=port)

【讨论】:

以上是关于错误 R10 - Web 进程在启动后 60 秒内未能绑定到 $PORT的主要内容,如果未能解决你的问题,请参考以下文章

在 python 上获取“错误 R10(启动超时)-> Web 进程未能在启动后 60 秒内绑定到 $PORT”

错误 R10(启动超时)-> Web 进程未能在启动后 60 秒内绑定到 $PORT - HEROKU ERROR

Heroku discord bot 托管错误 R10(启动超时)-> Web 进程在启动后 60 秒内无法绑定到 $PORT

Heroku Node.js 错误 R10(启动超时)-> Web 进程在启动后 60 秒内无法绑定到 $PORT

Heroku 错误:Web 进程在启动后 60 秒内无法绑定到 $PORT(使用 axios)

Java Maven 项目 - 错误 R10(启动超时)-> Web 进程未能在启动后 90 秒内绑定到 $PORT