diff --git a/caller.go b/caller.go index 3083e53..3399d72 100644 --- a/caller.go +++ b/caller.go @@ -260,7 +260,12 @@ func (c *Caller) UploadMedia(file *os.File, request *BaseRequest, info *LoginInf } // WebWxSendImageMsg 发送图片消息接口 -func (c *Caller) WebWxSendImageMsg(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) { +func (c *Caller) WebWxSendImageMsg(reader io.Reader, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) { + file, cb, err := readerToFile(reader) + if err != nil { + return nil, err + } + defer cb() // 首先尝试上传图片 var mediaId string { @@ -282,7 +287,12 @@ func (c *Caller) WebWxSendImageMsg(file *os.File, request *BaseRequest, info *Lo return parser.SentMessage(msg) } -func (c *Caller) WebWxSendFile(file *os.File, req *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) { +func (c *Caller) WebWxSendFile(reader io.Reader, req *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) { + file, cb, err := readerToFile(reader) + if err != nil { + return nil, err + } + defer cb() resp, err := c.UploadMedia(file, req, info, fromUserName, toUserName) if err != nil { return nil, err @@ -298,7 +308,12 @@ func (c *Caller) WebWxSendFile(file *os.File, req *BaseRequest, info *LoginInfo, return c.WebWxSendAppMsg(msg, req) } -func (c *Caller) WebWxSendVideoMsg(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) { +func (c *Caller) WebWxSendVideoMsg(reader io.Reader, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) { + file, cb, err := readerToFile(reader) + if err != nil { + return nil, err + } + defer cb() var mediaId string { resp, err := c.UploadMedia(file, request, info, fromUserName, toUserName) @@ -500,3 +515,32 @@ func (p *MessageResponseParser) SentMessage(msg *SendMessage) (*SentMessage, err } return &SentMessage{MsgId: msgID, SendMessage: msg}, nil } + +func readerToFile(reader io.Reader) (file *os.File, cb func(), err error) { + if file, ok := reader.(*os.File); ok { + return file, func() {}, nil + } + file, err = os.CreateTemp("", "*") + if err != nil { + return nil, nil, err + } + _, err = io.Copy(file, reader) + if err != nil { + _ = file.Close() + _ = os.Remove(file.Name()) + return nil, nil, err + } + if err = file.Close(); err != nil { + _ = os.Remove(file.Name()) + return nil, nil, err + } + file, err = os.Open(file.Name()) + if err != nil { + _ = os.Remove(file.Name()) + return nil, nil, err + } + return file, func() { + _ = file.Close() + _ = os.Remove(file.Name()) + }, nil +} diff --git a/client.go b/client.go index b9b5ca1..d6de48d 100644 --- a/client.go +++ b/client.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "crypto/md5" + "encoding/hex" "encoding/json" "fmt" "io" @@ -11,6 +12,7 @@ import ( "net/http" "net/url" "os" + "path/filepath" "strconv" "strings" "sync" @@ -310,15 +312,22 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in return nil, err } - fileMd5 := fmt.Sprintf("%x", h.Sum(nil)) + fileMd5 := hex.EncodeToString(h.Sum(nil)) sate, err := file.Stat() if err != nil { return nil, err } + filename := sate.Name() + + if ext := filepath.Ext(filename); ext == "" { + names := strings.Split(contentType, "/") + filename = filename + "." + names[len(names)-1] + } + // 获取文件的类型 - mediaType := getMessageType(sate.Name()) + mediaType := getMessageType(filename) path, _ := url.Parse(c.Domain.FileHost() + webwxuploadmedia) params := url.Values{} @@ -362,7 +371,7 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in content := map[string]string{ "id": "WU_FILE_0", - "name": file.Name(), + "name": filename, "type": contentType, "lastModifiedDate": sate.ModTime().Format(TimeFormat), "size": strconv.FormatInt(sate.Size(), 10), diff --git a/message.go b/message.go index 6d358c3..afaeb16 100644 --- a/message.go +++ b/message.go @@ -165,7 +165,7 @@ func (m *Message) ReplyText(content string) (*SentMessage, error) { } // ReplyImage 回复图片消息 -func (m *Message) ReplyImage(file *os.File) (*SentMessage, error) { +func (m *Message) ReplyImage(file io.Reader) (*SentMessage, error) { info := m.bot.Storage.LoginInfo request := m.bot.Storage.Request sentMessage, err := m.bot.Caller.WebWxSendImageMsg(file, request, info, m.bot.self.UserName, m.FromUserName) @@ -173,7 +173,7 @@ func (m *Message) ReplyImage(file *os.File) (*SentMessage, error) { } // ReplyVideo 回复视频消息 -func (m *Message) ReplyVideo(file *os.File) (*SentMessage, error) { +func (m *Message) ReplyVideo(file io.Reader) (*SentMessage, error) { info := m.bot.Storage.LoginInfo request := m.bot.Storage.Request sentMessage, err := m.bot.Caller.WebWxSendVideoMsg(file, request, info, m.bot.self.UserName, m.FromUserName) @@ -181,7 +181,7 @@ func (m *Message) ReplyVideo(file *os.File) (*SentMessage, error) { } // ReplyFile 回复文件消息 -func (m *Message) ReplyFile(file *os.File) (*SentMessage, error) { +func (m *Message) ReplyFile(file io.Reader) (*SentMessage, error) { info := m.bot.Storage.LoginInfo request := m.bot.Storage.Request sentMessage, err := m.bot.Caller.WebWxSendFile(file, request, info, m.bot.self.UserName, m.FromUserName) diff --git a/relations.go b/relations.go index c29124e..a8cb9c1 100644 --- a/relations.go +++ b/relations.go @@ -2,7 +2,7 @@ package openwechat import ( "fmt" - "os" + "io" "time" ) @@ -24,17 +24,17 @@ func (f *Friend) SendText(content string) (*SentMessage, error) { } // SendImage 发送图片消息 -func (f *Friend) SendImage(file *os.File) (*SentMessage, error) { +func (f *Friend) SendImage(file io.Reader) (*SentMessage, error) { return f.self.SendImageToFriend(f, file) } // SendVideo 发送视频消息 -func (f *Friend) SendVideo(file *os.File) (*SentMessage, error) { +func (f *Friend) SendVideo(file io.Reader) (*SentMessage, error) { return f.self.SendVideoToFriend(f, file) } // SendFile 发送文件消息 -func (f *Friend) SendFile(file *os.File) (*SentMessage, error) { +func (f *Friend) SendFile(file io.Reader) (*SentMessage, error) { return f.self.SendFileToFriend(f, file) } @@ -117,7 +117,7 @@ func (f Friends) SendText(text string, delays ...time.Duration) error { } // SendImage 向slice的好友依次发送图片消息 -func (f Friends) SendImage(file *os.File, delays ...time.Duration) error { +func (f Friends) SendImage(file io.Reader, delays ...time.Duration) error { if f.Count() == 0 { return nil } @@ -130,7 +130,7 @@ func (f Friends) SendImage(file *os.File, delays ...time.Duration) error { } // SendFile 群发文件 -func (f Friends) SendFile(file *os.File, delay ...time.Duration) error { +func (f Friends) SendFile(file io.Reader, delay ...time.Duration) error { if f.Count() == 0 { return nil } @@ -155,17 +155,17 @@ func (g *Group) SendText(content string) (*SentMessage, error) { } // SendImage 发行图片消息给当前的群组 -func (g *Group) SendImage(file *os.File) (*SentMessage, error) { +func (g *Group) SendImage(file io.Reader) (*SentMessage, error) { return g.self.SendImageToGroup(g, file) } // SendVideo 发行视频消息给当前的群组 -func (g *Group) SendVideo(file *os.File) (*SentMessage, error) { +func (g *Group) SendVideo(file io.Reader) (*SentMessage, error) { return g.self.SendVideoToGroup(g, file) } // SendFile 发送文件给当前的群组 -func (g *Group) SendFile(file *os.File) (*SentMessage, error) { +func (g *Group) SendFile(file io.Reader) (*SentMessage, error) { return g.self.SendFileToGroup(g, file) } @@ -254,7 +254,7 @@ func (g Groups) SendText(text string, delay ...time.Duration) error { } // SendImage 向群组依次发送图片消息, 支持发送延迟 -func (g Groups) SendImage(file *os.File, delay ...time.Duration) error { +func (g Groups) SendImage(file io.Reader, delay ...time.Duration) error { if g.Count() == 0 { return nil } @@ -267,7 +267,7 @@ func (g Groups) SendImage(file *os.File, delay ...time.Duration) error { } // SendFile 向群组依次发送文件消息, 支持发送延迟 -func (g Groups) SendFile(file *os.File, delay ...time.Duration) error { +func (g Groups) SendFile(file io.Reader, delay ...time.Duration) error { if g.Count() == 0 { return nil } @@ -385,12 +385,12 @@ func (m *Mp) SendText(content string) (*SentMessage, error) { } // SendImage 发送图片消息给公众号 -func (m *Mp) SendImage(file *os.File) (*SentMessage, error) { +func (m *Mp) SendImage(file io.Reader) (*SentMessage, error) { return m.self.SendImageToMp(m, file) } // SendFile 发送文件消息给公众号 -func (m *Mp) SendFile(file *os.File) (*SentMessage, error) { +func (m *Mp) SendFile(file io.Reader) (*SentMessage, error) { return m.self.SendFileToMp(m, file) } diff --git a/user.go b/user.go index f2aeb16..c69211c 100644 --- a/user.go +++ b/user.go @@ -295,21 +295,21 @@ func (s *Self) sendTextToUser(user *User, text string) (*SentMessage, error) { return s.sendMessageWrapper(sentMessage, err) } -func (s *Self) sendImageToUser(user *User, file *os.File) (*SentMessage, error) { +func (s *Self) sendImageToUser(user *User, file io.Reader) (*SentMessage, error) { req := s.bot.Storage.Request info := s.bot.Storage.LoginInfo sentMessage, err := s.bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, user.UserName) return s.sendMessageWrapper(sentMessage, err) } -func (s *Self) sendVideoToUser(user *User, file *os.File) (*SentMessage, error) { +func (s *Self) sendVideoToUser(user *User, file io.Reader) (*SentMessage, error) { req := s.bot.Storage.Request info := s.bot.Storage.LoginInfo sentMessage, err := s.bot.Caller.WebWxSendVideoMsg(file, req, info, s.UserName, user.UserName) return s.sendMessageWrapper(sentMessage, err) } -func (s *Self) sendFileToUser(user *User, file *os.File) (*SentMessage, error) { +func (s *Self) sendFileToUser(user *User, file io.Reader) (*SentMessage, error) { req := s.bot.Storage.Request info := s.bot.Storage.LoginInfo sentMessage, err := s.bot.Caller.WebWxSendFile(file, req, info, s.UserName, user.UserName) @@ -322,17 +322,17 @@ func (s *Self) SendTextToFriend(friend *Friend, text string) (*SentMessage, erro } // SendImageToFriend 发送图片消息给好友 -func (s *Self) SendImageToFriend(friend *Friend, file *os.File) (*SentMessage, error) { +func (s *Self) SendImageToFriend(friend *Friend, file io.Reader) (*SentMessage, error) { return s.sendImageToUser(friend.User, file) } // SendVideoToFriend 发送视频给好友 -func (s *Self) SendVideoToFriend(friend *Friend, file *os.File) (*SentMessage, error) { +func (s *Self) SendVideoToFriend(friend *Friend, file io.Reader) (*SentMessage, error) { return s.sendVideoToUser(friend.User, file) } // SendFileToFriend 发送文件给好友 -func (s *Self) SendFileToFriend(friend *Friend, file *os.File) (*SentMessage, error) { +func (s *Self) SendFileToFriend(friend *Friend, file io.Reader) (*SentMessage, error) { return s.sendFileToUser(friend.User, file) } @@ -441,17 +441,17 @@ func (s *Self) SendTextToGroup(group *Group, text string) (*SentMessage, error) } // SendImageToGroup 发送图片消息给群组 -func (s *Self) SendImageToGroup(group *Group, file *os.File) (*SentMessage, error) { +func (s *Self) SendImageToGroup(group *Group, file io.Reader) (*SentMessage, error) { return s.sendImageToUser(group.User, file) } // SendVideoToGroup 发送视频给群组 -func (s *Self) SendVideoToGroup(group *Group, file *os.File) (*SentMessage, error) { +func (s *Self) SendVideoToGroup(group *Group, file io.Reader) (*SentMessage, error) { return s.sendVideoToUser(group.User, file) } // SendFileToGroup 发送文件给群组 -func (s *Self) SendFileToGroup(group *Group, file *os.File) (*SentMessage, error) { +func (s *Self) SendFileToGroup(group *Group, file io.Reader) (*SentMessage, error) { return s.sendFileToUser(group.User, file) } @@ -530,7 +530,7 @@ func (s *Self) sendTextToMembers(text string, delay time.Duration, members ...*U } // sendImageToMembers 发送图片消息给群组或者好友 -func (s *Self) sendImageToMembers(img *os.File, delay time.Duration, members ...*User) error { +func (s *Self) sendImageToMembers(img io.Reader, delay time.Duration, members ...*User) error { if len(members) == 0 { return nil } @@ -544,7 +544,7 @@ func (s *Self) sendImageToMembers(img *os.File, delay time.Duration, members ... } // sendVideoToMembers 发送视频消息给群组或者好友 -func (s *Self) sendVideoToMembers(video *os.File, delay time.Duration, members ...*User) error { +func (s *Self) sendVideoToMembers(video io.Reader, delay time.Duration, members ...*User) error { if len(members) == 0 { return nil } @@ -557,7 +557,7 @@ func (s *Self) sendVideoToMembers(video *os.File, delay time.Duration, members . return s.forwardMessage(msg, delay, members[1:]...) } -func (s *Self) sendFileToMembers(file *os.File, delay time.Duration, members ...*User) error { +func (s *Self) sendFileToMembers(file io.Reader, delay time.Duration, members ...*User) error { if len(members) == 0 { return nil } @@ -577,19 +577,19 @@ func (s *Self) SendTextToFriends(text string, delay time.Duration, friends ...*F } // SendImageToFriends 发送图片消息给好友 -func (s *Self) SendImageToFriends(img *os.File, delay time.Duration, friends ...*Friend) error { +func (s *Self) SendImageToFriends(img io.Reader, delay time.Duration, friends ...*Friend) error { members := Friends(friends).AsMembers() return s.sendImageToMembers(img, delay, members...) } // SendFileToFriends 发送文件给好友 -func (s *Self) SendFileToFriends(file *os.File, delay time.Duration, friends ...*Friend) error { +func (s *Self) SendFileToFriends(file io.Reader, delay time.Duration, friends ...*Friend) error { members := Friends(friends).AsMembers() return s.sendFileToMembers(file, delay, members...) } // SendVideoToFriends 发送视频给好友 -func (s *Self) SendVideoToFriends(video *os.File, delay time.Duration, friends ...*Friend) error { +func (s *Self) SendVideoToFriends(video io.Reader, delay time.Duration, friends ...*Friend) error { members := Friends(friends).AsMembers() return s.sendVideoToMembers(video, delay, members...) } @@ -601,19 +601,19 @@ func (s *Self) SendTextToGroups(text string, delay time.Duration, groups ...*Gro } // SendImageToGroups 发送图片消息给群组 -func (s *Self) SendImageToGroups(img *os.File, delay time.Duration, groups ...*Group) error { +func (s *Self) SendImageToGroups(img io.Reader, delay time.Duration, groups ...*Group) error { members := Groups(groups).AsMembers() return s.sendImageToMembers(img, delay, members...) } // SendFileToGroups 发送文件给群组 -func (s *Self) SendFileToGroups(file *os.File, delay time.Duration, groups ...*Group) error { +func (s *Self) SendFileToGroups(file io.Reader, delay time.Duration, groups ...*Group) error { members := Groups(groups).AsMembers() return s.sendFileToMembers(file, delay, members...) } // SendVideoToGroups 发送视频给群组 -func (s *Self) SendVideoToGroups(video *os.File, delay time.Duration, groups ...*Group) error { +func (s *Self) SendVideoToGroups(video io.Reader, delay time.Duration, groups ...*Group) error { members := Groups(groups).AsMembers() return s.sendVideoToMembers(video, delay, members...) } @@ -798,17 +798,17 @@ func (s *Self) SendTextToMp(mp *Mp, text string) (*SentMessage, error) { } // SendImageToMp 发送图片消息给公众号 -func (s *Self) SendImageToMp(mp *Mp, file *os.File) (*SentMessage, error) { +func (s *Self) SendImageToMp(mp *Mp, file io.Reader) (*SentMessage, error) { return s.sendImageToUser(mp.User, file) } // SendFileToMp 发送文件给公众号 -func (s *Self) SendFileToMp(mp *Mp, file *os.File) (*SentMessage, error) { +func (s *Self) SendFileToMp(mp *Mp, file io.Reader) (*SentMessage, error) { return s.sendFileToUser(mp.User, file) } // SendVideoToMp 发送视频消息给公众号 -func (s *Self) SendVideoToMp(mp *Mp, file *os.File) (*SentMessage, error) { +func (s *Self) SendVideoToMp(mp *Mp, file io.Reader) (*SentMessage, error) { return s.sendVideoToUser(mp.User, file) }