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==&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())