更新热登陆存储接口行为 🔨

This commit is contained in:
eatMoreApple 2021-05-11 18:47:37 +08:00
parent 72aaf1bc96
commit 41bf30c8a0
5 changed files with 517 additions and 514 deletions

16
bot.go
View File

@ -85,7 +85,8 @@ func (b *Bot) HotLogin(storage HotReloadStorage, retry ...bool) error {
// 热登陆初始化 // 热登陆初始化
func (b *Bot) hotLoginInit() error { func (b *Bot) hotLoginInit() error {
cookies := b.hotReloadStorage.GetCookie() item := b.hotReloadStorage.GetHotReloadStorageItem()
cookies := item.Cookies
for u, ck := range cookies { for u, ck := range cookies {
path, err := url.Parse(u) path, err := url.Parse(u)
if err != nil { if err != nil {
@ -93,8 +94,9 @@ func (b *Bot) hotLoginInit() error {
} }
b.Caller.Client.Jar.SetCookies(path, ck) b.Caller.Client.Jar.SetCookies(path, ck)
} }
b.storage.LoginInfo = b.hotReloadStorage.GetLoginInfo() b.storage.LoginInfo = item.LoginInfo
b.storage.Request = b.hotReloadStorage.GetBaseRequest() b.storage.Request = item.BaseRequest
b.Caller.Client.domain = item.WechatDomain
return nil return nil
} }
@ -175,7 +177,13 @@ func (b *Bot) handleLogin(data []byte) error {
// 如果是热登陆,则将当前的重要信息写入hotReloadStorage // 如果是热登陆,则将当前的重要信息写入hotReloadStorage
if b.isHot { if b.isHot {
cookies := b.Caller.Client.GetCookieMap() cookies := b.Caller.Client.GetCookieMap()
if err := b.hotReloadStorage.Dump(cookies, request, info); err != nil { item := HotReloadStorageItem{
BaseRequest: request,
Cookies: cookies,
LoginInfo: info,
WechatDomain: b.Caller.Client.domain,
}
if err := b.hotReloadStorage.Dump(item); err != nil {
return err return err
} }
} }

View File

@ -11,6 +11,7 @@ import (
// 上层模块可以直接获取封装后的请求结果 // 上层模块可以直接获取封装后的请求结果
type Caller struct { type Caller struct {
Client *Client Client *Client
path *url.URL
} }
// Constructor for Caller // Constructor for Caller
@ -75,12 +76,13 @@ func (c *Caller) GetLoginInfo(body []byte) (*LoginInfo, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
host := path.Host
domain, err := getDomainByHost(host) domain, err := getDomainByHost(path.Host)
if err != nil { if err != nil {
return nil, err return nil, err
} }
c.Client.domain = domain c.Client.domain = domain
resp := NewReturnResponse(c.Client.GetLoginInfo(path.String())) resp := NewReturnResponse(c.Client.GetLoginInfo(path.String()))
if resp.Err() != nil { if resp.Err() != nil {
return nil, resp.Err() return nil, resp.Err()

View File

@ -40,7 +40,7 @@ func (u UserAgentHook) AfterRequest(response *http.Response, err error) {}
type Client struct { type Client struct {
HttpHooks HttpHooks HttpHooks HttpHooks
*http.Client *http.Client
domain *domain domain *WechatDomain
mode mode mode mode
mu sync.Mutex mu sync.Mutex
cookies map[string][]*http.Cookie cookies map[string][]*http.Cookie

View File

@ -14,26 +14,29 @@ type Storage struct {
Response *WebInitResponse Response *WebInitResponse
} }
type HotReloadStorageItem struct {
Cookies map[string][]*http.Cookie
BaseRequest *BaseRequest
LoginInfo *LoginInfo
WechatDomain *WechatDomain
}
// 热登陆存储接口 // 热登陆存储接口
type HotReloadStorage interface { type HotReloadStorage interface {
GetCookie() map[string][]*http.Cookie // 获取client.cookie GetHotReloadStorageItem() HotReloadStorageItem // 获取HotReloadStorageItem
GetBaseRequest() *BaseRequest // 获取BaseRequest Dump(item HotReloadStorageItem) error // 实现该方法, 将必要信息进行序列化
GetLoginInfo() *LoginInfo // 获取LoginInfo
Dump(cookies map[string][]*http.Cookie, req *BaseRequest, info *LoginInfo) error // 实现该方法, 将必要信息进行序列化
Load() error // 实现该方法, 将存储媒介的内容反序列化 Load() error // 实现该方法, 将存储媒介的内容反序列化
} }
// 实现HotReloadStorage接口 // 实现HotReloadStorage接口
// 默认以json文件的形式存储 // 默认以json文件的形式存储
type JsonFileHotReloadStorage struct { type JsonFileHotReloadStorage struct {
Cookie map[string][]*http.Cookie item HotReloadStorageItem
Req *BaseRequest
Info *LoginInfo
filename string filename string
} }
// 将信息写入json文件 // 将信息写入json文件
func (f *JsonFileHotReloadStorage) Dump(cookies map[string][]*http.Cookie, req *BaseRequest, info *LoginInfo) error { func (f *JsonFileHotReloadStorage) Dump(item HotReloadStorageItem) error {
file, err := os.OpenFile(f.filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.ModePerm) file, err := os.OpenFile(f.filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.ModePerm)
@ -43,11 +46,9 @@ func (f *JsonFileHotReloadStorage) Dump(cookies map[string][]*http.Cookie, req *
defer file.Close() defer file.Close()
f.Cookie = cookies f.item = item
f.Req = req
f.Info = info
data, err := json.Marshal(f) data, err := json.Marshal(f.item)
if err != nil { if err != nil {
return err return err
} }
@ -67,20 +68,12 @@ func (f *JsonFileHotReloadStorage) Load() error {
if _, err := buffer.ReadFrom(file); err != nil { if _, err := buffer.ReadFrom(file); err != nil {
return err return err
} }
err = json.Unmarshal(buffer.Bytes(), f) err = json.Unmarshal(buffer.Bytes(), &f.item)
return err return err
} }
func (f *JsonFileHotReloadStorage) GetCookie() map[string][]*http.Cookie { func (f *JsonFileHotReloadStorage) GetHotReloadStorageItem() HotReloadStorageItem {
return f.Cookie return f.item
}
func (f *JsonFileHotReloadStorage) GetBaseRequest() *BaseRequest {
return f.Req
}
func (f *JsonFileHotReloadStorage) GetLoginInfo() *LoginInfo {
return f.Info
} }
func NewJsonFileHotReloadStorage(filename string) *JsonFileHotReloadStorage { func NewJsonFileHotReloadStorage(filename string) *JsonFileHotReloadStorage {

6
url.go
View File

@ -47,18 +47,18 @@ var domainMap = map[string][]string{
"wechat.com": {"https://wechat.com", "https://file.web.wechat.com", "https://webpush.web.wechat.com"}, "wechat.com": {"https://wechat.com", "https://file.web.wechat.com", "https://webpush.web.wechat.com"},
} }
func getDomainByHost(host string) (*domain, error) { func getDomainByHost(host string) (*WechatDomain, error) {
value, exist := domainMap[host] value, exist := domainMap[host]
if !exist { if !exist {
return nil, errors.New("invalid host") return nil, errors.New("invalid host")
} }
return &domain{ return &WechatDomain{
BaseHost: value[0], BaseHost: value[0],
FileHost: value[1], FileHost: value[1],
SyncHost: value[2], SyncHost: value[2],
}, nil }, nil
} }
type domain struct { type WechatDomain struct {
BaseHost, FileHost, SyncHost string BaseHost, FileHost, SyncHost string
} }