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

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 {
cookies := b.hotReloadStorage.GetCookie()
item := b.hotReloadStorage.GetHotReloadStorageItem()
cookies := item.Cookies
for u, ck := range cookies {
path, err := url.Parse(u)
if err != nil {
@ -93,8 +94,9 @@ func (b *Bot) hotLoginInit() error {
}
b.Caller.Client.Jar.SetCookies(path, ck)
}
b.storage.LoginInfo = b.hotReloadStorage.GetLoginInfo()
b.storage.Request = b.hotReloadStorage.GetBaseRequest()
b.storage.LoginInfo = item.LoginInfo
b.storage.Request = item.BaseRequest
b.Caller.Client.domain = item.WechatDomain
return nil
}
@ -175,7 +177,13 @@ func (b *Bot) handleLogin(data []byte) error {
// 如果是热登陆,则将当前的重要信息写入hotReloadStorage
if b.isHot {
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
}
}

View File

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

View File

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

View File

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