From 0c6fa63391cb1c3ca7fe8e9534dae4a9f36a0546 Mon Sep 17 00:00:00 2001 From: eatMoreApple <15055461510@163.com> Date: Tue, 11 May 2021 18:00:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=86=85=E9=83=A8host?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.go | 7 +-- caller.go | 22 +++++---- client.go | 75 ++++++++++++++++------------- global.go | 72 ++++++---------------------- url.go | 141 ++++++++++++++++++++---------------------------------- 5 files changed, 125 insertions(+), 192 deletions(-) diff --git a/bot.go b/bot.go index 0766391..7da9626 100644 --- a/bot.go +++ b/bot.go @@ -308,13 +308,14 @@ func DefaultBot(modes ...mode) *Bot { } else { m = modes[0] } - urlManager := GetUrlManagerByMode(m) - return NewBot(DefaultCaller(urlManager)) + caller := DefaultCaller() + caller.Client.mode = m + return NewBot(caller) } // 通过uuid获取登录二维码的url func GetQrcodeUrl(uuid string) string { - return qrcodeUrl + uuid + return qrcode + uuid } // 打印登录二维码 diff --git a/caller.go b/caller.go index e19de9f..d15fe11 100644 --- a/caller.go +++ b/caller.go @@ -3,8 +3,8 @@ package openwechat import ( "errors" "net/http" + "net/url" "os" - "strings" ) // 调用请求和解析请求 @@ -19,8 +19,8 @@ func NewCaller(client *Client) *Caller { } // Default Constructor for Caller -func DefaultCaller(urlManager UrlManager) *Caller { - return NewCaller(DefaultClient(urlManager)) +func DefaultCaller() *Caller { + return NewCaller(DefaultClient()) } // 获取登录的uuid @@ -71,13 +71,17 @@ func (c *Caller) GetLoginInfo(body []byte) (*LoginInfo, error) { if len(results) != 2 { return nil, errors.New("redirect url does not match") } - path := string(results[1]) - if strings.Contains(path, "wx2") { - c.Client.UrlManager = normal - } else { - c.Client.UrlManager = desktop + path, err := url.Parse(string(results[1])) + if err != nil { + return nil, err } - resp := NewReturnResponse(c.Client.GetLoginInfo(path)) + host := path.Host + domain, err := getDomainByHost(host) + if err != nil { + return nil, err + } + c.Client.domain = domain + resp := NewReturnResponse(c.Client.GetLoginInfo(path.String())) if resp.Err() != nil { return nil, resp.Err() } diff --git a/client.go b/client.go index 0d9fbee..1e54d32 100644 --- a/client.go +++ b/client.go @@ -40,18 +40,19 @@ func (u UserAgentHook) AfterRequest(response *http.Response, err error) {} type Client struct { HttpHooks HttpHooks *http.Client - UrlManager + domain *domain + mode mode mu sync.Mutex cookies map[string][]*http.Cookie } -func NewClient(client *http.Client, urlManager UrlManager) *Client { - return &Client{Client: client, UrlManager: urlManager} +func NewClient(client *http.Client) *Client { + return &Client{Client: client} } // 自动存储cookie // 设置客户端不自动跳转 -func DefaultClient(urlManager UrlManager) *Client { +func DefaultClient() *Client { jar, _ := cookiejar.New(nil) client := &http.Client{ CheckRedirect: func(req *http.Request, via []*http.Request) error { @@ -59,7 +60,7 @@ func DefaultClient(urlManager UrlManager) *Client { }, Jar: jar, } - c := NewClient(client, urlManager) + c := NewClient(client) c.AddHttpHook(UserAgentHook{}) return c } @@ -106,13 +107,19 @@ func (c *Client) GetCookieMap() map[string][]*http.Cookie { // 获取登录的uuid func (c *Client) GetLoginUUID() (*http.Response, error) { - path, _ := url.Parse(jsLoginUrl) + path, _ := url.Parse(jslogin) params := url.Values{} + redirectUrl, _ := url.Parse(webwxnewloginpage) + if c.mode == Desktop { + p := url.Values{"mod": {"desktop"}} + redirectUrl.RawQuery = p.Encode() + } + params.Add("redirect_uri", redirectUrl.String()) params.Add("appid", appId) - params.Add("redirect_uri", c.webWxNewLoginPageUrl) params.Add("fun", "new") params.Add("lang", "zh_CN") params.Add("_", strconv.FormatInt(time.Now().Unix(), 10)) + path.RawQuery = params.Encode() req, _ := http.NewRequest(http.MethodGet, path.String(), nil) return c.Do(req) @@ -120,13 +127,13 @@ func (c *Client) GetLoginUUID() (*http.Response, error) { // 获取登录的二维吗 func (c *Client) GetLoginQrcode(uuid string) (*http.Response, error) { - path := qrcodeUrl + uuid + path := qrcode + uuid return c.Get(path) } // 检查是否登录 func (c *Client) CheckLogin(uuid string) (*http.Response, error) { - path, _ := url.Parse(loginUrl) + path, _ := url.Parse(login) now := time.Now().Unix() params := url.Values{} params.Add("r", strconv.FormatInt(now/1579, 10)) @@ -142,14 +149,16 @@ func (c *Client) CheckLogin(uuid string) (*http.Response, error) { // GetLoginInfo 请求获取LoginInfo func (c *Client) GetLoginInfo(path string) (*http.Response, error) { req, _ := http.NewRequest(http.MethodGet, path, nil) - req.Header.Add("client-version", uosPatchClientVersion) - req.Header.Add("extspam", uosPatchExtspam) + if c.mode == Desktop { + req.Header.Add("client-version", uosPatchClientVersion) + req.Header.Add("extspam", uosPatchExtspam) + } return c.Do(req) } // 请求获取初始化信息 func (c *Client) WebInit(request *BaseRequest) (*http.Response, error) { - path, _ := url.Parse(c.webWxInitUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxinit) params := url.Values{} params.Add("_", fmt.Sprintf("%d", time.Now().Unix())) path.RawQuery = params.Encode() @@ -165,7 +174,7 @@ func (c *Client) WebInit(request *BaseRequest) (*http.Response, error) { // 通知手机已登录 func (c *Client) WebWxStatusNotify(request *BaseRequest, response *WebInitResponse, info *LoginInfo) (*http.Response, error) { - path, _ := url.Parse(c.webWxStatusNotifyUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxstatusnotify) params := url.Values{} params.Add("lang", "zh_CN") params.Add("pass_ticket", info.PassTicket) @@ -186,7 +195,7 @@ func (c *Client) WebWxStatusNotify(request *BaseRequest, response *WebInitRespon // 异步检查是否有新的消息返回 func (c *Client) SyncCheck(info *LoginInfo, response *WebInitResponse) (*http.Response, error) { - path, _ := url.Parse(c.syncCheckUrl) + path, _ := url.Parse(c.domain.SyncHost + synccheck) params := url.Values{} params.Add("r", strconv.FormatInt(time.Now().Unix(), 10)) params.Add("skey", info.SKey) @@ -209,7 +218,7 @@ func (c *Client) SyncCheck(info *LoginInfo, response *WebInitResponse) (*http.Re // 获取联系人信息 func (c *Client) WebWxGetContact(info *LoginInfo) (*http.Response, error) { - path, _ := url.Parse(c.webWxGetContactUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxgetcontact) params := url.Values{} params.Add("r", strconv.FormatInt(time.Now().Unix(), 10)) params.Add("skey", info.SKey) @@ -221,7 +230,7 @@ func (c *Client) WebWxGetContact(info *LoginInfo) (*http.Response, error) { // 获取联系人详情 func (c *Client) WebWxBatchGetContact(members Members, request *BaseRequest) (*http.Response, error) { - path, _ := url.Parse(c.webWxBatchGetContactUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxbatchgetcontact) params := url.Values{} params.Add("type", "ex") params.Add("r", strconv.FormatInt(time.Now().Unix(), 10)) @@ -240,7 +249,7 @@ func (c *Client) WebWxBatchGetContact(members Members, request *BaseRequest) (*h // 获取消息接口 func (c *Client) WebWxSync(request *BaseRequest, response *WebInitResponse, info *LoginInfo) (*http.Response, error) { - path, _ := url.Parse(c.webWxSyncUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxsync) params := url.Values{} params.Add("sid", info.WxSid) params.Add("skey", info.SKey) @@ -274,7 +283,7 @@ func (c *Client) sendMessage(request *BaseRequest, url string, msg *SendMessage) // 发送文本消息 func (c *Client) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRequest) (*http.Response, error) { msg.Type = TextMessage - path, _ := url.Parse(c.webWxSendMsgUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxsendmsg) params := url.Values{} params.Add("lang", "zh_CN") params.Add("pass_ticket", info.PassTicket) @@ -284,7 +293,7 @@ func (c *Client) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRe // 获取用户的头像 func (c *Client) WebWxGetHeadImg(headImageUrl string) (*http.Response, error) { - path := c.baseUrl + headImageUrl + path := c.domain.BaseHost + headImageUrl req, _ := http.NewRequest(http.MethodGet, path, nil) return c.Do(req) } @@ -319,7 +328,7 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in // 获取文件的类型 mediaType := getMessageType(sate.Name()) - path, _ := url.Parse(c.webWxUpLoadMediaUrl) + path, _ := url.Parse(c.domain.FileHost + webwxuploadmedia) params := url.Values{} params.Add("f", "json") @@ -435,7 +444,7 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in // 发送的图片必须是已经成功上传的图片 func (c *Client) WebWxSendMsgImg(msg *SendMessage, request *BaseRequest, info *LoginInfo) (*http.Response, error) { msg.Type = ImageMessage - path, _ := url.Parse(c.webWxSendMsgImgUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxsendmsgimg) params := url.Values{} params.Add("fun", "async") params.Add("f", "json") @@ -448,7 +457,7 @@ func (c *Client) WebWxSendMsgImg(msg *SendMessage, request *BaseRequest, info *L // 发送文件信息 func (c *Client) WebWxSendAppMsg(msg *SendMessage, request *BaseRequest) (*http.Response, error) { msg.Type = AppMessage - path, _ := url.Parse(c.webWxSendAppMsgUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxsendappmsg) params := url.Values{} params.Add("fun", "async") params.Add("f", "json") @@ -458,7 +467,7 @@ func (c *Client) WebWxSendAppMsg(msg *SendMessage, request *BaseRequest) (*http. // 用户重命名接口 func (c *Client) WebWxOplog(request *BaseRequest, remarkName, userName string) (*http.Response, error) { - path, _ := url.Parse(c.webWxOplogUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxoplog) params := url.Values{} params.Add("lang", "zh_CN") path.RawQuery = params.Encode() @@ -477,7 +486,7 @@ func (c *Client) WebWxOplog(request *BaseRequest, remarkName, userName string) ( // 添加用户为好友接口 func (c *Client) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyContent string) (*http.Response, error) { loginInfo := storage.LoginInfo - path, _ := url.Parse(c.webWxVerifyUserUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxverifyuser) params := url.Values{} params.Add("r", strconv.FormatInt(time.Now().Unix(), 10)) params.Add("lang", "zh_CN") @@ -504,7 +513,7 @@ func (c *Client) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyCon // 获取图片消息的图片响应 func (c *Client) WebWxGetMsgImg(msg *Message, info *LoginInfo) (*http.Response, error) { - path, _ := url.Parse(c.webWxGetMsgImgUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxgetmsgimg) params := url.Values{} params.Add("MsgID", msg.MsgId) params.Add("skey", info.SKey) @@ -516,7 +525,7 @@ func (c *Client) WebWxGetMsgImg(msg *Message, info *LoginInfo) (*http.Response, // 获取语音消息的语音响应 func (c *Client) WebWxGetVoice(msg *Message, info *LoginInfo) (*http.Response, error) { - path, _ := url.Parse(c.webWxGetVoiceUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxgetvoice) params := url.Values{} params.Add("msgid", msg.MsgId) params.Add("skey", info.SKey) @@ -527,7 +536,7 @@ func (c *Client) WebWxGetVoice(msg *Message, info *LoginInfo) (*http.Response, e // 获取视频消息的视频响应 func (c *Client) WebWxGetVideo(msg *Message, info *LoginInfo) (*http.Response, error) { - path, _ := url.Parse(c.webWxGetVideoUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxgetvideo) params := url.Values{} params.Add("msgid", msg.MsgId) params.Add("skey", info.SKey) @@ -538,7 +547,7 @@ func (c *Client) WebWxGetVideo(msg *Message, info *LoginInfo) (*http.Response, e // 获取文件消息的文件响应 func (c *Client) WebWxGetMedia(msg *Message, info *LoginInfo) (*http.Response, error) { - path, _ := url.Parse(c.webWxGetMediaUrl) + path, _ := url.Parse(c.domain.FileHost + webwxgetmedia) params := url.Values{} params.Add("sender", msg.FromUserName) params.Add("mediaid", msg.MediaId) @@ -553,7 +562,7 @@ func (c *Client) WebWxGetMedia(msg *Message, info *LoginInfo) (*http.Response, e // 用户退出 func (c *Client) Logout(info *LoginInfo) (*http.Response, error) { - path, _ := url.Parse(c.webWxLogoutUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxlogout) params := url.Values{} params.Add("redirect", "1") params.Add("type", "1") @@ -565,7 +574,7 @@ func (c *Client) Logout(info *LoginInfo) (*http.Response, error) { // 添加用户进群聊 func (c *Client) AddMemberIntoChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*Friend) (*http.Response, error) { - path, _ := url.Parse(c.webWxUpdateChatRoomUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxupdatechatroom) params := url.Values{} params.Add("fun", "addmember") params.Add("pass_ticket", info.PassTicket) @@ -588,7 +597,7 @@ func (c *Client) AddMemberIntoChatRoom(req *BaseRequest, info *LoginInfo, group // 从群聊中移除用户 func (c *Client) RemoveMemberFromChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*User) (*http.Response, error) { - path, _ := url.Parse(c.webWxUpdateChatRoomUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxupdatechatroom) params := url.Values{} params.Add("fun", "delmember") params.Add("lang", "zh_CN") @@ -617,14 +626,14 @@ func (c *Client) WebWxRevokeMsg(msg *SentMessage, request *BaseRequest) (*http.R "ToUserName": msg.ToUserName, } buffer, _ := ToBuffer(content) - req, _ := http.NewRequest(http.MethodPost, c.webWxRevokeMsg, buffer) + req, _ := http.NewRequest(http.MethodPost, c.domain.BaseHost+webwxrevokemsg, buffer) req.Header.Set("Content-Type", jsonContentType) return c.Do(req) } // 校验上传文件 func (c *Client) webWxCheckUpload(stat os.FileInfo, request *BaseRequest, fileMd5, fromUserName, toUserName string) (*http.Response, error) { - path, _ := url.Parse(c.webWxCheckUploadUrl) + path, _ := url.Parse(c.domain.BaseHost + webwxcheckupload) content := map[string]interface{}{ "BaseRequest": request, "FileMd5": fileMd5, diff --git a/global.go b/global.go index 8287fcc..1bf640e 100644 --- a/global.go +++ b/global.go @@ -13,64 +13,24 @@ var ( ) const ( - appId = "wx782c26e4c19acffb" - jsLoginUrl = "https://login.wx.qq.com/jslogin" - qrcodeUrl = "https://login.weixin.qq.com/qrcode/" - loginUrl = "https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login" - - // Normal urls - - baseNormalUrl = "https://wx2.qq.com" - webWxNewLoginPageNormalUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage" - webWxInitNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit" - webWxStatusNotifyNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify" - webWxSyncNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync" - webWxSendMsgNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg" - webWxGetContactNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact" - webWxSendMsgImgNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsgimg" - webWxSendAppMsgNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendappmsg" - webWxBatchGetContactNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact" - webWxOplogNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxoplog" - webWxVerifyUserNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxverifyuser" - syncCheckNormalUrl = "https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck" - webWxUpLoadMediaNormalUrl = "https://file.wx2.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia" - webWxGetMsgImgNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetmsgimg" - webWxGetVoiceNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetvoice" - webWxGetVideoNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetvideo" - webWxLogoutNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxlogout" - webWxGetMediaNormalUrl = "https://file.wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetmedia" - webWxUpdateChatRoomNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxupdatechatroom" - webWxRevokeMsgNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxrevokemsg" - webWxCheckUploadNormalUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxcheckupload" - - // Desktop urls - - baseDesktopUrl = "https://wx.qq.com" - webWxNewLoginPageDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?mod=desktop" - webWxInitDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit" - webWxStatusNotifyDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify" - webWxSyncDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync" - webWxSendMsgDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg" - webWxGetContactDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact" - webWxSendMsgImgDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsgimg" - webWxSendAppMsgDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendappmsg" - webWxBatchGetContactDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact" - webWxOplogDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxoplog" - webWxVerifyUserDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxverifyuser" - syncCheckDesktopUrl = "https://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck" - webWxUpLoadMediaDesktopUrl = "https://file.wx.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia" - webWxGetMsgImgDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetmsgimg" - webWxGetVoiceDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetvoice" - webWxGetVideoDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetvideo" - webWxLogoutDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxlogout" - webWxGetMediaDesktopUrl = "https://file.wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetmedia" - webWxUpdateChatRoomDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxupdatechatroom" - webWxRevokeMsgDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxrevokemsg" - webWxCheckUploadDesktopUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxcheckupload" + appId = "wx782c26e4c19acffb" + appMessageAppId = "wxeb7ec651dd0aefa9" jsonContentType = "application/json; charset=utf-8" uosPatchClientVersion = "2.0.0" - uosPatchExtspam = "Gp8ICJkIEpkICggwMDAwMDAwMRAGGoAI1GiJSIpeO1RZTq9QBKsRbPJdi84ropi16EYI10WB6g74sGmRwSNXjPQnYUKYotKkvLGpshucCaeWZMOylnc6o2AgDX9grhQQx7fm2DJRTyuNhUlwmEoWhjoG3F0ySAWUsEbH3bJMsEBwoB//0qmFJob74ffdaslqL+IrSy7LJ76/G5TkvNC+J0VQkpH1u3iJJs0uUYyLDzdBIQ6Ogd8LDQ3VKnJLm4g/uDLe+G7zzzkOPzCjXL+70naaQ9medzqmh+/SmaQ6uFWLDQLcRln++wBwoEibNpG4uOJvqXy+ql50DjlNchSuqLmeadFoo9/mDT0q3G7o/80P15ostktjb7h9bfNc+nZVSnUEJXbCjTeqS5UYuxn+HTS5nZsPVxJA2O5GdKCYK4x8lTTKShRstqPfbQpplfllx2fwXcSljuYi3YipPyS3GCAqf5A7aYYwJ7AvGqUiR2SsVQ9Nbp8MGHET1GxhifC692APj6SJxZD3i1drSYZPMMsS9rKAJTGz2FEupohtpf2tgXm6c16nDk/cw+C7K7me5j5PLHv55DFCS84b06AytZPdkFZLj7FHOkcFGJXitHkX5cgww7vuf6F3p0yM/W73SoXTx6GX4G6Hg2rYx3O/9VU2Uq8lvURB4qIbD9XQpzmyiFMaytMnqxcZJcoXCtfkTJ6pI7a92JpRUvdSitg967VUDUAQnCXCM/m0snRkR9LtoXAO1FUGpwlp1EfIdCZFPKNnXMeqev0j9W9ZrkEs9ZWcUEexSj5z+dKYQBhIICviYUQHVqBTZSNy22PlUIeDeIs11j7q4t8rD8LPvzAKWVqXE+5lS1JPZkjg4y5hfX1Dod3t96clFfwsvDP6xBSe1NBcoKbkyGxYK0UvPGtKQEE0Se2zAymYDv41klYE9s+rxp8e94/H8XhrL9oGm8KWb2RmYnAE7ry9gd6e8ZuBRIsISlJAE/e8y8xFmP031S6Lnaet6YXPsFpuFsdQs535IjcFd75hh6DNMBYhSfjv456cvhsb99+fRw/KVZLC3yzNSCbLSyo9d9BI45Plma6V8akURQA/qsaAzU0VyTIqZJkPDTzhuCl92vD2AD/QOhx6iwRSVPAxcRFZcWjgc2wCKh+uCYkTVbNQpB9B90YlNmI3fWTuUOUjwOzQRxJZj11NsimjOJ50qQwTTFj6qQvQ1a/I+MkTx5UO+yNHl718JWcR3AXGmv/aa9rD1eNP8ioTGlOZwPgmr2sor2iBpKTOrB83QgZXP+xRYkb4zVC+LoAXEoIa1+zArywlgREer7DLePukkU6wHTkuSaF+ge5Of1bXuU4i938WJHj0t3D8uQxkJvoFi/EYN/7u2P1zGRLV4dHVUsZMGCCtnO6BBigFMAA=" + uosPatchExtspam = "Gp8ICJkIEpkICggwMDAwMDAwMRAGGoAI1GiJSIpeO1RZTq9QBKsRbPJdi84ropi16EYI10WB6g74sGmRwSNXjPQnYU" + + "KYotKkvLGpshucCaeWZMOylnc6o2AgDX9grhQQx7fm2DJRTyuNhUlwmEoWhjoG3F0ySAWUsEbH3bJMsEBwoB//0qmFJob74ffdaslqL+IrSy7L" + + "J76/G5TkvNC+J0VQkpH1u3iJJs0uUYyLDzdBIQ6Ogd8LDQ3VKnJLm4g/uDLe+G7zzzkOPzCjXL+70naaQ9medzqmh+/SmaQ6uFWLDQLcRln++w" + + "BwoEibNpG4uOJvqXy+ql50DjlNchSuqLmeadFoo9/mDT0q3G7o/80P15ostktjb7h9bfNc+nZVSnUEJXbCjTeqS5UYuxn+HTS5nZsPVxJA2O5G" + + "dKCYK4x8lTTKShRstqPfbQpplfllx2fwXcSljuYi3YipPyS3GCAqf5A7aYYwJ7AvGqUiR2SsVQ9Nbp8MGHET1GxhifC692APj6SJxZD3i1drSY" + + "ZPMMsS9rKAJTGz2FEupohtpf2tgXm6c16nDk/cw+C7K7me5j5PLHv55DFCS84b06AytZPdkFZLj7FHOkcFGJXitHkX5cgww7vuf6F3p0yM/W73" + + "SoXTx6GX4G6Hg2rYx3O/9VU2Uq8lvURB4qIbD9XQpzmyiFMaytMnqxcZJcoXCtfkTJ6pI7a92JpRUvdSitg967VUDUAQnCXCM/m0snRkR9LtoX" + + "AO1FUGpwlp1EfIdCZFPKNnXMeqev0j9W9ZrkEs9ZWcUEexSj5z+dKYQBhIICviYUQHVqBTZSNy22PlUIeDeIs11j7q4t8rD8LPvzAKWVqXE+5l" + + "S1JPZkjg4y5hfX1Dod3t96clFfwsvDP6xBSe1NBcoKbkyGxYK0UvPGtKQEE0Se2zAymYDv41klYE9s+rxp8e94/H8XhrL9oGm8KWb2RmYnAE7r" + + "y9gd6e8ZuBRIsISlJAE/e8y8xFmP031S6Lnaet6YXPsFpuFsdQs535IjcFd75hh6DNMBYhSfjv456cvhsb99+fRw/KVZLC3yzNSCbLSyo9d9BI" + + "45Plma6V8akURQA/qsaAzU0VyTIqZJkPDTzhuCl92vD2AD/QOhx6iwRSVPAxcRFZcWjgc2wCKh+uCYkTVbNQpB9B90YlNmI3fWTuUOUjwOzQRx" + + "JZj11NsimjOJ50qQwTTFj6qQvQ1a/I+MkTx5UO+yNHl718JWcR3AXGmv/aa9rD1eNP8ioTGlOZwPgmr2sor2iBpKTOrB83QgZXP+xRYkb4zVC+" + + "LoAXEoIa1+zArywlgREer7DLePukkU6wHTkuSaF+ge5Of1bXuU4i938WJHj0t3D8uQxkJvoFi/EYN/7u2P1zGRLV4dHVUsZMGCCtnO6BBigFMAA=" ) // 消息类型 @@ -124,5 +84,3 @@ var imageType = map[string]bool{ } var videoType = "mp4" - -const appMessageAppId = "wxeb7ec651dd0aefa9" diff --git a/url.go b/url.go index 42a539e..c12736b 100644 --- a/url.go +++ b/url.go @@ -1,84 +1,6 @@ package openwechat -// url信息存储 -type UrlManager struct { - baseUrl string - webWxNewLoginPageUrl string - webWxInitUrl string - webWxStatusNotifyUrl string - webWxSyncUrl string - webWxSendMsgUrl string - webWxGetContactUrl string - webWxSendMsgImgUrl string - webWxSendAppMsgUrl string - webWxBatchGetContactUrl string - webWxOplogUrl string - webWxVerifyUserUrl string - syncCheckUrl string - webWxUpLoadMediaUrl string - webWxGetMsgImgUrl string - webWxGetVoiceUrl string - webWxGetVideoUrl string - webWxLogoutUrl string - webWxGetMediaUrl string - webWxUpdateChatRoomUrl string - webWxRevokeMsg string - webWxCheckUploadUrl string -} - -var ( - // uos版 - desktop = UrlManager{ - baseUrl: baseDesktopUrl, - webWxNewLoginPageUrl: webWxNewLoginPageDesktopUrl, - webWxInitUrl: webWxInitDesktopUrl, - webWxStatusNotifyUrl: webWxStatusNotifyDesktopUrl, - webWxSyncUrl: webWxSyncDesktopUrl, - webWxSendMsgUrl: webWxSendMsgDesktopUrl, - webWxGetContactUrl: webWxGetContactDesktopUrl, - webWxSendMsgImgUrl: webWxSendMsgImgDesktopUrl, - webWxSendAppMsgUrl: webWxSendAppMsgDesktopUrl, - webWxBatchGetContactUrl: webWxBatchGetContactDesktopUrl, - webWxOplogUrl: webWxOplogDesktopUrl, - webWxVerifyUserUrl: webWxVerifyUserDesktopUrl, - syncCheckUrl: syncCheckDesktopUrl, - webWxUpLoadMediaUrl: webWxUpLoadMediaDesktopUrl, - webWxGetMsgImgUrl: webWxGetMsgImgDesktopUrl, - webWxGetVoiceUrl: webWxGetVoiceDesktopUrl, - webWxGetVideoUrl: webWxGetVideoDesktopUrl, - webWxLogoutUrl: webWxLogoutDesktopUrl, - webWxGetMediaUrl: webWxGetMediaDesktopUrl, - webWxUpdateChatRoomUrl: webWxUpdateChatRoomDesktopUrl, - webWxRevokeMsg: webWxRevokeMsgDesktopUrl, - webWxCheckUploadUrl: webWxCheckUploadDesktopUrl, - } - - // 网页版 - normal = UrlManager{ - baseUrl: baseNormalUrl, - webWxNewLoginPageUrl: webWxNewLoginPageNormalUrl, - webWxInitUrl: webWxInitNormalUrl, - webWxStatusNotifyUrl: webWxStatusNotifyNormalUrl, - webWxSyncUrl: webWxSyncNormalUrl, - webWxSendMsgUrl: webWxSendMsgNormalUrl, - webWxGetContactUrl: webWxGetContactNormalUrl, - webWxSendMsgImgUrl: webWxSendMsgImgNormalUrl, - webWxSendAppMsgUrl: webWxSendAppMsgNormalUrl, - webWxBatchGetContactUrl: webWxBatchGetContactNormalUrl, - webWxOplogUrl: webWxOplogNormalUrl, - webWxVerifyUserUrl: webWxVerifyUserNormalUrl, - syncCheckUrl: syncCheckNormalUrl, - webWxUpLoadMediaUrl: webWxUpLoadMediaNormalUrl, - webWxGetMsgImgUrl: webWxGetMsgImgNormalUrl, - webWxGetVoiceUrl: webWxGetVoiceNormalUrl, - webWxGetVideoUrl: webWxGetVideoNormalUrl, - webWxLogoutUrl: webWxLogoutNormalUrl, - webWxGetMediaUrl: webWxGetMediaNormalUrl, - webWxUpdateChatRoomUrl: webWxUpdateChatRoomNormalUrl, - webWxRevokeMsg: webWxRevokeMsgNormalUrl, - webWxCheckUploadUrl: webWxCheckUploadNormalUrl, - } -) +import "errors" // mode 类型限制 type mode string @@ -89,15 +11,54 @@ const ( Desktop mode = "desktop" // 突破网页版登录限制 ) -// 通过mode获取完善的UrlManager, -// mode有且仅有两种模式: Normal && Desktop -func GetUrlManagerByMode(m mode) UrlManager { - switch m { - case Desktop: - return desktop - case Normal: - return normal - default: - panic("unsupport mode got") - } +const ( + webwxinit = "/cgi-bin/mmwebwx-bin/webwxinit" + webwxstatusnotify = "/cgi-bin/mmwebwx-bin/webwxstatusnotify" + webwxsync = "/cgi-bin/mmwebwx-bin/webwxsync" + webwxsendmsg = "/cgi-bin/mmwebwx-bin/webwxsendmsg" + webwxgetcontact = "/cgi-bin/mmwebwx-bin/webwxgetcontact" + webwxsendmsgimg = "/cgi-bin/mmwebwx-bin/webwxsendmsgimg" + webwxsendappmsg = "/cgi-bin/mmwebwx-bin/webwxsendappmsg" + webwxbatchgetcontact = "/cgi-bin/mmwebwx-bin/webwxbatchgetcontact" + webwxoplog = "/cgi-bin/mmwebwx-bin/webwxoplog" + webwxverifyuser = "/cgi-bin/mmwebwx-bin/webwxverifyuser" + synccheck = "/cgi-bin/mmwebwx-bin/synccheck" + webwxuploadmedia = "/cgi-bin/mmwebwx-bin/webwxuploadmedia" + webwxgetmsgimg = "/cgi-bin/mmwebwx-bin/webwxgetmsgimg" + webwxgetvoice = "/cgi-bin/mmwebwx-bin/webwxgetvoice" + webwxgetvideo = "/cgi-bin/mmwebwx-bin/webwxgetvideo" + webwxlogout = "/cgi-bin/mmwebwx-bin/webwxlogout" + webwxgetmedia = "/cgi-bin/mmwebwx-bin/webwxgetmedia" + webwxupdatechatroom = "/cgi-bin/mmwebwx-bin/webwxupdatechatroom" + webwxrevokemsg = "/cgi-bin/mmwebwx-bin/webwxrevokemsg" + webwxcheckupload = "/cgi-bin/mmwebwx-bin/webwxcheckupload" + + webwxnewloginpage = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage" + jslogin = "https://login.wx.qq.com/jslogin" + login = "https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login" + qrcode = "https://login.weixin.qq.com/qrcode/" +) + +var domainMap = map[string][]string{ + "wx.qq.com": {"https://wx.qq.com", "https://file.wx.qq.com", "https://webpush.wx.qq.com"}, + "wx2.qq.com": {"https://wx2.qq.com", "https://file.wx2.qq.com", "https://webpush.wx2.qq.com"}, + "wx8.qq.com": {"https://wx8.qq.com", "https://file.wx8.qq.com", "https://webpush.wx8.qq.com"}, + "web2.wechat.com": {"https://web2.wechat.com", "https://file.web2.wechat.com", "https://webpush.web2.wechat.com"}, + "wechat.com": {"https://wechat.com", "https://file.web.wechat.com", "https://webpush.web.wechat.com"}, +} + +func getDomainByHost(host string) (*domain, error) { + value, exist := domainMap[host] + if !exist { + return nil, errors.New("invalid host") + } + return &domain{ + BaseHost: value[0], + FileHost: value[1], + SyncHost: value[2], + }, nil +} + +type domain struct { + BaseHost, FileHost, SyncHost string }