Spaces:
Running
Running
File size: 16,360 Bytes
d861292 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
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": "<msg><img aeskey=\"cd8ccfc701d1bb8d41d2dafc1809aaa8\" encryver=\"1\" cdnthumbaeskey=\"cd8ccfc701d1bb8d41d2dafc1809aaa8\" cdnthumburl=\"3057020100044b304902010002040c2ac9e502032f5081020415eff98c02046694a573042432316339303161312d376666302d343539332d623830622d3639346336646466623530610204051418020201000405004c54a100\" cdnthumblength=\"21104\" cdnthumbheight=\"200\" cdnthumbwidth=\"200\" cdnmidheight=\"0\" cdnmidwidth=\"0\" cdnhdheight=\"0\" cdnhdwidth=\"0\" cdnmidimgurl=\"3057020100044b304902010002040c2ac9e502032f5081020415eff98c02046694a573042432316339303161312d376666302d343539332d623830622d3639346336646466623530610204051418020201000405004c54a100\" length=\"85326\" md5=\"cd8ccfc701d1bb8d41d2dafc1809aaa8\" /></msg>"}}
# 收 {"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": "<appmsg appid=\"\" sdkver=\"0\"><title>“偶像”发来的好友申请能信吗?</title><des>这是仿冒名人骗局,千万不能信</des><type>5</type><url>http://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#rd</url><appattach><cdnthumburl>3057020100044b3049020100020416bb792802032fc67902043699ca2a02046694f260042438633361386631662d393634392d346166382d613535622d3236366338313333663235320204051408030201000405004c55cd00</cdnthumburl><cdnthumbmd5>b3da5aedfc0b12c2c5f2f2039d9eff9f</cdnthumbmd5><cdnthumblength>11325</cdnthumblength><cdnthumbwidth>160</cdnthumbwidth><cdnthumbheight>160</cdnthumbheight><cdnthumbaeskey>1c99c04fb672b357f89de639756fa5e8</cdnthumbaeskey><aeskey>1c99c04fb672b357f89de639756fa5e8</aeskey><encryver>0</encryver><filekey>wxid_n5kf2grjaxm812_43_1721037408</filekey></appattach><sourceusername>gh_6e99ff560306</sourceusername><sourcedisplayname>微信安全中心</sourcedisplayname><md5>b3da5aedfc0b12c2c5f2f2039d9eff9f</md5><webviewshared><jsAppId><![CDATA[]]></jsAppId><publisherReqId><![CDATA[3050482407]]></publisherReqId></webviewshared><mpsharetrace><hasfinderelement>0</hasfinderelement></mpsharetrace><mmreadershare><itemshowtype>0</itemshowtype><nativepage>0</nativepage><pubtime>0</pubtime><duration>0</duration><width>0</width><height>0</height><vid /><funcflag>0</funcflag><ispaysubscribe>0</ispaysubscribe></mmreadershare></appmsg>",
"MsgType": 49
}
}
print(json.dumps(ApiReqData))
await websocket.send(json.dumps(ApiReqData))
# 发 {"ReqId": 298214359, "BotWxid": "wxid_987654321", "CgiCmd": 222, "CgiRequest": {"ToUserName": "User_Wxid", "AppMsgXml": "<appmsg appid=\"\" sdkver=\"0\"><title>\u201c\u5076\u50cf\u201d\u53d1\u6765\u7684\u597d\u53cb\u7533\u8bf7\u80fd\u4fe1\u5417\uff1f</title><des>\u8fd9\u662f\u4eff\u5192\u540d\u4eba\u9a97\u5c40\uff0c\u5343\u4e07\u4e0d\u80fd\u4fe1</des><type>5</type><url>http://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#rd</url><appattach><cdnthumburl>3057020100044b3049020100020416bb792802032fc67902043699ca2a02046694f260042438633361386631662d393634392d346166382d613535622d3236366338313333663235320204051408030201000405004c55cd00</cdnthumburl><cdnthumbmd5>b3da5aedfc0b12c2c5f2f2039d9eff9f</cdnthumbmd5><cdnthumblength>11325</cdnthumblength><cdnthumbwidth>160</cdnthumbwidth><cdnthumbheight>160</cdnthumbheight><cdnthumbaeskey>1c99c04fb672b357f89de639756fa5e8</cdnthumbaeskey><aeskey>1c99c04fb672b357f89de639756fa5e8</aeskey><encryver>0</encryver><filekey>wxid_n5kf2grjaxm812_43_1721037408</filekey></appattach><sourceusername>gh_6e99ff560306</sourceusername><sourcedisplayname>\u5fae\u4fe1\u5b89\u5168\u4e2d\u5fc3</sourcedisplayname><md5>b3da5aedfc0b12c2c5f2f2039d9eff9f</md5><webviewshared><jsAppId><![CDATA[]]></jsAppId><publisherReqId><![CDATA[3050482407]]></publisherReqId></webviewshared><mpsharetrace><hasfinderelement>0</hasfinderelement></mpsharetrace><mmreadershare><itemshowtype>0</itemshowtype><nativepage>0</nativepage><pubtime>0</pubtime><duration>0</duration><width>0</width><height>0</height><vid /><funcflag>0</funcflag><ispaysubscribe>0</ispaysubscribe></mmreadershare></appmsg>", "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())
|