wechaty-puppet-padplus2 3.1.2 → 3.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -18
- package/dist/cjs/server/service/api/index3.cjs +1 -1
- package/dist/cjs/server/service/request/index.cjs +1 -1
- package/dist/cjs/server/service/utils/api-logger.cjs +1 -0
- package/dist/esm/server/service/api/index3.js +13 -6
- package/dist/esm/server/service/request/index.js +16 -7
- package/dist/esm/server/service/utils/api-logger.js +54 -0
- package/dist/types/server/service/utils/api-logger.d.ts +31 -0
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -26,25 +26,15 @@ const qrcodeUrl = await puppet.requestLoginQRCode()
|
|
|
26
26
|
console.log('manual qrcode url:', qrcodeUrl)
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
## 发布到私有NPM仓库
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
```env
|
|
31
|
+
#服务地址
|
|
32
|
+
PUPPET_PADPLUS_BASE_URL
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
#服务端口
|
|
35
|
+
BASE_PORT
|
|
34
36
|
|
|
37
|
+
#设备名称
|
|
38
|
+
DEVICE_NAME
|
|
35
39
|
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
export NPM_AUTH_TOKEN=$(echo -n 'username:password' | openssl base64)
|
|
39
|
-
export NPM_EMAIL=your-email@example.com
|
|
40
|
-
```
|
|
41
|
-
3. 执行发布命令:
|
|
42
|
-
```bash
|
|
43
|
-
npm run publish
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
如有问题,请联系管理员。
|
|
47
|
-
|
|
48
|
-
pnpm build
|
|
49
|
-
npm publish --registry http://localhost:4873/
|
|
50
|
-
npm version patch
|
|
40
|
+
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../index.cjs");require("url");const t=require("cuid");require("path"),require("fs-extra"),require("os"),require("wechaty-puppet"),require("flash-store");const a=require("../utils/polling.cjs");require("../../map/index.cjs");const s=require("../../cache-manager.cjs"),i=require("../../utils/xml-to-json.cjs"),n=require("../config/index.cjs"),message=require("../../map/message.cjs"),o=require("../../map/response.cjs"),r=require("../../map/RoomMemberList.cjs"),contact=require("../../map/contact.cjs"),d=require("../../map/Label.cjs"),c=(e=>e&&e.__esModule?e:{default:e})(t);var l,m;(m=l||(l={}))[m.THUMB=0]="THUMB",m[m.NORMAL=1]="NORMAL",void(m[m.HD=2]="HD"),exports.Api=class{_cacheMgr;_client;token;uuid;wxid;callback;poll_message_timer;constructor(e){this._client=e}async init(){this._cacheMgr=new s.CacheManager(this.token),await this._cacheMgr.init()}async login(e,t){this.callback=t;let a=this._client.token.split("puppet_padplus_")[1];this.token=a,await this.init();const s=await this._cacheMgr.getUUID(a);this.uuid=s?.uuid,this.wxid=s?.wxid,s?.wxid?this.getSecondLogin():await this.getLoginCodeByFirst()}async requestLoginQRCode(){return await this.getLoginCodeByFirst(),this.uuid?`http://weixin.qq.com/x/${this.uuid}`:void 0}getLoginCodeByFirst=async()=>{try{let e=this.callback,t=await this.getLoginCodeNew(this.token);if(1==t.Code){this.uuid=t.Data.Uuid,e.onOneClickEvent({status:1,imageUrl:`http://weixin.qq.com/x/${t.Data.Uuid}`});const s=new a.Polling;let i=null;s.poll(2e3,(async()=>{let a=await this.checkLoginStatus();if(i||(i=setTimeout((async()=>{s.stop(),e.onQrCodeEvent({status:5})}),1e3*a.Data.expiredTime)),0==a.Code){if(1==a.Data.states&&e.onQrCodeEvent({status:2}),4==a.Data.states&&e.onQrCodeEvent({status:4}),"登录成功"==a.Message){s.stop(),i&&(clearTimeout(i),i=null),e.onQrCodeEvent({status:3}),this._cacheMgr.setUUID(this.token,{uuid:t.Data.Uuid,wxid:a.Data.acctSectResp.userName}),this.wxid=a.Data.acctSectResp.userName;try{let{messageList:t,contactList:a}=await this.getInitMessage();this._client.selfContact=await this.getMyContact(this.wxid),await e.onLoginSuccess(this._client.selfContact),await e.onSync({getContactList:()=>a,getMessageList:()=>t}),this.poll_change_contact(3e3),this.poll_message(),this.poll_heart()}catch(e){}}}else-8==a.Code}))}}catch(e){}};async getSecondLogin(){try{await this.heart();let{messageList:e,contactList:t}=await this.getInitMessage();this._client.selfContact=await this.getMyContact(this.wxid),await this.callback.onLoginSuccess(this._client.selfContact),await this.callback.onSync({getContactList:()=>t,getMessageList:()=>e}),this.poll_message(),this.poll_change_contact(3e3),this.poll_heart()}catch(e){await this.getLoginCodeByFirst()}}poll_message(){const e=new a.Polling;this.poll_message_timer=e,e.poll(1e3,(async()=>{const{messageList:e,contactList:t}=await this.getMessage();e.length>0&&this._client.emit("message",e),t.length>0&&this._client.emit("contact",t)}))}async getLoginCodeNew(t=""){return e.SyyyRequest.post({url:"/Login/LoginGetQR",data:{DeviceID:t,DeviceName:n.DeviceName,Proxy:{ProxyIp:"string",ProxyPassword:"string",ProxyUser:"string"}}})}async checkLoginStatus(){return e.SyyyRequest.post({url:`/Login/LoginCheckQR?uuid=${this.uuid}`,data:{}})}poll_heart(){(new a.Polling).poll(15e4,(async()=>{try{await this.heart()}catch(e){this.poll_message_timer.stop(),await(this._cacheMgr?.close()),this._cacheMgr=void 0,this._client.emit("kickout","")}}))}async heart(t=20){let a=0;for(;a<t;){try{let t=await e.SyyyRequest.post({url:`/Login/HeartBeat?wxid=${this.wxid}`});if("成功"===t.Message||!t)return t}catch(e){}a++}throw new Error("HeartBeat failed after multiple attempts")}poll_change_contact=async e=>{for(;;){try{const e=await(this._cacheMgr?.getRoomIds());if(!e)return;for(const t of e)try{const e=await this.getChatRoomContact(t),a=await(this._cacheMgr?.getRoomMember(t));if(a&&e.getChatroommemberList().length>0){const s=a,i=e.toObject().chatroommemberList;(s.length!==i.length&&Math.abs(s.length-i.length)<3||JSON.stringify(s)!=JSON.stringify(i))&&(this._cacheMgr?.setRoomMember(t,e.toObject().chatroommemberList),console.log("contactcontact",e),this._client.emit("contact",[e]))}else 0!==e.getChatroommemberList().length&&this._cacheMgr?.setRoomMember(t,e.toObject().chatroommemberList)}catch(e){}}catch(e){}await new Promise((t=>setTimeout(t,e)))}};async getInitMessage(){let e=this,t=[],a=[];return await async function s(){let{messageList:i,contactList:n}=await e.getMessage(!0);t.push(...i),a.push(...n),i&&0==i.length&&0==n.length||await s()}(),{messageList:t,contactList:a}}async getMessage(t){let a=await e.SyyyRequest.post({url:"/Msg/Sync",data:{Scene:0,Synckey:"string",Wxid:this.wxid}}),s=[];if(0==a.Code&&a.Data.AddMsgs&&a.Data.AddMsgs.length>0){let e=a.Data.AddMsgs;for(const t of e){let e=(new message.Message).setFromusername(t.FromUserName.string).setTousername(t.ToUserName.string).setId(t.MsgId).setType(t.MsgType).setCreatetime(t.CreateTime);const a=/@chatroom$/.test(t.FromUserName.string),n=/@chatroom$/.test(t.ToUserName.string);let o=[];(a||n)&&(this._cacheMgr?.setRoom(t.FromUserName.string||t.ToUserName.string,!0),o=((await i.xmlToJson(t.MsgSource)).msgsource?.atuserlist?(await i.xmlToJson(t.MsgSource)).msgsource.atuserlist.split(","):[]).filter((e=>""!==e))),e.setContent(t.Content.string).setAtList(o),s.push(e)}}return{messageList:s,contactList:[]}}async send_text(t,a,s=""){return await e.SyyyRequest.post({url:"/Msg/SendTxt",data:{At:s?.join?.(","),Content:a,ToWxid:t,Type:0,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async sendImageMessage(t,a,s){return await e.SyyyRequest.post({url:"/Msg/UploadImg",data:{Base64:a,ToWxid:t,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async sendVideoMessage(t,a,s){return await e.SyyyRequest.post({url:"/Msg/SendVideo",data:{Base64:a,ImageBase64:`data:image/png;base64,${s}`,PlayLength:0,ToWxid:t,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async sendFileMessage(t){return await e.SyyyRequest.post({url:"/Tools/UploadFile",data:{Base64:t,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async sendMessageEmoji(t,a,s){return await e.SyyyRequest.post({url:"/Msg/SendEmoji",data:{Md5:a,ToWxid:t,TotalLen:s,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async sendMessageLink(t,a,s){let n={appmsg:{$:{appid:"",sdkver:"0"},title:s.title,des:s.description,action:"view",type:"5",showtype:"0",content:"",url:s.url,dataurl:"",lowurl:"",lowdataurl:"",recorditem:"",thumburl:s.thumbURL,messageaction:"",laninfo:"",extinfo:"",sourceusername:"",sourcedisplayname:"",commenturl:"",appattach:{totallen:"0",attachid:"",emoticonmd5:"",fileext:"",aeskey:"",cdnthumburl:"3057020100044b30490201000204cfb2499202032f58b702047366327002046690b731042437376632396432322d386664622d346332352d383735332d3066623162666164313539320204051808030201000405004c4d3700",cdnthumbaeskey:"801f4f18eb05147db6b1a5c0085ef945",cdnthumbmd5:"661e8de94322838210632126fde5094b",cdnthumblength:"10300",cdnthumbwidth:"100",cdnthumbheight:"100"},webviewshared:{publisherId:"msg_8252690270823229747",publisherReqId:"106112608"},weappinfo:{pagepath:"",username:"",appid:"",appservicetype:"0"},websearch:""}},r=await i.jsonToXml(n),d=await i.jsonToXml({msg:n});return await e.SyyyRequest.post({url:"/Msg/SendApp",data:{ToWxid:a,Type:0,Wxid:this.wxid,Xml:r}}),(new o.SendAppMessageResponse).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()}).setMsgcontent(d)}async sendMessageMiniProgram(t,a){const{appid:s,description:n,iconUrl:r,shareId:d,thumbKey:l,thumbUrl:m,username:u,title:g,pagePath:y}=a;let h={appmsg:{appid:s,title:g,action:"view",type:"33",showtype:"0",url:`https://mp.weixin.qq.com/mp/waerrpage?appid=${s}&type=upgrade&upgradetype=3#wechat_redirect`,md5:"45aa6d4173817719325046cd881fa92d",sourcedisplayname:n,appattach:{totallen:"0",fileext:"jpg",filekey:"dbb0e647bd45df3d1bd83d22d51b8073",cdnthumburl:m,aeskey:"5efa5257be70f5fd634676f997e79129",cdnthumbaeskey:l,cdnthumbmd5:"45aa6d4173817719325046cd881fa92d",encryver:"1",cdnthumblength:"65264",cdnthumbheight:"100",cdnthumbwidth:"100"},webviewshared:{publisherReqId:"0"},weappinfo:{pagepath:y,username:u,appid:s,type:"2",weappiconurl:r,appservicetype:"0",shareId:d}}},p=await i.jsonToXml(h),w=await i.jsonToXml({msg:h});return await e.SyyyRequest.post({url:"/Msg/SendApp",data:{ToWxid:t,Type:0,Wxid:this.wxid,Xml:p}}),(new o.SendAppMessageResponse).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()}).setMsgcontent(w)}async forwardMessage(t,a){let s=await i.xmlToJson(a),n=await i.jsonToXml({appmsg:s.msg.appmsg});return await e.SyyyRequest.post({url:"/Msg/SendApp",data:{ToWxid:t,Type:0,Wxid:this.wxid,Xml:n}}),(new o.SendAppMessageResponse).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()}).setMsgcontent(a)}async forwardMessagewenjian(t,a){let s=await i.jsonToXml({msg:{appmsg:{sdkver:"0",title:"新建文本文档 (2).txt",des:"184 B",type:"6",action:"view",appattach:{totallen:"184",fileext:"txt",attachid:"@cdn_3057020100044b30490201000204cfb2499202032f591b02041424e978020466a8b32c042437363061356463352d636435372d346339652d626332322d3430343032396633633637640204051400050201000405004c505700_4dfcfca645d1f21482a9c9eea8140f3e_1",cdnattachurl:"3057020100044b30490201000204cfb2499202032f591b02041424e978020466a8b32c042437363061356463352d636435372d346339652d626332322d3430343032396633633637640204051400050201000405004c505700",aeskey:"4dfcfca645d1f21482a9c9eea8140f3e",encryver:"0",filekey:"wxid_yqw0irrcmoyd12_2764_1722331948",overwrite_newmsgid:"7009346818105138159",fileuploadtoken:"v1_7wKTlnLUYDj/Zspdynmg7opHS3F+nLFWQcFHcnJvZNQCfoFxVMjJr8zu/79izHT2VeBP+4382v9Q7GPuzYCdPvwClLTDHZQ6RggFOpF8kP4x5b2kETRF9bURmKeTyO6vidAQMyHYijyPxmdi+GjkJzr34qhhdGbsFkl8KMIjVgk1sYTPsOjpV/n9TRfEIr056iMnfISvqpWoFoEo8SkgbwX5oZTgfkeB"},md5:"cc2100250f9da1c45beed68d867756bb",webviewshared:{},mpsharetrace:{hasfinderelement:"0"},secretmsg:{isscrectmsg:"0"}},fromusername:"wxid_kxbss8yjkqx122",scene:"1",appinfo:{version:"1"}}});return await e.SyyyRequest.post({url:"/Msg/SendCDNFile",data:{Content:s,ToWxid:t,Wxid:this.wxid}}),(new o.SendAppMessageResponse).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()}).setMsgcontent(a)}async sendVoiceMessage(t,a,s){return await e.SyyyRequest.post({url:"/Msg/SendVoice",data:{Base64:a,ToWxid:t,Type:4,VoiceTime:1,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async getAllChatRoomMembers(){let t=await e.SyyyRequest.post({url:"/",data:{type:10114}}),a=[];for(const e of t.data.data.chatrooms){let t=[];for(const a in e.chatroomMembers)t.push((new r.ChatRoomMember).setUsername(e.chatroomMembers[a].userName).setAvatar(e.chatroomMembers[a].smallHeadImgUrl).setNickname(e.chatroomMembers[a].nickName).setInviterusername(e.chatroomMembers[a].inviterUserName).setDisplayname(e.chatroomMembers[a]?.chatroomNickName));const s=(new contact.Contact).setUsername(e.userName).setNickname(e.nickName).setAvatar(e.smallHeadImgUrl).setGender(0).setSignature("").setRemark(e.remark).setChatroommaxcount(e.chatroomMaxCount).setChatroommemberList(t).setChatroomownerusername(e.ownerUserName);a.push(s)}return a}async getChatRoomMembers(t){let a=await e.SyyyRequest.post({url:"/Group/GetChatRoomMemberDetail",data:{QID:t,Wxid:this.wxid}}),s=[];if(a.Data?.NewChatroomData.ChatRoomMember)for(const e of a.Data.NewChatroomData.ChatRoomMember)s.push((new r.ChatRoomMember).setUsername(e.UserName).setAvatar(e.SmallHeadImgUrl).setNickname(e.NickName).setDisplayname(e?.DisplayName||""));return s}async getContact(e,t){let a;return a=/@chatroom$/.test(e)?await this.getChatRoomContact(e):e==this._client.selfContact.getUsername()?this._client.selfContact:await this.getChatContact(e),a}async updateSelfNickName(t){return new Promise((async(a,s)=>{try{a(await e.SyyyRequest.post({url:"/User/UpdateProfile",data:{NickName:t,Wxid:this.wxid}}))}catch(e){s(e)}}))}async updateSelfSignature(t){return new Promise((async(a,s)=>{try{a(await e.SyyyRequest.post({url:"/User/UpdateProfile",data:{Signature:t,Wxid:this.wxid}}))}catch(e){s(e)}}))}async getContactQRCode(t,a){return new Promise((async(t,s)=>{try{t(await e.SyyyRequest.post({url:"/User/GetQRCode",data:{Style:a,Wxid:this.wxid}}))}catch(e){s(e)}}))}async updateContactRemark(t,a){await e.SyyyRequest.post({url:"/Friend/SetRemarks",data:{Remarks:a,ToWxid:t,Wxid:this.wxid}})}async GetFriendRelation(t){return await e.SyyyRequest.post({url:"/Friend/GetFriendRelation",data:{UserName:t,Wxid:this.wxid}})}async addContact(t,a,s){await e.SyyyRequest.post({url:"/Friend/SendRequest",data:{Scene:0,V1:t,V2:a,VerifyContent:s,Wxid:this.wxid}})}async deleteContact(t){await e.SyyyRequest.post({url:"/Friend/Delete",data:{ToWxid:t,Wxid:this.wxid}})}async getChatContact(t){let a=(await e.SyyyRequest.post({url:"/Friend/GetContractDetail",data:{ChatRoom:"string",Towxids:t,Wxid:this.wxid}})).Data.ContactList[0];return(new contact.Contact).setUsername(a.UserName.string).setNickname(a.NickName.string).setAvatar(a.SmallHeadImgUrl).setGender(a.Sex).setSignature(a.Signature).setAntispamticket(a.AntispamTicket).setAlias(a.Alias)}async getMyContact(t){return new Promise((async(t,a)=>{try{let a=(await e.SyyyRequest.post({url:`/User/GetContractProfile?wxid=${this.wxid}`,data:{}})).Data;t((new contact.Contact).setUsername(a.userInfo.UserName.string).setNickname(a.userInfo.NickName.string).setAvatar(a.userInfoExt.SmallHeadImgUrl).setGender(a.userInfo.Sex).setSignature(a.userInfo.Signature).setAntispamticket(a.AntispamTicket||""))}catch(e){a(e)}}))}async getChatRoomContact(t){return new Promise((async(a,s)=>{let i=await e.SyyyRequest.post({url:"Group/GetChatRoomInfo",data:{QID:t,Wxid:this.wxid}});if(0==i.Code&&i.Data.ContactList){let e=i.Data.ContactList[0],s=await this.getChatRoomMembers(t);a((new contact.Contact).setUsername(e.UserName.string).setNickname(e.NickName.string).setAvatar(e.SmallHeadImgUrl).setGender(0).setSignature("").setRemark("").setChatroommaxcount(500).setChatroommemberList(s).setChatroomownerusername(e.ChatRoomOwner).setEncryptusername(e.EncryptUserName))}else s("数据出错")}))}async acceptChatRoomInvitation(t,a){return e.SyyyRequest.post({url:"/Group/ScanIntoGroup",data:{Url:a,Wxid:this.wxid}})}async quitChatRoom(t){return e.SyyyRequest.post({url:"/Group/Quit",data:{QID:t,Wxid:this.wxid}})}async getMessageImage(t,a,s){return new Promise((async(a,n)=>{try{let n=(await i.xmlToJson(t)).msg.img.$,o=await e.SyyyRequest.post({url:"/Tools/CdnDownloadImage",data:{FileAesKey:n.aeskey,FileNo:n.cdnmidimgurl,Wxid:this.wxid}});a({imageType:s,imageData:o.Data.Image})}catch(e){a(e)}}))}async getMessageVoice(t,a,s){let n=(await i.xmlToJson(a)).msg.voicemsg.$;return(await e.SyyyRequest.post({url:"/Tools/DownloadVoice",data:{Bufid:n.clientmsgid,FromUserName:s,Length:Number(n.length),MsgId:t,Wxid:this.wxid}})).Data.data.buffer}async getMessageVideo(t,a,s){let n=(await i.xmlToJson(a)).msg.videomsg.$;return(await e.SyyyRequest.post({url:"/Tools/DownloadVideo",data:{CompressType:0,DataLen:Number(n.length),MsgId:t,Section:{DataLen:Number(n.playlength),StartPos:0},ToWxid:s,Wxid:this.wxid}})).Data.data.buffer}async getMessageAttach(t,a){let s=await i.xmlToJson(t),n=s.msg.appmsg.appattach;return(await e.SyyyRequest.post({url:"/Tools/DownloadFile",data:{AppID:s.msg.appmsg.$.appid,AttachId:n.attachid,DataLen:Number(n.totallen),Section:{DataLen:0,StartPos:0},UserName:a,Wxid:this.wxid}})).Data.data.buffer}async getMessageMiniProgramThumb(t,a){let s=(await i.xmlToJson(t)).msg.appmsg.appattach;return(await e.SyyyRequest.post({url:"/Tools/CdnDownloadImage",data:{FileAesKey:s.aeskey,FileNo:s.cdnattachurl,Wxid:this.wxid}})).Data.Image}async getMessageAttachThumb(t,a){let s=(await i.xmlToJson(t)).msg.appmsg.appattach;return(await e.SyyyRequest.post({url:"/Tools/CdnDownloadImage",data:{FileAesKey:s.aeskey,FileNo:s.cdnthumburl,Wxid:this.wxid}})).Data.Image}async sendContactCardMessage(t,a){return await e.SyyyRequest.post({url:"/Msg/ShareCard",data:{ToWxid:t,CardWxId:a.getUsername(),CardNickName:a.getNickname(),CardAlias:a.getAlias(),Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async logout(){return await e.SyyyRequest.get({url:`/Login/LogOut?wxid=${this.wxid}`,data:{}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async revokeMessage(t,a,s){return e.SyyyRequest.post({url:"/Msg/Revoke",data:{ClientMsgId:a,CreateTime:0,NewMsgId:s,ToUserName:t,Wxid:this.wxid}})}async createChatRoom(t,a){return(await e.SyyyRequest.post({url:"/Group/CreateChatRoom",data:{UserList:t,Wxid:this.wxid}})).Data.chatRoomName.string}async inviteChatroomMembers(t,a){await e.SyyyRequest.post({url:"/Group/AddChatRoomMember",data:{ChatRoomName:t,ToWxids:a,Wxid:this.wxid}})}async deleteChatRoomMember(t,a){await e.SyyyRequest.post({url:"/Group/DelChatRoomMember",data:{ChatRoomName:t,ToWxids:a,Wxid:this.wxid}})}async getChatRoomQrCode(t){return new Promise((async(a,s)=>{try{a(await e.SyyyRequest.post({url:"/Group/GetQRCode",data:{QID:t,Wxid:this.wxid}}))}catch(e){s(e)}}))}async setChatRoomName(t,a){await e.SyyyRequest.post({url:"/Group/SetChatRoomName",data:{Content:a,QID:t,Wxid:this.wxid}})}async getChatRoomAnnouncement(t){await e.SyyyRequest.post({url:"/Group/GetChatRoomInfoDetail",data:{QID:t,Wxid:this.wxid}})}async setChatRoomAnnouncement(t,a){await e.SyyyRequest.post({url:"/Group/SetChatRoomAnnouncement",data:{Content:a,QID:t,Wxid:this.wxid}})}async acceptUser(t,a,s,i){await e.SyyyRequest.post({url:"/Friend/PassVerify",data:{V1:s,V2:a,Wxid:this.wxid,Scene:i}})}async getLabelList(){return new Promise((async(t,a)=>{try{let a=await e.SyyyRequest.post({url:`/Label/GetList?wxid=${this.wxid}`,data:{}}),s=[];if(a.Data.labelPairList)for(const e of a.Data.labelPairList){let t=(new d.Label).setId(e.labelID).setName(e.labelName);s.push(t)}t(s)}catch(e){}}))}async addLabel(t){return await e.SyyyRequest.post({url:"/Label/Add",data:{LabelName:t,wxid:this.wxid}})}async removeLabel(t){return new Promise((async(a,s)=>{try{a(await e.SyyyRequest.post({url:"/Label/Delete",data:{LabelID:String(t),Wxid:this.wxid}}))}catch(e){}}))}async setContactLabel(t,a){return new Promise((async(s,i)=>{let n=a.filter((e=>!isNaN(e)));try{s(await e.SyyyRequest.post({url:"/Label/UpdateList",data:{LabelID:n.join(",")||"",ToWxids:t,wxid:this.wxid}}))}catch(e){}}))}};
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../index.cjs");require("url");const t=require("cuid");require("path"),require("fs-extra"),require("os"),require("wechaty-puppet"),require("flash-store");const a=require("../utils/polling.cjs");require("../../map/index.cjs");const s=require("../../cache-manager.cjs"),i=require("../../utils/xml-to-json.cjs"),n=require("../config/index.cjs"),message=require("../../map/message.cjs"),o=require("../../map/response.cjs"),r=require("../../map/RoomMemberList.cjs"),contact=require("../../map/contact.cjs"),d=require("../../map/Label.cjs"),c=(e=>e&&e.__esModule?e:{default:e})(t);var l,m;(m=l||(l={}))[m.THUMB=0]="THUMB",m[m.NORMAL=1]="NORMAL",void(m[m.HD=2]="HD"),exports.Api=class{_cacheMgr;_client;token;uuid;wxid;callback;poll_message_timer;poll_heart_timer;constructor(e){this._client=e}async init(){this._cacheMgr=new s.CacheManager(this.token),await this._cacheMgr.init()}async login(e,t){this.callback=t;let a=this._client.token.split("puppet_padplus_")[1];this.token=a,await this.init();const s=await this._cacheMgr.getUUID(a);this.uuid=s?.uuid,this.wxid=s?.wxid,s?.wxid?this.getSecondLogin():await this.getLoginCodeByFirst()}async requestLoginQRCode(){return await this.getLoginCodeByFirst(),this.uuid?`http://weixin.qq.com/x/${this.uuid}`:void 0}getLoginCodeByFirst=async()=>{try{let e=this.callback,t=await this.getLoginCodeNew(this.token);if(1==t.Code){this.uuid=t.Data.Uuid,e.onOneClickEvent({status:1,imageUrl:`http://weixin.qq.com/x/${t.Data.Uuid}`});const s=new a.Polling;let i=null;s.poll(2e3,(async()=>{let a=await this.checkLoginStatus();if(i||(i=setTimeout((async()=>{s.stop(),e.onQrCodeEvent({status:5})}),1e3*a.Data.expiredTime)),0==a.Code){if(1==a.Data.states&&e.onQrCodeEvent({status:2}),4==a.Data.states&&e.onQrCodeEvent({status:4}),"登录成功"==a.Message){s.stop(),i&&(clearTimeout(i),i=null),e.onQrCodeEvent({status:3}),this._cacheMgr.setUUID(this.token,{uuid:t.Data.Uuid,wxid:a.Data.acctSectResp.userName}),this.wxid=a.Data.acctSectResp.userName;try{let{messageList:t,contactList:a}=await this.getInitMessage();this._client.selfContact=await this.getMyContact(this.wxid),await e.onLoginSuccess(this._client.selfContact),await e.onSync({getContactList:()=>a,getMessageList:()=>t}),this.poll_change_contact(3e3),this.poll_message(),this.poll_heart()}catch(e){}}}else-8==a.Code}))}}catch(e){}};async getSecondLogin(){try{await this.heart();let{messageList:e,contactList:t}=await this.getInitMessage();this._client.selfContact=await this.getMyContact(this.wxid),await this.callback.onLoginSuccess(this._client.selfContact),await this.callback.onSync({getContactList:()=>t,getMessageList:()=>e}),this.poll_message(),this.poll_change_contact(3e3),this.poll_heart()}catch(e){await this.getLoginCodeByFirst()}}poll_message(){const e=new a.Polling;this.poll_message_timer=e,e.poll(1e3,(async()=>{const{messageList:e,contactList:t}=await this.getMessage();e.length>0&&this._client.emit("message",e),t.length>0&&this._client.emit("contact",t)}))}async getLoginCodeNew(t=""){return e.SyyyRequest.post({url:"/Login/LoginGetQR",data:{DeviceID:t,DeviceName:n.DeviceName,Proxy:{ProxyIp:"string",ProxyPassword:"string",ProxyUser:"string"}}})}async checkLoginStatus(){return e.SyyyRequest.post({url:`/Login/LoginCheckQR?uuid=${this.uuid}`,data:{}})}poll_heart(){this.poll_heart_timer&&this.poll_heart_timer.stop();const e=new a.Polling;this.poll_heart_timer=e,e.poll(15e4,(async()=>{try{await this.heart()}catch(e){console.error("Heart beat failed, kicking out...",e),this.poll_message_timer?.stop(),this.poll_heart_timer?.stop(),await(this._cacheMgr?.close()),this._cacheMgr=void 0,this._client.emit("kickout","")}}))}async heart(t=3){let a=0;for(;a<t;){try{let t=await e.SyyyRequest.post({url:`/Login/HeartBeat?wxid=${this.wxid}`});if(t&&"成功"===t.Message)return t;console.warn(`HeartBeat attempt ${a+1} got unexpected response:`,t?.Message||"no response")}catch(e){console.error(`HeartBeat attempt ${a+1} failed:`,e.message)}a++,a<t&&await new Promise((e=>setTimeout(e,2e3)))}throw new Error("HeartBeat failed after multiple attempts")}poll_change_contact=async e=>{for(;;){try{const e=await(this._cacheMgr?.getRoomIds());if(!e)return;for(const t of e)try{const e=await this.getChatRoomContact(t),a=await(this._cacheMgr?.getRoomMember(t));if(a&&e.getChatroommemberList().length>0){const s=a,i=e.toObject().chatroommemberList;(s.length!==i.length&&Math.abs(s.length-i.length)<3||JSON.stringify(s)!=JSON.stringify(i))&&(this._cacheMgr?.setRoomMember(t,e.toObject().chatroommemberList),console.log("contactcontact",e),this._client.emit("contact",[e]))}else 0!==e.getChatroommemberList().length&&this._cacheMgr?.setRoomMember(t,e.toObject().chatroommemberList)}catch(e){}}catch(e){}await new Promise((t=>setTimeout(t,e)))}};async getInitMessage(){let e=this,t=[],a=[];return await async function s(){let{messageList:i,contactList:n}=await e.getMessage(!0);t.push(...i),a.push(...n),i&&0==i.length&&0==n.length||await s()}(),{messageList:t,contactList:a}}async getMessage(t){let a=await e.SyyyRequest.post({url:"/Msg/Sync",data:{Scene:0,Synckey:"string",Wxid:this.wxid}}),s=[];if(0==a.Code&&a.Data.AddMsgs&&a.Data.AddMsgs.length>0){let e=a.Data.AddMsgs;for(const t of e){let e=(new message.Message).setFromusername(t.FromUserName.string).setTousername(t.ToUserName.string).setId(t.MsgId).setType(t.MsgType).setCreatetime(t.CreateTime);const a=/@chatroom$/.test(t.FromUserName.string),n=/@chatroom$/.test(t.ToUserName.string);let o=[];(a||n)&&(this._cacheMgr?.setRoom(t.FromUserName.string||t.ToUserName.string,!0),o=((await i.xmlToJson(t.MsgSource)).msgsource?.atuserlist?(await i.xmlToJson(t.MsgSource)).msgsource.atuserlist.split(","):[]).filter((e=>""!==e))),e.setContent(t.Content.string).setAtList(o),s.push(e)}}return{messageList:s,contactList:[]}}async send_text(t,a,s=""){return await e.SyyyRequest.post({url:"/Msg/SendTxt",data:{At:s?.join?.(","),Content:a,ToWxid:t,Type:0,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async sendImageMessage(t,a,s){return await e.SyyyRequest.post({url:"/Msg/UploadImg",data:{Base64:a,ToWxid:t,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async sendVideoMessage(t,a,s){return await e.SyyyRequest.post({url:"/Msg/SendVideo",data:{Base64:a,ImageBase64:`data:image/png;base64,${s}`,PlayLength:0,ToWxid:t,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async sendFileMessage(t){return await e.SyyyRequest.post({url:"/Tools/UploadFile",data:{Base64:t,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async sendMessageEmoji(t,a,s){return await e.SyyyRequest.post({url:"/Msg/SendEmoji",data:{Md5:a,ToWxid:t,TotalLen:s,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async sendMessageLink(t,a,s){let n={appmsg:{$:{appid:"",sdkver:"0"},title:s.title,des:s.description,action:"view",type:"5",showtype:"0",content:"",url:s.url,dataurl:"",lowurl:"",lowdataurl:"",recorditem:"",thumburl:s.thumbURL,messageaction:"",laninfo:"",extinfo:"",sourceusername:"",sourcedisplayname:"",commenturl:"",appattach:{totallen:"0",attachid:"",emoticonmd5:"",fileext:"",aeskey:"",cdnthumburl:"3057020100044b30490201000204cfb2499202032f58b702047366327002046690b731042437376632396432322d386664622d346332352d383735332d3066623162666164313539320204051808030201000405004c4d3700",cdnthumbaeskey:"801f4f18eb05147db6b1a5c0085ef945",cdnthumbmd5:"661e8de94322838210632126fde5094b",cdnthumblength:"10300",cdnthumbwidth:"100",cdnthumbheight:"100"},webviewshared:{publisherId:"msg_8252690270823229747",publisherReqId:"106112608"},weappinfo:{pagepath:"",username:"",appid:"",appservicetype:"0"},websearch:""}},r=await i.jsonToXml(n),d=await i.jsonToXml({msg:n});return await e.SyyyRequest.post({url:"/Msg/SendApp",data:{ToWxid:a,Type:0,Wxid:this.wxid,Xml:r}}),(new o.SendAppMessageResponse).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()}).setMsgcontent(d)}async sendMessageMiniProgram(t,a){const{appid:s,description:n,iconUrl:r,shareId:d,thumbKey:l,thumbUrl:m,username:u,title:g,pagePath:h}=a;let y={appmsg:{appid:s,title:g,action:"view",type:"33",showtype:"0",url:`https://mp.weixin.qq.com/mp/waerrpage?appid=${s}&type=upgrade&upgradetype=3#wechat_redirect`,md5:"45aa6d4173817719325046cd881fa92d",sourcedisplayname:n,appattach:{totallen:"0",fileext:"jpg",filekey:"dbb0e647bd45df3d1bd83d22d51b8073",cdnthumburl:m,aeskey:"5efa5257be70f5fd634676f997e79129",cdnthumbaeskey:l,cdnthumbmd5:"45aa6d4173817719325046cd881fa92d",encryver:"1",cdnthumblength:"65264",cdnthumbheight:"100",cdnthumbwidth:"100"},webviewshared:{publisherReqId:"0"},weappinfo:{pagepath:h,username:u,appid:s,type:"2",weappiconurl:r,appservicetype:"0",shareId:d}}},p=await i.jsonToXml(y),w=await i.jsonToXml({msg:y});return await e.SyyyRequest.post({url:"/Msg/SendApp",data:{ToWxid:t,Type:0,Wxid:this.wxid,Xml:p}}),(new o.SendAppMessageResponse).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()}).setMsgcontent(w)}async forwardMessage(t,a){let s=await i.xmlToJson(a),n=await i.jsonToXml({appmsg:s.msg.appmsg});return await e.SyyyRequest.post({url:"/Msg/SendApp",data:{ToWxid:t,Type:0,Wxid:this.wxid,Xml:n}}),(new o.SendAppMessageResponse).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()}).setMsgcontent(a)}async forwardMessagewenjian(t,a){let s=await i.jsonToXml({msg:{appmsg:{sdkver:"0",title:"新建文本文档 (2).txt",des:"184 B",type:"6",action:"view",appattach:{totallen:"184",fileext:"txt",attachid:"@cdn_3057020100044b30490201000204cfb2499202032f591b02041424e978020466a8b32c042437363061356463352d636435372d346339652d626332322d3430343032396633633637640204051400050201000405004c505700_4dfcfca645d1f21482a9c9eea8140f3e_1",cdnattachurl:"3057020100044b30490201000204cfb2499202032f591b02041424e978020466a8b32c042437363061356463352d636435372d346339652d626332322d3430343032396633633637640204051400050201000405004c505700",aeskey:"4dfcfca645d1f21482a9c9eea8140f3e",encryver:"0",filekey:"wxid_yqw0irrcmoyd12_2764_1722331948",overwrite_newmsgid:"7009346818105138159",fileuploadtoken:"v1_7wKTlnLUYDj/Zspdynmg7opHS3F+nLFWQcFHcnJvZNQCfoFxVMjJr8zu/79izHT2VeBP+4382v9Q7GPuzYCdPvwClLTDHZQ6RggFOpF8kP4x5b2kETRF9bURmKeTyO6vidAQMyHYijyPxmdi+GjkJzr34qhhdGbsFkl8KMIjVgk1sYTPsOjpV/n9TRfEIr056iMnfISvqpWoFoEo8SkgbwX5oZTgfkeB"},md5:"cc2100250f9da1c45beed68d867756bb",webviewshared:{},mpsharetrace:{hasfinderelement:"0"},secretmsg:{isscrectmsg:"0"}},fromusername:"wxid_kxbss8yjkqx122",scene:"1",appinfo:{version:"1"}}});return await e.SyyyRequest.post({url:"/Msg/SendCDNFile",data:{Content:s,ToWxid:t,Wxid:this.wxid}}),(new o.SendAppMessageResponse).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()}).setMsgcontent(a)}async sendVoiceMessage(t,a,s){return await e.SyyyRequest.post({url:"/Msg/SendVoice",data:{Base64:a,ToWxid:t,Type:4,VoiceTime:1,Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async getAllChatRoomMembers(){let t=await e.SyyyRequest.post({url:"/",data:{type:10114}}),a=[];for(const e of t.data.data.chatrooms){let t=[];for(const a in e.chatroomMembers)t.push((new r.ChatRoomMember).setUsername(e.chatroomMembers[a].userName).setAvatar(e.chatroomMembers[a].smallHeadImgUrl).setNickname(e.chatroomMembers[a].nickName).setInviterusername(e.chatroomMembers[a].inviterUserName).setDisplayname(e.chatroomMembers[a]?.chatroomNickName));const s=(new contact.Contact).setUsername(e.userName).setNickname(e.nickName).setAvatar(e.smallHeadImgUrl).setGender(0).setSignature("").setRemark(e.remark).setChatroommaxcount(e.chatroomMaxCount).setChatroommemberList(t).setChatroomownerusername(e.ownerUserName);a.push(s)}return a}async getChatRoomMembers(t){let a=await e.SyyyRequest.post({url:"/Group/GetChatRoomMemberDetail",data:{QID:t,Wxid:this.wxid}}),s=[];if(a.Data?.NewChatroomData.ChatRoomMember)for(const e of a.Data.NewChatroomData.ChatRoomMember)s.push((new r.ChatRoomMember).setUsername(e.UserName).setAvatar(e.SmallHeadImgUrl).setNickname(e.NickName).setDisplayname(e?.DisplayName||""));return s}async getContact(e,t){let a;return a=/@chatroom$/.test(e)?await this.getChatRoomContact(e):e==this._client.selfContact.getUsername()?this._client.selfContact:await this.getChatContact(e),a}async updateSelfNickName(t){return new Promise((async(a,s)=>{try{a(await e.SyyyRequest.post({url:"/User/UpdateProfile",data:{NickName:t,Wxid:this.wxid}}))}catch(e){s(e)}}))}async updateSelfSignature(t){return new Promise((async(a,s)=>{try{a(await e.SyyyRequest.post({url:"/User/UpdateProfile",data:{Signature:t,Wxid:this.wxid}}))}catch(e){s(e)}}))}async getContactQRCode(t,a){return new Promise((async(t,s)=>{try{t(await e.SyyyRequest.post({url:"/User/GetQRCode",data:{Style:a,Wxid:this.wxid}}))}catch(e){s(e)}}))}async updateContactRemark(t,a){await e.SyyyRequest.post({url:"/Friend/SetRemarks",data:{Remarks:a,ToWxid:t,Wxid:this.wxid}})}async GetFriendRelation(t){return await e.SyyyRequest.post({url:"/Friend/GetFriendRelation",data:{UserName:t,Wxid:this.wxid}})}async addContact(t,a,s){await e.SyyyRequest.post({url:"/Friend/SendRequest",data:{Scene:0,V1:t,V2:a,VerifyContent:s,Wxid:this.wxid}})}async deleteContact(t){await e.SyyyRequest.post({url:"/Friend/Delete",data:{ToWxid:t,Wxid:this.wxid}})}async getChatContact(t){let a=(await e.SyyyRequest.post({url:"/Friend/GetContractDetail",data:{ChatRoom:"string",Towxids:t,Wxid:this.wxid}})).Data.ContactList[0];return(new contact.Contact).setUsername(a.UserName.string).setNickname(a.NickName.string).setAvatar(a.SmallHeadImgUrl).setGender(a.Sex).setSignature(a.Signature).setAntispamticket(a.AntispamTicket).setAlias(a.Alias)}async getMyContact(t){return new Promise((async(t,a)=>{try{let a=(await e.SyyyRequest.post({url:`/User/GetContractProfile?wxid=${this.wxid}`,data:{}})).Data;t((new contact.Contact).setUsername(a.userInfo.UserName.string).setNickname(a.userInfo.NickName.string).setAvatar(a.userInfoExt.SmallHeadImgUrl).setGender(a.userInfo.Sex).setSignature(a.userInfo.Signature).setAntispamticket(a.AntispamTicket||""))}catch(e){a(e)}}))}async getChatRoomContact(t){return new Promise((async(a,s)=>{let i=await e.SyyyRequest.post({url:"Group/GetChatRoomInfo",data:{QID:t,Wxid:this.wxid}});if(0==i.Code&&i.Data.ContactList){let e=i.Data.ContactList[0],s=await this.getChatRoomMembers(t);a((new contact.Contact).setUsername(e.UserName.string).setNickname(e.NickName.string).setAvatar(e.SmallHeadImgUrl).setGender(0).setSignature("").setRemark("").setChatroommaxcount(500).setChatroommemberList(s).setChatroomownerusername(e.ChatRoomOwner).setEncryptusername(e.EncryptUserName))}else s("数据出错")}))}async acceptChatRoomInvitation(t,a){return e.SyyyRequest.post({url:"/Group/ScanIntoGroup",data:{Url:a,Wxid:this.wxid}})}async quitChatRoom(t){return e.SyyyRequest.post({url:"/Group/Quit",data:{QID:t,Wxid:this.wxid}})}async getMessageImage(t,a,s){return new Promise((async(a,n)=>{try{let n=(await i.xmlToJson(t)).msg.img.$,o=await e.SyyyRequest.post({url:"/Tools/CdnDownloadImage",data:{FileAesKey:n.aeskey,FileNo:n.cdnmidimgurl,Wxid:this.wxid}});a({imageType:s,imageData:o.Data.Image})}catch(e){a(e)}}))}async getMessageVoice(t,a,s){let n=(await i.xmlToJson(a)).msg.voicemsg.$;return(await e.SyyyRequest.post({url:"/Tools/DownloadVoice",data:{Bufid:n.clientmsgid,FromUserName:s,Length:Number(n.length),MsgId:t,Wxid:this.wxid}})).Data.data.buffer}async getMessageVideo(t,a,s){let n=(await i.xmlToJson(a)).msg.videomsg.$;return(await e.SyyyRequest.post({url:"/Tools/DownloadVideo",data:{CompressType:0,DataLen:Number(n.length),MsgId:t,Section:{DataLen:Number(n.playlength),StartPos:0},ToWxid:s,Wxid:this.wxid}})).Data.data.buffer}async getMessageAttach(t,a){let s=await i.xmlToJson(t),n=s.msg.appmsg.appattach;return(await e.SyyyRequest.post({url:"/Tools/DownloadFile",data:{AppID:s.msg.appmsg.$.appid,AttachId:n.attachid,DataLen:Number(n.totallen),Section:{DataLen:0,StartPos:0},UserName:a,Wxid:this.wxid}})).Data.data.buffer}async getMessageMiniProgramThumb(t,a){let s=(await i.xmlToJson(t)).msg.appmsg.appattach;return(await e.SyyyRequest.post({url:"/Tools/CdnDownloadImage",data:{FileAesKey:s.aeskey,FileNo:s.cdnattachurl,Wxid:this.wxid}})).Data.Image}async getMessageAttachThumb(t,a){let s=(await i.xmlToJson(t)).msg.appmsg.appattach;return(await e.SyyyRequest.post({url:"/Tools/CdnDownloadImage",data:{FileAesKey:s.aeskey,FileNo:s.cdnthumburl,Wxid:this.wxid}})).Data.Image}async sendContactCardMessage(t,a){return await e.SyyyRequest.post({url:"/Msg/ShareCard",data:{ToWxid:t,CardWxId:a.getUsername(),CardNickName:a.getNickname(),CardAlias:a.getAlias(),Wxid:this.wxid}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async logout(){return await e.SyyyRequest.get({url:`/Login/LogOut?wxid=${this.wxid}`,data:{}}),(new o.Response).setMsgid(c.default()).setMessagerevokeinfo({clientmsgid:c.default(),newclientmsgid:c.default(),createtime:(new Date).getTime()})}async revokeMessage(t,a,s){return e.SyyyRequest.post({url:"/Msg/Revoke",data:{ClientMsgId:a,CreateTime:0,NewMsgId:s,ToUserName:t,Wxid:this.wxid}})}async createChatRoom(t,a){return(await e.SyyyRequest.post({url:"/Group/CreateChatRoom",data:{UserList:t,Wxid:this.wxid}})).Data.chatRoomName.string}async inviteChatroomMembers(t,a){await e.SyyyRequest.post({url:"/Group/AddChatRoomMember",data:{ChatRoomName:t,ToWxids:a,Wxid:this.wxid}})}async deleteChatRoomMember(t,a){await e.SyyyRequest.post({url:"/Group/DelChatRoomMember",data:{ChatRoomName:t,ToWxids:a,Wxid:this.wxid}})}async getChatRoomQrCode(t){return new Promise((async(a,s)=>{try{a(await e.SyyyRequest.post({url:"/Group/GetQRCode",data:{QID:t,Wxid:this.wxid}}))}catch(e){s(e)}}))}async setChatRoomName(t,a){await e.SyyyRequest.post({url:"/Group/SetChatRoomName",data:{Content:a,QID:t,Wxid:this.wxid}})}async getChatRoomAnnouncement(t){await e.SyyyRequest.post({url:"/Group/GetChatRoomInfoDetail",data:{QID:t,Wxid:this.wxid}})}async setChatRoomAnnouncement(t,a){await e.SyyyRequest.post({url:"/Group/SetChatRoomAnnouncement",data:{Content:a,QID:t,Wxid:this.wxid}})}async acceptUser(t,a,s,i){await e.SyyyRequest.post({url:"/Friend/PassVerify",data:{V1:s,V2:a,Wxid:this.wxid,Scene:i}})}async getLabelList(){return new Promise((async(t,a)=>{try{let a=await e.SyyyRequest.post({url:`/Label/GetList?wxid=${this.wxid}`,data:{}}),s=[];if(a.Data.labelPairList)for(const e of a.Data.labelPairList){let t=(new d.Label).setId(e.labelID).setName(e.labelName);s.push(t)}t(s)}catch(e){}}))}async addLabel(t){return await e.SyyyRequest.post({url:"/Label/Add",data:{LabelName:t,wxid:this.wxid}})}async removeLabel(t){return new Promise((async(a,s)=>{try{a(await e.SyyyRequest.post({url:"/Label/Delete",data:{LabelID:String(t),Wxid:this.wxid}}))}catch(e){}}))}async setContactLabel(t,a){return new Promise((async(s,i)=>{let n=a.filter((e=>!isNaN(e)));try{s(await e.SyyyRequest.post({url:"/Label/UpdateList",data:{LabelID:n.join(",")||"",ToWxids:t,wxid:this.wxid}}))}catch(e){}}))}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=(e=>e&&e.__esModule?e:{default:e})(
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("axios"),t=require("../utils/api-logger.cjs"),s=(e=>e&&e.__esModule?e:{default:e})(e);exports.default=class{instance;constructor(e){this.instance=s.default.create(e),this.instance.interceptors.request.use((e=>(e.metadata={startTime:Date.now()},t.default.logRequest(e),e)),(e=>e)),this.instance.interceptors.response.use((e=>{const s=e.config?.metadata?.startTime||Date.now();return t.default.logResponse(e,s),e.data}),(e=>{const s=e.config?.metadata?.startTime||Date.now();return t.default.logError(e,s),e})),this.instance.interceptors.request.use(e.interceptors?.requestSuccessFn,e.interceptors?.requestFailFn),this.instance.interceptors.response.use(e.interceptors?.responseSuccessFn,e.interceptors?.responseFailFn)}request(e){return e.interceptors?.requestSuccessFn&&(e=e.interceptors.requestSuccessFn(e)),new Promise(((t,s)=>{this.instance.request(e).then((s=>{e.interceptors?.responseSuccessFn&&(s=e.interceptors.responseSuccessFn(s)),t(s)})).catch((e=>{s(e)}))}))}get(e){return this.request({method:"GET",...e})}post(e){return this.request({method:"POST",...e})}patch(e){return this.request({method:"PATCH",...e})}delete(e){return this.request({method:"DELETE",...e})}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),(e=>e&&e.__esModule?e:{default:e})(require("dotenv")).default.config();const e="true"===process.env.CONSOLE;exports.default=class{static formatTime(){const e=new Date;return`${e.getFullYear()}/${String(e.getMonth()+1).padStart(2,"0")}/${String(e.getDate()).padStart(2,"0")} ${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}:${String(e.getSeconds()).padStart(2,"0")}.${String(e.getMilliseconds()).padStart(3,"0")}`}static safeStringify(e,o=1e3){if(!e)return"null";try{let t=JSON.stringify(e,null,2);return t.length>o&&(t=t.substring(0,o)+"\n... (truncated)"),t}catch(e){return"[无法序列化]"}}static logRequest(o){if(!e)return;const t=this.formatTime(),n=o.method?.toUpperCase()||"UNKNOWN",s=o.url||"unknown",r=(o.baseURL||"")+s;console.log("\n"+"=".repeat(80)),console.log(`[${t}] 📤 API 请求`),console.log(`方法: ${n}`),console.log(`地址: ${r}`),o.params&&Object.keys(o.params).length>0&&console.log("查询参数:",this.safeStringify(o.params)),o.data&&Object.keys(o.data).length>0&&console.log("请求体:",this.safeStringify(o.data)),console.log("=".repeat(80))}static logResponse(o,t){if(!e)return;const n=this.formatTime(),s=Date.now()-t,r=o?.status||"unknown",a=o?.config?.method?.toUpperCase()||"UNKNOWN",l=o?.config?.url||"unknown";console.log("\n"+"=".repeat(80)),console.log(`[${n}] 📥 API 响应 (耗时: ${s}ms)`),console.log(`方法: ${a}`),console.log(`地址: ${l}`),console.log(`状态: ${r}`),console.log("响应数据:",this.safeStringify(o?.data||o)),console.log("=".repeat(80)+"\n")}static logError(error,o){if(!e)return;const t=this.formatTime(),n=Date.now()-o,s=error?.config?.method?.toUpperCase()||"UNKNOWN",r=error?.config?.url||"unknown",a=error?.response?.status||"no response";console.log("\n"+"=".repeat(80)),console.log(`[${t}] ❌ API 错误 (耗时: ${n}ms)`),console.log(`方法: ${s}`),console.log(`地址: ${r}`),console.log(`状态: ${a}`),console.log("错误信息:",error?.message||"未知错误"),error?.response?.data&&console.log("错误详情:",this.safeStringify(error.response.data)),console.log("=".repeat(80)+"\n")}};
|
|
@@ -46,6 +46,7 @@ class Api {
|
|
|
46
46
|
wxid;
|
|
47
47
|
callback;
|
|
48
48
|
poll_message_timer;
|
|
49
|
+
poll_heart_timer;
|
|
49
50
|
constructor(e) {
|
|
50
51
|
this._client = e;
|
|
51
52
|
}
|
|
@@ -147,27 +148,33 @@ class Api {
|
|
|
147
148
|
});
|
|
148
149
|
}
|
|
149
150
|
poll_heart() {
|
|
150
|
-
|
|
151
|
+
this.poll_heart_timer && this.poll_heart_timer.stop();
|
|
152
|
+
const e = new a;
|
|
153
|
+
this.poll_heart_timer = e, e.poll(15e4, (async () => {
|
|
151
154
|
try {
|
|
152
155
|
await this.heart();
|
|
153
156
|
} catch (e) {
|
|
154
|
-
|
|
157
|
+
console.error("Heart beat failed, kicking out...", e), this.poll_message_timer?.stop(),
|
|
158
|
+
this.poll_heart_timer?.stop(), await (this._cacheMgr?.close()), this._cacheMgr = void 0,
|
|
155
159
|
this._client.emit("kickout", "");
|
|
156
160
|
}
|
|
157
161
|
}));
|
|
158
162
|
}
|
|
159
|
-
async heart(t =
|
|
163
|
+
async heart(t = 3) {
|
|
160
164
|
let a = 0;
|
|
161
165
|
for (;a < t; ) {
|
|
162
166
|
try {
|
|
163
167
|
let t = await e.post({
|
|
164
168
|
url: `/Login/HeartBeat?wxid=${this.wxid}`
|
|
165
169
|
});
|
|
166
|
-
if ("成功" === t.Message
|
|
170
|
+
if (t && "成功" === t.Message) {
|
|
167
171
|
return t;
|
|
168
172
|
}
|
|
169
|
-
|
|
170
|
-
|
|
173
|
+
console.warn(`HeartBeat attempt ${a + 1} got unexpected response:`, t?.Message || "no response");
|
|
174
|
+
} catch (e) {
|
|
175
|
+
console.error(`HeartBeat attempt ${a + 1} failed:`, e.message);
|
|
176
|
+
}
|
|
177
|
+
a++, a < t && await new Promise((e => setTimeout(e, 2e3)));
|
|
171
178
|
}
|
|
172
179
|
throw new Error("HeartBeat failed after multiple attempts");
|
|
173
180
|
}
|
|
@@ -1,20 +1,29 @@
|
|
|
1
1
|
import e from "axios";
|
|
2
2
|
|
|
3
|
+
import t from "../utils/api-logger.js";
|
|
4
|
+
|
|
3
5
|
class SyRequest {
|
|
4
6
|
instance;
|
|
5
7
|
constructor(s) {
|
|
6
|
-
this.instance = e.create(s), this.instance.interceptors.request.use((e =>
|
|
7
|
-
|
|
8
|
+
this.instance = e.create(s), this.instance.interceptors.request.use((e => (e.metadata = {
|
|
9
|
+
startTime: Date.now()
|
|
10
|
+
}, t.logRequest(e), e)), (e => e)), this.instance.interceptors.response.use((e => {
|
|
11
|
+
const s = e.config?.metadata?.startTime || Date.now();
|
|
12
|
+
return t.logResponse(e, s), e.data;
|
|
13
|
+
}), (e => {
|
|
14
|
+
const s = e.config?.metadata?.startTime || Date.now();
|
|
15
|
+
return t.logError(e, s), e;
|
|
16
|
+
})), this.instance.interceptors.request.use(s.interceptors?.requestSuccessFn, s.interceptors?.requestFailFn),
|
|
8
17
|
this.instance.interceptors.response.use(s.interceptors?.responseSuccessFn, s.interceptors?.responseFailFn);
|
|
9
18
|
}
|
|
10
19
|
request(e) {
|
|
11
20
|
return e.interceptors?.requestSuccessFn && (e = e.interceptors.requestSuccessFn(e)),
|
|
12
|
-
new Promise(((
|
|
13
|
-
this.instance.request(e).then((
|
|
14
|
-
e.interceptors?.responseSuccessFn && (
|
|
15
|
-
s
|
|
21
|
+
new Promise(((t, s) => {
|
|
22
|
+
this.instance.request(e).then((s => {
|
|
23
|
+
e.interceptors?.responseSuccessFn && (s = e.interceptors.responseSuccessFn(s)),
|
|
24
|
+
t(s);
|
|
16
25
|
})).catch((e => {
|
|
17
|
-
|
|
26
|
+
s(e);
|
|
18
27
|
}));
|
|
19
28
|
}));
|
|
20
29
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import o from "dotenv";
|
|
2
|
+
|
|
3
|
+
o.config();
|
|
4
|
+
|
|
5
|
+
const t = "true" === process.env.CONSOLE;
|
|
6
|
+
|
|
7
|
+
class ApiLogger {
|
|
8
|
+
static formatTime() {
|
|
9
|
+
const o = new Date;
|
|
10
|
+
return `${o.getFullYear()}/${String(o.getMonth() + 1).padStart(2, "0")}/${String(o.getDate()).padStart(2, "0")} ${String(o.getHours()).padStart(2, "0")}:${String(o.getMinutes()).padStart(2, "0")}:${String(o.getSeconds()).padStart(2, "0")}.${String(o.getMilliseconds()).padStart(3, "0")}`;
|
|
11
|
+
}
|
|
12
|
+
static safeStringify(o, t = 1e3) {
|
|
13
|
+
if (!o) {
|
|
14
|
+
return "null";
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
let e = JSON.stringify(o, null, 2);
|
|
18
|
+
return e.length > t && (e = e.substring(0, t) + "\n... (truncated)"), e;
|
|
19
|
+
} catch (o) {
|
|
20
|
+
return "[无法序列化]";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
static logRequest(o) {
|
|
24
|
+
if (!t) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const e = this.formatTime(), n = o.method?.toUpperCase() || "UNKNOWN", s = o.url || "unknown", r = (o.baseURL || "") + s;
|
|
28
|
+
console.log("\n" + "=".repeat(80)), console.log(`[${e}] 📤 API 请求`), console.log(`方法: ${n}`),
|
|
29
|
+
console.log(`地址: ${r}`), o.params && Object.keys(o.params).length > 0 && console.log("查询参数:", this.safeStringify(o.params)),
|
|
30
|
+
o.data && Object.keys(o.data).length > 0 && console.log("请求体:", this.safeStringify(o.data)),
|
|
31
|
+
console.log("=".repeat(80));
|
|
32
|
+
}
|
|
33
|
+
static logResponse(o, e) {
|
|
34
|
+
if (!t) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const n = this.formatTime(), s = Date.now() - e, r = o?.status || "unknown", a = o?.config?.method?.toUpperCase() || "UNKNOWN", l = o?.config?.url || "unknown";
|
|
38
|
+
console.log("\n" + "=".repeat(80)), console.log(`[${n}] 📥 API 响应 (耗时: ${s}ms)`),
|
|
39
|
+
console.log(`方法: ${a}`), console.log(`地址: ${l}`), console.log(`状态: ${r}`), console.log("响应数据:", this.safeStringify(o?.data || o)),
|
|
40
|
+
console.log("=".repeat(80) + "\n");
|
|
41
|
+
}
|
|
42
|
+
static logError(error, o) {
|
|
43
|
+
if (!t) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const e = this.formatTime(), n = Date.now() - o, s = error?.config?.method?.toUpperCase() || "UNKNOWN", r = error?.config?.url || "unknown", a = error?.response?.status || "no response";
|
|
47
|
+
console.log("\n" + "=".repeat(80)), console.log(`[${e}] ❌ API 错误 (耗时: ${n}ms)`),
|
|
48
|
+
console.log(`方法: ${s}`), console.log(`地址: ${r}`), console.log(`状态: ${a}`), console.log("错误信息:", error?.message || "未知错误"),
|
|
49
|
+
error?.response?.data && console.log("错误详情:", this.safeStringify(error.response.data)),
|
|
50
|
+
console.log("=".repeat(80) + "\n");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export { ApiLogger as default };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 日志工具类
|
|
3
|
+
*/
|
|
4
|
+
declare class ApiLogger {
|
|
5
|
+
/**
|
|
6
|
+
* 格式化当前时间
|
|
7
|
+
*/
|
|
8
|
+
static formatTime(): string;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 安全的 JSON 序列化
|
|
12
|
+
*/
|
|
13
|
+
static safeStringify(obj: any, maxLength?: number): string;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 打印请求日志
|
|
17
|
+
*/
|
|
18
|
+
static logRequest(config: any): void;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 打印响应日志
|
|
22
|
+
*/
|
|
23
|
+
static logResponse(response: any, startTime: number): void;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 打印错误日志
|
|
27
|
+
*/
|
|
28
|
+
static logError(error: any, startTime: number): void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default ApiLogger;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wechaty-puppet-padplus2",
|
|
3
|
-
"version": "3.1.
|
|
4
|
-
"description": "Wechaty PadPlus 微信
|
|
3
|
+
"version": "3.1.4",
|
|
4
|
+
"description": "Wechaty PadPlus 微信 稳定长链接协议实现",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cjs/mod.cjs",
|
|
7
7
|
"module": "dist/esm/mod.js",
|
|
@@ -119,5 +119,6 @@
|
|
|
119
119
|
"wechaty-puppet": "latest",
|
|
120
120
|
"xml2js": "^0.6.2",
|
|
121
121
|
"xmlreader": "^0.2.3"
|
|
122
|
-
}
|
|
123
|
-
|
|
122
|
+
},
|
|
123
|
+
"packageManager": "pnpm@10.27.0+sha512.72d699da16b1179c14ba9e64dc71c9a40988cbdc65c264cb0e489db7de917f20dcf4d64d8723625f2969ba52d4b7e2a1170682d9ac2a5dcaeaab732b7e16f04a"
|
|
124
|
+
}
|