更新热登陆存储接口行为 🔨
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 {
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
39
stroage.go
39
stroage.go
@ -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
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"},
|
"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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user