更新热登陆存储接口行为 🔨
This commit is contained in:
parent
72aaf1bc96
commit
41bf30c8a0
16
bot.go
16
bot.go
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
39
stroage.go
39
stroage.go
@ -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
6
url.go
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user