media.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package material
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "github.com/silenceper/wechat/v2/util"
  7. )
  8. // MediaType 媒体文件类型
  9. type MediaType string
  10. const (
  11. // MediaTypeImage 媒体文件:图片
  12. MediaTypeImage MediaType = "image"
  13. // MediaTypeVoice 媒体文件:声音
  14. MediaTypeVoice MediaType = "voice"
  15. // MediaTypeVideo 媒体文件:视频
  16. MediaTypeVideo MediaType = "video"
  17. // MediaTypeThumb 媒体文件:缩略图
  18. MediaTypeThumb MediaType = "thumb"
  19. )
  20. const (
  21. mediaUploadURL = "https://api.weixin.qq.com/cgi-bin/media/upload"
  22. mediaUploadImageURL = "https://api.weixin.qq.com/cgi-bin/media/uploadimg"
  23. mediaGetURL = "https://api.weixin.qq.com/cgi-bin/media/get"
  24. )
  25. // Media 临时素材上传返回信息
  26. type Media struct {
  27. util.CommonError
  28. Type MediaType `json:"type"`
  29. MediaID string `json:"media_id"`
  30. ThumbMediaID string `json:"thumb_media_id"`
  31. CreatedAt int64 `json:"created_at"`
  32. }
  33. // MediaUpload 临时素材上传
  34. func (material *Material) MediaUpload(mediaType MediaType, filename string) (media Media, err error) {
  35. var accessToken string
  36. accessToken, err = material.GetAccessToken()
  37. if err != nil {
  38. return
  39. }
  40. uri := fmt.Sprintf("%s?access_token=%s&type=%s", mediaUploadURL, accessToken, mediaType)
  41. var response []byte
  42. response, err = util.PostFile("media", filename, uri)
  43. if err != nil {
  44. return
  45. }
  46. err = json.Unmarshal(response, &media)
  47. if err != nil {
  48. return
  49. }
  50. if media.ErrCode != 0 {
  51. err = fmt.Errorf("MediaUpload error : errcode=%v , errmsg=%v", media.ErrCode, media.ErrMsg)
  52. return
  53. }
  54. return
  55. }
  56. // MediaUploadFromReader 临时素材上传
  57. func (material *Material) MediaUploadFromReader(mediaType MediaType, filename string, reader io.Reader) (media Media, err error) {
  58. var accessToken string
  59. accessToken, err = material.GetAccessToken()
  60. if err != nil {
  61. return
  62. }
  63. uri := fmt.Sprintf("%s?access_token=%s&type=%s", mediaUploadURL, accessToken, mediaType)
  64. var byteData []byte
  65. byteData, err = io.ReadAll(reader)
  66. if err != nil {
  67. return
  68. }
  69. var response []byte
  70. response, err = util.PostFileByStream("media", filename, uri, byteData)
  71. if err != nil {
  72. return
  73. }
  74. err = json.Unmarshal(response, &media)
  75. if err != nil {
  76. return
  77. }
  78. if media.ErrCode != 0 {
  79. err = fmt.Errorf("MediaUpload error : errcode=%v , errmsg=%v", media.ErrCode, media.ErrMsg)
  80. return
  81. }
  82. return
  83. }
  84. // GetMediaURL 返回临时素材的下载地址供用户自己处理
  85. // NOTICE: URL 不可公开,因为含access_token 需要立即另存文件
  86. func (material *Material) GetMediaURL(mediaID string) (mediaURL string, err error) {
  87. var accessToken string
  88. accessToken, err = material.GetAccessToken()
  89. if err != nil {
  90. return
  91. }
  92. mediaURL = fmt.Sprintf("%s?access_token=%s&media_id=%s", mediaGetURL, accessToken, mediaID)
  93. return
  94. }
  95. // resMediaImage 图片上传返回结果
  96. type resMediaImage struct {
  97. util.CommonError
  98. URL string `json:"url"`
  99. }
  100. // ImageUpload 图片上传
  101. func (material *Material) ImageUpload(filename string) (url string, err error) {
  102. var accessToken string
  103. accessToken, err = material.GetAccessToken()
  104. if err != nil {
  105. return
  106. }
  107. uri := fmt.Sprintf("%s?access_token=%s", mediaUploadImageURL, accessToken)
  108. var response []byte
  109. response, err = util.PostFile("media", filename, uri)
  110. if err != nil {
  111. return
  112. }
  113. var image resMediaImage
  114. err = json.Unmarshal(response, &image)
  115. if err != nil {
  116. return
  117. }
  118. if image.ErrCode != 0 {
  119. err = fmt.Errorf("UploadImage error : errcode=%v , errmsg=%v", image.ErrCode, image.ErrMsg)
  120. return
  121. }
  122. url = image.URL
  123. return
  124. }