添加默认的uuid回调
This commit is contained in:
parent
1dab95b4ee
commit
6e683358ef
32
bot.go
32
bot.go
@ -24,7 +24,7 @@ type Bot struct {
|
|||||||
hotReloadStorage HotReloadStorage
|
hotReloadStorage HotReloadStorage
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断当前用户是否正常在线
|
// Alive 判断当前用户是否正常在线
|
||||||
func (b *Bot) Alive() bool {
|
func (b *Bot) Alive() bool {
|
||||||
if b.self == nil {
|
if b.self == nil {
|
||||||
return false
|
return false
|
||||||
@ -37,7 +37,7 @@ func (b *Bot) Alive() bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取当前的用户
|
// GetCurrentUser 获取当前的用户
|
||||||
// self, err := bot.GetCurrentUser()
|
// self, err := bot.GetCurrentUser()
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
// return
|
// return
|
||||||
@ -50,7 +50,7 @@ func (b *Bot) GetCurrentUser() (*Self, error) {
|
|||||||
return b.self, nil
|
return b.self, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 热登录,可实现重复登录,
|
// HotLogin 热登录,可实现重复登录,
|
||||||
// retry设置为true可在热登录失效后进行普通登录行为
|
// retry设置为true可在热登录失效后进行普通登录行为
|
||||||
// storage := NewJsonFileHotReloadStorage("storage.json")
|
// storage := NewJsonFileHotReloadStorage("storage.json")
|
||||||
// err := bot.HotLogin(storage, true)
|
// err := bot.HotLogin(storage, true)
|
||||||
@ -98,7 +98,7 @@ func (b *Bot) hotLoginInit() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户登录
|
// Login 用户登录
|
||||||
// 该方法会一直阻塞,直到用户扫码登录,或者二维码过期
|
// 该方法会一直阻塞,直到用户扫码登录,或者二维码过期
|
||||||
func (b *Bot) Login() error {
|
func (b *Bot) Login() error {
|
||||||
uuid, err := b.Caller.GetLoginUUID()
|
uuid, err := b.Caller.GetLoginUUID()
|
||||||
@ -135,7 +135,7 @@ func (b *Bot) Login() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户退出
|
// Logout 用户退出
|
||||||
func (b *Bot) Logout() error {
|
func (b *Bot) Logout() error {
|
||||||
if b.Alive() {
|
if b.Alive() {
|
||||||
if b.LogoutCallBack != nil {
|
if b.LogoutCallBack != nil {
|
||||||
@ -267,7 +267,7 @@ func (b *Bot) getNewWechatMessage() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 当消息同步发生了错误或者用户主动在手机上退出,该方法会立即返回,否则会一直阻塞
|
// Block 当消息同步发生了错误或者用户主动在手机上退出,该方法会立即返回,否则会一直阻塞
|
||||||
func (b *Bot) Block() error {
|
func (b *Bot) Block() error {
|
||||||
if b.self == nil {
|
if b.self == nil {
|
||||||
return errors.New("`Block` must be called after user login")
|
return errors.New("`Block` must be called after user login")
|
||||||
@ -276,22 +276,22 @@ func (b *Bot) Block() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取当前Bot崩溃的原因
|
// CrashReason 获取当前Bot崩溃的原因
|
||||||
func (b *Bot) CrashReason() error {
|
func (b *Bot) CrashReason() error {
|
||||||
return b.err
|
return b.err
|
||||||
}
|
}
|
||||||
|
|
||||||
// setter for Bot.MessageHandler
|
// MessageOnSuccess setter for Bot.MessageHandler
|
||||||
func (b *Bot) MessageOnSuccess(h func(msg *Message)) {
|
func (b *Bot) MessageOnSuccess(h func(msg *Message)) {
|
||||||
b.MessageHandler = h
|
b.MessageHandler = h
|
||||||
}
|
}
|
||||||
|
|
||||||
// setter for Bot.GetMessageErrorHandler
|
// MessageOnError setter for Bot.GetMessageErrorHandler
|
||||||
func (b *Bot) MessageOnError(h func(err error)) {
|
func (b *Bot) MessageOnError(h func(err error)) {
|
||||||
b.GetMessageErrorHandler = h
|
b.GetMessageErrorHandler = h
|
||||||
}
|
}
|
||||||
|
|
||||||
// 写入HotReloadStorage
|
// DumpHotReloadStorage 写入HotReloadStorage
|
||||||
func (b *Bot) DumpHotReloadStorage() error {
|
func (b *Bot) DumpHotReloadStorage() error {
|
||||||
if b.hotReloadStorage == nil {
|
if b.hotReloadStorage == nil {
|
||||||
return errors.New("hotReloadStorage can be nil")
|
return errors.New("hotReloadStorage can be nil")
|
||||||
@ -321,13 +321,13 @@ func (b *Bot) OnLogout(f func(bot *Bot)) {
|
|||||||
b.LogoutCallBack = f
|
b.LogoutCallBack = f
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bot的构造方法,需要自己传入Caller
|
// NewBot Bot的构造方法,需要自己传入Caller
|
||||||
func NewBot(caller *Caller) *Bot {
|
func NewBot(caller *Caller) *Bot {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
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}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 默认的Bot的构造方法,
|
// DefaultBot 默认的Bot的构造方法,
|
||||||
// mode不传入默认为openwechat.Normal,详情见mode
|
// mode不传入默认为openwechat.Normal,详情见mode
|
||||||
// bot := openwechat.DefaultBot(openwechat.Desktop)
|
// bot := openwechat.DefaultBot(openwechat.Desktop)
|
||||||
func DefaultBot(modes ...mode) *Bot {
|
func DefaultBot(modes ...mode) *Bot {
|
||||||
@ -339,15 +339,17 @@ func DefaultBot(modes ...mode) *Bot {
|
|||||||
}
|
}
|
||||||
caller := DefaultCaller()
|
caller := DefaultCaller()
|
||||||
caller.Client.mode = m
|
caller.Client.mode = m
|
||||||
return NewBot(caller)
|
bot := NewBot(caller)
|
||||||
|
bot.UUIDCallback = PrintlnQrcodeUrl
|
||||||
|
return bot
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通过uuid获取登录二维码的url
|
// GetQrcodeUrl 通过uuid获取登录二维码的url
|
||||||
func GetQrcodeUrl(uuid string) string {
|
func GetQrcodeUrl(uuid string) string {
|
||||||
return qrcode + uuid
|
return qrcode + uuid
|
||||||
}
|
}
|
||||||
|
|
||||||
// 打印登录二维码
|
// PrintlnQrcodeUrl 打印登录二维码
|
||||||
func PrintlnQrcodeUrl(uuid string) {
|
func PrintlnQrcodeUrl(uuid string) {
|
||||||
println("访问下面网址扫描二维码登录")
|
println("访问下面网址扫描二维码登录")
|
||||||
println(GetQrcodeUrl(uuid))
|
println(GetQrcodeUrl(uuid))
|
||||||
|
@ -208,6 +208,7 @@ func TestSendMessage(t *testing.T) {
|
|||||||
func TestAgreeFriendsAdd(t *testing.T) {
|
func TestAgreeFriendsAdd(t *testing.T) {
|
||||||
bot := defaultBot()
|
bot := defaultBot()
|
||||||
bot.MessageHandler = func(msg *Message) {
|
bot.MessageHandler = func(msg *Message) {
|
||||||
|
msg.Sender()
|
||||||
if msg.IsFriendAdd() {
|
if msg.IsFriendAdd() {
|
||||||
if err := msg.Agree(); err != nil {
|
if err := msg.Agree(); err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
|
42
caller.go
42
caller.go
@ -8,24 +8,24 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 调用请求和解析请求
|
// Caller 调用请求和解析请求
|
||||||
// 上层模块可以直接获取封装后的请求结果
|
// 上层模块可以直接获取封装后的请求结果
|
||||||
type Caller struct {
|
type Caller struct {
|
||||||
Client *Client
|
Client *Client
|
||||||
path *url.URL
|
path *url.URL
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constructor for Caller
|
// NewCaller Constructor for Caller
|
||||||
func NewCaller(client *Client) *Caller {
|
func NewCaller(client *Client) *Caller {
|
||||||
return &Caller{Client: client}
|
return &Caller{Client: client}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default Constructor for Caller
|
// DefaultCaller Default Constructor for Caller
|
||||||
func DefaultCaller() *Caller {
|
func DefaultCaller() *Caller {
|
||||||
return NewCaller(DefaultClient())
|
return NewCaller(DefaultClient())
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取登录的uuid
|
// GetLoginUUID 获取登录的uuid
|
||||||
func (c *Caller) GetLoginUUID() (string, error) {
|
func (c *Caller) GetLoginUUID() (string, error) {
|
||||||
resp, err := c.Client.GetLoginUUID()
|
resp, err := c.Client.GetLoginUUID()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -47,7 +47,7 @@ func (c *Caller) GetLoginUUID() (string, error) {
|
|||||||
return string(results[1]), nil
|
return string(results[1]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否登录成功
|
// CheckLogin 检查是否登录成功
|
||||||
func (c *Caller) CheckLogin(uuid string) (*CheckLoginResponse, error) {
|
func (c *Caller) CheckLogin(uuid string) (*CheckLoginResponse, error) {
|
||||||
resp, err := c.Client.CheckLogin(uuid)
|
resp, err := c.Client.CheckLogin(uuid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -69,7 +69,7 @@ func (c *Caller) CheckLogin(uuid string) (*CheckLoginResponse, error) {
|
|||||||
return &CheckLoginResponse{Code: code, Raw: buffer.Bytes()}, nil
|
return &CheckLoginResponse{Code: code, Raw: buffer.Bytes()}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取登录信息
|
// GetLoginInfo 获取登录信息
|
||||||
func (c *Caller) GetLoginInfo(body []byte) (*LoginInfo, error) {
|
func (c *Caller) GetLoginInfo(body []byte) (*LoginInfo, error) {
|
||||||
// 从响应体里面获取需要跳转的url
|
// 从响应体里面获取需要跳转的url
|
||||||
results := redirectUriRegexp.FindSubmatch(body)
|
results := redirectUriRegexp.FindSubmatch(body)
|
||||||
@ -102,7 +102,7 @@ func (c *Caller) GetLoginInfo(body []byte) (*LoginInfo, error) {
|
|||||||
return &loginInfo, nil
|
return &loginInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取初始化信息
|
// WebInit 获取初始化信息
|
||||||
func (c *Caller) WebInit(request *BaseRequest) (*WebInitResponse, error) {
|
func (c *Caller) WebInit(request *BaseRequest) (*WebInitResponse, error) {
|
||||||
resp, err := c.Client.WebInit(request)
|
resp, err := c.Client.WebInit(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -116,7 +116,7 @@ func (c *Caller) WebInit(request *BaseRequest) (*WebInitResponse, error) {
|
|||||||
return &webInitResponse, nil
|
return &webInitResponse, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通知手机已登录
|
// WebWxStatusNotify 通知手机已登录
|
||||||
func (c *Caller) WebWxStatusNotify(request *BaseRequest, response *WebInitResponse, info *LoginInfo) error {
|
func (c *Caller) WebWxStatusNotify(request *BaseRequest, response *WebInitResponse, info *LoginInfo) error {
|
||||||
resp, err := c.Client.WebWxStatusNotify(request, response, info)
|
resp, err := c.Client.WebWxStatusNotify(request, response, info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -133,7 +133,7 @@ func (c *Caller) WebWxStatusNotify(request *BaseRequest, response *WebInitRespon
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 异步获取是否有新的消息
|
// SyncCheck 异步获取是否有新的消息
|
||||||
func (c *Caller) SyncCheck(info *LoginInfo, response *WebInitResponse) (*SyncCheckResponse, error) {
|
func (c *Caller) SyncCheck(info *LoginInfo, response *WebInitResponse) (*SyncCheckResponse, error) {
|
||||||
resp, err := c.Client.SyncCheck(info, response)
|
resp, err := c.Client.SyncCheck(info, response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -153,7 +153,7 @@ func (c *Caller) SyncCheck(info *LoginInfo, response *WebInitResponse) (*SyncChe
|
|||||||
return syncCheckResponse, nil
|
return syncCheckResponse, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取所有的联系人
|
// WebWxGetContact 获取所有的联系人
|
||||||
func (c *Caller) WebWxGetContact(info *LoginInfo) (Members, error) {
|
func (c *Caller) WebWxGetContact(info *LoginInfo) (Members, error) {
|
||||||
resp, err := c.Client.WebWxGetContact(info)
|
resp, err := c.Client.WebWxGetContact(info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -170,7 +170,7 @@ func (c *Caller) WebWxGetContact(info *LoginInfo) (Members, error) {
|
|||||||
return item.MemberList, nil
|
return item.MemberList, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取联系人的详情
|
// WebWxBatchGetContact 获取联系人的详情
|
||||||
// 注: Members参数的长度不要大于50
|
// 注: Members参数的长度不要大于50
|
||||||
func (c *Caller) WebWxBatchGetContact(members Members, request *BaseRequest) (Members, error) {
|
func (c *Caller) WebWxBatchGetContact(members Members, request *BaseRequest) (Members, error) {
|
||||||
resp, err := c.Client.WebWxBatchGetContact(members, request)
|
resp, err := c.Client.WebWxBatchGetContact(members, request)
|
||||||
@ -188,7 +188,7 @@ func (c *Caller) WebWxBatchGetContact(members Members, request *BaseRequest) (Me
|
|||||||
return item.ContactList, nil
|
return item.ContactList, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取新的消息接口
|
// WebWxSync 获取新的消息接口
|
||||||
func (c *Caller) WebWxSync(request *BaseRequest, response *WebInitResponse, info *LoginInfo) (*WebWxSyncResponse, error) {
|
func (c *Caller) WebWxSync(request *BaseRequest, response *WebInitResponse, info *LoginInfo) (*WebWxSyncResponse, error) {
|
||||||
resp, err := c.Client.WebWxSync(request, response, info)
|
resp, err := c.Client.WebWxSync(request, response, info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -202,13 +202,13 @@ func (c *Caller) WebWxSync(request *BaseRequest, response *WebInitResponse, info
|
|||||||
return &webWxSyncResponse, nil
|
return &webWxSyncResponse, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送消息接口
|
// WebWxSendMsg 发送消息接口
|
||||||
func (c *Caller) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRequest) (*SentMessage, error) {
|
func (c *Caller) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRequest) (*SentMessage, error) {
|
||||||
resp, err := c.Client.WebWxSendMsg(msg, info, request)
|
resp, err := c.Client.WebWxSendMsg(msg, info, request)
|
||||||
return getSuccessSentMessage(msg, resp, err)
|
return getSuccessSentMessage(msg, resp, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改用户备注接口
|
// WebWxOplog 修改用户备注接口
|
||||||
func (c *Caller) WebWxOplog(request *BaseRequest, remarkName, toUserName string) error {
|
func (c *Caller) WebWxOplog(request *BaseRequest, remarkName, toUserName string) error {
|
||||||
resp, err := c.Client.WebWxOplog(request, remarkName, toUserName)
|
resp, err := c.Client.WebWxOplog(request, remarkName, toUserName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -240,7 +240,7 @@ func (c *Caller) UploadMedia(file *os.File, request *BaseRequest, info *LoginInf
|
|||||||
return &item, nil
|
return &item, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送图片消息接口
|
// WebWxSendImageMsg 发送图片消息接口
|
||||||
func (c *Caller) WebWxSendImageMsg(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) {
|
func (c *Caller) WebWxSendImageMsg(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) {
|
||||||
// 首先尝试上传图片
|
// 首先尝试上传图片
|
||||||
resp, err := c.UploadMedia(file, request, info, fromUserName, toUserName)
|
resp, err := c.UploadMedia(file, request, info, fromUserName, toUserName)
|
||||||
@ -270,13 +270,13 @@ func (c *Caller) WebWxSendFile(file *os.File, req *BaseRequest, info *LoginInfo,
|
|||||||
return c.WebWxSendAppMsg(msg, req)
|
return c.WebWxSendAppMsg(msg, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送媒体消息
|
// WebWxSendAppMsg 发送媒体消息
|
||||||
func (c *Caller) WebWxSendAppMsg(msg *SendMessage, req *BaseRequest) (*SentMessage, error) {
|
func (c *Caller) WebWxSendAppMsg(msg *SendMessage, req *BaseRequest) (*SentMessage, error) {
|
||||||
resp, err := c.Client.WebWxSendAppMsg(msg, req)
|
resp, err := c.Client.WebWxSendAppMsg(msg, req)
|
||||||
return getSuccessSentMessage(msg, resp, err)
|
return getSuccessSentMessage(msg, resp, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户退出
|
// Logout 用户退出
|
||||||
func (c *Caller) Logout(info *LoginInfo) error {
|
func (c *Caller) Logout(info *LoginInfo) error {
|
||||||
resp, err := c.Client.Logout(info)
|
resp, err := c.Client.Logout(info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -285,7 +285,7 @@ func (c *Caller) Logout(info *LoginInfo) error {
|
|||||||
return parseBaseResponseError(resp)
|
return parseBaseResponseError(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 拉好友入群
|
// AddFriendIntoChatRoom 拉好友入群
|
||||||
func (c *Caller) AddFriendIntoChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*Friend) error {
|
func (c *Caller) AddFriendIntoChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*Friend) error {
|
||||||
if len(friends) == 0 {
|
if len(friends) == 0 {
|
||||||
return errors.New("no friends found")
|
return errors.New("no friends found")
|
||||||
@ -297,7 +297,7 @@ func (c *Caller) AddFriendIntoChatRoom(req *BaseRequest, info *LoginInfo, group
|
|||||||
return parseBaseResponseError(resp)
|
return parseBaseResponseError(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从群聊中移除用户
|
// RemoveFriendFromChatRoom 从群聊中移除用户
|
||||||
func (c *Caller) RemoveFriendFromChatRoom(req *BaseRequest, info *LoginInfo, group *Group, users ...*User) error {
|
func (c *Caller) RemoveFriendFromChatRoom(req *BaseRequest, info *LoginInfo, group *Group, users ...*User) error {
|
||||||
if len(users) == 0 {
|
if len(users) == 0 {
|
||||||
return errors.New("no users found")
|
return errors.New("no users found")
|
||||||
@ -309,7 +309,7 @@ func (c *Caller) RemoveFriendFromChatRoom(req *BaseRequest, info *LoginInfo, gro
|
|||||||
return parseBaseResponseError(resp)
|
return parseBaseResponseError(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 同意加好友请求
|
// WebWxVerifyUser 同意加好友请求
|
||||||
func (c *Caller) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyContent string) error {
|
func (c *Caller) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyContent string) error {
|
||||||
resp, err := c.Client.WebWxVerifyUser(storage, info, verifyContent)
|
resp, err := c.Client.WebWxVerifyUser(storage, info, verifyContent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -318,7 +318,7 @@ func (c *Caller) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyCon
|
|||||||
return parseBaseResponseError(resp)
|
return parseBaseResponseError(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 撤回消息操作
|
// WebWxRevokeMsg 撤回消息操作
|
||||||
func (c *Caller) WebWxRevokeMsg(msg *SentMessage, request *BaseRequest) error {
|
func (c *Caller) WebWxRevokeMsg(msg *SentMessage, request *BaseRequest) error {
|
||||||
resp, err := c.Client.WebWxRevokeMsg(msg, request)
|
resp, err := c.Client.WebWxRevokeMsg(msg, request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
56
client.go
56
client.go
@ -18,7 +18,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 请求上下文钩子
|
// HttpHook 请求上下文钩子
|
||||||
type HttpHook interface {
|
type HttpHook interface {
|
||||||
BeforeRequest(req *http.Request)
|
BeforeRequest(req *http.Request)
|
||||||
AfterRequest(response *http.Response, err error)
|
AfterRequest(response *http.Response, err error)
|
||||||
@ -34,7 +34,7 @@ func (u UserAgentHook) BeforeRequest(req *http.Request) {
|
|||||||
|
|
||||||
func (u UserAgentHook) AfterRequest(response *http.Response, err error) {}
|
func (u UserAgentHook) AfterRequest(response *http.Response, err error) {}
|
||||||
|
|
||||||
// http请求客户端
|
// Client http请求客户端
|
||||||
// 客户端需要维持Session会话
|
// 客户端需要维持Session会话
|
||||||
// 并且客户端不允许跳转
|
// 并且客户端不允许跳转
|
||||||
type Client struct {
|
type Client struct {
|
||||||
@ -50,7 +50,7 @@ func NewClient(client *http.Client) *Client {
|
|||||||
return &Client{Client: client}
|
return &Client{Client: client}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 自动存储cookie
|
// DefaultClient 自动存储cookie
|
||||||
// 设置客户端不自动跳转
|
// 设置客户端不自动跳转
|
||||||
func DefaultClient() *Client {
|
func DefaultClient() *Client {
|
||||||
jar, _ := cookiejar.New(nil)
|
jar, _ := cookiejar.New(nil)
|
||||||
@ -91,7 +91,7 @@ func (c *Client) setCookie(resp *http.Response) {
|
|||||||
c.cookies[path] = cookies
|
c.cookies[path] = cookies
|
||||||
}
|
}
|
||||||
|
|
||||||
// 抽象Do方法,将所有的有效的cookie存入Client.cookies
|
// Do 抽象Do方法,将所有的有效的cookie存入Client.cookies
|
||||||
// 方便热登陆时获取
|
// 方便热登陆时获取
|
||||||
func (c *Client) Do(req *http.Request) (*http.Response, error) {
|
func (c *Client) Do(req *http.Request) (*http.Response, error) {
|
||||||
resp, err := c.do(req)
|
resp, err := c.do(req)
|
||||||
@ -101,12 +101,12 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) {
|
|||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取当前client的所有的有效的client
|
// GetCookieMap 获取当前client的所有的有效的client
|
||||||
func (c *Client) GetCookieMap() map[string][]*http.Cookie {
|
func (c *Client) GetCookieMap() map[string][]*http.Cookie {
|
||||||
return c.cookies
|
return c.cookies
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取登录的uuid
|
// GetLoginUUID 获取登录的uuid
|
||||||
func (c *Client) GetLoginUUID() (*http.Response, error) {
|
func (c *Client) GetLoginUUID() (*http.Response, error) {
|
||||||
path, _ := url.Parse(jslogin)
|
path, _ := url.Parse(jslogin)
|
||||||
params := url.Values{}
|
params := url.Values{}
|
||||||
@ -126,13 +126,13 @@ func (c *Client) GetLoginUUID() (*http.Response, error) {
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取登录的二维吗
|
// GetLoginQrcode 获取登录的二维吗
|
||||||
func (c *Client) GetLoginQrcode(uuid string) (*http.Response, error) {
|
func (c *Client) GetLoginQrcode(uuid string) (*http.Response, error) {
|
||||||
path := qrcode + uuid
|
path := qrcode + uuid
|
||||||
return c.Get(path)
|
return c.Get(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否登录
|
// CheckLogin 检查是否登录
|
||||||
func (c *Client) CheckLogin(uuid string) (*http.Response, error) {
|
func (c *Client) CheckLogin(uuid string) (*http.Response, error) {
|
||||||
path, _ := url.Parse(login)
|
path, _ := url.Parse(login)
|
||||||
now := time.Now().Unix()
|
now := time.Now().Unix()
|
||||||
@ -157,7 +157,7 @@ func (c *Client) GetLoginInfo(path string) (*http.Response, error) {
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 请求获取初始化信息
|
// WebInit 请求获取初始化信息
|
||||||
func (c *Client) WebInit(request *BaseRequest) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -173,7 +173,7 @@ func (c *Client) WebInit(request *BaseRequest) (*http.Response, error) {
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通知手机已登录
|
// WebWxStatusNotify 通知手机已登录
|
||||||
func (c *Client) WebWxStatusNotify(request *BaseRequest, response *WebInitResponse, info *LoginInfo) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -194,7 +194,7 @@ func (c *Client) WebWxStatusNotify(request *BaseRequest, response *WebInitRespon
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 异步检查是否有新的消息返回
|
// SyncCheck 异步检查是否有新的消息返回
|
||||||
func (c *Client) SyncCheck(info *LoginInfo, response *WebInitResponse) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -217,7 +217,7 @@ func (c *Client) SyncCheck(info *LoginInfo, response *WebInitResponse) (*http.Re
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取联系人信息
|
// WebWxGetContact 获取联系人信息
|
||||||
func (c *Client) WebWxGetContact(info *LoginInfo) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -229,7 +229,7 @@ func (c *Client) WebWxGetContact(info *LoginInfo) (*http.Response, error) {
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取联系人详情
|
// WebWxBatchGetContact 获取联系人详情
|
||||||
func (c *Client) WebWxBatchGetContact(members Members, request *BaseRequest) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -248,7 +248,7 @@ func (c *Client) WebWxBatchGetContact(members Members, request *BaseRequest) (*h
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取消息接口
|
// WebWxSync 获取消息接口
|
||||||
func (c *Client) WebWxSync(request *BaseRequest, response *WebInitResponse, info *LoginInfo) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -281,7 +281,7 @@ func (c *Client) sendMessage(request *BaseRequest, url string, msg *SendMessage)
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送文本消息
|
// WebWxSendMsg 发送文本消息
|
||||||
func (c *Client) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRequest) (*http.Response, error) {
|
func (c *Client) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRequest) (*http.Response, error) {
|
||||||
msg.Type = TextMessage
|
msg.Type = TextMessage
|
||||||
path, _ := url.Parse(c.domain.BaseHost() + webwxsendmsg)
|
path, _ := url.Parse(c.domain.BaseHost() + webwxsendmsg)
|
||||||
@ -292,7 +292,7 @@ func (c *Client) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRe
|
|||||||
return c.sendMessage(request, path.String(), msg)
|
return c.sendMessage(request, path.String(), msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取用户的头像
|
// WebWxGetHeadImg 获取用户的头像
|
||||||
func (c *Client) WebWxGetHeadImg(headImageUrl string) (*http.Response, error) {
|
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)
|
req, _ := http.NewRequest(http.MethodGet, path, nil)
|
||||||
@ -446,7 +446,7 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in
|
|||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送图片
|
// WebWxSendMsgImg 发送图片
|
||||||
// 这个接口依赖上传文件的接口
|
// 这个接口依赖上传文件的接口
|
||||||
// 发送的图片必须是已经成功上传的图片
|
// 发送的图片必须是已经成功上传的图片
|
||||||
func (c *Client) WebWxSendMsgImg(msg *SendMessage, request *BaseRequest, info *LoginInfo) (*http.Response, error) {
|
func (c *Client) WebWxSendMsgImg(msg *SendMessage, request *BaseRequest, info *LoginInfo) (*http.Response, error) {
|
||||||
@ -461,7 +461,7 @@ func (c *Client) WebWxSendMsgImg(msg *SendMessage, request *BaseRequest, info *L
|
|||||||
return c.sendMessage(request, path.String(), msg)
|
return c.sendMessage(request, path.String(), msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送文件信息
|
// WebWxSendAppMsg 发送文件信息
|
||||||
func (c *Client) WebWxSendAppMsg(msg *SendMessage, request *BaseRequest) (*http.Response, error) {
|
func (c *Client) WebWxSendAppMsg(msg *SendMessage, request *BaseRequest) (*http.Response, error) {
|
||||||
msg.Type = AppMessage
|
msg.Type = AppMessage
|
||||||
path, _ := url.Parse(c.domain.BaseHost() + webwxsendappmsg)
|
path, _ := url.Parse(c.domain.BaseHost() + webwxsendappmsg)
|
||||||
@ -472,7 +472,7 @@ func (c *Client) WebWxSendAppMsg(msg *SendMessage, request *BaseRequest) (*http.
|
|||||||
return c.sendMessage(request, path.String(), msg)
|
return c.sendMessage(request, path.String(), msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户重命名接口
|
// WebWxOplog 用户重命名接口
|
||||||
func (c *Client) WebWxOplog(request *BaseRequest, remarkName, userName string) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -490,7 +490,7 @@ func (c *Client) WebWxOplog(request *BaseRequest, remarkName, userName string) (
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加用户为好友接口
|
// WebWxVerifyUser 添加用户为好友接口
|
||||||
func (c *Client) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyContent string) (*http.Response, error) {
|
func (c *Client) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyContent string) (*http.Response, error) {
|
||||||
loginInfo := storage.LoginInfo
|
loginInfo := storage.LoginInfo
|
||||||
path, _ := url.Parse(c.domain.BaseHost() + webwxverifyuser)
|
path, _ := url.Parse(c.domain.BaseHost() + webwxverifyuser)
|
||||||
@ -518,7 +518,7 @@ func (c *Client) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyCon
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取图片消息的图片响应
|
// WebWxGetMsgImg 获取图片消息的图片响应
|
||||||
func (c *Client) WebWxGetMsgImg(msg *Message, info *LoginInfo) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -530,7 +530,7 @@ func (c *Client) WebWxGetMsgImg(msg *Message, info *LoginInfo) (*http.Response,
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取语音消息的语音响应
|
// WebWxGetVoice 获取语音消息的语音响应
|
||||||
func (c *Client) WebWxGetVoice(msg *Message, info *LoginInfo) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -541,7 +541,7 @@ func (c *Client) WebWxGetVoice(msg *Message, info *LoginInfo) (*http.Response, e
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取视频消息的视频响应
|
// WebWxGetVideo 获取视频消息的视频响应
|
||||||
func (c *Client) WebWxGetVideo(msg *Message, info *LoginInfo) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -552,7 +552,7 @@ func (c *Client) WebWxGetVideo(msg *Message, info *LoginInfo) (*http.Response, e
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取文件消息的文件响应
|
// WebWxGetMedia 获取文件消息的文件响应
|
||||||
func (c *Client) WebWxGetMedia(msg *Message, info *LoginInfo) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -567,7 +567,7 @@ func (c *Client) WebWxGetMedia(msg *Message, info *LoginInfo) (*http.Response, e
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户退出
|
// Logout 用户退出
|
||||||
func (c *Client) Logout(info *LoginInfo) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -579,7 +579,7 @@ func (c *Client) Logout(info *LoginInfo) (*http.Response, error) {
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加用户进群聊
|
// AddMemberIntoChatRoom 添加用户进群聊
|
||||||
func (c *Client) AddMemberIntoChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*Friend) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -602,7 +602,7 @@ func (c *Client) AddMemberIntoChatRoom(req *BaseRequest, info *LoginInfo, group
|
|||||||
return c.Do(requ)
|
return c.Do(requ)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从群聊中移除用户
|
// RemoveMemberFromChatRoom 从群聊中移除用户
|
||||||
func (c *Client) RemoveMemberFromChatRoom(req *BaseRequest, info *LoginInfo, group *Group, friends ...*User) (*http.Response, error) {
|
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 := url.Values{}
|
||||||
@ -624,7 +624,7 @@ func (c *Client) RemoveMemberFromChatRoom(req *BaseRequest, info *LoginInfo, gro
|
|||||||
return c.Do(requ)
|
return c.Do(requ)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 撤回消息
|
// WebWxRevokeMsg 撤回消息
|
||||||
func (c *Client) WebWxRevokeMsg(msg *SentMessage, request *BaseRequest) (*http.Response, error) {
|
func (c *Client) WebWxRevokeMsg(msg *SentMessage, request *BaseRequest) (*http.Response, error) {
|
||||||
content := map[string]interface{}{
|
content := map[string]interface{}{
|
||||||
"BaseRequest": request,
|
"BaseRequest": request,
|
||||||
|
@ -77,7 +77,7 @@ var (
|
|||||||
loginForbiddenError = errors.New("login forbidden")
|
loginForbiddenError = errors.New("login forbidden")
|
||||||
)
|
)
|
||||||
|
|
||||||
// ALL跟search函数搭配
|
// ALL 跟search函数搭配
|
||||||
// friends.Search(openwechat.ALL, )
|
// friends.Search(openwechat.ALL, )
|
||||||
const ALL = 0
|
const ALL = 0
|
||||||
|
|
||||||
|
10
items.go
10
items.go
@ -9,7 +9,7 @@ import (
|
|||||||
一些网络返回信息的封装
|
一些网络返回信息的封装
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// 登录信息
|
// LoginInfo 登录信息
|
||||||
type LoginInfo struct {
|
type LoginInfo struct {
|
||||||
Ret int `xml:"ret"`
|
Ret int `xml:"ret"`
|
||||||
WxUin int `xml:"wxuin"`
|
WxUin int `xml:"wxuin"`
|
||||||
@ -28,14 +28,14 @@ func (l LoginInfo) Error() string {
|
|||||||
return l.Message
|
return l.Message
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始的请求信息
|
// BaseRequest 初始的请求信息
|
||||||
// 几乎所有的请求都要携带该参数
|
// 几乎所有的请求都要携带该参数
|
||||||
type BaseRequest struct {
|
type BaseRequest struct {
|
||||||
Uin int
|
Uin int
|
||||||
Sid, Skey, DeviceID string
|
Sid, Skey, DeviceID string
|
||||||
}
|
}
|
||||||
|
|
||||||
// 大部分返回对象都携带该信息
|
// BaseResponse 大部分返回对象都携带该信息
|
||||||
type BaseResponse struct {
|
type BaseResponse struct {
|
||||||
Ret int
|
Ret int
|
||||||
ErrMsg string
|
ErrMsg string
|
||||||
@ -80,7 +80,7 @@ type SyncKey struct {
|
|||||||
List []struct{ Key, Val int64 }
|
List []struct{ Key, Val int64 }
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化的相应信息
|
// WebInitResponse 初始化的相应信息
|
||||||
type WebInitResponse struct {
|
type WebInitResponse struct {
|
||||||
Count int
|
Count int
|
||||||
ClientVersion int
|
ClientVersion int
|
||||||
@ -98,7 +98,7 @@ type WebInitResponse struct {
|
|||||||
ContactList []User
|
ContactList []User
|
||||||
}
|
}
|
||||||
|
|
||||||
// 公众号的订阅信息
|
// MPSubscribeMsg 公众号的订阅信息
|
||||||
type MPSubscribeMsg struct {
|
type MPSubscribeMsg struct {
|
||||||
MPArticleCount int
|
MPArticleCount int
|
||||||
Time int64
|
Time int64
|
||||||
|
70
message.go
70
message.go
@ -56,7 +56,7 @@ type Message struct {
|
|||||||
item map[string]interface{}
|
item map[string]interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取消息的发送者
|
// Sender 获取消息的发送者
|
||||||
func (m *Message) Sender() (*User, error) {
|
func (m *Message) Sender() (*User, error) {
|
||||||
if m.FromUserName == m.Bot.self.User.UserName {
|
if m.FromUserName == m.Bot.self.User.UserName {
|
||||||
return m.Bot.self.User, nil
|
return m.Bot.self.User, nil
|
||||||
@ -65,7 +65,7 @@ func (m *Message) Sender() (*User, error) {
|
|||||||
return user.Detail()
|
return user.Detail()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取消息在群里面的发送者
|
// SenderInGroup 获取消息在群里面的发送者
|
||||||
func (m *Message) SenderInGroup() (*User, error) {
|
func (m *Message) SenderInGroup() (*User, error) {
|
||||||
if !m.IsSendByGroup() {
|
if !m.IsSendByGroup() {
|
||||||
return nil, errors.New("message is not from group")
|
return nil, errors.New("message is not from group")
|
||||||
@ -85,7 +85,7 @@ func (m *Message) SenderInGroup() (*User, error) {
|
|||||||
return users.First(), nil
|
return users.First(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取消息的接收者
|
// Receiver 获取消息的接收者
|
||||||
func (m *Message) Receiver() (*User, error) {
|
func (m *Message) Receiver() (*User, error) {
|
||||||
if m.IsSendByGroup() {
|
if m.IsSendByGroup() {
|
||||||
if sender, err := m.Sender(); err != nil {
|
if sender, err := m.Sender(); err != nil {
|
||||||
@ -106,22 +106,22 @@ func (m *Message) Receiver() (*User, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断消息是否由自己发送
|
// IsSendBySelf 判断消息是否由自己发送
|
||||||
func (m *Message) IsSendBySelf() bool {
|
func (m *Message) IsSendBySelf() bool {
|
||||||
return m.FromUserName == m.Bot.self.User.UserName
|
return m.FromUserName == m.Bot.self.User.UserName
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断消息是否由好友发送
|
// IsSendByFriend 判断消息是否由好友发送
|
||||||
func (m *Message) IsSendByFriend() bool {
|
func (m *Message) IsSendByFriend() bool {
|
||||||
return !m.IsSendByGroup() && strings.HasPrefix(m.FromUserName, "@") && !m.IsSendBySelf()
|
return !m.IsSendByGroup() && strings.HasPrefix(m.FromUserName, "@") && !m.IsSendBySelf()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断消息是否由群组发送
|
// IsSendByGroup 判断消息是否由群组发送
|
||||||
func (m *Message) IsSendByGroup() bool {
|
func (m *Message) IsSendByGroup() bool {
|
||||||
return strings.HasPrefix(m.FromUserName, "@@")
|
return strings.HasPrefix(m.FromUserName, "@@")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 回复消息
|
// Reply 回复消息
|
||||||
func (m *Message) Reply(msgType int, content, mediaId string) (*SentMessage, error) {
|
func (m *Message) Reply(msgType int, content, mediaId string) (*SentMessage, error) {
|
||||||
msg := NewSendMessage(msgType, content, m.Bot.self.User.UserName, m.FromUserName, mediaId)
|
msg := NewSendMessage(msgType, content, m.Bot.self.User.UserName, m.FromUserName, mediaId)
|
||||||
info := m.Bot.storage.LoginInfo
|
info := m.Bot.storage.LoginInfo
|
||||||
@ -129,19 +129,19 @@ func (m *Message) Reply(msgType int, content, mediaId string) (*SentMessage, err
|
|||||||
return m.Bot.Caller.WebWxSendMsg(msg, info, request)
|
return m.Bot.Caller.WebWxSendMsg(msg, info, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 回复文本消息
|
// ReplyText 回复文本消息
|
||||||
func (m *Message) ReplyText(content string) (*SentMessage, error) {
|
func (m *Message) ReplyText(content string) (*SentMessage, error) {
|
||||||
return m.Reply(TextMessage, content, "")
|
return m.Reply(TextMessage, content, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 回复图片消息
|
// ReplyImage 回复图片消息
|
||||||
func (m *Message) ReplyImage(file *os.File) (*SentMessage, error) {
|
func (m *Message) ReplyImage(file *os.File) (*SentMessage, error) {
|
||||||
info := m.Bot.storage.LoginInfo
|
info := m.Bot.storage.LoginInfo
|
||||||
request := m.Bot.storage.Request
|
request := m.Bot.storage.Request
|
||||||
return m.Bot.Caller.WebWxSendImageMsg(file, request, info, m.Bot.self.UserName, m.FromUserName)
|
return m.Bot.Caller.WebWxSendImageMsg(file, request, info, m.Bot.self.UserName, m.FromUserName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 回复文件消息
|
// ReplyFile 回复文件消息
|
||||||
func (m *Message) ReplyFile(file *os.File) (*SentMessage, error) {
|
func (m *Message) ReplyFile(file *os.File) (*SentMessage, error) {
|
||||||
info := m.Bot.storage.LoginInfo
|
info := m.Bot.storage.LoginInfo
|
||||||
request := m.Bot.storage.Request
|
request := m.Bot.storage.Request
|
||||||
@ -180,7 +180,7 @@ func (m *Message) IsMedia() bool {
|
|||||||
return m.MsgType == 49
|
return m.MsgType == 49
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断是否撤回
|
// IsRecalled 判断是否撤回
|
||||||
func (m *Message) IsRecalled() bool {
|
func (m *Message) IsRecalled() bool {
|
||||||
return m.MsgType == 10002
|
return m.MsgType == 10002
|
||||||
}
|
}
|
||||||
@ -193,17 +193,17 @@ func (m *Message) IsNotify() bool {
|
|||||||
return m.MsgType == 51 && m.StatusNotifyCode != 0
|
return m.MsgType == 51 && m.StatusNotifyCode != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断当前的消息是不是微信转账
|
// IsTransferAccounts 判断当前的消息是不是微信转账
|
||||||
func (m *Message) IsTransferAccounts() bool {
|
func (m *Message) IsTransferAccounts() bool {
|
||||||
return m.IsMedia() && m.FileName == "微信转账"
|
return m.IsMedia() && m.FileName == "微信转账"
|
||||||
}
|
}
|
||||||
|
|
||||||
// 否发出红包判断当前是
|
// IsSendRedPacket 否发出红包判断当前是
|
||||||
func (m *Message) IsSendRedPacket() bool {
|
func (m *Message) IsSendRedPacket() bool {
|
||||||
return m.IsSystem() && m.Content == "发出红包,请在手机上查看"
|
return m.IsSystem() && m.Content == "发出红包,请在手机上查看"
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断当前是否收到红包
|
// IsReceiveRedPacket 判断当前是否收到红包
|
||||||
func (m *Message) IsReceiveRedPacket() bool {
|
func (m *Message) IsReceiveRedPacket() bool {
|
||||||
return m.IsSystem() && m.Content == "收到红包,请在手机上查看"
|
return m.IsSystem() && m.Content == "收到红包,请在手机上查看"
|
||||||
}
|
}
|
||||||
@ -212,17 +212,17 @@ func (m *Message) IsSysNotice() bool {
|
|||||||
return m.MsgType == 9999
|
return m.MsgType == 9999
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断是否为操作通知消息
|
// StatusNotify 判断是否为操作通知消息
|
||||||
func (m *Message) StatusNotify() bool {
|
func (m *Message) StatusNotify() bool {
|
||||||
return m.MsgType == 51
|
return m.MsgType == 51
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断消息是否为文件类型的消息
|
// HasFile 判断消息是否为文件类型的消息
|
||||||
func (m *Message) HasFile() bool {
|
func (m *Message) HasFile() bool {
|
||||||
return m.IsPicture() || m.IsVoice() || m.IsVideo() || m.IsMedia()
|
return m.IsPicture() || m.IsVoice() || m.IsVideo() || m.IsMedia()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取文件消息的文件
|
// GetFile 获取文件消息的文件
|
||||||
func (m *Message) GetFile() (*http.Response, error) {
|
func (m *Message) GetFile() (*http.Response, error) {
|
||||||
if !m.HasFile() {
|
if !m.HasFile() {
|
||||||
return nil, errors.New("invalid message type")
|
return nil, errors.New("invalid message type")
|
||||||
@ -242,7 +242,7 @@ func (m *Message) GetFile() (*http.Response, error) {
|
|||||||
return nil, errors.New("unsupported type")
|
return nil, errors.New("unsupported type")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取card类型
|
// Card 获取card类型
|
||||||
func (m *Message) Card() (*Card, error) {
|
func (m *Message) Card() (*Card, error) {
|
||||||
if !m.IsCard() {
|
if !m.IsCard() {
|
||||||
return nil, errors.New("card message required")
|
return nil, errors.New("card message required")
|
||||||
@ -253,7 +253,7 @@ func (m *Message) Card() (*Card, error) {
|
|||||||
return &card, err
|
return &card, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取FriendAddMessageContent内容
|
// FriendAddMessageContent 获取FriendAddMessageContent内容
|
||||||
func (m *Message) FriendAddMessageContent() (*FriendAddMessage, error) {
|
func (m *Message) FriendAddMessageContent() (*FriendAddMessage, error) {
|
||||||
if !m.IsFriendAdd() {
|
if !m.IsFriendAdd() {
|
||||||
return nil, errors.New("friend add message required")
|
return nil, errors.New("friend add message required")
|
||||||
@ -264,7 +264,7 @@ func (m *Message) FriendAddMessageContent() (*FriendAddMessage, error) {
|
|||||||
return &f, err
|
return &f, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取撤回消息的内容
|
// RevokeMsg 获取撤回消息的内容
|
||||||
func (m *Message) RevokeMsg() (*RevokeMsg, error) {
|
func (m *Message) RevokeMsg() (*RevokeMsg, error) {
|
||||||
if !m.IsRecalled() {
|
if !m.IsRecalled() {
|
||||||
return nil, errors.New("recalled message required")
|
return nil, errors.New("recalled message required")
|
||||||
@ -275,7 +275,7 @@ func (m *Message) RevokeMsg() (*RevokeMsg, error) {
|
|||||||
return &r, err
|
return &r, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 同意好友的请求
|
// Agree 同意好友的请求
|
||||||
func (m *Message) Agree(verifyContents ...string) error {
|
func (m *Message) Agree(verifyContents ...string) error {
|
||||||
if !m.IsFriendAdd() {
|
if !m.IsFriendAdd() {
|
||||||
return fmt.Errorf("friend add message required")
|
return fmt.Errorf("friend add message required")
|
||||||
@ -287,7 +287,7 @@ func (m *Message) Agree(verifyContents ...string) error {
|
|||||||
return m.Bot.Caller.WebWxVerifyUser(m.Bot.storage, m.RecommendInfo, builder.String())
|
return m.Bot.Caller.WebWxVerifyUser(m.Bot.storage, m.RecommendInfo, builder.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
// 往消息上下文中设置值
|
// Set 往消息上下文中设置值
|
||||||
// goroutine safe
|
// goroutine safe
|
||||||
func (m *Message) Set(key string, value interface{}) {
|
func (m *Message) Set(key string, value interface{}) {
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
@ -298,7 +298,7 @@ func (m *Message) Set(key string, value interface{}) {
|
|||||||
m.item[key] = value
|
m.item[key] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从消息上下文中获取值
|
// Get 从消息上下文中获取值
|
||||||
// goroutine safe
|
// goroutine safe
|
||||||
func (m *Message) Get(key string) (value interface{}, exist bool) {
|
func (m *Message) Get(key string) (value interface{}, exist bool) {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
@ -346,7 +346,7 @@ func (m *Message) init(bot *Bot) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送消息的结构体
|
// SendMessage 发送消息的结构体
|
||||||
type SendMessage struct {
|
type SendMessage struct {
|
||||||
Type int
|
Type int
|
||||||
Content string
|
Content string
|
||||||
@ -357,7 +357,7 @@ type SendMessage struct {
|
|||||||
MediaId string `json:"MediaId,omitempty"`
|
MediaId string `json:"MediaId,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendMessage的构造方法
|
// NewSendMessage SendMessage的构造方法
|
||||||
func NewSendMessage(msgType int, content, fromUserName, toUserName, mediaId string) *SendMessage {
|
func NewSendMessage(msgType int, content, fromUserName, toUserName, mediaId string) *SendMessage {
|
||||||
id := strconv.FormatInt(time.Now().UnixNano()/1e2, 10)
|
id := strconv.FormatInt(time.Now().UnixNano()/1e2, 10)
|
||||||
return &SendMessage{
|
return &SendMessage{
|
||||||
@ -371,17 +371,17 @@ func NewSendMessage(msgType int, content, fromUserName, toUserName, mediaId stri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 文本消息的构造方法
|
// NewTextSendMessage 文本消息的构造方法
|
||||||
func NewTextSendMessage(content, fromUserName, toUserName string) *SendMessage {
|
func NewTextSendMessage(content, fromUserName, toUserName string) *SendMessage {
|
||||||
return NewSendMessage(TextMessage, content, fromUserName, toUserName, "")
|
return NewSendMessage(TextMessage, content, fromUserName, toUserName, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 媒体消息的构造方法
|
// NewMediaSendMessage 媒体消息的构造方法
|
||||||
func NewMediaSendMessage(msgType int, fromUserName, toUserName, mediaId string) *SendMessage {
|
func NewMediaSendMessage(msgType int, fromUserName, toUserName, mediaId string) *SendMessage {
|
||||||
return NewSendMessage(msgType, "", fromUserName, toUserName, mediaId)
|
return NewSendMessage(msgType, "", fromUserName, toUserName, mediaId)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 一些特殊类型的消息会携带该结构体信息
|
// RecommendInfo 一些特殊类型的消息会携带该结构体信息
|
||||||
type RecommendInfo struct {
|
type RecommendInfo struct {
|
||||||
OpCode int
|
OpCode int
|
||||||
Scene int
|
Scene int
|
||||||
@ -399,7 +399,7 @@ type RecommendInfo struct {
|
|||||||
UserName string
|
UserName string
|
||||||
}
|
}
|
||||||
|
|
||||||
// 名片消息内容
|
// Card 名片消息内容
|
||||||
type Card struct {
|
type Card struct {
|
||||||
XMLName xml.Name `xml:"msg"`
|
XMLName xml.Name `xml:"msg"`
|
||||||
ImageStatus int `xml:"imagestatus,attr"`
|
ImageStatus int `xml:"imagestatus,attr"`
|
||||||
@ -423,7 +423,7 @@ type Card struct {
|
|||||||
RegionCode string `xml:"regionCode,attr"`
|
RegionCode string `xml:"regionCode,attr"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 好友添加消息信息内容
|
// FriendAddMessage 好友添加消息信息内容
|
||||||
type FriendAddMessage struct {
|
type FriendAddMessage struct {
|
||||||
XMLName xml.Name `xml:"msg"`
|
XMLName xml.Name `xml:"msg"`
|
||||||
Shortpy int `xml:"shortpy,attr"`
|
Shortpy int `xml:"shortpy,attr"`
|
||||||
@ -466,7 +466,7 @@ type FriendAddMessage struct {
|
|||||||
} `xml:"brandlist"`
|
} `xml:"brandlist"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 撤回消息Content
|
// RevokeMsg 撤回消息Content
|
||||||
type RevokeMsg struct {
|
type RevokeMsg struct {
|
||||||
SysMsg xml.Name `xml:"sysmsg"`
|
SysMsg xml.Name `xml:"sysmsg"`
|
||||||
Type string `xml:"type,attr"`
|
Type string `xml:"type,attr"`
|
||||||
@ -478,24 +478,24 @@ type RevokeMsg struct {
|
|||||||
} `xml:"revokemsg"`
|
} `xml:"revokemsg"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 已发送的信息
|
// SentMessage 已发送的信息
|
||||||
type SentMessage struct {
|
type SentMessage struct {
|
||||||
*SendMessage
|
*SendMessage
|
||||||
Self *Self
|
Self *Self
|
||||||
MsgId string
|
MsgId string
|
||||||
}
|
}
|
||||||
|
|
||||||
// 撤回该消息
|
// Revoke 撤回该消息
|
||||||
func (s *SentMessage) Revoke() error {
|
func (s *SentMessage) Revoke() error {
|
||||||
return s.Self.RevokeMessage(s)
|
return s.Self.RevokeMessage(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转发该消息给好友
|
// ForwardToFriends 转发该消息给好友
|
||||||
func (s *SentMessage) ForwardToFriends(friends ...*Friend) error {
|
func (s *SentMessage) ForwardToFriends(friends ...*Friend) error {
|
||||||
return s.Self.ForwardMessageToFriends(s, friends...)
|
return s.Self.ForwardMessageToFriends(s, friends...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转发该消息给群组
|
// ForwardToGroups 转发该消息给群组
|
||||||
func (s *SentMessage) ForwardToGroups(groups ...*Group) error {
|
func (s *SentMessage) ForwardToGroups(groups ...*Group) error {
|
||||||
return s.Self.ForwardMessageToGroups(s, groups...)
|
return s.Self.ForwardMessageToGroups(s, groups...)
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,22 @@
|
|||||||
package openwechat
|
package openwechat
|
||||||
|
|
||||||
// 消息处理函数
|
// MessageHandler 消息处理函数
|
||||||
type MessageHandler func(msg *Message)
|
type MessageHandler func(msg *Message)
|
||||||
|
|
||||||
// 消息分发处理接口
|
// MessageDispatcher 消息分发处理接口
|
||||||
// 跟 DispatchMessage 结合封装成 MessageHandler
|
// 跟 DispatchMessage 结合封装成 MessageHandler
|
||||||
type MessageDispatcher interface {
|
type MessageDispatcher interface {
|
||||||
Dispatch(msg *Message)
|
Dispatch(msg *Message)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 跟 MessageDispatcher 结合封装成 MessageHandler
|
// DispatchMessage 跟 MessageDispatcher 结合封装成 MessageHandler
|
||||||
func DispatchMessage(dispatcher MessageDispatcher) func(msg *Message) {
|
func DispatchMessage(dispatcher MessageDispatcher) func(msg *Message) {
|
||||||
return func(msg *Message) { dispatcher.Dispatch(msg) }
|
return func(msg *Message) { dispatcher.Dispatch(msg) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// MessageDispatcher impl
|
// MessageDispatcher impl
|
||||||
|
|
||||||
// MessageMatchDispatcher 消息处理函数
|
// MessageContextHandler 消息处理函数
|
||||||
type MessageContextHandler func(ctx *MessageContext)
|
type MessageContextHandler func(ctx *MessageContext)
|
||||||
|
|
||||||
type MessageContextHandlerGroup []MessageContextHandler
|
type MessageContextHandlerGroup []MessageContextHandler
|
||||||
@ -28,7 +28,7 @@ type MessageContext struct {
|
|||||||
*Message
|
*Message
|
||||||
}
|
}
|
||||||
|
|
||||||
// 主动调用下一个消息处理函数(或开始调用)
|
// Next 主动调用下一个消息处理函数(或开始调用)
|
||||||
func (c *MessageContext) Next() {
|
func (c *MessageContext) Next() {
|
||||||
c.index++
|
c.index++
|
||||||
for c.index <= len(c.messageHandlers) {
|
for c.index <= len(c.messageHandlers) {
|
||||||
@ -60,12 +60,12 @@ type MessageMatchDispatcher struct {
|
|||||||
matchNodes matchNodes
|
matchNodes matchNodes
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constructor for MessageMatchDispatcher
|
// NewMessageMatchDispatcher Constructor
|
||||||
func NewMessageMatchDispatcher() *MessageMatchDispatcher {
|
func NewMessageMatchDispatcher() *MessageMatchDispatcher {
|
||||||
return &MessageMatchDispatcher{}
|
return &MessageMatchDispatcher{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置是否异步处理
|
// SetAsync 设置是否异步处理
|
||||||
func (m *MessageMatchDispatcher) SetAsync(async bool) {
|
func (m *MessageMatchDispatcher) SetAsync(async bool) {
|
||||||
m.async = async
|
m.async = async
|
||||||
}
|
}
|
||||||
@ -93,7 +93,7 @@ func (m *MessageMatchDispatcher) do(ctx *MessageContext) {
|
|||||||
ctx.Next()
|
ctx.Next()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册消息处理函数, 根据自己的需求自定义
|
// RegisterHandler 注册消息处理函数, 根据自己的需求自定义
|
||||||
// matchFunc返回true则表示处理对应的handlers
|
// matchFunc返回true则表示处理对应的handlers
|
||||||
func (m *MessageMatchDispatcher) RegisterHandler(matchFunc matchFunc, handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) RegisterHandler(matchFunc matchFunc, handlers ...MessageContextHandler) {
|
||||||
if matchFunc == nil {
|
if matchFunc == nil {
|
||||||
@ -103,32 +103,32 @@ func (m *MessageMatchDispatcher) RegisterHandler(matchFunc matchFunc, handlers .
|
|||||||
m.matchNodes = append(m.matchNodes, node)
|
m.matchNodes = append(m.matchNodes, node)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册处理消息类型为Text的处理函数
|
// OnText 注册处理消息类型为Text的处理函数
|
||||||
func (m *MessageMatchDispatcher) OnText(handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnText(handlers ...MessageContextHandler) {
|
||||||
m.RegisterHandler(func(message *Message) bool { return message.IsText() }, handlers...)
|
m.RegisterHandler(func(message *Message) bool { return message.IsText() }, handlers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册处理消息类型为Image的处理函数
|
// OnImage 注册处理消息类型为Image的处理函数
|
||||||
func (m *MessageMatchDispatcher) OnImage(handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnImage(handlers ...MessageContextHandler) {
|
||||||
m.RegisterHandler(func(message *Message) bool { return message.IsPicture() }, handlers...)
|
m.RegisterHandler(func(message *Message) bool { return message.IsPicture() }, handlers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册处理消息类型为Voice的处理函数
|
// OnVoice 注册处理消息类型为Voice的处理函数
|
||||||
func (m *MessageMatchDispatcher) OnVoice(handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnVoice(handlers ...MessageContextHandler) {
|
||||||
m.RegisterHandler(func(message *Message) bool { return message.IsVoice() }, handlers...)
|
m.RegisterHandler(func(message *Message) bool { return message.IsVoice() }, handlers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册处理消息类型为FriendAdd的处理函数
|
// OnFriendAdd 注册处理消息类型为FriendAdd的处理函数
|
||||||
func (m *MessageMatchDispatcher) OnFriendAdd(handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnFriendAdd(handlers ...MessageContextHandler) {
|
||||||
m.RegisterHandler(func(message *Message) bool { return message.IsFriendAdd() }, handlers...)
|
m.RegisterHandler(func(message *Message) bool { return message.IsFriendAdd() }, handlers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册处理消息类型为Card的处理函数
|
// OnCard 注册处理消息类型为Card的处理函数
|
||||||
func (m *MessageMatchDispatcher) OnCard(handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnCard(handlers ...MessageContextHandler) {
|
||||||
m.RegisterHandler(func(message *Message) bool { return message.IsCard() }, handlers...)
|
m.RegisterHandler(func(message *Message) bool { return message.IsCard() }, handlers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册根据好友昵称是否匹配的消息处理函数
|
// OnFriendByNickName 注册根据好友昵称是否匹配的消息处理函数
|
||||||
func (m *MessageMatchDispatcher) OnFriendByNickName(nickName string, handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnFriendByNickName(nickName string, handlers ...MessageContextHandler) {
|
||||||
matchFunc := func(message *Message) bool {
|
matchFunc := func(message *Message) bool {
|
||||||
if message.IsSendByFriend() {
|
if message.IsSendByFriend() {
|
||||||
@ -140,17 +140,17 @@ func (m *MessageMatchDispatcher) OnFriendByNickName(nickName string, handlers ..
|
|||||||
m.RegisterHandler(matchFunc, handlers...)
|
m.RegisterHandler(matchFunc, handlers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册发送者为好友的处理函数
|
// OnFriend 注册发送者为好友的处理函数
|
||||||
func (m *MessageMatchDispatcher) OnFriend(handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnFriend(handlers ...MessageContextHandler) {
|
||||||
m.RegisterHandler(func(message *Message) bool { return message.IsSendByFriend() }, handlers...)
|
m.RegisterHandler(func(message *Message) bool { return message.IsSendByFriend() }, handlers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册发送者为群组的处理函数
|
// OnGroup 注册发送者为群组的处理函数
|
||||||
func (m *MessageMatchDispatcher) OnGroup(handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnGroup(handlers ...MessageContextHandler) {
|
||||||
m.RegisterHandler(func(message *Message) bool { return message.IsSendByGroup() }, handlers...)
|
m.RegisterHandler(func(message *Message) bool { return message.IsSendByGroup() }, handlers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册根据消息发送者的行为是否匹配的消息处理函数
|
// OnUser 注册根据消息发送者的行为是否匹配的消息处理函数
|
||||||
func (m *MessageMatchDispatcher) OnUser(f func(user *User) bool, handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnUser(f func(user *User) bool, handlers ...MessageContextHandler) {
|
||||||
mf := func(message *Message) bool {
|
mf := func(message *Message) bool {
|
||||||
sender, err := message.Sender()
|
sender, err := message.Sender()
|
||||||
@ -162,7 +162,7 @@ func (m *MessageMatchDispatcher) OnUser(f func(user *User) bool, handlers ...Mes
|
|||||||
m.RegisterHandler(mf, handlers...)
|
m.RegisterHandler(mf, handlers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册根据好友备注是否匹配的消息处理函数
|
// OnFriendByRemarkName 注册根据好友备注是否匹配的消息处理函数
|
||||||
func (m *MessageMatchDispatcher) OnFriendByRemarkName(remarkName string, handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnFriendByRemarkName(remarkName string, handlers ...MessageContextHandler) {
|
||||||
f := func(user *User) bool {
|
f := func(user *User) bool {
|
||||||
return user.IsFriend() && user.RemarkName == remarkName
|
return user.IsFriend() && user.RemarkName == remarkName
|
||||||
@ -170,7 +170,7 @@ func (m *MessageMatchDispatcher) OnFriendByRemarkName(remarkName string, handler
|
|||||||
m.OnUser(f, handlers...)
|
m.OnUser(f, handlers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册根据群名是否匹配的消息处理函数
|
// OnGroupByGroupName 注册根据群名是否匹配的消息处理函数
|
||||||
func (m *MessageMatchDispatcher) OnGroupByGroupName(groupName string, handlers ...MessageContextHandler) {
|
func (m *MessageMatchDispatcher) OnGroupByGroupName(groupName string, handlers ...MessageContextHandler) {
|
||||||
f := func(user *User) bool {
|
f := func(user *User) bool {
|
||||||
return user.IsGroup() && user.NickName == groupName
|
return user.IsGroup() && user.NickName == groupName
|
||||||
|
@ -21,7 +21,7 @@ func ToBuffer(v interface{}) (*bytes.Buffer, error) {
|
|||||||
return &buffer, err
|
return &buffer, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取随机设备id
|
// GetRandomDeviceId 获取随机设备id
|
||||||
func GetRandomDeviceId() string {
|
func GetRandomDeviceId() string {
|
||||||
rand.Seed(time.Now().Unix())
|
rand.Seed(time.Now().Unix())
|
||||||
var builder strings.Builder
|
var builder strings.Builder
|
||||||
@ -42,7 +42,7 @@ func getWebWxDataTicket(cookies []*http.Cookie) string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// Form Xml 格式化
|
// XmlFormString Form Xml 格式化
|
||||||
func XmlFormString(text string) string {
|
func XmlFormString(text string) string {
|
||||||
lt := strings.ReplaceAll(text, "<", "<")
|
lt := strings.ReplaceAll(text, "<", "<")
|
||||||
gt := strings.ReplaceAll(lt, ">", ">")
|
gt := strings.ReplaceAll(lt, ">", ">")
|
||||||
@ -58,7 +58,7 @@ func getTotalDuration(delay ...time.Duration) time.Duration {
|
|||||||
return total
|
return total
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取文件上传的类型
|
// GetFileContentType 获取文件上传的类型
|
||||||
func GetFileContentType(file multipart.File) (string, error) {
|
func GetFileContentType(file multipart.File) (string, error) {
|
||||||
data := make([]byte, 512)
|
data := make([]byte, 512)
|
||||||
if _, err := file.Read(data); err != nil {
|
if _, err := file.Read(data); err != nil {
|
||||||
|
80
relations.go
80
relations.go
@ -13,44 +13,44 @@ func (f Friend) String() string {
|
|||||||
return fmt.Sprintf("<Friend:%s>", f.NickName)
|
return fmt.Sprintf("<Friend:%s>", f.NickName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 重命名当前好友
|
// SetRemarkName 重命名当前好友
|
||||||
func (f *Friend) SetRemarkName(name string) error {
|
func (f *Friend) SetRemarkName(name string) error {
|
||||||
return f.Self.SetRemarkNameToFriend(f, name)
|
return f.Self.SetRemarkNameToFriend(f, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送自定义消息
|
// SendMsg 发送自定义消息
|
||||||
func (f *Friend) SendMsg(msg *SendMessage) (*SentMessage, error) {
|
func (f *Friend) SendMsg(msg *SendMessage) (*SentMessage, error) {
|
||||||
return f.Self.SendMessageToFriend(f, msg)
|
return f.Self.SendMessageToFriend(f, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送文本消息
|
// SendText 发送文本消息
|
||||||
func (f *Friend) SendText(content string) (*SentMessage, error) {
|
func (f *Friend) SendText(content string) (*SentMessage, error) {
|
||||||
return f.Self.SendTextToFriend(f, content)
|
return f.Self.SendTextToFriend(f, content)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送图片消息
|
// SendImage 发送图片消息
|
||||||
func (f *Friend) SendImage(file *os.File) (*SentMessage, error) {
|
func (f *Friend) SendImage(file *os.File) (*SentMessage, error) {
|
||||||
return f.Self.SendImageToFriend(f, file)
|
return f.Self.SendImageToFriend(f, file)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送文件消息
|
// SendFile 发送文件消息
|
||||||
func (f *Friend) SendFile(file *os.File) (*SentMessage, error) {
|
func (f *Friend) SendFile(file *os.File) (*SentMessage, error) {
|
||||||
return f.Self.SendFileToFriend(f, file)
|
return f.Self.SendFileToFriend(f, file)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 拉该好友入群
|
// AddIntoGroup 拉该好友入群
|
||||||
func (f *Friend) AddIntoGroup(groups ...*Group) error {
|
func (f *Friend) AddIntoGroup(groups ...*Group) error {
|
||||||
return f.Self.AddFriendIntoManyGroups(f, groups...)
|
return f.Self.AddFriendIntoManyGroups(f, groups...)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Friends []*Friend
|
type Friends []*Friend
|
||||||
|
|
||||||
// 获取好友的数量
|
// Count 获取好友的数量
|
||||||
func (f Friends) Count() int {
|
func (f Friends) Count() int {
|
||||||
return len(f)
|
return len(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取第一个好友
|
// First 获取第一个好友
|
||||||
func (f Friends) First() *Friend {
|
func (f Friends) First() *Friend {
|
||||||
if f.Count() > 0 {
|
if f.Count() > 0 {
|
||||||
return f[0]
|
return f[0]
|
||||||
@ -58,7 +58,7 @@ func (f Friends) First() *Friend {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取最后一个好友
|
// Last 获取最后一个好友
|
||||||
func (f Friends) Last() *Friend {
|
func (f Friends) Last() *Friend {
|
||||||
if f.Count() > 0 {
|
if f.Count() > 0 {
|
||||||
return f[f.Count()-1]
|
return f[f.Count()-1]
|
||||||
@ -66,22 +66,22 @@ func (f Friends) Last() *Friend {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据用户名查找好友
|
// SearchByUserName 根据用户名查找好友
|
||||||
func (f Friends) SearchByUserName(limit int, username string) (results Friends) {
|
func (f Friends) SearchByUserName(limit int, username string) (results Friends) {
|
||||||
return f.Search(limit, func(friend *Friend) bool { return friend.User.UserName == username })
|
return f.Search(limit, func(friend *Friend) bool { return friend.User.UserName == username })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据昵称查找好友
|
// SearchByNickName 根据昵称查找好友
|
||||||
func (f Friends) SearchByNickName(limit int, nickName string) (results Friends) {
|
func (f Friends) SearchByNickName(limit int, nickName string) (results Friends) {
|
||||||
return f.Search(limit, func(friend *Friend) bool { return friend.User.NickName == nickName })
|
return f.Search(limit, func(friend *Friend) bool { return friend.User.NickName == nickName })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据备注查找好友
|
// SearchByRemarkName 根据备注查找好友
|
||||||
func (f Friends) SearchByRemarkName(limit int, remarkName string) (results Friends) {
|
func (f Friends) SearchByRemarkName(limit int, remarkName string) (results Friends) {
|
||||||
return f.Search(limit, func(friend *Friend) bool { return friend.User.RemarkName == remarkName })
|
return f.Search(limit, func(friend *Friend) bool { return friend.User.RemarkName == remarkName })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据自定义条件查找好友
|
// Search 根据自定义条件查找好友
|
||||||
func (f Friends) Search(limit int, condFuncList ...func(friend *Friend) bool) (results Friends) {
|
func (f Friends) Search(limit int, condFuncList ...func(friend *Friend) bool) (results Friends) {
|
||||||
if condFuncList == nil {
|
if condFuncList == nil {
|
||||||
return f
|
return f
|
||||||
@ -106,7 +106,7 @@ func (f Friends) Search(limit int, condFuncList ...func(friend *Friend) bool) (r
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 向slice的好友依次发送消息
|
// SendMsg 向slice的好友依次发送消息
|
||||||
func (f Friends) SendMsg(msg *SendMessage, delay ...time.Duration) error {
|
func (f Friends) SendMsg(msg *SendMessage, delay ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
total := getTotalDuration(delay...)
|
||||||
var (
|
var (
|
||||||
@ -128,7 +128,7 @@ func (f Friends) SendMsg(msg *SendMessage, delay ...time.Duration) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 向slice的好友依次发送文本消息
|
// SendText 向slice的好友依次发送文本消息
|
||||||
func (f Friends) SendText(text string, delay ...time.Duration) error {
|
func (f Friends) SendText(text string, delay ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
total := getTotalDuration(delay...)
|
||||||
var (
|
var (
|
||||||
@ -150,7 +150,7 @@ func (f Friends) SendText(text string, delay ...time.Duration) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 向slice的好友依次发送图片消息
|
// SendImage 向slice的好友依次发送图片消息
|
||||||
func (f Friends) SendImage(file *os.File, delay ...time.Duration) error {
|
func (f Friends) SendImage(file *os.File, delay ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
total := getTotalDuration(delay...)
|
||||||
var (
|
var (
|
||||||
@ -172,7 +172,7 @@ func (f Friends) SendImage(file *os.File, delay ...time.Duration) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 群发文件
|
// SendFile 群发文件
|
||||||
func (f Friends)SendFile(file *os.File, delay ...time.Duration) error {
|
func (f Friends)SendFile(file *os.File, delay ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
total := getTotalDuration(delay...)
|
||||||
var (
|
var (
|
||||||
@ -201,27 +201,27 @@ func (g Group) String() string {
|
|||||||
return fmt.Sprintf("<Group:%s>", g.NickName)
|
return fmt.Sprintf("<Group:%s>", g.NickName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发行消息给当前的群组
|
// SendMsg 发行消息给当前的群组
|
||||||
func (g *Group) SendMsg(msg *SendMessage) (*SentMessage, error) {
|
func (g *Group) SendMsg(msg *SendMessage) (*SentMessage, error) {
|
||||||
return g.Self.SendMessageToGroup(g, msg)
|
return g.Self.SendMessageToGroup(g, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发行文本消息给当前的群组
|
// SendText 发行文本消息给当前的群组
|
||||||
func (g *Group) SendText(content string) (*SentMessage, error) {
|
func (g *Group) SendText(content string) (*SentMessage, error) {
|
||||||
return g.Self.SendTextToGroup(g, content)
|
return g.Self.SendTextToGroup(g, content)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发行图片消息给当前的群组
|
// SendImage 发行图片消息给当前的群组
|
||||||
func (g *Group) SendImage(file *os.File) (*SentMessage, error) {
|
func (g *Group) SendImage(file *os.File) (*SentMessage, error) {
|
||||||
return g.Self.SendImageToGroup(g, file)
|
return g.Self.SendImageToGroup(g, file)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送文件给当前的群组
|
// SendFile 发送文件给当前的群组
|
||||||
func (g *Group) SendFile(file *os.File) (*SentMessage, error) {
|
func (g *Group) SendFile(file *os.File) (*SentMessage, error) {
|
||||||
return g.Self.SendFileToGroup(g, file)
|
return g.Self.SendFileToGroup(g, file)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取所有的群成员
|
// Members 获取所有的群成员
|
||||||
func (g *Group) Members() (Members, error) {
|
func (g *Group) Members() (Members, error) {
|
||||||
group, err := g.Detail()
|
group, err := g.Detail()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -230,12 +230,12 @@ func (g *Group) Members() (Members, error) {
|
|||||||
return group.MemberList, nil
|
return group.MemberList, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 拉好友入群
|
// AddFriendsIn 拉好友入群
|
||||||
func (g *Group) AddFriendsIn(friends ...*Friend) error {
|
func (g *Group) AddFriendsIn(friends ...*Friend) error {
|
||||||
return g.Self.AddFriendsIntoGroup(g, friends...)
|
return g.Self.AddFriendsIntoGroup(g, friends...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从群聊中移除用户
|
// RemoveMembers 从群聊中移除用户
|
||||||
// Deprecated
|
// Deprecated
|
||||||
// 无论是网页版,还是程序上都不起作用
|
// 无论是网页版,还是程序上都不起作用
|
||||||
func (g *Group) RemoveMembers(members Members) error {
|
func (g *Group) RemoveMembers(members Members) error {
|
||||||
@ -244,12 +244,12 @@ func (g *Group) RemoveMembers(members Members) error {
|
|||||||
|
|
||||||
type Groups []*Group
|
type Groups []*Group
|
||||||
|
|
||||||
// 获取群组数量
|
// Count 获取群组数量
|
||||||
func (g Groups) Count() int {
|
func (g Groups) Count() int {
|
||||||
return len(g)
|
return len(g)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取第一个群组
|
// First 获取第一个群组
|
||||||
func (g Groups) First() *Group {
|
func (g Groups) First() *Group {
|
||||||
if g.Count() > 0 {
|
if g.Count() > 0 {
|
||||||
return g[0]
|
return g[0]
|
||||||
@ -257,7 +257,7 @@ func (g Groups) First() *Group {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取最后一个群组
|
// Last 获取最后一个群组
|
||||||
func (g Groups) Last() *Group {
|
func (g Groups) Last() *Group {
|
||||||
if g.Count() > 0 {
|
if g.Count() > 0 {
|
||||||
return g[g.Count()-1]
|
return g[g.Count()-1]
|
||||||
@ -265,7 +265,7 @@ func (g Groups) Last() *Group {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 向群组依次发送消息, 支持发送延迟
|
// SendMsg 向群组依次发送消息, 支持发送延迟
|
||||||
func (g Groups) SendMsg(msg *SendMessage, delay ...time.Duration) error {
|
func (g Groups) SendMsg(msg *SendMessage, delay ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
total := getTotalDuration(delay...)
|
||||||
var (
|
var (
|
||||||
@ -287,7 +287,7 @@ func (g Groups) SendMsg(msg *SendMessage, delay ...time.Duration) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 向群组依次发送文本消息, 支持发送延迟
|
// SendText 向群组依次发送文本消息, 支持发送延迟
|
||||||
func (g Groups) SendText(text string, delay ...time.Duration) error {
|
func (g Groups) SendText(text string, delay ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
total := getTotalDuration(delay...)
|
||||||
var (
|
var (
|
||||||
@ -309,7 +309,7 @@ func (g Groups) SendText(text string, delay ...time.Duration) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 向群组依次发送图片消息, 支持发送延迟
|
// SendImage 向群组依次发送图片消息, 支持发送延迟
|
||||||
func (g Groups) SendImage(file *os.File, delay ...time.Duration) error {
|
func (g Groups) SendImage(file *os.File, delay ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
total := getTotalDuration(delay...)
|
||||||
var (
|
var (
|
||||||
@ -331,22 +331,22 @@ func (g Groups) SendImage(file *os.File, delay ...time.Duration) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据用户名查找群组
|
// SearchByUserName 根据用户名查找群组
|
||||||
func (g Groups) SearchByUserName(limit int, username string) (results Groups) {
|
func (g Groups) SearchByUserName(limit int, username string) (results Groups) {
|
||||||
return g.Search(limit, func(group *Group) bool { return group.UserName == username })
|
return g.Search(limit, func(group *Group) bool { return group.UserName == username })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据昵称查找群组
|
// SearchByNickName 根据昵称查找群组
|
||||||
func (g Groups) SearchByNickName(limit int, nickName string) (results Groups) {
|
func (g Groups) SearchByNickName(limit int, nickName string) (results Groups) {
|
||||||
return g.Search(limit, func(group *Group) bool { return group.NickName == nickName })
|
return g.Search(limit, func(group *Group) bool { return group.NickName == nickName })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据备注查找群组
|
// SearchByRemarkName 根据备注查找群组
|
||||||
func (g Groups) SearchByRemarkName(limit int, remarkName string) (results Groups) {
|
func (g Groups) SearchByRemarkName(limit int, remarkName string) (results Groups) {
|
||||||
return g.Search(limit, func(group *Group) bool { return group.RemarkName == remarkName })
|
return g.Search(limit, func(group *Group) bool { return group.RemarkName == remarkName })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据自定义条件查找群组
|
// Search 根据自定义条件查找群组
|
||||||
func (g Groups) Search(limit int, condFuncList ...func(group *Group) bool) (results Groups) {
|
func (g Groups) Search(limit int, condFuncList ...func(group *Group) bool) (results Groups) {
|
||||||
if condFuncList == nil {
|
if condFuncList == nil {
|
||||||
return g
|
return g
|
||||||
@ -371,22 +371,22 @@ func (g Groups) Search(limit int, condFuncList ...func(group *Group) bool) (resu
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 公众号对象
|
// Mp 公众号对象
|
||||||
type Mp struct{ *User }
|
type Mp struct{ *User }
|
||||||
|
|
||||||
func (m Mp) String() string {
|
func (m Mp) String() string {
|
||||||
return fmt.Sprintf("<Mp:%s>", m.NickName)
|
return fmt.Sprintf("<Mp:%s>", m.NickName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 公众号组对象
|
// Mps 公众号组对象
|
||||||
type Mps []*Mp
|
type Mps []*Mp
|
||||||
|
|
||||||
// 数量统计
|
// Count 数量统计
|
||||||
func (m Mps) Count() int {
|
func (m Mps) Count() int {
|
||||||
return len(m)
|
return len(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取第一个
|
// First 获取第一个
|
||||||
func (m Mps) First() *Mp {
|
func (m Mps) First() *Mp {
|
||||||
if m.Count() > 0 {
|
if m.Count() > 0 {
|
||||||
return m[0]
|
return m[0]
|
||||||
@ -394,7 +394,7 @@ func (m Mps) First() *Mp {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取最后一个
|
// Last 获取最后一个
|
||||||
func (m Mps) Last() *Mp {
|
func (m Mps) Last() *Mp {
|
||||||
if m.Count() > 0 {
|
if m.Count() > 0 {
|
||||||
return m[m.Count()-1]
|
return m[m.Count()-1]
|
||||||
@ -402,7 +402,7 @@ func (m Mps) Last() *Mp {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据自定义条件查找
|
// Search 根据自定义条件查找
|
||||||
func (m Mps) Search(limit int, condFuncList ...func(group *Mp) bool) (results Mps) {
|
func (m Mps) Search(limit int, condFuncList ...func(group *Mp) bool) (results Mps) {
|
||||||
if condFuncList == nil {
|
if condFuncList == nil {
|
||||||
return m
|
return m
|
||||||
|
10
stroage.go
10
stroage.go
@ -7,7 +7,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 身份信息, 维持整个登陆的Session会话
|
// Storage 身份信息, 维持整个登陆的Session会话
|
||||||
type Storage struct {
|
type Storage struct {
|
||||||
LoginInfo *LoginInfo
|
LoginInfo *LoginInfo
|
||||||
Request *BaseRequest
|
Request *BaseRequest
|
||||||
@ -21,21 +21,21 @@ type HotReloadStorageItem struct {
|
|||||||
WechatDomain WechatDomain
|
WechatDomain WechatDomain
|
||||||
}
|
}
|
||||||
|
|
||||||
// 热登陆存储接口
|
// HotReloadStorage 热登陆存储接口
|
||||||
type HotReloadStorage interface {
|
type HotReloadStorage interface {
|
||||||
GetHotReloadStorageItem() HotReloadStorageItem // 获取HotReloadStorageItem
|
GetHotReloadStorageItem() HotReloadStorageItem // 获取HotReloadStorageItem
|
||||||
Dump(item HotReloadStorageItem) error // 实现该方法, 将必要信息进行序列化
|
Dump(item HotReloadStorageItem) error // 实现该方法, 将必要信息进行序列化
|
||||||
Load() error // 实现该方法, 将存储媒介的内容反序列化
|
Load() error // 实现该方法, 将存储媒介的内容反序列化
|
||||||
}
|
}
|
||||||
|
|
||||||
// 实现HotReloadStorage接口
|
// JsonFileHotReloadStorage 实现HotReloadStorage接口
|
||||||
// 默认以json文件的形式存储
|
// 默认以json文件的形式存储
|
||||||
type JsonFileHotReloadStorage struct {
|
type JsonFileHotReloadStorage struct {
|
||||||
item HotReloadStorageItem
|
item HotReloadStorageItem
|
||||||
filename string
|
filename string
|
||||||
}
|
}
|
||||||
|
|
||||||
// 将信息写入json文件
|
// Dump 将信息写入json文件
|
||||||
func (f *JsonFileHotReloadStorage) Dump(item HotReloadStorageItem) 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)
|
||||||
@ -56,7 +56,7 @@ func (f *JsonFileHotReloadStorage) Dump(item HotReloadStorageItem) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从文件中读取信息
|
// Load 从文件中读取信息
|
||||||
func (f *JsonFileHotReloadStorage) Load() error {
|
func (f *JsonFileHotReloadStorage) Load() error {
|
||||||
file, err := os.Open(f.filename)
|
file, err := os.Open(f.filename)
|
||||||
|
|
||||||
|
78
user.go
78
user.go
@ -9,7 +9,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 抽象的用户结构: 好友 群组 公众号
|
// User 抽象的用户结构: 好友 群组 公众号
|
||||||
type User struct {
|
type User struct {
|
||||||
Uin int
|
Uin int
|
||||||
HideInputBarFlag int
|
HideInputBarFlag int
|
||||||
@ -54,12 +54,12 @@ func (u *User) String() string {
|
|||||||
return fmt.Sprintf("<User:%s>", u.NickName)
|
return fmt.Sprintf("<User:%s>", u.NickName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取用户头像
|
// GetAvatarResponse 获取用户头像
|
||||||
func (u *User) GetAvatarResponse() (*http.Response, error) {
|
func (u *User) GetAvatarResponse() (*http.Response, error) {
|
||||||
return u.Self.Bot.Caller.Client.WebWxGetHeadImg(u.HeadImgUrl)
|
return u.Self.Bot.Caller.Client.WebWxGetHeadImg(u.HeadImgUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 下载用户头像
|
// SaveAvatar 下载用户头像
|
||||||
func (u *User) SaveAvatar(filename string) error {
|
func (u *User) SaveAvatar(filename string) error {
|
||||||
resp, err := u.GetAvatarResponse()
|
resp, err := u.GetAvatarResponse()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -79,7 +79,7 @@ func (u *User) SaveAvatar(filename string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取用户的详情
|
// Detail 获取用户的详情
|
||||||
func (u *User) Detail() (*User, error) {
|
func (u *User) Detail() (*User, error) {
|
||||||
if u.UserName == u.Self.UserName {
|
if u.UserName == u.Self.UserName {
|
||||||
return u.Self.User, nil
|
return u.Self.User, nil
|
||||||
@ -95,22 +95,22 @@ func (u *User) Detail() (*User, error) {
|
|||||||
return user, nil
|
return user, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断是否为好友
|
// IsFriend 判断是否为好友
|
||||||
func (u *User) IsFriend() bool {
|
func (u *User) IsFriend() bool {
|
||||||
return !u.IsGroup() && strings.HasPrefix(u.UserName, "@") && u.VerifyFlag == 0
|
return !u.IsGroup() && strings.HasPrefix(u.UserName, "@") && u.VerifyFlag == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断是否为群组
|
// IsGroup 判断是否为群组
|
||||||
func (u *User) IsGroup() bool {
|
func (u *User) IsGroup() bool {
|
||||||
return strings.HasPrefix(u.UserName, "@@") && u.VerifyFlag == 0
|
return strings.HasPrefix(u.UserName, "@@") && u.VerifyFlag == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断是否为公众号
|
// IsMP 判断是否为公众号
|
||||||
func (u *User) IsMP() bool {
|
func (u *User) IsMP() bool {
|
||||||
return u.VerifyFlag == 8 || u.VerifyFlag == 24 || u.VerifyFlag == 136
|
return u.VerifyFlag == 8 || u.VerifyFlag == 24 || u.VerifyFlag == 136
|
||||||
}
|
}
|
||||||
|
|
||||||
// 自己,当前登录用户对象
|
// Self 自己,当前登录用户对象
|
||||||
type Self struct {
|
type Self struct {
|
||||||
*User
|
*User
|
||||||
Bot *Bot
|
Bot *Bot
|
||||||
@ -121,7 +121,7 @@ type Self struct {
|
|||||||
mps Mps
|
mps Mps
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取所有的好友、群组、公众号信息
|
// Members 获取所有的好友、群组、公众号信息
|
||||||
func (s *Self) Members(update ...bool) (Members, error) {
|
func (s *Self) Members(update ...bool) (Members, error) {
|
||||||
// 首先判断缓存里有没有,如果没有则去更新缓存
|
// 首先判断缓存里有没有,如果没有则去更新缓存
|
||||||
// 判断是否需要更新,如果传入的参数不为nil,则取第一个
|
// 判断是否需要更新,如果传入的参数不为nil,则取第一个
|
||||||
@ -150,7 +150,7 @@ func (s *Self) updateMembers() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取文件传输助手对象,封装成Friend返回
|
// FileHelper 获取文件传输助手对象,封装成Friend返回
|
||||||
// fh, err := self.FileHelper() // or fh := openwechat.NewFriendHelper(self)
|
// fh, err := self.FileHelper() // or fh := openwechat.NewFriendHelper(self)
|
||||||
func (s *Self) FileHelper() (*Friend, error) {
|
func (s *Self) FileHelper() (*Friend, error) {
|
||||||
// 如果缓存里有,直接返回,否则去联系人里面找
|
// 如果缓存里有,直接返回,否则去联系人里面找
|
||||||
@ -170,7 +170,7 @@ func (s *Self) FileHelper() (*Friend, error) {
|
|||||||
return s.fileHelper, nil
|
return s.fileHelper, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取所有的好友
|
// Friends 获取所有的好友
|
||||||
func (s *Self) Friends(update ...bool) (Friends, error) {
|
func (s *Self) Friends(update ...bool) (Friends, error) {
|
||||||
if s.friends == nil || (len(update) > 0 && update[0]) {
|
if s.friends == nil || (len(update) > 0 && update[0]) {
|
||||||
if _, err := s.Members(true); err != nil {
|
if _, err := s.Members(true); err != nil {
|
||||||
@ -181,7 +181,7 @@ func (s *Self) Friends(update ...bool) (Friends, error) {
|
|||||||
return s.friends, nil
|
return s.friends, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取所有的群组
|
// Groups 获取所有的群组
|
||||||
func (s *Self) Groups(update ...bool) (Groups, error) {
|
func (s *Self) Groups(update ...bool) (Groups, error) {
|
||||||
if s.groups == nil || (len(update) > 0 && update[0]) {
|
if s.groups == nil || (len(update) > 0 && update[0]) {
|
||||||
if _, err := s.Members(true); err != nil {
|
if _, err := s.Members(true); err != nil {
|
||||||
@ -192,7 +192,7 @@ func (s *Self) Groups(update ...bool) (Groups, error) {
|
|||||||
return s.groups, nil
|
return s.groups, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取所有的公众号
|
// Mps 获取所有的公众号
|
||||||
func (s *Self) Mps(update ...bool) (Mps, error) {
|
func (s *Self) Mps(update ...bool) (Mps, error) {
|
||||||
if s.mps == nil || (len(update) > 0 && update[0]) {
|
if s.mps == nil || (len(update) > 0 && update[0]) {
|
||||||
if _, err := s.Members(true); err != nil {
|
if _, err := s.Members(true); err != nil {
|
||||||
@ -203,7 +203,7 @@ func (s *Self) Mps(update ...bool) (Mps, error) {
|
|||||||
return s.mps, nil
|
return s.mps, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新所有的联系人信息
|
// UpdateMembersDetail 更新所有的联系人信息
|
||||||
func (s *Self) UpdateMembersDetail() error {
|
func (s *Self) UpdateMembersDetail() error {
|
||||||
// 先获取所有的联系人
|
// 先获取所有的联系人
|
||||||
members, err := s.Members()
|
members, err := s.Members()
|
||||||
@ -227,39 +227,39 @@ func (s *Self) sendMessageToUser(user *User, msg *SendMessage) (*SentMessage, er
|
|||||||
return successSendMessage, nil
|
return successSendMessage, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送消息给好友
|
// SendMessageToFriend 发送消息给好友
|
||||||
func (s *Self) SendMessageToFriend(friend *Friend, msg *SendMessage) (*SentMessage, error) {
|
func (s *Self) SendMessageToFriend(friend *Friend, msg *SendMessage) (*SentMessage, error) {
|
||||||
return s.sendMessageToUser(friend.User, msg)
|
return s.sendMessageToUser(friend.User, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送文本消息给好友
|
// SendTextToFriend 发送文本消息给好友
|
||||||
func (s *Self) SendTextToFriend(friend *Friend, text string) (*SentMessage, error) {
|
func (s *Self) SendTextToFriend(friend *Friend, text string) (*SentMessage, error) {
|
||||||
msg := NewTextSendMessage(text, s.UserName, friend.UserName)
|
msg := NewTextSendMessage(text, s.UserName, friend.UserName)
|
||||||
return s.SendMessageToFriend(friend, msg)
|
return s.SendMessageToFriend(friend, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送图片消息给好友
|
// SendImageToFriend 发送图片消息给好友
|
||||||
func (s *Self) SendImageToFriend(friend *Friend, file *os.File) (*SentMessage, error) {
|
func (s *Self) SendImageToFriend(friend *Friend, file *os.File) (*SentMessage, error) {
|
||||||
req := s.Bot.storage.Request
|
req := s.Bot.storage.Request
|
||||||
info := s.Bot.storage.LoginInfo
|
info := s.Bot.storage.LoginInfo
|
||||||
return s.Bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, friend.UserName)
|
return s.Bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, friend.UserName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送文件给好友
|
// SendFileToFriend 发送文件给好友
|
||||||
func (s *Self) SendFileToFriend(friend *Friend, file *os.File) (*SentMessage, error) {
|
func (s *Self) SendFileToFriend(friend *Friend, file *os.File) (*SentMessage, error) {
|
||||||
req := s.Bot.storage.Request
|
req := s.Bot.storage.Request
|
||||||
info := s.Bot.storage.LoginInfo
|
info := s.Bot.storage.LoginInfo
|
||||||
return s.Bot.Caller.WebWxSendFile(file, req, info, s.UserName, friend.UserName)
|
return s.Bot.Caller.WebWxSendFile(file, req, info, s.UserName, friend.UserName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置好友备注
|
// SetRemarkNameToFriend 设置好友备注
|
||||||
// self.SetRemarkNameToFriend(friend, "remark") // or friend.SetRemarkName("remark")
|
// self.SetRemarkNameToFriend(friend, "remark") // or friend.SetRemarkName("remark")
|
||||||
func (s *Self) SetRemarkNameToFriend(friend *Friend, remarkName string) error {
|
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)
|
return s.Bot.Caller.WebWxOplog(req, remarkName, friend.UserName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 拉多名好友进群
|
// AddFriendsIntoGroup 拉多名好友进群
|
||||||
// 最好自己是群主,成功率高一点,因为有的群允许非群组拉人,而有的群不允许
|
// 最好自己是群主,成功率高一点,因为有的群允许非群组拉人,而有的群不允许
|
||||||
func (s *Self) AddFriendsIntoGroup(group *Group, friends ...*Friend) error {
|
func (s *Self) AddFriendsIntoGroup(group *Group, friends ...*Friend) error {
|
||||||
if len(friends) == 0 {
|
if len(friends) == 0 {
|
||||||
@ -283,7 +283,7 @@ func (s *Self) AddFriendsIntoGroup(group *Group, friends ...*Friend) error {
|
|||||||
return s.Bot.Caller.AddFriendIntoChatRoom(req, info, group, friends...)
|
return s.Bot.Caller.AddFriendIntoChatRoom(req, info, group, friends...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从群聊中移除用户
|
// RemoveMemberFromGroup 从群聊中移除用户
|
||||||
// Deprecated
|
// Deprecated
|
||||||
// 无论是网页版,还是程序上都不起作用
|
// 无论是网页版,还是程序上都不起作用
|
||||||
func (s *Self) RemoveMemberFromGroup(group *Group, members Members) error {
|
func (s *Self) RemoveMemberFromGroup(group *Group, members Members) error {
|
||||||
@ -314,7 +314,7 @@ func (s *Self) RemoveMemberFromGroup(group *Group, members Members) error {
|
|||||||
return s.Bot.Caller.RemoveFriendFromChatRoom(req, info, group, members...)
|
return s.Bot.Caller.RemoveFriendFromChatRoom(req, info, group, members...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 拉好友进多个群聊
|
// AddFriendIntoManyGroups 拉好友进多个群聊
|
||||||
// AddFriendIntoGroups, 名字和上面的有点像
|
// AddFriendIntoGroups, 名字和上面的有点像
|
||||||
func (s *Self) AddFriendIntoManyGroups(friend *Friend, groups ...*Group) error {
|
func (s *Self) AddFriendIntoManyGroups(friend *Friend, groups ...*Group) error {
|
||||||
for _, group := range groups {
|
for _, group := range groups {
|
||||||
@ -325,32 +325,32 @@ func (s *Self) AddFriendIntoManyGroups(friend *Friend, groups ...*Group) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送消息给群组
|
// SendMessageToGroup 发送消息给群组
|
||||||
func (s *Self) SendMessageToGroup(group *Group, msg *SendMessage) (*SentMessage, error) {
|
func (s *Self) SendMessageToGroup(group *Group, msg *SendMessage) (*SentMessage, error) {
|
||||||
return s.sendMessageToUser(group.User, msg)
|
return s.sendMessageToUser(group.User, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送文本消息给群组
|
// SendTextToGroup 发送文本消息给群组
|
||||||
func (s *Self) SendTextToGroup(group *Group, text string) (*SentMessage, error) {
|
func (s *Self) SendTextToGroup(group *Group, text string) (*SentMessage, error) {
|
||||||
msg := NewTextSendMessage(text, s.UserName, group.UserName)
|
msg := NewTextSendMessage(text, s.UserName, group.UserName)
|
||||||
return s.SendMessageToGroup(group, msg)
|
return s.SendMessageToGroup(group, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送图片消息给群组
|
// SendImageToGroup 发送图片消息给群组
|
||||||
func (s *Self) SendImageToGroup(group *Group, file *os.File) (*SentMessage, error) {
|
func (s *Self) SendImageToGroup(group *Group, file *os.File) (*SentMessage, error) {
|
||||||
req := s.Bot.storage.Request
|
req := s.Bot.storage.Request
|
||||||
info := s.Bot.storage.LoginInfo
|
info := s.Bot.storage.LoginInfo
|
||||||
return s.Bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, group.UserName)
|
return s.Bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, group.UserName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送文件给群组
|
// SendFileToGroup 发送文件给群组
|
||||||
func (s *Self) SendFileToGroup(group *Group, file *os.File) (*SentMessage, error) {
|
func (s *Self) SendFileToGroup(group *Group, file *os.File) (*SentMessage, error) {
|
||||||
req := s.Bot.storage.Request
|
req := s.Bot.storage.Request
|
||||||
info := s.Bot.storage.LoginInfo
|
info := s.Bot.storage.LoginInfo
|
||||||
return s.Bot.Caller.WebWxSendFile(file, req, info, s.UserName, group.UserName)
|
return s.Bot.Caller.WebWxSendFile(file, req, info, s.UserName, group.UserName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 撤回消息
|
// RevokeMessage 撤回消息
|
||||||
// sentMessage, err := friend.SendText("message")
|
// sentMessage, err := friend.SendText("message")
|
||||||
// if err == nil {
|
// if err == nil {
|
||||||
// self.RevokeMessage(sentMessage) // or sentMessage.Revoke()
|
// self.RevokeMessage(sentMessage) // or sentMessage.Revoke()
|
||||||
@ -392,7 +392,7 @@ func (s *Self) forwardMessage(msg *SentMessage, users ...*User) error {
|
|||||||
return errors.New("unsupport message")
|
return errors.New("unsupport message")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转发给好友
|
// ForwardMessageToFriends 转发给好友
|
||||||
func (s *Self) ForwardMessageToFriends(msg *SentMessage, friends ...*Friend) error {
|
func (s *Self) ForwardMessageToFriends(msg *SentMessage, friends ...*Friend) error {
|
||||||
var users = make([]*User, len(friends))
|
var users = make([]*User, len(friends))
|
||||||
for index, friend := range friends {
|
for index, friend := range friends {
|
||||||
@ -401,7 +401,7 @@ func (s *Self) ForwardMessageToFriends(msg *SentMessage, friends ...*Friend) err
|
|||||||
return s.forwardMessage(msg, users...)
|
return s.forwardMessage(msg, users...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转发给群组
|
// ForwardMessageToGroups 转发给群组
|
||||||
func (s *Self) ForwardMessageToGroups(msg *SentMessage, groups ...*Group) error {
|
func (s *Self) ForwardMessageToGroups(msg *SentMessage, groups ...*Group) error {
|
||||||
var users = make([]*User, len(groups))
|
var users = make([]*User, len(groups))
|
||||||
for index, group := range groups {
|
for index, group := range groups {
|
||||||
@ -410,15 +410,15 @@ func (s *Self) ForwardMessageToGroups(msg *SentMessage, groups ...*Group) error
|
|||||||
return s.forwardMessage(msg, users...)
|
return s.forwardMessage(msg, users...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 抽象的用户组
|
// Members 抽象的用户组
|
||||||
type Members []*User
|
type Members []*User
|
||||||
|
|
||||||
// 统计数量
|
// Count 统计数量
|
||||||
func (m Members) Count() int {
|
func (m Members) Count() int {
|
||||||
return len(m)
|
return len(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取第一个
|
// First 获取第一个
|
||||||
func (m Members) First() *User {
|
func (m Members) First() *User {
|
||||||
if m.Count() > 0 {
|
if m.Count() > 0 {
|
||||||
u := m[0]
|
u := m[0]
|
||||||
@ -427,7 +427,7 @@ func (m Members) First() *User {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取最后一个
|
// Last 获取最后一个
|
||||||
func (m Members) Last() *User {
|
func (m Members) Last() *User {
|
||||||
if m.Count() > 0 {
|
if m.Count() > 0 {
|
||||||
u := m[m.Count()-1]
|
u := m[m.Count()-1]
|
||||||
@ -436,7 +436,7 @@ func (m Members) Last() *User {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置owner
|
// SetOwner 设置owner
|
||||||
// 请不要随意设置
|
// 请不要随意设置
|
||||||
func (m Members) SetOwner(s *Self) {
|
func (m Members) SetOwner(s *Self) {
|
||||||
for _, member := range m {
|
for _, member := range m {
|
||||||
@ -444,22 +444,22 @@ func (m Members) SetOwner(s *Self) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据用户名查找
|
// SearchByUserName 根据用户名查找
|
||||||
func (m Members) SearchByUserName(limit int, username string) (results Members) {
|
func (m Members) SearchByUserName(limit int, username string) (results Members) {
|
||||||
return m.Search(limit, func(user *User) bool { return user.UserName == username })
|
return m.Search(limit, func(user *User) bool { return user.UserName == username })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据昵称查找
|
// SearchByNickName 根据昵称查找
|
||||||
func (m Members) SearchByNickName(limit int, nickName string) (results Members) {
|
func (m Members) SearchByNickName(limit int, nickName string) (results Members) {
|
||||||
return m.Search(limit, func(user *User) bool { return user.NickName == nickName })
|
return m.Search(limit, func(user *User) bool { return user.NickName == nickName })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据备注查找
|
// SearchByRemarkName 根据备注查找
|
||||||
func (m Members) SearchByRemarkName(limit int, remarkName string) (results Members) {
|
func (m Members) SearchByRemarkName(limit int, remarkName string) (results Members) {
|
||||||
return m.Search(limit, func(user *User) bool { return user.RemarkName == remarkName })
|
return m.Search(limit, func(user *User) bool { return user.RemarkName == remarkName })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据自定义条件查找
|
// Search 根据自定义条件查找
|
||||||
func (m Members) Search(limit int, condFuncList ...func(user *User) bool) (results Members) {
|
func (m Members) Search(limit int, condFuncList ...func(user *User) bool) (results Members) {
|
||||||
if condFuncList == nil {
|
if condFuncList == nil {
|
||||||
return m
|
return m
|
||||||
@ -569,7 +569,7 @@ func (m Members) detail(self *Self) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 这里为了兼容Desktop版本找不到文件传输助手的问题
|
// NewFriendHelper 这里为了兼容Desktop版本找不到文件传输助手的问题
|
||||||
// 文件传输助手的微信身份标识符永远是filehelper
|
// 文件传输助手的微信身份标识符永远是filehelper
|
||||||
// 这种形式的对象可能缺少一些其他属性
|
// 这种形式的对象可能缺少一些其他属性
|
||||||
// 但是不影响发送信息的功能
|
// 但是不影响发送信息的功能
|
||||||
|
Loading…
x
Reference in New Issue
Block a user