diff --git a/go.mod b/go.mod index 74e360f..1496c31 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/robfig/cron v1.2.0 // indirect github.com/spf13/afero v1.8.2 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect diff --git a/main.go b/main.go index 7bc7052..3387ad1 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "WechatGateWay/handle" "WechatGateWay/third_part" "fmt" + "github.com/robfig/cron" "github.com/spf13/viper" "log" "net/http" @@ -29,10 +30,16 @@ func init() { global.WechatSendAid = viper.GetString("wechat.SendAid") // receive_id 企业应用的回调,表示corpid global.WxCrypt = global.NewWXBizMsgCrypt(global.WechatToken, global.WechatEncodingAesKey, global.WechatCorpId, global.XmlType) - third_part.GetRemoteToken(global.WechatCorpId, global.WechatSendSecret) + third_part.GetRemoteToken() log.Println("server init success") } func main() { + c := cron.New() + //每30分钟执行一次 + c.AddFunc("0 */30 * * * *", func() { go third_part.GetRemoteToken() }) + c.Start() + log.Println("任务注册成功") + // 开启一个http服务器,接收来自企业微信的消息 http.HandleFunc("/", handle.HandleTencent) port := viper.GetString("server.port") diff --git a/third_part/WeChat.go b/third_part/WeChat.go index 48342a5..607fdaf 100644 --- a/third_part/WeChat.go +++ b/third_part/WeChat.go @@ -6,6 +6,7 @@ import ( "bytes" "encoding/json" "fmt" + "io" "io/ioutil" "log" "math" @@ -37,7 +38,9 @@ type JsonData struct { } // GetRemoteToken 从企业微信服务端API获取access_token,存在redis服务则缓存 -func GetRemoteToken(corpId, appSecret string) string { +func GetRemoteToken() string { + corpId := global.WechatCorpId + appSecret := global.WechatSendSecret getTokenUrl := fmt.Sprintf(GetTokenApi, corpId, appSecret) //log.Println("getTokenUrl==>", getTokenUrl) resp, err := http.Get(getTokenUrl) @@ -66,8 +69,6 @@ func GetRemoteToken(corpId, appSecret string) string { // PostMsg 推送消息 func PostMsg(postData JsonData, postUrl string) string { postJson, _ := json.Marshal(postData) - log.Println("postJson ", string(postJson)) - log.Println("postUrl ", postUrl) msgReq, err := http.NewRequest("POST", postUrl, bytes.NewBuffer(postJson)) if err != nil { log.Println(err) @@ -78,10 +79,10 @@ func PostMsg(postData JsonData, postUrl string) string { if err != nil { log.Fatalln("企业微信发送应用消息接口报错==>", err) } - defer msgReq.Body.Close() - body, _ := ioutil.ReadAll(resp.Body) - mediaResp := utils.ParseJson(string(body)) - log.Println("企业微信发送应用消息接口返回==>", mediaResp) + body, _ := io.ReadAll(resp.Body) + msgReq.Body.Close() + //mediaResp := utils.ParseJson(string(body)) + //log.Println("企业微信发送应用消息接口返回==>", mediaResp) return string(body) } @@ -119,21 +120,18 @@ func UploadMediaFile(msgType string, filename string, accessToken string) (strin buf := new(bytes.Buffer) writer := multipart.NewWriter(buf) if createFormFile, err := writer.CreateFormFile("media", fileInfo.Name()); err == nil { - readAll, _ := ioutil.ReadAll(fd) + readAll, _ := io.ReadAll(fd) createFormFile.Write(readAll) } writer.Close() uploadMediaUrl := fmt.Sprintf(UploadMediaApi, accessToken, msgType) - log.Println("uploadMediaUrl==>", uploadMediaUrl) newRequest, _ := http.NewRequest("POST", uploadMediaUrl, buf) newRequest.Header.Set("Content-Type", writer.FormDataContentType()) - log.Println("Content-Type ", writer.FormDataContentType()) client := &http.Client{} resp, err := client.Do(newRequest) - respData, _ := ioutil.ReadAll(resp.Body) + respData, _ := io.ReadAll(resp.Body) mediaResp := utils.ParseJson(string(respData)) - log.Println("企业微信上传临时素材接口返回==>", mediaResp) if err != nil { log.Fatalln("上传临时素材出错==>", err) return "", mediaResp["errcode"].(float64) @@ -216,13 +214,11 @@ func ValidateToken(errcode any) bool { // GetAccessToken 获取企业微信的access_token func GetAccessToken() string { - var WecomCid = global.WechatCorpId - var WecomSecret = global.WechatSendSecret accessToken := global.WechatAccessToken if accessToken == "" { log.Println("get access_token from remote API") - accessToken = GetRemoteToken(WecomCid, WecomSecret) + accessToken = GetRemoteToken() global.WechatAccessToken = accessToken } else { log.Println("get access_token from redis") @@ -242,13 +238,11 @@ func InitJsonData(msgType, toUser string) JsonData { } } -// due func -func SendText(toUser, msg string) { - var res http.ResponseWriter +// SendTextPost 发送文本消息 +func SendTextPost(toUser, msg string) { + // 获取token accessToken := GetAccessToken() - // 默认token有效 - tokenValid := true // 准备发送应用消息所需参数 postData := InitJsonData("text", toUser) @@ -256,54 +250,49 @@ func SendText(toUser, msg string) { Content: msg, } - postStatus := "" - for i := 0; i <= 3; i++ { - sendMessageUrl := fmt.Sprintf(SendMessageApi, accessToken) - postStatus = PostMsg(postData, sendMessageUrl) - postResponse := utils.ParseJson(postStatus) - errcode := postResponse["errcode"] - log.Println("发送应用消息接口返回errcode==>", errcode) - tokenValid = ValidateToken(errcode) - // token有效则跳出循环继续执行,否则重试3次 - if tokenValid { - break - } - // 刷新token - accessToken = GetAccessToken() + //for i := 0; i <= 3; i++ { + // sendMessageUrl := fmt.Sprintf(SendMessageApi, accessToken) + // postStatus = PostMsg(postData, sendMessageUrl) + // postResponse := utils.ParseJson(postStatus) + // errcode := postResponse["errcode"] + // log.Println("发送应用消息接口返回errcode==>", errcode) + // tokenValid = ValidateToken(errcode) + // // token有效则跳出循环继续执行,否则重试3次 + // if tokenValid { + // break + // } + // // 刷新token + // accessToken = GetAccessToken() + //} + + sendMessageUrl := fmt.Sprintf(SendMessageApi, accessToken) + postStatus := PostMsg(postData, sendMessageUrl) + msg_req, err := http.NewRequest("POST", sendMessageUrl, bytes.NewBuffer([]byte(postStatus))) + if err != nil { + log.Println(err) } + msg_req.Header.Set("Content-Type", "application/json") + client := &http.Client{} + _, err = client.Do(msg_req) + if err != nil { + panic(err) + } + defer msg_req.Body.Close() - res.Header().Set("Content-type", "application/json") - _, _ = res.Write([]byte(postStatus)) } -// SendPicFile send pic -func SendPicFile(toUser string, filename string) { - var res http.ResponseWriter +// due func +func SendTextBak(toUser, msg string) { + // 获取token accessToken := GetAccessToken() // 默认token有效 tokenValid := true - msgType := "image" - // 默认mediaId为空 - mediaId := "" - - // token有效则跳出循环继续执行,否则重试3次 - for i := 0; i <= 3; i++ { - var errcode float64 - mediaId, errcode = UploadMediaFile(msgType, filename, accessToken) - log.Printf("企业微信上传临时素材接口返回的media_id==>[%s], errcode==>[%f]\n", mediaId, errcode) - tokenValid = ValidateToken(errcode) - if tokenValid { - break - } - accessToken = GetAccessToken() - } - // 准备发送应用消息所需参数 - postData := InitJsonData("image", toUser) - postData.Image = Pic{ - MediaId: mediaId, + postData := InitJsonData("text", toUser) + postData.Text = Msg{ + Content: msg, } postStatus := "" @@ -322,8 +311,37 @@ func SendPicFile(toUser string, filename string) { accessToken = GetAccessToken() } + var res http.ResponseWriter res.Header().Set("Content-type", "application/json") _, _ = res.Write([]byte(postStatus)) + +} + +// SendPicMediaId send pic +func SendPicFile(toUser string, filename string) { + token := global.WechatAccessToken + // 准备发送应用消息所需参数 + mid, _ := UploadMediaFile("image", filename, token) + postData := InitJsonData("image", toUser) + postData.Image = Pic{ + MediaId: mid, + } + + sendMessageUrl := fmt.Sprintf(SendMessageApi, token) + postStatus := PostMsg(postData, sendMessageUrl) + //postResponse := utils.ParseJson(postStatus) + + msg_req, err := http.NewRequest("POST", sendMessageUrl, bytes.NewBuffer([]byte(postStatus))) + if err != nil { + log.Println(err) + } + msg_req.Header.Set("Content-Type", "application/json") + client := &http.Client{} + _, err = client.Do(msg_req) + if err != nil { + panic(err) + } + defer msg_req.Body.Close() } // wechat send pic