发送文件直接支持 io.Reader (#182)
This commit is contained in:
parent
721f56314e
commit
da3b267965
50
caller.go
50
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
|
||||
}
|
||||
|
15
client.go
15
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),
|
||||
|
@ -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)
|
||||
|
26
relations.go
26
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)
|
||||
}
|
||||
|
||||
|
42
user.go
42
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)
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user