Skip to content

Commit

Permalink
更新微信API
Browse files Browse the repository at this point in the history
  • Loading branch information
tiechui1994 committed Feb 25, 2023
1 parent 785229a commit 2b784ca
Show file tree
Hide file tree
Showing 3 changed files with 203 additions and 109 deletions.
94 changes: 94 additions & 0 deletions weixin/upload.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package weixin

import (
"crypto/rand"
"encoding/hex"
"fmt"
"io"
"io/fs"
"mime"
"path/filepath"
"strings"
)

func randomBoundary() string {
var buf [4]byte
_, err := io.ReadFull(rand.Reader, buf[:])
if err != nil {
panic(err)
}
return hex.EncodeToString(buf[:])
}

var quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"")

func escapeQuotes(s string) string {
return quoteEscaper.Replace(s)
}

// Multipart request has the following structure:
// POST /upload HTTP/1.1
// Other-Headers: ...
// Content-Type: multipart/form-data; boundary=$boundary
// \r\n
// --$boundary\r\n <-request body starts here
// Content-Disposition: form-data; name="field1"; filename="xyz.img"\r\n
// Content-Type: application/octet-stream\r\n
// Content-Length: 4\r\n
// \r\n
// $content\r\n
// --$boundary\r\n
// Content-Disposition: form-data; name="field2"; filename="pwd.img"\r\n
// ...
// --$boundary--\r\n
func uploadFile(fields map[string]interface{}) (reader io.Reader, contentType string, totalSize int, err error) {
boundary := randomBoundary()
contentType = fmt.Sprintf("multipart/form-data; boundary=%s", boundary)

parts := make([]io.Reader, 0)
CRLF := "\r\n"

fieldBoundary := "------------------------" + boundary + CRLF

for k, v := range fields {
parts = append(parts, strings.NewReader(fieldBoundary))
totalSize += len(fieldBoundary)
if v == nil {
continue
}
switch val := v.(type) {
case string:
header := fmt.Sprintf(`Content-Disposition: form-data; name="%s"`, escapeQuotes(k))
parts = append(
parts,
strings.NewReader(header+CRLF+CRLF),
strings.NewReader(val),
strings.NewReader(CRLF),
)
totalSize += len(header) + 2*len(CRLF) + len(val) + len(CRLF)
continue
case fs.File:
stat, _ := val.Stat()
contentType := mime.TypeByExtension(filepath.Ext(stat.Name()))
header := strings.Join([]string{
fmt.Sprintf(`Content-Disposition: form-data; name="%s"; filename="%s"`, escapeQuotes(k), escapeQuotes(stat.Name())),
fmt.Sprintf(`Content-Type: %s`, contentType),
fmt.Sprintf(`Content-Length: %d`, stat.Size()),
}, CRLF)
parts = append(
parts,
strings.NewReader(header+CRLF+CRLF),
val,
strings.NewReader(CRLF),
)
totalSize += len(header) + 2*len(CRLF) + int(stat.Size()) + len(CRLF)
continue
}
}

finishBoundary := "------------------------" + boundary + "------------------------" + CRLF
parts = append(parts, strings.NewReader(finishBoundary))
totalSize += len(finishBoundary)

return io.MultiReader(parts...), contentType, totalSize, nil
}
196 changes: 98 additions & 98 deletions weixin/weixin.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ type Article struct {
Content string `json:"content"`
Digest string `json:"digest"`

ThumbMediaID string `json:"thumb_media_id"`
ShowCoverPic int `json:"show_cover_pic"`
ContentSourceUrl string `json:"content_source_url"`
ContentSourceUrl string `json:"content_source_url"`
ThumbMediaID string `json:"thumb_media_id"`
NeedOpenComment int `json:"need_open_comment"`
OnlyFansCanComment int `json:"only_fans_can_comment"`

Url string `json:"url"`
ThumbUrl string `json:"thumb_url"`
Url string `json:"url"`
}

type wxerror struct {
Expand Down Expand Up @@ -122,99 +122,6 @@ func PersitMaterialList(token, mtype string, offset, count int) (list interface{
}
}

func AddPersitNews(token string, article Article) (id string, err error) {
value := []string{
"access_token=" + token,
}
u := weixin + "/cgi-bin/material/add_news?" + strings.Join(value, "&")
body := map[string]interface{}{
"articles": []Article{article},
}

raw, err := util.POST(u, util.WithBody(body))
if err != nil {
return id, err
}

var result struct {
wxerror
MediaID string `json:"media_id"`
}
err = json.Unmarshal(raw, &result)
if err != nil {
return id, err
}

if result.isError() {
err = result.wxerror
return
}

return result.MediaID, nil
}

func UpdatePersitNews(token, mdediaid string, index int, article Article) (err error) {
value := []string{
"access_token=" + token,
}
u := weixin + "/cgi-bin/material/update_news?" + strings.Join(value, "&")
body := map[string]interface{}{
"media_id": mdediaid,
"index": index,
"articles": article,
}

raw, err := util.POST(u, util.WithBody(body))
if err != nil {
return err
}

var result struct {
wxerror
}
err = json.Unmarshal(raw, &result)
if err != nil {
return err
}

if result.isError() {
err = result.wxerror
return
}

return nil
}

func GetPersitNews(token, mediaid string) (artice []Article, err error) {
value := []string{
"access_token=" + token,
}
u := weixin + "/cgi-bin/material/get_material?" + strings.Join(value, "&")
body := map[string]string{
"media_id": mediaid,
}
raw, err := util.POST(u, util.WithBody(body))
if err != nil {
return artice, err
}

var result struct {
wxerror
NewsItem []Article `json:"news_item"`
}
err = json.Unmarshal(raw, &result)
if err != nil {
return artice, err
}

if result.isError() {
err = result.wxerror
return
}

return result.NewsItem, nil
}

func UploadNewsImage(token, filename string) (url string, err error) {
info, err := os.Stat(filename)
if err != nil {
Expand Down Expand Up @@ -357,3 +264,96 @@ func Token(appid, secret string) (token TokenInfo, err error) {

return result.TokenInfo, nil
}

func AddDraft(token string, article Article) (id string, err error) {
value := []string{
"access_token=" + token,
}
u := weixin + "/cgi-bin/draft/add?" + strings.Join(value, "&")
body := map[string]interface{}{
"articles": []Article{article},
}

raw, err := util.POST(u, util.WithBody(body))
if err != nil {
return id, err
}

var result struct {
wxerror
MediaID string `json:"media_id"`
}
err = json.Unmarshal(raw, &result)
if err != nil {
return id, err
}

if result.isError() {
err = result.wxerror
return
}

return result.MediaID, nil
}

func GetDraft(token, mediaid string) (artice []Article, err error) {
value := []string{
"access_token=" + token,
}
u := weixin + "/cgi-bin/draft/get?" + strings.Join(value, "&")
body := map[string]string{
"media_id": mediaid,
}
raw, err := util.POST(u, util.WithBody(body))
if err != nil {
return artice, err
}

var result struct {
wxerror
NewsItem []Article `json:"news_item"`
}
err = json.Unmarshal(raw, &result)
if err != nil {
return artice, err
}

if result.isError() {
err = result.wxerror
return
}

return result.NewsItem, nil
}

func UpdateDraft(token, mdediaid string, index int, article Article) (err error) {
value := []string{
"access_token=" + token,
}
u := weixin + "/cgi-bin/draft/update?" + strings.Join(value, "&")
body := map[string]interface{}{
"media_id": mdediaid,
"index": index,
"articles": article,
}

raw, err := util.POST(u, util.WithBody(body))
if err != nil {
return err
}

var result struct {
wxerror
}
err = json.Unmarshal(raw, &result)
if err != nil {
return err
}

if result.isError() {
err = result.wxerror
return
}

return nil
}
22 changes: 11 additions & 11 deletions weixin/weixin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ import (
"testing"
)

var token = "48_sU3K7Ezw5aL3Kyd4ChGcG_f-Mkm_bTij5jTv9u224hXkbMAXX7QBbvx4rLLX-lqd7JkbhqwlIQ5pbgKIlsledrmJdCmyFlXMuHkvAkWAYJcTmOb1L0OzHCSHsoz7izmjogWWoNTFkaDw43o3NSKdAEAGLD"
var token = "65__urjOi5kgsVuLWxndRheHLtoWqT8UWo9dzBTxUFNMXpdX6L5mm-ok7MnyDQWulpl7m-eu4ACdRDOMooC5ZJw25Q58tzuvVCQayBh49rNdmC-AT_q9-o1X_I_tMJPZgACAYEO"

func TestUploadNewsImage(t *testing.T) {
id, err := UploadNewsImage(token, "/home/quinn/Pictures/develop_runtime_cfun7.jpeg")
id, err := UploadNewsImage(token, "/home/quinn/Downloads/v.jpeg")
t.Log("id", id)
t.Log("err", err)
}

func TestAddPersitMaterial(t *testing.T) {
id, err := AddPersitMaterial(token, MediaImage, "/home/quinn/Pictures/develop_runtime_cfun7.jpeg")
id, err := AddPersitMaterial(token, MediaImage, "/home/quinn/Downloads/vietnamese-woman.jpg")
t.Log("id", id)
t.Log("err", err)
}
Expand All @@ -26,21 +26,21 @@ func TestMediaList(t *testing.T) {
}

// crAgK-cmXMbGEq9kZymbzf_ZnZjo4XV7HHYef7yF_ZI
func TestAddPersitNews(t *testing.T) {
func TestAddDraft(t *testing.T) {
data, _ := ioutil.ReadFile("/home/quinn/Desktop/www.html")
news := Article{
Title: "测试当中",
Title: "测试case",
Author: "tiechui1994",
ThumbMediaID: "crAgK-cmXMbGEq9kZymbzWP0k6ziJ5W_OayqgGzT2Go",
ThumbMediaID: "crAgK-cmXMbGEq9kZymbzbQ2SZK08yL2dASCbsNrKRf3UH5s3yDc9ReYrv0IyNbd",
ContentSourceUrl: "https://www.baidu.com",
Content: string(data),
}
id, err := AddPersitNews(token, news)
id, err := AddDraft(token, news)
t.Log("id", id)
t.Log("err", err)
}

func TestUpdatePersitNews(t *testing.T) {
func TestUpdateDraft(t *testing.T) {
data, _ := ioutil.ReadFile("/home/quinn/Desktop/yyy.html")
news := Article{
Title: "测试当中",
Expand All @@ -49,12 +49,12 @@ func TestUpdatePersitNews(t *testing.T) {
ContentSourceUrl: "https://www.baidu.com",
Content: string(data),
}
err := UpdatePersitNews(token, "crAgK-cmXMbGEq9kZymbzf_ZnZjo4XV7HHYef7yF_ZI", 0, news)
err := UpdateDraft(token, "crAgK-cmXMbGEq9kZymbzf_ZnZjo4XV7HHYef7yF_ZI", 0, news)
t.Log("err", err)
}

func TestGetPersitNews(t *testing.T) {
news, err := GetPersitNews(token, "crAgK-cmXMbGEq9kZymbzfRNQraVlfgjkPuDLTrU2yY")
func TestGetDraft(t *testing.T) {
news, err := GetDraft(token, "crAgK-cmXMbGEq9kZymbzfRNQraVlfgjkPuDLTrU2yY")
t.Log("news", news)
t.Log("err", err)
}

0 comments on commit 2b784ca

Please sign in to comment.