commit
a8ba29e155
38
bot.go
38
bot.go
@ -24,7 +24,7 @@ type Bot struct {
|
||||
cancel context.CancelFunc
|
||||
Caller *Caller
|
||||
self *Self
|
||||
storage *Storage
|
||||
Storage *Storage
|
||||
HotReloadStorage HotReloadStorage
|
||||
}
|
||||
|
||||
@ -56,8 +56,8 @@ func (b *Bot) GetCurrentUser() (*Self, error) {
|
||||
|
||||
// HotLogin 热登录,可实现重复登录,
|
||||
// retry设置为true可在热登录失效后进行普通登录行为
|
||||
// storage := NewJsonFileHotReloadStorage("storage.json")
|
||||
// err := bot.HotLogin(storage, true)
|
||||
// Storage := NewJsonFileHotReloadStorage("Storage.json")
|
||||
// err := bot.HotLogin(Storage, true)
|
||||
// fmt.Println(err)
|
||||
func (b *Bot) HotLogin(storage HotReloadStorage, retry ...bool) error {
|
||||
b.IsHot = true
|
||||
@ -103,9 +103,9 @@ func (b *Bot) hotLoginInit(item HotReloadStorageItem) error {
|
||||
}
|
||||
b.Caller.Client.Jar.SetCookies(path, ck)
|
||||
}
|
||||
b.storage.LoginInfo = item.LoginInfo
|
||||
b.storage.Request = item.BaseRequest
|
||||
b.Caller.Client.domain = item.WechatDomain
|
||||
b.Storage.LoginInfo = item.LoginInfo
|
||||
b.Storage.Request = item.BaseRequest
|
||||
b.Caller.Client.Domain = item.WechatDomain
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -152,7 +152,7 @@ func (b *Bot) Logout() error {
|
||||
if b.LogoutCallBack != nil {
|
||||
b.LogoutCallBack(b)
|
||||
}
|
||||
info := b.storage.LoginInfo
|
||||
info := b.Storage.LoginInfo
|
||||
if err := b.Caller.Logout(info); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -170,7 +170,7 @@ func (b *Bot) HandleLogin(data []byte) error {
|
||||
return err
|
||||
}
|
||||
// 将LoginInfo存到storage里面
|
||||
b.storage.LoginInfo = info
|
||||
b.Storage.LoginInfo = info
|
||||
|
||||
// 构建BaseRequest
|
||||
request := &BaseRequest{
|
||||
@ -181,7 +181,7 @@ func (b *Bot) HandleLogin(data []byte) error {
|
||||
}
|
||||
|
||||
// 将BaseRequest存到storage里面方便后续调用
|
||||
b.storage.Request = request
|
||||
b.Storage.Request = request
|
||||
|
||||
// 如果是热登陆,则将当前的重要信息写入hotReloadStorage
|
||||
if b.IsHot {
|
||||
@ -195,8 +195,8 @@ func (b *Bot) HandleLogin(data []byte) error {
|
||||
|
||||
// WebInit 根据有效凭证获取和初始化用户信息
|
||||
func (b *Bot) WebInit() error {
|
||||
req := b.storage.Request
|
||||
info := b.storage.LoginInfo
|
||||
req := b.Storage.Request
|
||||
info := b.Storage.LoginInfo
|
||||
// 获取初始化的用户信息和一些必要的参数
|
||||
resp, err := b.Caller.WebInit(req)
|
||||
if err != nil {
|
||||
@ -205,7 +205,7 @@ func (b *Bot) WebInit() error {
|
||||
// 设置当前的用户
|
||||
b.self = &Self{Bot: b, User: &resp.User}
|
||||
b.self.Self = b.self
|
||||
b.storage.Response = resp
|
||||
b.Storage.Response = resp
|
||||
|
||||
// 通知手机客户端已经登录
|
||||
if err = b.Caller.WebWxStatusNotify(req, resp, info); err != nil {
|
||||
@ -234,7 +234,7 @@ func (b *Bot) asyncCall() error {
|
||||
)
|
||||
for b.Alive() {
|
||||
// 长轮询检查是否有消息返回
|
||||
resp, err = b.Caller.SyncCheck(b.storage.LoginInfo, b.storage.Response)
|
||||
resp, err = b.Caller.SyncCheck(b.Storage.LoginInfo, b.Storage.Response)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -262,12 +262,12 @@ func (b *Bot) stopAsyncCALL(err error) {
|
||||
|
||||
// 获取新的消息
|
||||
func (b *Bot) getNewWechatMessage() error {
|
||||
resp, err := b.Caller.WebWxSync(b.storage.Request, b.storage.Response, b.storage.LoginInfo)
|
||||
resp, err := b.Caller.WebWxSync(b.Storage.Request, b.Storage.Response, b.Storage.LoginInfo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 更新SyncKey并且重新存入storage
|
||||
b.storage.Response.SyncKey = resp.SyncKey
|
||||
b.Storage.Response.SyncKey = resp.SyncKey
|
||||
// 遍历所有的新的消息,依次处理
|
||||
for _, message := range resp.AddMsgList {
|
||||
// 根据不同的消息类型来进行处理,方便后续统一调用
|
||||
@ -311,10 +311,10 @@ func (b *Bot) DumpHotReloadStorage() error {
|
||||
}
|
||||
cookies := b.Caller.Client.GetCookieMap()
|
||||
item := HotReloadStorageItem{
|
||||
BaseRequest: b.storage.Request,
|
||||
BaseRequest: b.Storage.Request,
|
||||
Cookies: cookies,
|
||||
LoginInfo: b.storage.LoginInfo,
|
||||
WechatDomain: b.Caller.Client.domain,
|
||||
LoginInfo: b.Storage.LoginInfo,
|
||||
WechatDomain: b.Caller.Client.Domain,
|
||||
}
|
||||
|
||||
data, err := json.Marshal(item)
|
||||
@ -345,7 +345,7 @@ func (b *Bot) OnLogout(f func(bot *Bot)) {
|
||||
// NewBot Bot的构造方法,需要自己传入Caller
|
||||
func NewBot(caller *Caller) *Bot {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
return &Bot{Caller: caller, storage: &Storage{}, context: ctx, cancel: cancel}
|
||||
return &Bot{Caller: caller, Storage: &Storage{}, context: ctx, cancel: cancel}
|
||||
}
|
||||
|
||||
// DefaultBot 默认的Bot的构造方法,
|
||||
|
@ -80,7 +80,7 @@ func (c *Caller) GetLoginInfo(body []byte) (*LoginInfo, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.Client.domain = WechatDomain(path.Host)
|
||||
c.Client.Domain = WechatDomain(path.Host)
|
||||
resp, err := c.Client.GetLoginInfo(path.String())
|
||||
if err != nil {
|
||||
uErr, ok := err.(*url.Error)
|
||||
|
50
client.go
50
client.go
@ -40,7 +40,7 @@ func (u UserAgentHook) AfterRequest(response *http.Response, err error) {}
|
||||
type Client struct {
|
||||
HttpHooks HttpHooks
|
||||
*http.Client
|
||||
domain WechatDomain
|
||||
Domain WechatDomain
|
||||
mode mode
|
||||
mu sync.Mutex
|
||||
cookies map[string][]*http.Cookie
|
||||
@ -159,7 +159,7 @@ func (c *Client) GetLoginInfo(path string) (*http.Response, error) {
|
||||
|
||||
// WebInit 请求获取初始化信息
|
||||
func (c *Client) WebInit(request *BaseRequest) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxinit)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxinit)
|
||||
params := url.Values{}
|
||||
params.Add("_", fmt.Sprintf("%d", time.Now().Unix()))
|
||||
path.RawQuery = params.Encode()
|
||||
@ -175,7 +175,7 @@ func (c *Client) WebInit(request *BaseRequest) (*http.Response, error) {
|
||||
|
||||
// WebWxStatusNotify 通知手机已登录
|
||||
func (c *Client) WebWxStatusNotify(request *BaseRequest, response *WebInitResponse, info *LoginInfo) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxstatusnotify)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxstatusnotify)
|
||||
params := url.Values{}
|
||||
params.Add("lang", "zh_CN")
|
||||
params.Add("pass_ticket", info.PassTicket)
|
||||
@ -196,7 +196,7 @@ func (c *Client) WebWxStatusNotify(request *BaseRequest, response *WebInitRespon
|
||||
|
||||
// SyncCheck 异步检查是否有新的消息返回
|
||||
func (c *Client) SyncCheck(info *LoginInfo, response *WebInitResponse) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.SyncHost() + synccheck)
|
||||
path, _ := url.Parse(c.Domain.SyncHost() + synccheck)
|
||||
params := url.Values{}
|
||||
params.Add("r", strconv.FormatInt(time.Now().Unix(), 10))
|
||||
params.Add("skey", info.SKey)
|
||||
@ -219,7 +219,7 @@ func (c *Client) SyncCheck(info *LoginInfo, response *WebInitResponse) (*http.Re
|
||||
|
||||
// WebWxGetContact 获取联系人信息
|
||||
func (c *Client) WebWxGetContact(info *LoginInfo) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxgetcontact)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxgetcontact)
|
||||
params := url.Values{}
|
||||
params.Add("r", strconv.FormatInt(time.Now().Unix(), 10))
|
||||
params.Add("skey", info.SKey)
|
||||
@ -231,7 +231,7 @@ func (c *Client) WebWxGetContact(info *LoginInfo) (*http.Response, error) {
|
||||
|
||||
// WebWxBatchGetContact 获取联系人详情
|
||||
func (c *Client) WebWxBatchGetContact(members Members, request *BaseRequest) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxbatchgetcontact)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxbatchgetcontact)
|
||||
params := url.Values{}
|
||||
params.Add("type", "ex")
|
||||
params.Add("r", strconv.FormatInt(time.Now().Unix(), 10))
|
||||
@ -250,7 +250,7 @@ func (c *Client) WebWxBatchGetContact(members Members, request *BaseRequest) (*h
|
||||
|
||||
// WebWxSync 获取消息接口
|
||||
func (c *Client) WebWxSync(request *BaseRequest, response *WebInitResponse, info *LoginInfo) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxsync)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxsync)
|
||||
params := url.Values{}
|
||||
params.Add("sid", info.WxSid)
|
||||
params.Add("skey", info.SKey)
|
||||
@ -284,7 +284,7 @@ func (c *Client) sendMessage(request *BaseRequest, url string, msg *SendMessage)
|
||||
// WebWxSendMsg 发送文本消息
|
||||
func (c *Client) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRequest) (*http.Response, error) {
|
||||
msg.Type = TextMessage
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxsendmsg)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxsendmsg)
|
||||
params := url.Values{}
|
||||
params.Add("lang", "zh_CN")
|
||||
params.Add("pass_ticket", info.PassTicket)
|
||||
@ -294,7 +294,7 @@ func (c *Client) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRe
|
||||
|
||||
// WebWxGetHeadImg 获取用户的头像
|
||||
func (c *Client) WebWxGetHeadImg(headImageUrl string) (*http.Response, error) {
|
||||
path := c.domain.BaseHost() + headImageUrl
|
||||
path := c.Domain.BaseHost() + headImageUrl
|
||||
req, _ := http.NewRequest(http.MethodGet, path, nil)
|
||||
return c.Do(req)
|
||||
}
|
||||
@ -329,7 +329,7 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in
|
||||
// 获取文件的类型
|
||||
mediaType := getMessageType(sate.Name())
|
||||
|
||||
path, _ := url.Parse(c.domain.FileHost() + webwxuploadmedia)
|
||||
path, _ := url.Parse(c.Domain.FileHost() + webwxuploadmedia)
|
||||
params := url.Values{}
|
||||
params.Add("f", "json")
|
||||
|
||||
@ -451,7 +451,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.domain.BaseHost() + webwxsendmsgimg)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxsendmsgimg)
|
||||
params := url.Values{}
|
||||
params.Add("fun", "async")
|
||||
params.Add("f", "json")
|
||||
@ -464,7 +464,7 @@ func (c *Client) WebWxSendMsgImg(msg *SendMessage, request *BaseRequest, info *L
|
||||
// WebWxSendAppMsg 发送文件信息
|
||||
func (c *Client) WebWxSendAppMsg(msg *SendMessage, request *BaseRequest) (*http.Response, error) {
|
||||
msg.Type = AppMessage
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxsendappmsg)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxsendappmsg)
|
||||
params := url.Values{}
|
||||
params.Add("fun", "async")
|
||||
params.Add("f", "json")
|
||||
@ -474,7 +474,7 @@ func (c *Client) WebWxSendAppMsg(msg *SendMessage, request *BaseRequest) (*http.
|
||||
|
||||
// WebWxOplog 用户重命名接口
|
||||
func (c *Client) WebWxOplog(request *BaseRequest, remarkName, userName string) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxoplog)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxoplog)
|
||||
params := url.Values{}
|
||||
params.Add("lang", "zh_CN")
|
||||
path.RawQuery = params.Encode()
|
||||
@ -493,7 +493,7 @@ func (c *Client) WebWxOplog(request *BaseRequest, remarkName, userName string) (
|
||||
// WebWxVerifyUser 添加用户为好友接口
|
||||
func (c *Client) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyContent string) (*http.Response, error) {
|
||||
loginInfo := storage.LoginInfo
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxverifyuser)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxverifyuser)
|
||||
params := url.Values{}
|
||||
params.Add("r", strconv.FormatInt(time.Now().Unix(), 10))
|
||||
params.Add("lang", "zh_CN")
|
||||
@ -520,7 +520,7 @@ func (c *Client) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyCon
|
||||
|
||||
// WebWxGetMsgImg 获取图片消息的图片响应
|
||||
func (c *Client) WebWxGetMsgImg(msg *Message, info *LoginInfo) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxgetmsgimg)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxgetmsgimg)
|
||||
params := url.Values{}
|
||||
params.Add("MsgID", msg.MsgId)
|
||||
params.Add("skey", info.SKey)
|
||||
@ -532,7 +532,7 @@ func (c *Client) WebWxGetMsgImg(msg *Message, info *LoginInfo) (*http.Response,
|
||||
|
||||
// WebWxGetVoice 获取语音消息的语音响应
|
||||
func (c *Client) WebWxGetVoice(msg *Message, info *LoginInfo) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxgetvoice)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxgetvoice)
|
||||
params := url.Values{}
|
||||
params.Add("msgid", msg.MsgId)
|
||||
params.Add("skey", info.SKey)
|
||||
@ -543,7 +543,7 @@ func (c *Client) WebWxGetVoice(msg *Message, info *LoginInfo) (*http.Response, e
|
||||
|
||||
// WebWxGetVideo 获取视频消息的视频响应
|
||||
func (c *Client) WebWxGetVideo(msg *Message, info *LoginInfo) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxgetvideo)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxgetvideo)
|
||||
params := url.Values{}
|
||||
params.Add("msgid", msg.MsgId)
|
||||
params.Add("skey", info.SKey)
|
||||
@ -554,7 +554,7 @@ func (c *Client) WebWxGetVideo(msg *Message, info *LoginInfo) (*http.Response, e
|
||||
|
||||
// WebWxGetMedia 获取文件消息的文件响应
|
||||
func (c *Client) WebWxGetMedia(msg *Message, info *LoginInfo) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.FileHost() + webwxgetmedia)
|
||||
path, _ := url.Parse(c.Domain.FileHost() + webwxgetmedia)
|
||||
params := url.Values{}
|
||||
params.Add("sender", msg.FromUserName)
|
||||
params.Add("mediaid", msg.MediaId)
|
||||
@ -569,7 +569,7 @@ func (c *Client) WebWxGetMedia(msg *Message, info *LoginInfo) (*http.Response, e
|
||||
|
||||
// Logout 用户退出
|
||||
func (c *Client) Logout(info *LoginInfo) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxlogout)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxlogout)
|
||||
params := url.Values{}
|
||||
params.Add("redirect", "1")
|
||||
params.Add("type", "1")
|
||||
@ -581,7 +581,7 @@ func (c *Client) Logout(info *LoginInfo) (*http.Response, error) {
|
||||
|
||||
// AddMemberIntoChatRoom 添加用户进群聊
|
||||
func (c *Client) AddMemberIntoChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*Friend) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxupdatechatroom)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxupdatechatroom)
|
||||
params := url.Values{}
|
||||
params.Add("fun", "addmember")
|
||||
params.Add("pass_ticket", info.PassTicket)
|
||||
@ -604,7 +604,7 @@ func (c *Client) AddMemberIntoChatRoom(req *BaseRequest, info *LoginInfo, group
|
||||
|
||||
// RemoveMemberFromChatRoom 从群聊中移除用户
|
||||
func (c *Client) RemoveMemberFromChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*User) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxupdatechatroom)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxupdatechatroom)
|
||||
params := url.Values{}
|
||||
params.Add("fun", "delmember")
|
||||
params.Add("lang", "zh_CN")
|
||||
@ -633,14 +633,14 @@ func (c *Client) WebWxRevokeMsg(msg *SentMessage, request *BaseRequest) (*http.R
|
||||
"ToUserName": msg.ToUserName,
|
||||
}
|
||||
buffer, _ := ToBuffer(content)
|
||||
req, _ := http.NewRequest(http.MethodPost, c.domain.BaseHost()+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.domain.BaseHost() + webwxcheckupload)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxcheckupload)
|
||||
content := map[string]interface{}{
|
||||
"BaseRequest": request,
|
||||
"FileMd5": fileMd5,
|
||||
@ -657,7 +657,7 @@ func (c *Client) webWxCheckUpload(stat os.FileInfo, request *BaseRequest, fileMd
|
||||
}
|
||||
|
||||
func (c *Client) WebWxStatusAsRead(request *BaseRequest, info *LoginInfo, msg *Message) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxstatusnotify)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxstatusnotify)
|
||||
content := map[string]interface{}{
|
||||
"BaseRequest": request,
|
||||
"DeviceID": request.DeviceID,
|
||||
@ -677,7 +677,7 @@ func (c *Client) WebWxStatusAsRead(request *BaseRequest, info *LoginInfo, msg *M
|
||||
|
||||
// WebWxRelationPin 联系人置顶接口
|
||||
func (c *Client) WebWxRelationPin(request *BaseRequest, op uint8, user *User) (*http.Response, error) {
|
||||
path, _ := url.Parse(c.domain.BaseHost() + webwxoplog)
|
||||
path, _ := url.Parse(c.Domain.BaseHost() + webwxoplog)
|
||||
content := map[string]interface{}{
|
||||
"BaseRequest": request,
|
||||
"CmdId": 3,
|
||||
|
24
message.go
24
message.go
@ -125,8 +125,8 @@ func (m *Message) IsSendByGroup() bool {
|
||||
// Reply 回复消息
|
||||
func (m *Message) Reply(msgType int, content, mediaId string) (*SentMessage, error) {
|
||||
msg := NewSendMessage(msgType, content, m.Bot.self.User.UserName, m.FromUserName, mediaId)
|
||||
info := m.Bot.storage.LoginInfo
|
||||
request := m.Bot.storage.Request
|
||||
info := m.Bot.Storage.LoginInfo
|
||||
request := m.Bot.Storage.Request
|
||||
return m.Bot.Caller.WebWxSendMsg(msg, info, request)
|
||||
}
|
||||
|
||||
@ -137,15 +137,15 @@ func (m *Message) ReplyText(content string) (*SentMessage, error) {
|
||||
|
||||
// ReplyImage 回复图片消息
|
||||
func (m *Message) ReplyImage(file *os.File) (*SentMessage, error) {
|
||||
info := m.Bot.storage.LoginInfo
|
||||
request := m.Bot.storage.Request
|
||||
info := m.Bot.Storage.LoginInfo
|
||||
request := m.Bot.Storage.Request
|
||||
return m.Bot.Caller.WebWxSendImageMsg(file, request, info, m.Bot.self.UserName, m.FromUserName)
|
||||
}
|
||||
|
||||
// ReplyFile 回复文件消息
|
||||
func (m *Message) ReplyFile(file *os.File) (*SentMessage, error) {
|
||||
info := m.Bot.storage.LoginInfo
|
||||
request := m.Bot.storage.Request
|
||||
info := m.Bot.Storage.LoginInfo
|
||||
request := m.Bot.Storage.Request
|
||||
return m.Bot.Caller.WebWxSendFile(file, request, info, m.Bot.self.UserName, m.FromUserName)
|
||||
}
|
||||
|
||||
@ -234,16 +234,16 @@ func (m *Message) GetFile() (*http.Response, error) {
|
||||
return nil, errors.New("invalid message type")
|
||||
}
|
||||
if m.IsPicture() || m.IsEmoticon() {
|
||||
return m.Bot.Caller.Client.WebWxGetMsgImg(m, m.Bot.storage.LoginInfo)
|
||||
return m.Bot.Caller.Client.WebWxGetMsgImg(m, m.Bot.Storage.LoginInfo)
|
||||
}
|
||||
if m.IsVoice() {
|
||||
return m.Bot.Caller.Client.WebWxGetVoice(m, m.Bot.storage.LoginInfo)
|
||||
return m.Bot.Caller.Client.WebWxGetVoice(m, m.Bot.Storage.LoginInfo)
|
||||
}
|
||||
if m.IsVideo() {
|
||||
return m.Bot.Caller.Client.WebWxGetVideo(m, m.Bot.storage.LoginInfo)
|
||||
return m.Bot.Caller.Client.WebWxGetVideo(m, m.Bot.Storage.LoginInfo)
|
||||
}
|
||||
if m.IsMedia() {
|
||||
return m.Bot.Caller.Client.WebWxGetMedia(m, m.Bot.storage.LoginInfo)
|
||||
return m.Bot.Caller.Client.WebWxGetMedia(m, m.Bot.Storage.LoginInfo)
|
||||
}
|
||||
return nil, errors.New("unsupported type")
|
||||
}
|
||||
@ -290,12 +290,12 @@ func (m *Message) Agree(verifyContents ...string) error {
|
||||
for _, v := range verifyContents {
|
||||
builder.WriteString(v)
|
||||
}
|
||||
return m.Bot.Caller.WebWxVerifyUser(m.Bot.storage, m.RecommendInfo, builder.String())
|
||||
return m.Bot.Caller.WebWxVerifyUser(m.Bot.Storage, m.RecommendInfo, builder.String())
|
||||
}
|
||||
|
||||
// AsRead 将消息设置为已读
|
||||
func (m *Message) AsRead() error {
|
||||
return m.Bot.Caller.WebWxStatusAsRead(m.Bot.storage.Request, m.Bot.storage.LoginInfo, m)
|
||||
return m.Bot.Caller.WebWxStatusAsRead(m.Bot.Storage.Request, m.Bot.Storage.LoginInfo, m)
|
||||
}
|
||||
|
||||
// Set 往消息上下文中设置值
|
||||
|
46
user.go
46
user.go
@ -85,7 +85,7 @@ func (u *User) Detail() (*User, error) {
|
||||
return u.Self.User, nil
|
||||
}
|
||||
members := Members{u}
|
||||
request := u.Self.Bot.storage.Request
|
||||
request := u.Self.Bot.Storage.Request
|
||||
newMembers, err := u.Self.Bot.Caller.WebWxBatchGetContact(members, request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -112,13 +112,13 @@ func (u *User) IsMP() bool {
|
||||
|
||||
// Pin 将联系人置顶
|
||||
func (u *User) Pin() error {
|
||||
req := u.Self.Bot.storage.Request
|
||||
req := u.Self.Bot.Storage.Request
|
||||
return u.Self.Bot.Caller.WebWxRelationPin(req, u, 1)
|
||||
}
|
||||
|
||||
// UnPin 将联系人取消置顶
|
||||
func (u *User) UnPin() error {
|
||||
req := u.Self.Bot.storage.Request
|
||||
req := u.Self.Bot.Storage.Request
|
||||
return u.Self.Bot.Caller.WebWxRelationPin(req, u, 0)
|
||||
}
|
||||
|
||||
@ -152,7 +152,7 @@ func (s *Self) Members(update ...bool) (Members, error) {
|
||||
|
||||
// 更新联系人处理
|
||||
func (s *Self) updateMembers() error {
|
||||
info := s.Bot.storage.LoginInfo
|
||||
info := s.Bot.Storage.LoginInfo
|
||||
members, err := s.Bot.Caller.WebWxGetContact(info)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -229,8 +229,8 @@ func (s *Self) UpdateMembersDetail() error {
|
||||
func (s *Self) sendMessageToUser(user *User, msg *SendMessage) (*SentMessage, error) {
|
||||
msg.FromUserName = s.UserName
|
||||
msg.ToUserName = user.UserName
|
||||
info := s.Bot.storage.LoginInfo
|
||||
request := s.Bot.storage.Request
|
||||
info := s.Bot.Storage.LoginInfo
|
||||
request := s.Bot.Storage.Request
|
||||
successSendMessage, err := s.Bot.Caller.WebWxSendMsg(msg, info, request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -252,22 +252,22 @@ func (s *Self) SendTextToFriend(friend *Friend, text string) (*SentMessage, erro
|
||||
|
||||
// SendImageToFriend 发送图片消息给好友
|
||||
func (s *Self) SendImageToFriend(friend *Friend, file *os.File) (*SentMessage, error) {
|
||||
req := s.Bot.storage.Request
|
||||
info := s.Bot.storage.LoginInfo
|
||||
req := s.Bot.Storage.Request
|
||||
info := s.Bot.Storage.LoginInfo
|
||||
return s.Bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, friend.UserName)
|
||||
}
|
||||
|
||||
// SendFileToFriend 发送文件给好友
|
||||
func (s *Self) SendFileToFriend(friend *Friend, file *os.File) (*SentMessage, error) {
|
||||
req := s.Bot.storage.Request
|
||||
info := s.Bot.storage.LoginInfo
|
||||
req := s.Bot.Storage.Request
|
||||
info := s.Bot.Storage.LoginInfo
|
||||
return s.Bot.Caller.WebWxSendFile(file, req, info, s.UserName, friend.UserName)
|
||||
}
|
||||
|
||||
// SetRemarkNameToFriend 设置好友备注
|
||||
// self.SetRemarkNameToFriend(friend, "remark") // or friend.SetRemarkName("remark")
|
||||
func (s *Self) SetRemarkNameToFriend(friend *Friend, remarkName string) error {
|
||||
req := s.Bot.storage.Request
|
||||
req := s.Bot.Storage.Request
|
||||
return s.Bot.Caller.WebWxOplog(req, remarkName, friend.UserName)
|
||||
}
|
||||
|
||||
@ -290,8 +290,8 @@ func (s *Self) AddFriendsIntoGroup(group *Group, friends ...*Friend) error {
|
||||
}
|
||||
}
|
||||
}
|
||||
req := s.Bot.storage.Request
|
||||
info := s.Bot.storage.LoginInfo
|
||||
req := s.Bot.Storage.Request
|
||||
info := s.Bot.Storage.LoginInfo
|
||||
return s.Bot.Caller.AddFriendIntoChatRoom(req, info, group, friends...)
|
||||
}
|
||||
|
||||
@ -321,8 +321,8 @@ func (s *Self) RemoveMemberFromGroup(group *Group, members Members) error {
|
||||
if count != len(members) {
|
||||
return errors.New("invalid members")
|
||||
}
|
||||
req := s.Bot.storage.Request
|
||||
info := s.Bot.storage.LoginInfo
|
||||
req := s.Bot.Storage.Request
|
||||
info := s.Bot.Storage.LoginInfo
|
||||
return s.Bot.Caller.RemoveFriendFromChatRoom(req, info, group, members...)
|
||||
}
|
||||
|
||||
@ -350,15 +350,15 @@ func (s *Self) SendTextToGroup(group *Group, text string) (*SentMessage, error)
|
||||
|
||||
// SendImageToGroup 发送图片消息给群组
|
||||
func (s *Self) SendImageToGroup(group *Group, file *os.File) (*SentMessage, error) {
|
||||
req := s.Bot.storage.Request
|
||||
info := s.Bot.storage.LoginInfo
|
||||
req := s.Bot.Storage.Request
|
||||
info := s.Bot.Storage.LoginInfo
|
||||
return s.Bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, group.UserName)
|
||||
}
|
||||
|
||||
// SendFileToGroup 发送文件给群组
|
||||
func (s *Self) SendFileToGroup(group *Group, file *os.File) (*SentMessage, error) {
|
||||
req := s.Bot.storage.Request
|
||||
info := s.Bot.storage.LoginInfo
|
||||
req := s.Bot.Storage.Request
|
||||
info := s.Bot.Storage.LoginInfo
|
||||
return s.Bot.Caller.WebWxSendFile(file, req, info, s.UserName, group.UserName)
|
||||
}
|
||||
|
||||
@ -368,13 +368,13 @@ func (s *Self) SendFileToGroup(group *Group, file *os.File) (*SentMessage, error
|
||||
// self.RevokeMessage(sentMessage) // or sentMessage.Revoke()
|
||||
// }
|
||||
func (s *Self) RevokeMessage(msg *SentMessage) error {
|
||||
return s.Bot.Caller.WebWxRevokeMsg(msg, s.Bot.storage.Request)
|
||||
return s.Bot.Caller.WebWxRevokeMsg(msg, s.Bot.Storage.Request)
|
||||
}
|
||||
|
||||
// 转发消息接口
|
||||
func (s *Self) forwardMessage(msg *SentMessage, users ...*User) error {
|
||||
info := s.Bot.storage.LoginInfo
|
||||
req := s.Bot.storage.Request
|
||||
info := s.Bot.Storage.LoginInfo
|
||||
req := s.Bot.Storage.Request
|
||||
switch msg.Type {
|
||||
case TextMessage:
|
||||
for _, user := range users {
|
||||
@ -539,7 +539,7 @@ func (m Members) detail(self *Self) error {
|
||||
times = count / 50
|
||||
}
|
||||
var newMembers Members
|
||||
request := self.Bot.storage.Request
|
||||
request := self.Bot.Storage.Request
|
||||
var pMembers Members
|
||||
// 分情况依次更新
|
||||
for i := 1; i <= times; i++ {
|
||||
|
Loading…
x
Reference in New Issue
Block a user