import asyncio import json import random import websockets SERCIVE_HOST = "aiagents-wechatagents.hf.space" SECURITY_CODE = "" #账号在线成功后 30秒同比消息完毕。使用机器人回复文件传输助手 SecurityCode即可获得9位数字安全码 BotWxid = "wxid_987654321" def gen_req_id(): return random.randint(100000000, 999999999) async def Wsdemo(): uri = "wss://{}/ws/{}/{}".format(SERCIVE_HOST, BotWxid, SECURITY_CODE) tryCount = 0 try: async with websockets.connect(uri) as websocket: while True: message = await websocket.recv() print(f"<{message}\n") # 打印所有Websocket 数据日志 EventJson = json.loads(message) if "CurrentPacket" in EventJson: EventName = EventJson["CurrentPacket"]["Data"]["EventName"] print(f"<{EventName}") if EventName == "ON_EVENT_MSG_NEW": # 收到新消息 NewAddMsg = EventJson["CurrentPacket"]["Data"]["AddMsg"] if NewAddMsg["MsgType"] == 1: # 文字消息 ToWxid = NewAddMsg["FromUserName"] if "复读机" in NewAddMsg["Content"]: # 发送文字 text = NewAddMsg["Content"].replace( "复读机", "") ApiReqData = { # 组装发消息Api JSON结构 "ReqId": gen_req_id(), "BotWxid": BotWxid, "CgiCmd": 522, "CgiRequest": { "ToUserName": ToWxid, "Content": text, "MsgType": 1, "AtUsers": "" } } await websocket.send(json.dumps(ApiReqData)) # {"ReqId": 129068206, "BotWxid": "wxid_987654321", "CgiCmd": 522, "CgiRequest": {"ToUserName": "User_Wxid", "Content": "\u4f60\u597d", "MsgType": 1, "AtUsers": ""}} # {"CgiBaseResponse":{"Ret":0,"ErrMsg":""},"ReqId":129068206,"ResponseData":{"MsgId":1401066385,"MsgTime":1721011906,"NewMsgId":316929186395044355,"NewMsgIdExt":"316929186395044355"}} if "回复表情" in NewAddMsg["Content"]: ApiReqData = { # 组装发表情Api JSON结构 "ReqId": gen_req_id(), "BotWxid": BotWxid, "CgiCmd": 175, "CgiRequest": { "ToUserName": ToWxid, "EmojiMd5": "84fc5109c8878d1452a1cb18bfb152e5", "EmojiLen": 1494007 } } await websocket.send(json.dumps(ApiReqData)) # 发 {"ReqId": 867195149, "BotWxid": "wxid_987654321", "CgiCmd": 175, "CgiRequest": {"ToUserName": "User_Wxid", "EmojiMd5": "84fc5109c8878d1452a1cb18bfb152e5", "EmojiLen": 1494007}} # 收 {"CgiBaseResponse":{"Ret":0,"ErrMsg":""},"ReqId":867195149,"ResponseData":{"MsgId":850335357,"NewMsgId":7998657727555177533}} if "回复语音" in NewAddMsg["Content"]: ApiReqData = { # 组装发语音Api JSON结构 "ReqId": gen_req_id(), "BotWxid": BotWxid, "CgiCmd": 127, "CgiRequest": { "ToUserName": ToWxid, "VoiceUrl": "http:/abc.com/Time/0_00.silk", "VoiceTime": 10 } } await websocket.send(json.dumps(ApiReqData)) # 发 {"ReqId": 736694440, "BotWxid": "wxid_987654321", "CgiCmd": 127, "CgiRequest": {"ToUserName": "User_Wxid", "VoiceUrl": "http:/abc.com/Time/0_00.silk", "VoiceTime": 10}} # 收 {"CgiBaseResponse":{"Ret":0,"ErrMsg":""},"ReqId":736694440,"ResponseData":{"ClientMsgId":"65194700078319353868488431040050","NewMsgId":8086773615615202870}} if "回复图片" in NewAddMsg["Content"]: ApiReqData = { # 组装上传图片Api JSON结构 "ReqId": gen_req_id(), "BotWxid": BotWxid, "CgiCmd": 0, "CgiRequest": { "ToUserName": ToWxid, "FileType": 2, "FileUrl": "https://cdnv2.ruguoapp.com/FqTWQX8g6iOCFQgkw1h9PANosK4ov3.jpg?imageMogr2/auto-orient/heic-exif/1/format/jpeg/thumbnail/!1000x1000r/gravity/Center/crop/!1000x1000a0a0" } } await websocket.send(json.dumps(ApiReqData)) message = await websocket.recv() # 取回上传结果,自行完善同步请求 队列 EventJson = json.loads(message) if "ReqId" in EventJson: # 获得上传图片后的CDN XML信息 ImageXml = EventJson["ResponseData"] ApiReqData = { # 组装发图片Api JSON结构 "ReqId": gen_req_id(), "BotWxid": BotWxid, "CgiCmd": 110, "CgiRequest": { "ToUserName": ToWxid, "ImageXml": ImageXml } } data = json.dumps(ApiReqData) print(len(data)) await websocket.send(data) # 发 {"ReqId": 322053779, "BotWxid": "wxid_987654321", "CgiCmd": 110, "CgiRequest": {"ToUserName": "User_Wxid", "ImageXml": ""}} # 收 {"CgiBaseResponse":{"Ret":0,"ErrMsg":""},"ReqId":322053779,"ResponseData":{"ClientMsgId":"User_Wxid_1721018701_1","NewMsgId":4878810402297176917}} if "拍拍我" in NewAddMsg["Content"]: ApiReqData = { # 组装拍一拍Api JSON结构 "ReqId": gen_req_id(), "BotWxid": BotWxid, "CgiCmd": 849, "CgiRequest": { "ChatUserName": ToWxid, # 群聊时 为群ID "PattedUsername": ToWxid, # 要拍的对象Wxid "Scene": 0 } } await websocket.send(json.dumps(ApiReqData)) # 发 {"ReqId":841984723,"BotWxid":"wxid_987654321","CgiCmd":849,"CgiRequest":{"ChatUserName":"User_Wxid","PattedUsername":"User_Wxid","Scene":0}} # 收 {"CgiBaseResponse":{"ErrMsg":"","Ret":0},"ReqId":841984723,"ResponseData":null} if "文章" in NewAddMsg["Content"]: ApiReqData = { # 组装App消息 Api JSON结构 "ReqId": gen_req_id(), "BotWxid": BotWxid, "CgiCmd": 222, "CgiRequest": { "ToUserName": ToWxid, "AppMsgXml": "“偶像”发来的好友申请能信吗?这是仿冒名人骗局,千万不能信5http://mp.weixin.qq.com/s?__biz=MzA5MzEzNDg3MQ==&mid=2652783452&idx=1&sn=4bc53951663c4d9b0826b1b7e6188705&chksm=8b886a24bcffe332760c889e01535e5084443a95c9b8fad8a87c3948a547b905eef857fda39d&mpshare=1&scene=1&srcid=0715JHaRfI7qSrjVQySJNAv6&sharer_shareinfo=6a897b84f61fa66c7f8aa1912a3d33c3&sharer_shareinfo_first=6a897b84f61fa66c7f8aa1912a3d33c3#rd3057020100044b3049020100020416bb792802032fc67902043699ca2a02046694f260042438633361386631662d393634392d346166382d613535622d3236366338313333663235320204051408030201000405004c55cd00b3da5aedfc0b12c2c5f2f2039d9eff9f113251601601c99c04fb672b357f89de639756fa5e81c99c04fb672b357f89de639756fa5e80wxid_n5kf2grjaxm812_43_1721037408gh_6e99ff560306微信安全中心b3da5aedfc0b12c2c5f2f2039d9eff9f000000000", "MsgType": 49 } } print(json.dumps(ApiReqData)) await websocket.send(json.dumps(ApiReqData)) # 发 {"ReqId": 298214359, "BotWxid": "wxid_987654321", "CgiCmd": 222, "CgiRequest": {"ToUserName": "User_Wxid", "AppMsgXml": "\u201c\u5076\u50cf\u201d\u53d1\u6765\u7684\u597d\u53cb\u7533\u8bf7\u80fd\u4fe1\u5417\uff1f\u8fd9\u662f\u4eff\u5192\u540d\u4eba\u9a97\u5c40\uff0c\u5343\u4e07\u4e0d\u80fd\u4fe15http://mp.weixin.qq.com/s?__biz=MzA5MzEzNDg3MQ==&mid=2652783452&idx=1&sn=4bc53951663c4d9b0826b1b7e6188705&chksm=8b886a24bcffe332760c889e01535e5084443a95c9b8fad8a87c3948a547b905eef857fda39d&mpshare=1&scene=1&srcid=0715JHaRfI7qSrjVQySJNAv6&sharer_shareinfo=6a897b84f61fa66c7f8aa1912a3d33c3&sharer_shareinfo_first=6a897b84f61fa66c7f8aa1912a3d33c3#rd3057020100044b3049020100020416bb792802032fc67902043699ca2a02046694f260042438633361386631662d393634392d346166382d613535622d3236366338313333663235320204051408030201000405004c55cd00b3da5aedfc0b12c2c5f2f2039d9eff9f113251601601c99c04fb672b357f89de639756fa5e81c99c04fb672b357f89de639756fa5e80wxid_n5kf2grjaxm812_43_1721037408gh_6e99ff560306\u5fae\u4fe1\u5b89\u5168\u4e2d\u5fc3b3da5aedfc0b12c2c5f2f2039d9eff9f000000000", "MsgType": 49}} # 收 {"CgiBaseResponse":{"Ret":0,"ErrMsg":""},"ReqId":298214359,"ResponseData":{"ClientMsgId":"User_Wxid_1721039877083","NewMsgId":132486296310976195}} if "获取资料" in NewAddMsg["Content"]: ApiReqData = { # 组装获取资料Api JSON结构 "ReqId": gen_req_id(), "BotWxid": BotWxid, "CgiCmd": 182, "CgiRequest": { "Wxid": [ # 获取一些wxid的 头像昵称 等资料 BotWxid ] } } await websocket.send(json.dumps(ApiReqData)) # 发 {"ReqId": 842917140, "BotWxid": "wxid_987654321", "CgiCmd": 182, "CgiRequest": {"Wxid": ["wxid_123456789"]}} # 收 {"CgiBaseResponse":{"ErrMsg":"","Ret":0},"ReqId":842917140,"ResponseData":[{"MsgType":2,"UserName":"wxid_123456789","NickName":"可米","Signature":"","SmallHeadImgUrl":"https://wx.qlogo.cn/mmhead/ver_1/jjb3EQABmWI92P3icxVWHJqApIm6h5YXalicvAibibdKmGrnFEL6iaeCoiaw4mJg58teNxNgic6k2tSs6LFOMC68EjOzzH12gTAltD8UXacFpTJ58h1llb6NNvj1HXYZ1Dvfcic6xtmP1AemlC7nib2plMePn2Q/0","BigHeadImgUrl":"https://wx.qlogo.cn/mmhead/ver_1/jjb3EQABmWI92P3icxVWHJqApIm6h5YXalicvAibibdKmGrnFEL6iaeCoiaw4mJg58teNxNgic6k2tSs6LFOMC68EjOzzH12gTAltD8UXacFpTJ58h1llb6NNvj1HXYZ1Dvfcic6xtmP1AemlC7nib2plMePn2Q/132","Province":"Washington","City":"Kent","Remark":"","Alias":"","Sex":1,"ContactType":0,"VerifyFlag":1,"LabelLists":"","ChatRoomOwner":"","EncryptUsername":"","ExtInfo":"","ExtInfoExt":"","ChatRoomMember":null,"Ticket":"","ChatroomVersion":0}]} if "获取群成员资料" in NewAddMsg["Content"]: ApiReqData = { # 组装拍一拍Api JSON结构 "ReqId": gen_req_id(), "BotWxid": BotWxid, "CgiCmd": 182, "CgiRequest": { "ChatroomID": "xxx@chatroom", # 群组ID "Wxid": [ # 群成员ID "wxid_123456789" ] } } await websocket.send(json.dumps(ApiReqData)) if "ReqId" in EventJson: # 自行解决同步发送 print(f"<发送消息返回{EventJson}\n") except Exception as e: # 断线重连 tryCount += 1 if tryCount == 10: return t = random.randint(5, 8) print(f"< 超时重连中... {t}", e) await asyncio.sleep(t) await Wsdemo() asyncio.get_event_loop().run_until_complete(Wsdemo())