(原) 利用企业微信发送各种信息

原创文章,请后转载,并注明出处。

利用企业微信,可以很方便的给自己或者企业员工发送各种信息,用于通知、公告,自动化信息发送,生产信息发送等等。不象微信公众号受到发送限制,也不象网页版微信,非官方API不知道什么时候就不能用了。

我就用它发送很多信息:

  1. 服务器登陆信息:我有几个服务器,客户的,自己的,家里24小时的pi。谁有用户登陆,它会发个信息到企业微信。

  2. 家里是电信宽带,动态IP,让它自动发个到企业微信,于是就可以远程操作了。

  3. 自己做了一个门禁:家里大门,每次开门关门都会发信息的,有人回家我是知道的。 :)

  4. 家人电脑上给我发信息。在电脑上直接发送信息,这方便了吧。根本不用登陆,因为我将基本信息已经写入程序,直接发送就行。

  5. 邮件:你让它自动去轮询邮箱,发现某个标识的文件标题,就可以从企业微信上通知你,及时,而不被骚扰。

  6. 网站发送信息给我:我开发的网站,或者是自己的网站,通过接口随时可以给我发信息

  7. 进一步还可以拓展为网页与企业微信的交互,即可以让网页用户直接与企业微信号沟通,象客服一样。

  8. 你还可以想到很多….

代码很简单

package main

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
	"time"
	"github.com/soease/tools"

	jsoniter "github.com/json-iterator/go"
)

var json = jsoniter.ConfigCompatibleWithStandardLibrary

type JSON struct {
	Access_token string `json:"access_token"`
}

type MESSAGES struct {
	Touser  string `json:"touser"`
	Toparty string `json:"toparty"`
	Msgtype string `json:"msgtype"`
	Agentid int    `json:"agentid"`
	Text    struct {
		//Subject string `json:"subject"`
		Content string `json:"content"`
	} `json:"text"`
	Safe int `json:"safe"`
}

func Get_AccessToken(corpid, corpsecret string) string {
	gettoken_url := "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + corpsecret
	//print(gettoken_url)
	client := &http.Client{}
	req, _ := client.Get(gettoken_url)
	defer req.Body.Close()
	body, _ := ioutil.ReadAll(req.Body)
	//fmt.Printf("\n%q", string(body))
	var json_str JSON
	json.Unmarshal([]byte(body), &json_str)
	//fmt.Printf("\n%q",json_str.Access_token)
	return json_str.Access_token
}

func Send_Message(access_token, msg string) {
	send_url := "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token
	//print(send_url)
	client := &http.Client{}
	req, _ := http.NewRequest("POST", send_url, bytes.NewBuffer([]byte(msg)))
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("charset", "UTF-8")
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	
	//fmt.Println("response Status:", resp.Status)
	//body, _ := ioutil.ReadAll(resp.Body)
	//fmt.Println("response Body:", string(body))
}

func messages(touser string, toparty string, agentid int, content string) string {
	msg := MESSAGES{
		Touser:  touser,
		Toparty: toparty,
		Msgtype: "text",
		Agentid: agentid,
		Safe:    0,
		Text: struct {
			//Subject string `json:"subject"`
			Content string `json:"content"`
		}{Content: content},
	}
	sed_msg, _ := json.Marshal(msg)
	//fmt.Printf("%s", string(sed_msg))
	return string(sed_msg)
}

func main() {
	touser := "" //企业号中的用户帐号
	content := ""
	if len(os.Args) == 3 {
		touser = os.Args[1]
		content = time.Now().Format("2006-01-02 15:04:05") + ": " + os.Args[2]
	} else if len(os.Args) == 2 {
		touser = "ease"
		if strings.ToUpper(os.Args[1])=="IP" {
			content ="当前设备公网IP: " + tools.WanIP()
		} else {
			content = time.Now().Format("2006-01-02 15:04:05") + ": " + os.Args[1]
		}
	} else {
		fmt.Printf("\n格式:%s [用户ID] 信息\n\n", os.Args[0])
		return
	}
	toparty := "0"                                              //企业号中的部门id。
	agentid := 0                                                //企业号中的应用id。
	corpid := "wxce27304be..."                              //企业号的标识
	corpsecret := "ypLhR5NLU2E..." ///企业号中的应用的Secret
	accessToken := Get_AccessToken(corpid, corpsecret)
	//  fmt.Println(content)
	// 序列化成json之后,\n会被转义,也就是变成了\\n,使用str替换,替换掉转义
	msg := strings.Replace(messages(touser, toparty, agentid, content), "\\\\", "\\", -1)

	//  fmt.Println(strings.Replace(msg,"\\\\","\\",-1))
	Send_Message(accessToken, msg)

}