Closed NagaseYami closed 3 years ago
先推荐一波 koishijs/koishi ;
当反向连接成功之后,不需要正向WS连接。
请尝试通过HTTP POST提交send_private_msg事件(?
@undefined-moe
先推荐一波 koishijs/koishi
感谢推荐,已Star。 不过我主要还是想在周末自学一些python和golang,所以还是想把当前的问题搞懂
当反向连接成功之后,不需要正向WS连接。 请尝试通过HTTP POST提交send_private_msg事件(?
抱歉,没能理解,意思是反向WS之后没法从已经建立的连接提交api事件吗?
理论上是可以(我没试过),只是测试一下问题出在哪
我先尝试用golang写一个等价的ws服务器试一试吧
好吧,问题解决了,我仔细参考了websocket.go的代码,发现handshake是把string转换成了bytes发送的
https://github.com/Mrs4s/go-cqhttp/blob/a52ae1c828f6c1f1506c8ed2a00d2faa87b3eb31/server/websocket.go#L290
所以python那边的正确写法是
server.send_message(client, bytes(json.dumps(dic).encode('utf-8')))
为什么我之前send了一堆奇怪的东西都没有任何地方报错的。。。
!/usr/bin/env python
-- coding: utf-8 --
from websocket_server import WebsocketServer import json
class CqServer(object): def init(self): self.server = WebsocketServer(port=8765, host="localhost")
self.server.set_fn_new_client(self.new_client) self.server.set_fn_client_left(self.client_left) self.server.set_fn_message_received(self.message_received) self.server.run_forever() def new_client(self, client, server): print( "New Client Join.\nIP : {}\nID : {}\n".format(client["address"], client["id"]) ) def client_left(self, client, server): print("Client Leave.\nIP : {}\nID : {}\n".format(client["address"], client["id"])) def message_received(self, client, server, message): print(message) dic = { "action": "send_private_msg", "params": {"user_id": <我的QQ号>, "message": "Hello World!"}, } server.send_message(client, json.dumps(dic).encode("utf-8"))
python反向websocket怎么写的?可以分享一下吗?
!/usr/bin/env python
-- coding: utf-8 --
from websocket_server import WebsocketServer import json class CqServer(object): def init(self): self.server = WebsocketServer(port=8765, host="localhost")
self.server.set_fn_new_client(self.new_client) self.server.set_fn_client_left(self.client_left) self.server.set_fn_message_received(self.message_received) self.server.run_forever() def new_client(self, client, server): print( "New Client Join.\nIP : {}\nID : {}\n".format(client["address"], client["id"]) ) def client_left(self, client, server): print("Client Leave.\nIP : {}\nID : {}\n".format(client["address"], client["id"])) def message_received(self, client, server, message): print(message) dic = { "action": "send_private_msg", "params": {"user_id": <我的QQ号>, "message": "Hello World!"}, } server.send_message(client, json.dumps(dic).encode("utf-8"))
python反向websocket怎么写的?可以分享一下吗?
去参考nonebot,你来错地方了
!/usr/bin/env python
-- coding: utf-8 --
from websocket_server import WebsocketServer import json class CqServer(object): def init(self): self.server = WebsocketServer(port=8765, host="localhost")
self.server.set_fn_new_client(self.new_client) self.server.set_fn_client_left(self.client_left) self.server.set_fn_message_received(self.message_received) self.server.run_forever() def new_client(self, client, server): print( "New Client Join.\nIP : {}\nID : {}\n".format(client["address"], client["id"]) ) def client_left(self, client, server): print("Client Leave.\nIP : {}\nID : {}\n".format(client["address"], client["id"])) def message_received(self, client, server, message): print(message) dic = { "action": "send_private_msg", "params": {"user_id": <我的QQ号>, "message": "Hello World!"}, } server.send_message(client, json.dumps(dic).encode("utf-8"))
python反向websocket怎么写的?可以分享一下吗?
去参考nonebot,你来错地方了
nonebot并没有得到答案。
!/usr/bin/env python
-- coding: utf-8 --
from websocket_server import WebsocketServer import json class CqServer(object): def init(self): self.server = WebsocketServer(port=8765, host="localhost")
self.server.set_fn_new_client(self.new_client) self.server.set_fn_client_left(self.client_left) self.server.set_fn_message_received(self.message_received) self.server.run_forever() def new_client(self, client, server): print( "New Client Join.\nIP : {}\nID : {}\n".format(client["address"], client["id"]) ) def client_left(self, client, server): print("Client Leave.\nIP : {}\nID : {}\n".format(client["address"], client["id"])) def message_received(self, client, server, message): print(message) dic = { "action": "send_private_msg", "params": {"user_id": <我的QQ号>, "message": "Hello World!"}, } server.send_message(client, json.dumps(dic).encode("utf-8"))
python反向websocket怎么写的?可以分享一下吗?
去参考nonebot,你来错地方了
nonebot并没有得到答案。
我的意思是让你去看nonebot源码
!/usr/bin/env python
-- coding: utf-8 --
from websocket_server import WebsocketServer import json class CqServer(object): def init(self): self.server = WebsocketServer(port=8765, host="localhost")
self.server.set_fn_new_client(self.new_client) self.server.set_fn_client_left(self.client_left) self.server.set_fn_message_received(self.message_received) self.server.run_forever() def new_client(self, client, server): print( "New Client Join.\nIP : {}\nID : {}\n".format(client["address"], client["id"]) ) def client_left(self, client, server): print("Client Leave.\nIP : {}\nID : {}\n".format(client["address"], client["id"])) def message_received(self, client, server, message): print(message) dic = { "action": "send_private_msg", "params": {"user_id": <我的QQ号>, "message": "Hello World!"}, } server.send_message(client, json.dumps(dic).encode("utf-8"))
python反向websocket怎么写的?可以分享一下吗?
去参考nonebot,你来错地方了
nonebot并没有得到答案。
我的意思是让你去看nonebot源码
好的,谢谢啦。nonebot+cqhttp这样是可以吗?
我好像用不了这个库啊,用的时候获取不到完整信息
说明
大佬好,我是程序方面的小白。特别是对网络这块的知识非常缺乏。 目前在尝试实现反向WS的时候遇到了一些问题,在此提问,如果可以的话,劳烦您回答。 ※第一次接触python和websocket,一边查找资料一边写的,还请多多包涵 ※如果在Issues里不允许咨询此类问题或有冒犯到您,请关闭此Issue
go-cqhttp的配置文件
除了QQ号,密码,和反向WS的服务器设置以外都是维持默认的。
WS服务器的实现
第一次写python,也许很丑,请见谅
一个很基础的ws服务器,在任何ws客户端连接,断开,以及收到任何客户端的消息时会打印一些信息。 以及在收到任意消息之后,往我自己的QQ发一个
Hello World!
遇到的问题
在go-cqhttp连接到ws服务器,以及发送heartbeat的时候,ws服务器都打印出了正确的内容
问题是
server.send_message(client, json.dumps(dic).encode("utf-8"))
这一行仿佛没有起作用一般,go-cqhttp那边一点反应都没有。 我后来尝试将go-cqhttp的repo直接clone下来debug, 然后发现websocket.go的listenApi在我每次send_message后并无任何反应。 https://github.com/Mrs4s/go-cqhttp/blob/a52ae1c828f6c1f1506c8ed2a00d2faa87b3eb31/server/websocket.go#L171-L189一些其他的疑问
我有查看onebot上的关于反向WS的说明,但是没能理解的是,
这难道意味着,当反向连接成功之后,我需要再正向WS连接go-cqhttp的ws服务器吗?