WeChatAgents / demo.py
AiAgents's picture
Upload folder using huggingface_hub
d861292 verified
raw
history blame contribute delete
No virus
16.4 kB
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==&amp;mid=2652783452&amp;idx=1&amp;sn=4bc53951663c4d9b0826b1b7e6188705&amp;chksm=8b886a24bcffe332760c889e01535e5084443a95c9b8fad8a87c3948a547b905eef857fda39d&amp;mpshare=1&amp;scene=1&amp;srcid=0715JHaRfI7qSrjVQySJNAv6&amp;sharer_shareinfo=6a897b84f61fa66c7f8aa1912a3d33c3&amp;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==&amp;mid=2652783452&amp;idx=1&amp;sn=4bc53951663c4d9b0826b1b7e6188705&amp;chksm=8b886a24bcffe332760c889e01535e5084443a95c9b8fad8a87c3948a547b905eef857fda39d&amp;mpshare=1&amp;scene=1&amp;srcid=0715JHaRfI7qSrjVQySJNAv6&amp;sharer_shareinfo=6a897b84f61fa66c7f8aa1912a3d33c3&amp;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())