C#獲取釘釘部門

獲取釘釘的信息,需要許多請求,也就有許多URL,所以在項目新建一個類,保存所有用到的URL。

namespace DDHelper
{
    public sealed class Urls
    {
        /// <summary>
        /// 創建會話
        /// </summary>
        public const string chat_create="https://oapi.dingtalk.com/chat/create";

        /// <summary>
        /// 獲取會話信息
        /// </summary>
        public const string chat_get="https://oapi.dingtalk.com/chat/get";

        /// <summary>
        /// 發送會話消息
        /// </summary>
        public const string chat_send="https://oapi.dingtalk.com/chat/send";

        /// <summary>
        /// 更新會話消息
        /// </summary>
        public const string chat_update="https://oapi.dingtalk.com/chat/update";
        
        /// <summary>
        /// 獲取部門列表
        /// </summary>
        public const string department_list="https://oapi.dingtalk.com/department/list";

        /// <summary>
        /// 根據部門ID獲取部門下人員信息
        /// </summary>
        public const string department_user="https://oapi.dingtalk.com/user/simplelist";

        /// <summary>
        /// 獲取訪問票記
        /// </summary>
        public const string gettoken="https://oapi.dingtalk.com/gettoken";

        /// <summary>
        /// 發送消息
        /// </summary>
        public const string message_send="https://oapi.dingtalk.com/message/send";

        /// <summary>
        /// 用戶列表
        /// </summary>
        public const string user_list="https://oapi.dingtalk.com/user/list";

        /// <summary>
        /// 用戶詳情
        /// </summary>
        public const string user_get="https://oapi.dingtalk.com/user/get";

        /// <summary>
        /// 獲取JSAPI的票據
        /// </summary>
        public const string get_jsapi_ticket="https://oapi.dingtalk.com/get_jsapi_ticket";

        /// <summary>
        /// 發起審批
        /// </summary>
        public const string get_Examination_and_approval="https://eco.taobao.com/router/rest";

    }
}

獲取Tokan,也需要有接收類:

using System;

namespace DDHelper
{
    /// <summary>
    /// 訪問票據
    /// </summary>
    public class AccessToken
    {
        /// <summary>
        /// 票據的值
        /// </summary>
        public string Value
        {
            get; set;
        }

        /// <summary>
        /// 票據的開始時間
        /// </summary>
        public DateTime Begin
        {
            get;
            set;
        } = DateTime . Parse ( "1970-01-01" );
    }
}

爲避免URL拼接的時候寫錯參數,新建一個小字典,保存拼接參數

namespace DDHelper
{
    /// <summary>
    /// Url的Key
    /// </summary>
    public sealed class Keys
    {
        /// <summary>
        /// 企業id
        /// </summary>
        public const string corpid="corpid";   
        /// <summary>
        /// 企業祕鑰
        /// </summary>
        public const string corpsecret="corpsecret";
        /// <summary>
        /// 開發者id
        /// </summary>
        public const string departmentID = "departmentID";

        public const string userid = "userid";

        public const string chatid = "chatid";

        public const string access_token = "access_token";

        public const string jsapi_ticket = "jsapi_ticket";

        public const string noncestr = "noncestr";

        public const string timestamp = "timestamp";

        public const string url = "url";
    }
}

先獲取Token

/// <summary>
        /// 獲取token
        /// </summary>
        /// <param name="forced"></param>
        private static void UpdateAccessToken (bool forced = false )
        {
            //ConstVars.CACHE_TIME是緩存時間(常量,也可放到配置文件中),這樣在有效期內則直接從緩存中獲取票據,不需要再向服務器中獲取。
            if ( !forced && AccessToken . Begin . AddSeconds ( ConstVars . CACHE_TIME ) >= DateTime . Now )
            {
                return;
            }

            string apiurl = $"{Urls.gettoken}?{DDHelper . Keys . corpid}={AppSetting.corpid}&{DDHelper . Keys . corpsecret}={ AppSetting.corpsecret}";
            TokenResult tokenResult = Analyze . Get<TokenResult> ( apiurl );

            if ( tokenResult . ErrCode == ErrCodeEnum . OK )
            {
                AccessToken . Value = tokenResult . Access_token;
                AccessToken . Begin = DateTime . Now;
            }
        }

接受獲取的Token,需要一個類:

namespace DDHelper
{
    public class ResultPackage
    {
        public ErrCodeEnum ErrCode
        {
            get; set;
        } = ErrCodeEnum . Unknown;

        /// <summary>
        /// 錯誤消息
        /// </summary>
        public string ErrMsg
        {
            get; set;
        }

        /// <summary>
        /// 結果的Json形式
        /// </summary>
        public string Json
        {
            get;
            set;
        }

        public bool IsOK ( )
        {
            return ErrCode == ErrCodeEnum . OK;
        }

        public override string ToString ( )
        {
            string info = $"{nameof ( ErrCode )}:{ErrCode},{nameof ( ErrMsg )}:{ErrMsg}";

            return info;
        }

    }
}

namespace DDHelper
{
    public class TokenResult :ResultPackage
    {
        public string Access_token
        {
            get; set;
        }
    }
}

封裝GET、POST請求的方法:

using System . Collections . Generic;
using System . IO;
using System . Net;
using System . Text;

namespace DDHelper
{
    public class RequestHelper
    {
        /// <summary>
        /// 執行基本的命令方法,以GET方法
        /// </summary>
        /// <param name="apiurl"></param>
        /// <returns></returns>
        public static string Get ( string apiurl )
        {
            WebRequest request = WebRequest . Create ( @apiurl );
            request . Method = "GET";
            WebResponse response = request . GetResponse ( );
            Stream stream = response . GetResponseStream ( );
            Encoding encode = Encoding . UTF8;
            StreamReader reader = new StreamReader ( stream ,encode );
            string resultJson = reader . ReadToEnd ( );
            return resultJson;
        }

        /// <summary>
        /// 以post方式提交命令
        /// </summary>
        /// <param name="apiurl"></param>
        /// <param name="jsonString"></param>
        /// <returns></returns>
        public static string Post ( string apiurl ,string jsonString )
        {
            WebRequest requset = WebRequest . Create ( @apiurl );
            requset . Method = "POST";
            requset . ContentType = "application/json";

            byte [ ] bs = Encoding . UTF8 . GetBytes ( jsonString );
            requset . ContentLength = bs . Length;
            Stream newStream = requset . GetRequestStream ( );
            newStream . Write ( bs ,0 ,bs . Length );
            newStream . Close ( );

            WebResponse response = requset . GetResponse ( );
            Stream stream = response . GetResponseStream ( );
            Encoding encode = Encoding . UTF8;
            StreamReader reader = new StreamReader ( stream ,encode );
            string resultJson = reader . ReadToEnd ( );
            return resultJson;
        }

        /// <summary>
        /// 以POST方式提交機器人消息
        /// </summary>
        /// <param name="apiurl">請求的URL</param>
        /// <param name="jsonString">請求的json參數</param>
        /// <param name="headers">請求的key-value字典</param>
        /// <returns></returns>
        public static string Post ( string apiurl ,string jsonString ,Dictionary<string ,string> headers = null )
        {
            WebRequest request = WebRequest . Create ( @apiurl );
            request . Method = "POST";
            request . ContentType = "application/json";
            if ( headers != null )
            {
                foreach ( var keyValue in headers )
                {
                    if ( keyValue . Key == "Content-Type" )
                    {
                        request . ContentType = keyValue . Value;
                        continue;
                    }
                    request . Headers . Add ( keyValue . Key ,keyValue . Value );
                }
            }

            if ( string . IsNullOrEmpty ( jsonString ) )
            {
                request . ContentLength = 0;
            }
            else
            {
                byte [ ] bs = Encoding . UTF8 . GetBytes ( jsonString );
                request . ContentLength = bs . Length;
                Stream newStream = request . GetRequestStream ( );
                newStream . Write ( bs ,0 ,bs . Length );
                newStream . Close ( );
            }

            WebResponse response = request . GetResponse ( );
            Stream stream = response . GetResponseStream ( );
            Encoding encode = Encoding . UTF8;
            StreamReader reader = new StreamReader ( stream ,encode );
            string resultJson = reader . ReadToEnd ( );
            return resultJson;
        }
    }
}

將接收的json串,轉成我們需要的類,方便處理:
 

using Newtonsoft . Json;
using System;
using System . Collections . Generic;
using System . IO;
using System . Xml;
using System . Xml . Serialization;

namespace DDHelper
{
    public class XmlUtil
    {

        /// <summary>
        /// 反序列化
        /// </summary>
        /// <param name="type"></param>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static object Deserialize ( Type type ,string xml )
        {
            try
            {
                using ( StringReader sr = new StringReader ( xml ) )
                {
                    XmlSerializer xmldes = new XmlSerializer ( type );
                    return xmldes . Deserialize ( sr );
                }
            }
            catch ( Exception ex )
            {
                throw new Exception ( ex . Message );
            }
        }

        /// <summary>
        /// 反序列化
        /// </summary>
        /// <param name="type"></param>
        /// <param name="stream"></param>
        /// <returns></returns>
        public static object Deserialize ( Type type ,Stream stream )
        {
            XmlSerializer xmldex = new XmlSerializer ( type );
            return xmldex . Deserialize ( stream );
        }

        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="type"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string Serializer ( Type type ,object obj )
        {
            MemoryStream stream = new MemoryStream ( );
            XmlSerializer xml = new XmlSerializer ( type );
            try
            {
                //序列化對象
                xml . Serialize ( stream ,obj );
            }
            catch ( Exception )
            {
                throw;
            }
            stream . Position = 0;
            StreamReader sr = new StreamReader ( stream );
            string str = sr . ReadToEnd ( );

            sr . Dispose ( );
            stream . Dispose ( );

            return str;
        }

        /// <summary>
        /// 讀取xml,得到發送審批結果
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static ApprovalResult ReadXmlToApprovalResult ( string xml )
        {
            XmlDocument xmlDoc = new XmlDocument ( );
            xmlDoc . LoadXml ( xml );
            XmlNodeList xn = xmlDoc . SelectNodes ( "//result" );
            ApprovalResult appResu = new ApprovalResult ( );
            foreach ( XmlElement element in xn )
            {
                appResu . ding_open_errcode = Convert . ToInt32 ( element . GetElementsByTagName ( "ding_open_errcode" ) [ 0 ] . InnerText );
                appResu . request_id = string . Empty;
                appResu . is_success = Convert . ToBoolean ( element . GetElementsByTagName ( "is_success" ) [ 0 ] . InnerText );
                appResu . process_instance_id = element . GetElementsByTagName ( "process_instance_id" ) [ 0 ] . InnerText;
            }
            return appResu;
        }

        /// <summary>
        /// 讀取xml,得到審批結果信息
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static List<ApprovalReceiveResult> ReadXmlToApprovalReceiveResult ( string xml )
        {
            XmlDocument xmlDoc = new XmlDocument ( );
            xmlDoc . LoadXml ( xml );
            XmlNodeList xn = xmlDoc . SelectNodes ( "//operation_records_vo" );
            List<ApprovalReceiveResult> listApp = new List<ApprovalReceiveResult> ( );

            foreach ( XmlElement element in xn )
            {
                ApprovalReceiveResult appResu = new ApprovalReceiveResult ( );
                appResu . Date = Convert . ToDateTime ( element . GetElementsByTagName ( "date" ) [ 0 ] . InnerText );
                appResu . OperationResult = element . GetElementsByTagName ( "operation_result" ) [ 0 ] . InnerText;
                appResu . OperationType = element . GetElementsByTagName ( "operation_type" ) [ 0 ] . InnerText;
                if ( element . ChildNodes . Count > 4 && element . ChildNodes . Item ( 3 ) . Name . Equals ( "remark" ) )
                    appResu . Remark = element . GetElementsByTagName ( "remark" ) [ 0 ] . InnerText;
                else
                    appResu . Remark = string . Empty;
                appResu . OperationUser = element . GetElementsByTagName ( "userid" ) [ 0 ] . InnerText;
                listApp . Add ( appResu );
            }

            return listApp;
        }

        /// <summary>
        /// 把Json轉爲實體類
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="result"></param>
        /// <returns></returns>
        public static List<T> JsonStringToObj<T> ( string result ) where T : class
        {
            List<T> list = new List<T> ( );
            T t = JsonConvert . DeserializeObject<T> ( result );
            list . Add ( t );
            return list;
        }

    }
}
using System . Collections . Generic;
using Newtonsoft . Json;

namespace DDHelper
{
    public class Analyze
    {
        
        /// <summary>
        /// GET請求
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="requestUrl"></param>
        /// <returns></returns>
        public static T Get<T> ( string requestUrl ) where T : ResultPackage, new()
        {
            string resultJson = RequestHelper . Get ( requestUrl );
            return AnalyzeResult<T> ( resultJson );
        }

        /// <summary>
        /// POST請求
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="requestUrl"></param>
        /// <param name="requestParamOfJsonStr"></param>
        /// <returns></returns>
        public static T POST<T> ( string requestUrl ,string requestParamOfJsonStr ) where T : ResultPackage, new()
        {
            string resultJson = RequestHelper . Post ( requestUrl ,requestParamOfJsonStr );
            return AnalyzeResult<T> ( resultJson );
        }

        /// <summary>
        /// 分析結果
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="resultJson"></param>
        /// <returns></returns>
        public static T AnalyzeResult<T> ( string resultJson ) where T : ResultPackage, new()
        {
            ResultPackage tempResult = null;
            if ( !string . IsNullOrEmpty ( resultJson ) )
            {
                tempResult = JsonConvert . DeserializeObject<ResultPackage> ( resultJson );
            }
            T result = null;
            if ( tempResult != null && tempResult . IsOK ( ) )
            {
                result = JsonConvert . DeserializeObject<T> ( resultJson );
            }
            else if ( tempResult != null )
            {
                result = tempResult as T;
            }
            else if ( tempResult == null )
            {
                result = new T ( );
            }

            result . Json = resultJson;
            return result;
        }

        /// <summary>
        /// POST機器人請求
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="apiurl"></param>
        /// <param name="jsonString"></param>
        /// <param name="headers"></param>
        /// <returns></returns>
        public static T POST<T> ( string apiurl ,string jsonString ,Dictionary<string ,string> headers = null ) where T : ResultPackage, new()
        {
            string resultJson = RequestHelper . Post ( apiurl ,jsonString ,headers );
            return AnalyzeResult<T> ( resultJson );
        }

    }
}

上面都是爲獲取Token,及後面的請求做準備的基礎,下面獲取Token後,拼接獲取部門信息的URL

 /// <summary>
        /// 獲取url
        /// </summary>
        /// <param name="Url">url</param>
        /// <param name="forceUpdate"></param>
        /// <returns></returns>
        private static string FormatApiUrlWithToken ( string Url ,bool forceUpdate = false )
        {
            //獲取token
            UpdateAccessToken ( forceUpdate );
            string apiurl = $"{Url}?{DDHelper . Keys . access_token}={AccessToken . Value}";

            return apiurl;
        }

得到Token之後,也得到了獲取部門的URL,下面就要獲取部門信息:

/// <summary>
        /// 獲取部門信息並保存
        /// </summary>
        private void getDepartMentInfo ( )
        {
            string apiurl = FormatApiUrlWithToken ( Urls . department_list );
            var result = Analyze . Get<DepartResultSet> ( apiurl );
            List<DepartResultSet> list = XmlUtil . JsonStringToObj<DepartResultSet> ( result . Json );
            if ( list . Count > 0 )
            {
                foreach ( DepartResultSet depart in list )
                {
                    if ( depart . department . Count > 0 )
                    {
                        //保存部門信息到數據庫
                        isOk = _bll . SaveDepart ( depart . department );
                        if (isOk == false)
                            break;
                    }
                }
            }

            if ( isOk == false )
            {
                Utility . LogHelper . WriteLog ( "部門信息保存失敗" );
            }
        }

上面有一個地方需要注意,部門獲取到了,也只是json串,所以需要轉成我們要的類(和獲取Token請求結果一樣,都繼承自ResultPackage類)

using System.Collections.Generic;

namespace DDHelper
{
    public class DepartResultSet :ResultPackage
    {
        public List<Depart> department
        {
            get; set;
        }
    }
}
namespace DDHelper
{
    public class Depart
    {
        /// <summary>
        /// 部門id
        /// </summary>
        public string id
        {
            get; set;
        }
        
        /// <summary>
        /// 部門名稱
        /// </summary>
        public string name
        {
            get; set;
        }

        /// <summary>
        /// 父部門id,根部門爲1 
        /// </summary>
        public string parentId
        {
            get; set;
        }

        /// <summary>
        /// 是否同步創建一個關聯此部門的企業羣, true表示是, false表示不是  
        /// </summary>
        public bool createDeptGroup
        {
            get; set;
        }

        /// <summary>  
        /// 當羣已經創建後,是否有新人加入部門會自動加入該羣, true表示是, false表示不是  
        /// </summary>  
        public bool autoAddUser
        {
            get; set;
        }

    }
}

到此處,部門信息就獲取到了,也保存到後臺了,需要的基礎類基本都有了,後面獲取其它信息就不用再建基礎類了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章