Commit 850d3510 by 陶腾飞

v1.5.0 知微运维平台升级支持开机重启关机、支持批量百度搜索

parent 0a7cbf9e
......@@ -24,7 +24,6 @@ func main(){
var backupText = flag.String( pub.Msg_Backup ,"" ,"backup status to AD")
var reportText = flag.String( pub.Msg_Report ,"" ,"report to AD")
var execText = flag.String( pub.Msg_Exec ,"" ,"exec to LocalDaemon")
var regText = flag.String( pub.Msg_Reg ,"" ,"mod reg")
//var userText = flag.String( "user" ,"" ,"who is running me")
var passText = flag.String( "pass" ,"" ,"input passwork,but not need")
var wolmacText = flag.String( "wolmac" ,"" ,"input mac address for wake pc")
......@@ -38,7 +37,6 @@ func main(){
if *reportText != "" { flag_report( reportText );return}
if *backupText != "" { flag_bakcup( backupText );return}
if *execText != "" { flag_exec( execText );return}
if *regText != "" { flag_reg( regText );return}
if *wolmacText != "" { flag_wolmac( wolmacText );return}
if *woluserText != "" { flag_woluser( woluserText,passText);return}
if *wolallText { flag_wolall( passText );return}
......@@ -65,9 +63,6 @@ func flag_bakcup(s *string){
func flag_exec(s * string){
pub.SendServerExec(*s)
}
func flag_reg(s * string){
;
}
func flag_hour(){
nh := pub.GetHour()
switch nh{
......
......@@ -8,7 +8,7 @@ const DaemonListen string = ":" + DaemonPort
const ADServerDaemon string = Host_adserver + DaemonListen
const WxwrokDaemon string = ":16823"
const RandMax int = 60
const Version string = "1.4.0"
const Version string = "1.5.0"
// user //
......@@ -68,7 +68,6 @@ const App_adct string = SMB_ADSoftApplication + "adct.exe"
const App_MultiSplit string = SMB_ADSoftOthTool + "win_MultiSplit.exe"
const App_Sync string = `syncappw.exe`
const App_Sync_dir string = `C:\Progra~1\zhiwei\AllWay_Sync\Bin\syncappw.exe`
//const App_MulitOpenPages string = SMB_ADOtherTool + "MultiOpenPages.bat"
// backup //
......@@ -83,6 +82,7 @@ const (
HKLM
HKU
)
const Reg_Root_ac int = HKLM
const Reg_Root_dc int = HKCU
const Reg_Path_home string = `SOFTWARE\ADControl`
......@@ -104,8 +104,9 @@ const Reg_Name_LogStatus string = "LogStatus"
const Reg_Name_BackupVersion string = "BackupVersion"
const Reg_Name_PrimayComputerName string = "PrimayComputerName"
const Reg_Name_BeWakedID string = "BeWakedID"
// reg value //
// reg value //
var Reg_Value_WeDriveDir string = Reg_query_key_one(HKCU,Reg_Path_home,Reg_Name_WeDriveDir)
var Reg_Value_ON string = "ON"
var Reg_Value_OFF string = "OFF"
......@@ -118,16 +119,24 @@ var Reg_Value_LogStatus_OUT string = "OUT"
const Link_WxworkBot string = `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=59107f72-5b72-4a20-a33c-fdb1cd46f2c6`
const Cmd_k string = "cmd /k "
const Cmd_K_Start string = "cmd /k start "
var CopyStatusWeDrive map [string]bool
// wxwork key //
const WXTokenMsgSend string ="AvAQlFNxy1UQB3CjRml3GfKf7Y"
const WxworkTokenMsgSend string = "AvAQlFNxy1UQB3CjRml3GfKf7Y"
const WxworkEncodingAseKey string = "AwLPVXc1MxPmqo7dzw8CYbbWku0nZlDwWDVCSknqEFy"
const WxworkReceiverId string = "ww49cfd580625083c9"
const WxworkCorid string = "ww49cfd580625083c9"
const WxworkCorpSecret string = "ckANI7SsRh0v_zu2uN7gitRHvTwqRAh8oG1a20xJo_I"
const WxWorkAgentID string = "1000014"
// wxwork event key //
const WXEK_zwDevopsPowerWake string = "zwdevops_power_wake"
const WXEK_zwDevopsPowerTurnOFF string = "zwdevops_power_turnoff"
const WXEK_zwDevopsPowerReboot string = "zwdevops_power_reboot"
const WXEK_zwDevopsPowerStatus string = "zwdevops_power_status"
// wxwork answaer //
const WXRec_WakeSuccess string = "主机已启动!"
\ No newline at end of file
const WXRec_WakeSuccess string = "主机已启动,一切就绪~"
\ No newline at end of file
......@@ -23,6 +23,8 @@ var Error_Not_Msg = errors.New("isn't defined msg")
var Error_WXWork_Down = errors.New(Error_WXWork_Down_STR)
var Error_WXWork_Down_STR = "后台错误"
var Error_WXWork_NotDominUser_STR = "您的主机暂时不支持该功能"
func NewError(s string) error{
return errors.New(s)
}
\ No newline at end of file
......@@ -118,12 +118,6 @@ func (rep *MJreport)Msg_Deal() interface{} {
Reg_Name_LogStatus,
Reg_Value_LogStatus_OUT)
case Msg_Report_OverCopyToWeDrive:
go func() {
Delay(600)
CopyStatusWeDrive[rep.Dept] = true
}()
default:
PntOth("Default Report Json ",rep.Instruction)
......@@ -173,11 +167,9 @@ func (exec *MJexec)Msg_Deal()interface{}{
case Msg_Exec_HideShowIcon:
var hidetype string
if exec.DataBool {
exec.Explain = "显示"
hidetype = "+"
}else{
exec.Explain = "隐藏"
hidetype = "-"
}else{
hidetype = "+"
}
exec.Command = "attrib "+ hidetype+`h `+ exec.DataStr
exec.PsExec()
......@@ -296,41 +288,50 @@ func (bak * MJbackup)Msg_Deal() interface{}{
func (wxwork * MJwxwork)Msg_Deal() interface{}{
switch (wxwork.Instruction){
switch wxwork.Instruction {
case Msg_Wxwork_UserWake:
var zhiweiuser bool
// 在注册表中查询记录
pc := wxwork.Reg_Query_ADUsers(Reg_Name_PrimayComputerName)
mac := wxwork.Reg_Query_ADUsers(Reg_Name_MACAddress)
var domainUser bool = true
var pc,mac string
var err error
// 在注册表中查询 域用户 记录
if err = Reg_IfExist_item(Reg_Root_ac,Reg_Path_home_du + wxwork.Name); err == nil{
pc = wxwork.Reg_Query_ADUsers(Reg_Name_PrimayComputerName)
mac = wxwork.Reg_Query_ADUsers(Reg_Name_MACAddress)
if pc == "" || mac == ""{
// 在注册表中查询 知微用户 记录
}else if err = Reg_IfExist_item(Reg_Root_ac,Reg_Path_home_zhu + wxwork.Name); err == nil{
pc = wxwork.Reg_Query_ZhiWeiUsers(Reg_Name_PrimayComputerName)
mac = wxwork.Reg_Query_ZhiWeiUsers(Reg_Name_MACAddress)
zhiweiuser = true
}
if pc == "" || mac == ""{
wxwork.Text ="如果你不是情报部门,那么暂时还不支持该功能"
return wxwork
domainUser = false
}else{
wxwork.Text = Error_WXWork_NotDominUser_STR
break
}
// 查看电源状态
status,err := PSTest_Connection(pc)
PrintLog(pc,mac,wxwork.Name,Msg_Wxwork_UserWake,status)
PntWxwork(pc,mac,wxwork.Name,Msg_Wxwork_UserWake,status)
if err !=nil{
wxwork.Text = Error_WXWork_Down_STR
return wxwork
break
}
if status {
wxwork.Text = "已经开机了哦~"
return wxwork
break
}
// 只有域用户有效
// 写入被唤醒的ID用于判断是否是被企业微信唤醒
if zhiweiuser{
if domainUser{
Reg_Write_ADDC(pc,Reg_Name_BeWakedID,wxwork.UserID)
}
// 进行唤醒
go Wol(mac)
go func(userid string){
for i:=0;i<10;i++{
Delay(30)
......@@ -341,16 +342,129 @@ func (wxwork * MJwxwork)Msg_Deal() interface{}{
}
}
}(wxwork.UserID)
wxwork.Text = "开始唤醒,请等待~"
case Msg_Wxwork_Reboot:
// 检查是否是域用户
err := Reg_IfExist_item(Reg_Root_ac,Reg_Path_home_du + wxwork.Name)
if err !=nil{
wxwork.Text = Error_WXWork_NotDominUser_STR
break
}
// 先回复,后唤醒
go Wol(mac)
// 检查注册表的主机 是否存在
pc := wxwork.Reg_Query_ADUsers(Reg_Name_PrimayComputerName)
if pc == ""{
wxwork.Text = Error_WXWork_Down_STR
break
}
// 检查 主机连接情况
status,err := PSTest_Connection(pc)
if err != nil{
wxwork.Text = Error_WXWork_Down_STR
break
}
if !status{
wxwork.Text = "主机已关机或无法连接主机"
break
}
Execcmd_wait(`shutdown -r -t 0 -m \\`+ pc)
Reg_Write_ADDC(pc,Reg_Name_BeWakedID,wxwork.UserID)
go func(name,userid string){
var rebooted bool = false
for i:=0;i<30;i++{
status,_ := PSTest_Connection(pc)
if !status {
rebooted = true
}
if status && rebooted {
SendWxworkTextToAUserWithName(name,userid,"重启完成~")
return
}
}
}(wxwork.Name,wxwork.UserID)
wxwork.Text = "开始重启,请等待~"
break
case Msg_Wxwork_TurnOFF:
// 检查是否是域用户
err := Reg_IfExist_item(Reg_Root_ac,Reg_Path_home_du + wxwork.Name)
if err !=nil{
wxwork.Text = Error_WXWork_NotDominUser_STR
break
}
// 检查注册表的主机 是否存在
pc := wxwork.Reg_Query_ADUsers(Reg_Name_PrimayComputerName)
if pc == ""{
wxwork.Text = Error_WXWork_Down_STR
break
}
// 检查 主机连接情况
status,err := PSTest_Connection(pc)
if err != nil{
wxwork.Text = Error_WXWork_Down_STR
break
}
if !status{
wxwork.Text = "主机已关机或无法连接主机"
break
}
Execcmd_wait(`shutdown -s -t 0 -m \\`+ pc)
Reg_Write_ADDC(pc,Reg_Name_BeWakedID,wxwork.UserID)
go func(name,userid string){
for i:=0;i<10;i++{
Delay(30)
status,_ := PSTest_Connection(pc)
if !status {
SendWxworkTextToAUserWithName(name,userid,"关机已完成~")
return
}
}
}(wxwork.Name,wxwork.UserID)
wxwork.Text = "开始关机,请等待~"
case Msg_Wxwork_Status:
var domainUser bool = true
var pc string
var err error
// 在注册表中查询 域用户 记录
if err = Reg_IfExist_item(Reg_Root_ac,Reg_Path_home_du + wxwork.Name); err == nil{
pc = wxwork.Reg_Query_ADUsers(Reg_Name_PrimayComputerName)
// 在注册表中查询 知微用户 记录
}else if err = Reg_IfExist_item(Reg_Root_ac,Reg_Path_home_zhu + wxwork.Name); err == nil{
pc = wxwork.Reg_Query_ZhiWeiUsers(Reg_Name_PrimayComputerName)
domainUser = false
}else{
wxwork.Text = Error_WXWork_NotDominUser_STR
break
}
// 检查 主机连接情况
status,err := PSTest_Connection(pc)
if err != nil{
wxwork.Text = Error_WXWork_Down_STR
break
}
if status{
wxwork.Text = "主机已启动"
}else if !status && !domainUser{
wxwork.Text = "主机已关闭或禁用了ICMP(请允许防火墙)"
} else {
wxwork.Text = "主机已关闭"
}
wxwork.Text = "开始唤醒,请等待~"
default:
wxwork.Text = ""
}
wxwork.Instruction = ""
return wxwork
}
......
......@@ -84,6 +84,9 @@ const Msg_Exec_HideShowIcon string = "HideShowIcon"
// msg wxwork type ////////////////////////////////////////////////////////////////
const Msg_Wxwork_UserWake string = "UserWake"
const Msg_Wxwork_Reboot string = "Reboot"
const Msg_Wxwork_TurnOFF string = "TurnOFF"
const Msg_Wxwork_Status string = "Status"
// Registry Root
......@@ -263,12 +266,12 @@ func (err * MJerror)init (e error){
err.MsgType = Msg_Error
err.Instruction = e.Error()
}
func GJwxworkText(name, userid,text * string,instruction string )interface {}{
func GJwxworkText(name, userid * string,instruction string )interface {}{
var wxwork MJwxwork
wxwork.MsgType = Msg_Wxwork
wxwork.Name = *name
wxwork.UserID = *userid
wxwork.Text = *text
wxwork.Text = ""
wxwork.Instruction = instruction
return wxwork
}
......
......@@ -27,6 +27,7 @@ func Sprintf(f string,v ...interface{})string {
// Print Type
//
func PrintLog(v ...interface{}){
log.SetPrefix("Output ")
log.Println(v ...)
......@@ -81,25 +82,22 @@ func PntSend(v ...interface{}){
Loger.SetPrefix("Send ")
Loger.Println(v ...)
}
func PrintPrefix(s string ,v ...interface{}){
Loger.SetPrefix(s)
func PntWxwork(v ...interface{}){
log.SetPrefix("WXWORK")
log.Println(v ...)
Loger.SetPrefix("WXWORK ")
Loger.Println(v ...)
}
func PntWxwork(v ...interface{}){
Loger.SetPrefix("WXWORK" )
log.Println(v ...)
func PntWxSendText(v ...interface{}){
Loger.SetPrefix("WxSendText ")
Loger.Println(v ...)
}
func PntWxworkf(f string,v ...interface{}){
Loger.SetPrefix("WXWORK ")
log.SetPrefix("WxSendText ")
log.Println(v ...)
Loger.Printf(f,v ...)
}
func PntWxSendMsgText(v ...interface{}){
Loger.SetPrefix("WxSendMsgText ")
log.Println(v ...)
func PntWxRecText(v ...interface{}){
Loger.SetPrefix("WxRecText ")
Loger.Println(v ...)
log.SetPrefix("WxRecText ")
log.Println(v ...)
}
\ No newline at end of file
......@@ -116,7 +116,7 @@ func SendWX(Content string){
http.Post(Link_WxworkBot,"application/json; charset=utf-8",bytes.NewBuffer(w))
}
func SendWxworkTextToAUser(id,text string) error{
PntWxSendMsgText(id,text)
// 获取 最新 token
t,err := GetWXWorkToken()
if err !=nil{
......@@ -146,4 +146,7 @@ func SendWxworkTextToAUser(id,text string) error{
}
func SendWxworkTextToAUserWithName(name ,id,text string) error{
PntWxSendText(name,text)
return SendWxworkTextToAUser(id,text)
}
......@@ -43,12 +43,10 @@ func Rand(i * int)int{
}
// 程序挂起 i 秒
func Delay(i int){
PntInfo("Delay ",i)
time.Sleep(time.Duration(i) * time.Second)
<-time.After(time.Duration(i)*time.Second)
}
// 随机挂起 x 秒
func RandDelay(i int){
ri := Rand(&i)
PntInfo("RandDelay ",ri)
time.Sleep(time.Duration(ri) * time.Second)
}
......@@ -9,7 +9,6 @@ const AD_User_main_admin string = "zhiweiadserver"
const AD_User_tengfei string = "tengfei"
const AD_User_taotengfei string = "taotengfei"
const AD_User_huyibo string = "huyibo"
const AD_User_xuwenqiang string = "xuwenqiang"
const AD_User_zhiwei string = "zhiwei@zhiweireach.com"
......
......@@ -84,7 +84,7 @@ func Execcmd_copy(source,target string){
}
}
func Execcmd_wait(cmdargs string,){
func Execcmd_wait(cmdargs string){
app,appargs,err :=execcmd_base(cmdargs)
if err !=nil{
PntError(err)
......@@ -280,6 +280,11 @@ func Reg_query_item_one(root int ,path string) string {
return ""
}
}
func Reg_IfExist_item(root int ,path string) error {
k,err := registry.OpenKey(reg_prase(&root),path, registry.READ)
defer k.Close()
return err
}
func Reg_query_item(root int ,path string) []string {
if k, kerr := registry.OpenKey(reg_prase(&root),path, registry.READ);kerr==nil{
defer k.Close()
......
......@@ -6,6 +6,10 @@ import (
pub "AD-Control/public"
)
const (
urlKey = iota
baiduKey
)
//---------------------------------------------------------
//
......@@ -221,17 +225,15 @@ func tBatchOpenWeb(){
},
},
PushButton{
Text: "打开网页",
Text: "批量打开网址",
OnClicked: func() {
for seq,web := range pub.Splitln(inTE.Text()){
if web == ""{
continue
}
pub.Execcmd_nowait(`C:\Progra~2\Google\Chrome\Application\chrome.exe `+web)
pub.Delay(2)
outTE.AppendText(pub.Sprintf("%d %s\n",seq+1,web))
}
batchOpenWeb(inTE,outTE,urlKey)
},
},
PushButton{
Text: "批量百度搜索",
OnClicked: func() {
batchOpenWeb(inTE,outTE,baiduKey)
},
},
PushButton{
......@@ -244,6 +246,28 @@ func tBatchOpenWeb(){
},
}.Run()
}
func batchOpenWeb(inTE,outTE *walk.TextEdit,batch int){
var cmd string
chrome := `C:\Progra~2\Google\Chrome\Application\chrome.exe `
switch batch{
case urlKey:
cmd = ""
case baiduKey:
cmd = "https://www.baidu.com/s?wd="
}
cmd = chrome + cmd
for seq,web := range pub.Splitln(inTE.Text()){
if web == ""{
continue
}
pub.Execcmd_nowait(cmd+web)
pub.Delay(2)
outTE.AppendText(pub.Sprintf("%d %s\n",seq+1,web))
}
}
// 其他工具 备份用户文件
func tBakcupUser(){
if pub.Msg_YesNo("是否执行一次手动备份用户文件夹。目标文件夹:"+pub.Dir_userprofile)==1{
......@@ -457,9 +481,13 @@ func (mw *MyMainWindow) tHideShowIconDeal() {
return
}
if strings.Index(r,"Hidden") == -1{
exec.DataBool = true
} else {
exec.Explain = "隐藏"
exec.DataBool = false
} else {
exec.Explain = "显示"
exec.DataBool = true
}
pub.SendServer(exec)
......
......@@ -8,9 +8,6 @@ import (
"fmt"
"io/ioutil"
"wxbizmsgcrypt"
"time"
"strconv"
)
......@@ -22,6 +19,8 @@ type wxXml struct {
Content string `xml:"Content"`
Msgid string `xml:"MsgId"`
Agentid uint32 `xml:"AgentId"`
Event string `xml:"Event"`
EventKey string `xml:"EventKey"`
}
func main(){
......@@ -43,16 +42,18 @@ func index(w http.ResponseWriter, r *http.Request){
// 开始处理HTML
go readHtmlData(d,&byteBody)
go parseHtmlData(d,&byteBody)
// 立刻返回
fmt.Fprintf(w,"")
}
func readHtmlData(d string,byteBody* []byte) string {
func parseHtmlData(d string,byteBody* []byte) {
var err error
// 建立 企业微信 加密方法
wxcpt := wxbizmsgcrypt.NewWXBizMsgCrypt(pub.WXTokenMsgSend, pub.WxworkEncodingAseKey,pub. WxworkReceiverId, wxbizmsgcrypt.XmlType)
wxcpt := wxbizmsgcrypt.NewWXBizMsgCrypt(pub.WxworkTokenMsgSend, pub.WxworkEncodingAseKey,pub. WxworkReceiverId, wxbizmsgcrypt.XmlType)
// 解析 地址 参数
// ?msg_signature=5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3&timestamp=1409659589&nonce=263014780&echostr=P9nAzCzyDtyTWESHep1vC5X9xho%2FqYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp%2B4RPcs8TgAE7OaBO%2BFZXvnaqQ%3D%3D
......@@ -75,9 +76,11 @@ func readHtmlData(d string,byteBody* []byte) string {
*byteBody)
if nil != cryptErr {
pub.PntError("DecryptMsg fail", cryptErr)
return pub.Error_WXWork_Down_STR
err = pub.Error_WXWork_Down
}
if len(msg)==0{
err = pub.Error_WXWork_Down
}
// 解析具体消息
wxmsg := ParseXML(&msg)
......@@ -85,25 +88,53 @@ func readHtmlData(d string,byteBody* []byte) string {
wtBricklayer,err := pub.GetWXWorkToken()
if err != nil{
pub.PntError(err)
return pub.Error_WXWork_Down_STR
err = pub.Error_WXWork_Down
}
// 查询 姓名
name,err := GetBricklayerName(wtBricklayer,wxmsg.FromUsername)
if err !=nil {
pub.PntError(err)
return pub.Error_WXWork_Down_STR
err = pub.Error_WXWork_Down
}
if err !=nil{
pub.SendWxworkTextToAUser(wxmsg.FromUsername,fmt.Sprintf("%s",err))
}
// 我是复读机
if wxmsg.Content != ""{
pub.SendWxworkTextToAUser(wxmsg.FromUsername,wxmsg.Content)
return
}
// 具体功能实现
//result := MsgDeal(&name,&wxmsg.FromUsername,&wxmsg.Content)
wxMsgDeal(&name,&wxmsg.FromUsername,&wxmsg.Content)
// 企业微信 消息 处理
// wxmsg.Content是接收到的文本消息ID
// wxmsg.EventKey是菜单事件
// 创建菜单调用工具:https://open.work.weixin.qq.com/wwopen/devtool/interface?doc_id=10786
// 创建菜单官方说明:https://work.weixin.qq.com/api/doc/90000/90135/90231
rec := wxMsgDealEvent(&name,&wxmsg.FromUsername,&wxmsg.EventKey)
pub.SendWxworkTextToAUserWithName(name,wxmsg.FromUsername,rec)
return
// 先回复空,再异步发送处理结果
return ""
// // 建立 回复消息模板
// xml,t,nonce := wxmsg.createXML(result)
// func (wxmsg * wxXml) createXML(res string) (string,string,string) {
// t := time.Now()
// nonce := strconv.Itoa(t.Nanosecond())
// timestamp := strconv.FormatInt(t.Unix(),10)
// wxmsg.Content = res
// xml,err := xml.Marshal(&wxmsg)
// if err != nil {
// pub.PntError(err)
// }
// return string(xml),timestamp,nonce
// }
// // 加密消息
// cryptMsg, cryptErr := wxcpt.EncryptMsg(xml, t, nonce)
......@@ -114,53 +145,40 @@ func readHtmlData(d string,byteBody* []byte) string {
// return string(cryptMsg)
}
func wxMsgDeal(name, userid,text * string ) string{
func wxMsgDealEvent(name, userid,eventkey * string) string {
var result []byte
var err error
var wxwork pub.MJwxwork
pub.PrintPrefix("Listen ",*name,*text)
switch *text{
pub.PntWxRecText(*name,*eventkey)
switch *eventkey{
case "芝麻开机":
pub.SendWxworkTextToAUser(*userid,"收到,正在处理~")
result,err = pub.SendServer(pub.GJwxworkText(name,userid,text,pub.Msg_Wxwork_UserWake))
case pub.WXEK_zwDevopsPowerWake:
pub.SendWxworkTextToAUserWithName(*name,*userid,"收到唤醒指令,正在处理")
result,err = pub.SendServer(pub.GJwxworkText(name,userid,pub.Msg_Wxwork_UserWake))
case "":
return ""
//
default:
pub.SendWxworkTextToAUser(*userid,*text)
return ""
case pub.WXEK_zwDevopsPowerTurnOFF:
pub.SendWxworkTextToAUserWithName(*name,*userid,"收到关机指令,正在处理")
result,err = pub.SendServer(pub.GJwxworkText(name,userid,pub.Msg_Wxwork_TurnOFF))
case pub.WXEK_zwDevopsPowerReboot:
pub.SendWxworkTextToAUserWithName(*name,*userid,"收到重启指令,正在处理")
result,err = pub.SendServer(pub.GJwxworkText(name,userid,pub.Msg_Wxwork_Reboot))
case pub.WXEK_zwDevopsPowerStatus:
pub.SendWxworkTextToAUserWithName(*name,*userid,"收到查询指令,正在处理")
result,err = pub.SendServer(pub.GJwxworkText(name,userid,pub.Msg_Wxwork_Status))
}
if err != nil {
return pub.Error_WXWork_Down_STR
if err != nil{
return fmt.Sprintf("%s",err)
}
pub.ParseJsonBody(result,&wxwork)
if err := wxwork.SendTextToAUser();err!=nil{
pub.PntError(err)
}
return ""
return wxwork.Text
}
func (wxmsg * wxXml) createXML(res string) (string,string,string) {
t := time.Now()
nonce := strconv.Itoa(t.Nanosecond())
timestamp := strconv.FormatInt(t.Unix(),10)
wxmsg.Content = res
xml,err := xml.Marshal(&wxmsg)
if err != nil {
pub.PntError(err)
}
return string(xml),timestamp,nonce
}
func ParseXML(unmsg *[]byte)wxXml{
var msg wxXml
if nil != xml.Unmarshal(*unmsg, &msg) {
......@@ -168,9 +186,9 @@ func ParseXML(unmsg *[]byte)wxXml{
}
return msg
}
// 读取企业通讯录的成员信息
//官方说明:
// https://work.weixin.qq.com/api/doc/90000/90135/90196
// 官方说明: https://work.weixin.qq.com/api/doc/90000/90135/90196
func GetBricklayerName(token, userid string) (string,error) {
link := pub.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s",token,userid)
data,err := pub.SendGetRequest(&link)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment