dingding/main.go

183 lines
4.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"errors"
"flag"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"strconv"
"strings"
"time"
"github.com/sirupsen/logrus"
"github.com/spf13/viper"
"myschools.me/wyh/dingd.git/model"
"myschools.me/wyh/dingd.git/service"
)
func main() {
cf := flag.String("config", "config.yaml", "file of config")
flag.Parse()
viper.SetConfigFile(*cf)
if err := viper.ReadInConfig(); err != nil {
logrus.WithFields(logrus.Fields{
"func": "main",
}).Errorf("%s", err.Error())
return
}
uid := "351313653629177902"
opid := "351313653629177902"
service.DingTalkTaskCreate(&uid, &opid)
// unionid:=UnionidByCode()
// accesstoken, err := GetAccesstoken()
// if err != nil {
// log.Fatal(err)
// }
// userid, err := GetUseridByUnionid(accesstoken, unionid)
// if err != nil {
// log.Fatal(err)
// }
// userinfo, err := GETUserInfo(accesstoken, userid)
// if err != nil {
// log.Fatal(err)
// }
// fmt.Println(userinfo)
}
func EncodeSHA256(message, secret string) string {
// 钉钉签名算法实现
h := hmac.New(sha256.New, []byte(secret))
h.Write([]byte(message))
sum := h.Sum(nil) // 二进制流
message1 := base64.StdEncoding.EncodeToString(sum)
uv := url.Values{}
uv.Add("0", message1)
message2 := uv.Encode()[2:]
return message2
}
func GetAccesstoken() (accesstoken string, err error) {
var resp *http.Response
//var AppKey, AppSecret string
//获取access_token
url := fmt.Sprintf("https://oapi.dingtalk.com/gettoken?appkey=%s&appsecret=%s", viper.GetString("app.AppKey"), viper.GetString("app.AppSecret"))
resp, err = http.Get(url)
if err != nil {
return "", err
}
//fmt.Println(resp)
//fmt.Println(err)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
var i map[string]interface{}
_ = json.Unmarshal(body, &i)
//fmt.Println(1, string(body), i["errmsg"])
if i["errcode"].(float64) == 0 {
return i["access_token"].(string), nil
}
return "", errors.New("accesstoken获取错误" + i["errmsg"].(string))
}
func GetUseridByUnionid(accesstoken, unionid string) (userid string, err error) {
//根据unionid获取userid
var resp *http.Response
url := fmt.Sprintf("https://oapi.dingtalk.com/topapi/user/getbyunionid?access_token=%s", accesstoken)
p := struct {
Unionid string `json:"unionid"`
}{unionid} // post数据
p1, _ := json.Marshal(p)
p2 := string(p1)
p3 := strings.NewReader(p2) //构建post数据
resp, err = http.Post(url, "application/json;charset=UTF-8", p3)
if err != nil {
return "", nil
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", nil
}
//fmt.Println(1, string(body), err)
var i map[string]interface{}
_ = json.Unmarshal(body, &i)
errcode := i["errcode"].(float64)
if errcode != 0 {
return "", fmt.Errorf("userid获取错误: %f, %s", errcode, i["errmsg"].(string))
}
return i["result"].(map[string]interface{})["userid"].(string), nil
}
func GETUserInfo(accesstoken, userid string) (*model.DingtalkUserInfoResponse, error) {
var resp *http.Response
url := fmt.Sprintf("https://oapi.dingtalk.com/topapi/v2/user/get?access_token=%s", accesstoken)
p := struct {
UserID string `json:"userid"`
Language string `json:"language"`
}{
UserID: userid,
Language: "zh_CN",
}
p1, _ := json.Marshal(p)
p2 := string(p1)
p3 := strings.NewReader(p2) //构建post数据
resp, err := http.Post(url, "application/json;charset=UTF-8", p3)
if err != nil {
return nil, err
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
userinfo := &model.DingtalkUserInfoResponse{}
_ = json.Unmarshal(body, userinfo)
errcode := userinfo.ErrCode
if errcode != 0 {
log.Fatal("errcode!=0")
}
return userinfo, nil
}
func UnionidByCode() string {
timestamp := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) // 毫秒时间戳
signature := EncodeSHA256(timestamp, viper.GetString("app.AppSecret")) // 加密签名 加密算法见我另一个函数
url := fmt.Sprintf("https://oapi.dingtalk.com/sns/getuserinfo_bycode?accessKey=%s&timestamp=%s&signature=%s",
viper.GetString("app.AppKey"), timestamp, signature)
p := struct {
Tmp_auth_code string `json:"tmp_auth_code"`
}{viper.GetString("app.AuthCode")} // post数据
p1, _ := json.Marshal(p)
p2 := string(p1)
p3 := strings.NewReader(p2) //构建post数据
resp, err := http.Post(url, "application/json;charset=UTF-8", p3)
if err != nil {
log.Fatal(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
i := make(map[string]interface{})
_ = json.Unmarshal(body, &i)
fmt.Println(i)
errcode := i["errcode"].(float64)
if errcode != 0 {
log.Fatal("errcode ==0")
}
unionid := i["user_info"].(map[string]interface{})["unionid"].(string)
return unionid
}