Spaces:
Running
Running
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()) | |