发送文件直接支持 io.Reader (#182)

This commit is contained in:
多吃点苹果 2023-01-06 14:55:08 +08:00 committed by GitHub
parent 721f56314e
commit da3b267965
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 96 additions and 43 deletions

View File

@ -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
}

View File

@ -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),

View File

@ -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)

View File

@ -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)
}

42
user.go
View File

@ -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)
}