Go語言實現釘釘發送通知

藍葉子Sheep · · 260 次點擊 · · 開始瀏覽    
package?main

import?(
???"bufio"
???"io"
???"fmt"
???"io/ioutil"
???"os/exec"
???"net/http"
???"os"
???"strings"
)

func?GetKey()?(timestamp?string?,sign?string,?err?error){
???cmd?:=?exec.Command("/bin/python",?"/application/scripts/hezhong_host_status/aaa.py")
???stdout?,?err?:=?cmd.StdoutPipe()
???if?err?!=?nil?{
??????fmt.Println("Error:can?not?obtain?stdout?pipe?for?command:%s?\n",?err)
??????return?timestamp?,?sign,??err
???}


???if?err?:=?cmd.Start()?;?err?!=?nil?{
??????fmt.Println("Error:The?command?is?err?",err)
??????return??timestamp,??sign,err
???}

???var?Key?[]string
???//讀取所有輸出
???bytes?:=?bufio.NewReader(stdout)
???for?{
??????line?,err:=?bytes.ReadString('\n')
??????if?err?==?io.EOF{
?????????break
??????}
??????if?err?!=?nil?{
?????????fmt.Println("Read?Err:",err)
??????}
??????Key?=?append(Key,line)
???}


???if?err?:=?cmd.Wait();err!=?nil{
??????fmt.Println("Wait",err.Error())
??????return??timestamp,?sign?,err
???}

???timestamp?=?Key[0]
???sign?=?Key[1]
???return?timestamp?,sign?,nil
}

func?SendDingMsg(msg?string)?{
???//請求地址模板

???timestamp?,?sign?,?err?:=?GetKey()
???if?err?!=?nil?{
??????fmt.Println("Get?Key?Err:",err)
???}
???timestamp?=?strings.TrimRight(timestamp,?"\n")
???sign?=?strings.TrimRight(sign,?"\n")
???//timestamp?:=?time.Now().UnixNano()?/?1e6
???//timestamp?:=?int64(1572870805748)
???//sign?:=?"oJ5SHD3IwCWVIcL78k3pgX0tfQnjDfcDZMPXAI%2BvrFE%3D"
???webHook?:=?"https://oapi.dingtalk.com/robot/send?access_token=628d11124aef5f9efe2a8c8a6b5afa2b67ab01dxxxxxxxxxxxxxxxxxxxxx&"+?"timestamp="?+?timestamp?+?"&sign="?+?sign
???content?:=?`{"msgtype":?"text",
??????"text":?{"content":?"`+?msg?+?`"},
????????????????"at":?{
?????????????????????"atMobiles":?[
?????????????????????????"18301371817"
?????????????????????],
?????????????????????"isAtAll":?true
????????????????}
???}`
???//創建一個請求
???req,?err?:=?http.NewRequest("POST",?webHook,?strings.NewReader(content))
???if?err?!=?nil?{
??????fmt.Println(err)
???}
???client?:=?&http.Client{}
???//設置請求頭
???req.Header.Set("Content-Type",?"application/json")
???req.Header.Set("User-agent","firefox")
???//發送請求
???resp,?err?:=?client.Do(req)
???//關閉請求
???defer?resp.Body.Close()
???fmt.Println(resp.StatusCode)
???body,_?:=?ioutil.ReadAll(resp.Body)
???fmt.Println(string(body))
???if?err?!=?nil?{
??????fmt.Println("handle?error")
???}
}


func?main(){
???SendDingMsg(os.Args[1])
}

輔助Python腳本:

#!python?2.7
import?time
import?hmac
import?hashlib
import?base64
import?urllib
timestamp?=?long(round(time.time()?*?1000))
secret?=?'this?is?secret'
secret_enc?=?bytes(secret).encode('utf-8')
string_to_sign?=?'{}\n{}'.format(timestamp,?secret)
string_to_sign_enc?=?bytes(string_to_sign).encode('utf-8')
hmac_code?=?hmac.new(secret_enc,?string_to_sign_enc,?digestmod=hashlib.sha256).digest()
sign?=?urllib.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)




本文來自:51CTO博客

感謝作者:藍葉子Sheep

查看原文:Go語言實現釘釘發送通知

入群交流(和以上內容無關):Go中文網 QQ 交流群:729884609 或加微信入微信群:274768166 備注:入群;關注公眾號:Go語言中文網

260 次點擊  
加入收藏 微博
暫無回復
添加一條新回復 (您需要 登錄 后才能回復 沒有賬號 ?)
  • 請盡量讓自己的回復能夠對別人有幫助
  • 支持 Markdown 格式, **粗體**、~~刪除線~~、`單行代碼`
  • 支持 @ 本站用戶;支持表情(輸入 : 提示),見 Emoji cheat sheet
  • 圖片支持拖拽、截圖粘貼等方式上傳