Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用nb-cli创建项目后运行出现错误 #20

Closed
SDchao opened this issue Oct 5, 2020 · 6 comments
Closed

使用nb-cli创建项目后运行出现错误 #20

SDchao opened this issue Oct 5, 2020 · 6 comments

Comments

@SDchao
Copy link
Contributor

SDchao commented Oct 5, 2020

问题描述
根据Nonebotv2的指南,使用nb create创建项目后,运行出错。

先前使用最小实例无任何错误。

复现方法
按照Nonebotv2指南配置脚手架后运行

期望的行为
正常连接ws,载入内置插件

日志信息

10-05 14:23:48 [INFO] nonebot | NoneBot is initializing...
10-05 14:23:48 [INFO] nonebot | Current Env: dev
10-05 14:23:48 [DEBUG] nonebot | Loaded Config: {'driver': 'nonebot.drivers.fastapi', 'host': IPv4Address('127.0.0.1'), 'port': 8080, 'debug': True, 'api_root': {}, 'api_timeout': 30.0, 'access_token': None, 'secret': None, 'superusers': set(), 'nickname': '', 'command_start': {'/'}, 'command_sep': {'.'}, 'session_expire_timeout': datetime.timedelta(seconds=120), 'apscheduler_config': {'apscheduler.timezone': 'Asia/Shanghai'}}
10-05 14:23:48 [DEBUG] nonebot | Succeeded to load adapter "cqhttp"
10-05 14:23:48 [INFO] nonebot | Succeeded to import "nonebot.plugins.base"
10-05 14:23:48 [INFO] nonebot | Running NoneBot...
10-05 14:23:48 [INFO] uvicorn | Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
10-05 14:23:48 [INFO] uvicorn | Started reloader process [10388] using statreload
10-05 14:23:49 [INFO] nonebot | NoneBot is initializing...
10-05 14:23:49 [INFO] nonebot | Current Env: dev
10-05 14:23:49 [DEBUG] nonebot | Loaded Config: {'driver': 'nonebot.drivers.fastapi', 'host': IPv4Address('127.0.0.1'), 'port': 8080, 'debug': True, 'api_root': {}, 'api_timeout': 30.0, 'access_token': None, 'secret': None, 'superusers': set(), 'nickname': '', 'command_start': {'/'}, 'command_sep': {'.'}, 'session_expire_timeout': datetime.timedelta(seconds=120), 'apscheduler_config': {'apscheduler.timezone': 'Asia/Shanghai'}}
10-05 14:23:49 [DEBUG] nonebot | Succeeded to load adapter "cqhttp"
10-05 14:23:49 [INFO] nonebot | Succeeded to import "nonebot.plugins.base"
10-05 14:23:49 [INFO] uvicorn | Started server process [11652]
10-05 14:23:49 [INFO] uvicorn | Waiting for application startup.
10-05 14:23:49 [INFO] nonebot | Scheduler Started
10-05 14:23:49 [INFO] uvicorn | Application startup complete.
Exception in callback H11Protocol.connection_made(<_SelectorSoc...e, bufsize=0>>)
handle: <Handle H11Protocol.connection_made(<_SelectorSoc...e, bufsize=0>>)>
Traceback (most recent call last):
  File "D:\SDK\Python\Python37\lib\asyncio\events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "D:\Projects\python\nonebot-sdchao-v2\venv\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 125, in connection_made
    self.client = get_remote_addr(transport)
  File "D:\Projects\python\nonebot-sdchao-v2\venv\lib\site-packages\uvicorn\protocols\utils.py", line 9, in get_remote_addr
    return (str(info[0]), int(info[1])) if isinstance(info, tuple) else None
ValueError: invalid literal for int() with base 10: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

此ValueError异常将会反复出现

[2020-10-05 14:28:39] [INFO]: 开始尝试连接到反向Websocket Universal服务器: ws://127.0.0.1:8080/cqhttp/ws
[2020-10-05 14:28:39] [WARNING]: 连接到反向Websocket Universal服务器 ws://127.0.0.1:8080/cqhttp/ws 时出现错误: unexpected EOF
[2020-10-05 14:28:42] [INFO]: 开始尝试连接到反向Websocket Universal服务器: ws://127.0.0.1:8080/cqhttp/ws
[2020-10-05 14:28:42] [WARNING]: 连接到反向Websocket Universal服务器 ws://127.0.0.1:8080/cqhttp/ws 时出现错误: unexpected EOF

相关代码

if __name__ == "__main__":
    nonebot.run(app="bot:app")

运行环境

  • 操作系统:Win10 1909
  • OneBot(CQHTTP)实现及版本:go-cqhttp-v0.9.27
  • NoneBot 版本:nonebot2-2.0.0a2
  • aiocqhttp 版本:1.3.0
  • Python 版本:3.7(venv)
@yanyongyu yanyongyu transferred this issue from nonebot/nonebot Oct 5, 2020
@yanyongyu
Copy link
Member

yanyongyu commented Oct 5, 2020

检查一下uvicorn版本是否为最新
这个我在uvicorn有找到类似的问题:encode/uvicorn#600 encode/uvicorn#727 encode/uvicorn#729

报错原因:

# uvicorn.protocols.utils.py
def get_remote_addr(transport):
    socket_info = transport.get_extra_info("socket")
    if socket_info is not None:
        try:
            info = socket_info.getpeername()
            return (str(info[0]), int(info[1])) if isinstance(info, tuple) else None

在该函数中获取远程地址的host和port出现port错误,这个我并不清楚是uvicorn的问题还是go-cqhttp的问题,我这并没法复现这个错误,可以尝试在不同环境下启动go-cqhttp。

如果实在解决不了只能使用uvicorn命令行启动,看看是否还存在错误。

uvicorn bot:app --reload --host 127.0.0.1 --port 8080

@yanyongyu yanyongyu added the help wanted Extra attention is needed label Oct 5, 2020
@SDchao
Copy link
Contributor Author

SDchao commented Oct 5, 2020

直接使用uvicorn命令行启动,出现以下错误:

INFO:     Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
INFO:     Started reloader process 3360 using stat reload
ERROR:    Error loading ASGI app. Could not import module "bot".

@SDchao
Copy link
Contributor Author

SDchao commented Oct 5, 2020

使用命令重置winsock目录后正常,应该是个例了……

netsh winsock reset

@SDchao SDchao closed this as completed Oct 5, 2020
@yanyongyu yanyongyu removed the help wanted Extra attention is needed label Oct 5, 2020
@QIN2DIM
Copy link

QIN2DIM commented Jan 5, 2021

一跤滑倒...我在服务器的虚拟环境裸奔这个项目也出现了这个问题。。

OS:centos-release-7-7.1908.0.el7.centos.x86_64
OneBot(CQHTTP)实现及版本:go-cqhttp-v0.9.37
NoneBot 版本:nonebot2-2.0.0a8.post2
Python 版本:3.9.1(pyenv)

我之后通过Docker打包解决了这个问题(较为复杂),不过在此之前我排列组合调整了一波配置文件竟然神奇地解决了问题...不知道有没有帮助,暂时还没看源码,还不知道底层原理是什么

1. 调整go-cqhttp配置文件

这里的主要修改为反向WS的IP和端口以及注意不同代理之间的端口不要撞车。


/*
    go-cqhttp 默认配置文件
*/

{
    // QQ号
    uin: your_uin
    // QQ密码
    password: "your_password"
    // 是否启用密码加密
    encrypt_password: false
    // 加密后的密码, 如未启用密码加密将为空, 请勿随意修改.
    password_encrypted: ""
    // 是否启用内置数据库
    // 启用将会增加10-20MB的内存占用和一定的磁盘空间
    // 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
    enable_db: true
    // 访问密钥, 强烈推荐在公网的服务器设置
    access_token: ""
    // 重连设置
    relogin: {
        // 是否启用自动重连
        // 如不启用掉线后将不会自动重连
        enabled: true
        // 重连延迟, 单位秒
        relogin_delay: 3
        // 最大重连次数, 0为无限制
        max_relogin_times: 0
    }
    // API限速设置
    // 该设置为全局生效
    // 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
    // 目前该限速设置为令牌桶算法, 请参考: 
    // https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
    _rate_limit: {
        // 是否启用限速
        enabled: false
        // 令牌回复频率, 单位秒
        frequency: 1
        // 令牌桶大小
        bucket_size: 1
    }
    // 是否忽略无效的CQ码
    // 如果为假将原样发送
    ignore_invalid_cqcode: false
    // 是否强制分片发送消息
    // 分片发送将会带来更快的速度
    // 但是兼容性会有些问题
    force_fragmented: false
    // 心跳频率, 单位秒
    // -1 为关闭心跳
    heartbeat_interval: 0
    // HTTP设置
    http_config: {
        // 是否启用正向HTTP服务器
        enabled: true
        // 服务端监听地址
        host: 0.0.0.0
        // 服务端监听端口
        port: 6501
        // 反向HTTP超时时间, 单位秒
        // 最小值为5,小于5将会忽略本项设置
        timeout: 0
        // 反向HTTP POST地址列表
        // 格式: 
        // {
        //    地址: secret
        // }
        post_urls: {}
    }
    // 正向WS设置
    ws_config: {
        // 是否启用正向WS服务器
        enabled: true
        // 正向WS服务器监听地址
        host: 0.0.0.0
        // 正向WS服务器监听端口
        port: 6700
    }
    // 反向WS设置
    ws_reverse_servers: [
        // 可以添加多个反向WS推送
        {
            // 是否启用该推送
            enabled: true
            // 反向WS Universal 地址
            // 注意 设置了此项地址后下面两项将会被忽略
            // 留空请使用 ""
            reverse_url: ws://**服务器外网IP**:**监听端口WS**/cqhttp/ws
            // 反向WS API 地址
            reverse_api_url: ws://you_websocket_api.server
            // 反向WS Event 地址
            reverse_event_url: ws://you_websocket_event.server
            // 重连间隔 单位毫秒
            reverse_reconnect_interval: 3000
        }
    ]
    // 上报数据类型
    // 可选: string array
    post_message_format: array
    // 是否使用服务器下发的新地址进行重连
    // 注意, 此设置可能导致在海外服务器上连接情况更差
    use_sso_address: false
    // 是否启用 DEBUG
    debug: false
    // 日志等级
    log_level: ""
    // WebUi 设置
    web_ui: {
        // 是否启用 WebUi
        enabled: true
        // 监听地址
        host: 127.0.0.1
        // 监听端口
        web_ui_port: 9999
        // 是否接收来自web的输入
        web_input: false
    }
}

2. 配置bot.pyrun()启动方式

这里的主要修改是自定义host以及使port监听端口WS一致,
run(host='0.0.0.0',port=与反向WS端口一致)

@menggus
Copy link

menggus commented Jan 29, 2021

[温索克],...

netsh winsock reset

mee too

@0-8-4
Copy link

0-8-4 commented Mar 23, 2021

一跤滑倒...我在服务器的虚拟环境裸奔这个项目也出现了这个问题。。

OS:centos-release-7-7.1908.0.el7.centos.x86_64
OneBot(CQHTTP)实现及版本:go-cqhttp-v0.9.37
NoneBot 版本:nonebot2-2.0.0a8.post2
Python 版本:3.9.1(pyenv)

我之后通过Docker打包解决了这个问题(较为复杂),不过在此之前我排列组合调整了一波配置文件竟然神奇地解决了问题...不知道有没有帮助,暂时还没看源码,还不知道底层原理是什么

1. 调整go-cqhttp配置文件

这里的主要修改为反向WS的IP和端口以及注意不同代理之间的端口不要撞车。


/*
    go-cqhttp 默认配置文件
*/

{
    // QQ号
    uin: your_uin
    // QQ密码
    password: "your_password"
    // 是否启用密码加密
    encrypt_password: false
    // 加密后的密码, 如未启用密码加密将为空, 请勿随意修改.
    password_encrypted: ""
    // 是否启用内置数据库
    // 启用将会增加10-20MB的内存占用和一定的磁盘空间
    // 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
    enable_db: true
    // 访问密钥, 强烈推荐在公网的服务器设置
    access_token: ""
    // 重连设置
    relogin: {
        // 是否启用自动重连
        // 如不启用掉线后将不会自动重连
        enabled: true
        // 重连延迟, 单位秒
        relogin_delay: 3
        // 最大重连次数, 0为无限制
        max_relogin_times: 0
    }
    // API限速设置
    // 该设置为全局生效
    // 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
    // 目前该限速设置为令牌桶算法, 请参考: 
    // https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
    _rate_limit: {
        // 是否启用限速
        enabled: false
        // 令牌回复频率, 单位秒
        frequency: 1
        // 令牌桶大小
        bucket_size: 1
    }
    // 是否忽略无效的CQ码
    // 如果为假将原样发送
    ignore_invalid_cqcode: false
    // 是否强制分片发送消息
    // 分片发送将会带来更快的速度
    // 但是兼容性会有些问题
    force_fragmented: false
    // 心跳频率, 单位秒
    // -1 为关闭心跳
    heartbeat_interval: 0
    // HTTP设置
    http_config: {
        // 是否启用正向HTTP服务器
        enabled: true
        // 服务端监听地址
        host: 0.0.0.0
        // 服务端监听端口
        port: 6501
        // 反向HTTP超时时间, 单位秒
        // 最小值为5,小于5将会忽略本项设置
        timeout: 0
        // 反向HTTP POST地址列表
        // 格式: 
        // {
        //    地址: secret
        // }
        post_urls: {}
    }
    // 正向WS设置
    ws_config: {
        // 是否启用正向WS服务器
        enabled: true
        // 正向WS服务器监听地址
        host: 0.0.0.0
        // 正向WS服务器监听端口
        port: 6700
    }
    // 反向WS设置
    ws_reverse_servers: [
        // 可以添加多个反向WS推送
        {
            // 是否启用该推送
            enabled: true
            // 反向WS Universal 地址
            // 注意 设置了此项地址后下面两项将会被忽略
            // 留空请使用 ""
            reverse_url: ws://**服务器外网IP**:**监听端口WS**/cqhttp/ws
            // 反向WS API 地址
            reverse_api_url: ws://you_websocket_api.server
            // 反向WS Event 地址
            reverse_event_url: ws://you_websocket_event.server
            // 重连间隔 单位毫秒
            reverse_reconnect_interval: 3000
        }
    ]
    // 上报数据类型
    // 可选: string array
    post_message_format: array
    // 是否使用服务器下发的新地址进行重连
    // 注意, 此设置可能导致在海外服务器上连接情况更差
    use_sso_address: false
    // 是否启用 DEBUG
    debug: false
    // 日志等级
    log_level: ""
    // WebUi 设置
    web_ui: {
        // 是否启用 WebUi
        enabled: true
        // 监听地址
        host: 127.0.0.1
        // 监听端口
        web_ui_port: 9999
        // 是否接收来自web的输入
        web_input: false
    }
}

2. 配置bot.pyrun()启动方式

这里的主要修改是自定义host以及使port监听端口WS一致,
run(host='0.0.0.0',port=与反向WS端口一致)

你好,我也出现了这样的问题,请问一下你是怎么解决的,谢谢

OS:Ubuntu 20.04.1 LTS x86_64
OneBot(CQHTTP)实现及版本:go-cqhttp-v0.9.40-fix4-linux-amd64
NoneBot 版本:nonebot2-2.0.0.a1(poetry add)
Python 版本:3.8.2 和 3.8.5 都试过

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

5 participants