天天看點

從企業釘釘的接口擷取資料

公司需要,搞了一下釘釘的接口。

首先說明我是幫使用釘釘軟體的客戶通過釘釘的接口擷取資料,是以說我是有權限的。如果你是ISV,去看官方文檔吧。

我暫時還不知道ISV開發人員是什麼需求,但是至少對于釘釘來說我覺得挺麻煩的。點選打開連結

這是釘釘的官方文檔位址:點選打開連結

我搞了半天才厘清一點ISV和非ISV是什麼,反正大抵意思是一個授權和一個非授權的通路接口的方式。

非ISV開發人員需要擷取access_token(好像是預設兩小時生命周期,超過時間若在持續擷取資料就會自動延續,否則過期需要重新擷取。),

這個擷取接口是

https://oapi.dingtalk.com/gettoken?corpid=corpid&corpsecret=corpsecret

其中的corpid和corpsecret這樣擷取:點選打開連結。

java get方式擷取示例代碼:

public static String get(String url) {
        String result = "";
        BufferedReader in = null;
        try {
            URL getUrl = new URL(url);
            URLConnection connection = getUrl.openConnection();// 建立http連接配接
            connection.setRequestProperty("Charset", "UTF-8");
            connection.setRequestProperty("accept", "*/*");// 設定通用的請求屬性
            connection.connect();// 開始連接配接請求
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));//這裡如果不加編碼方式,解析請求回來的json可能中文亂碼報錯
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("發送GET請求出現異常!" + e);
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }           

下面說POST方式擷取資料,看一下接口文檔就知道了,嚴格的參數要求,初次搞反正很蛋疼。

@SuppressWarnings("unchecked")
    public void post() throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar cal = Calendar.getInstance();
        String access_tokenJson = "https://oapi.dingtalk.com/gettoken?corpid=corpid&corpsecret=corpsecret";
        JSONObject accessJson = JSONObject.fromObject(get(access_tokenJson));
        DD_access_token token= (DD_access_token)JSONObject.toBean(accessJson,DD_access_token.class);
        /*
                 釘釘取打卡記錄的接口傳參清單:
             {
                "userId": "員工在企業内的UserID,企業用來唯一辨別使用者的字段",//非必填
                "workDateFrom": "yyyy-MM-dd hh:mm:ss",
                "workDateTo": "yyyy-MM-dd hh:mm:ss"
             }
        */
        JSONObject jsonObj = new JSONObject();
         Date curTime = new Date();
         //jsonObj.put("userId", "userId");//userid查詢條件
        jsonObj.put("workDateFrom", sdf.format(curTime)+" 00:00:00");
         jsonObj.put("workDateTo", sdf.format(curTime));
        String strURL = "https://oapi.dingtalk.com/attendance/list?access_token="+token.getAccess_token()+"";
        try {
            URL url = new URL(strURL);// 建立url資源
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 建立http連接配接
            conn.setDoOutput(true);// 設定允許輸出
            conn.setDoInput(true);// 設定允許輸入
            conn.setUseCaches(false);// 設定不用緩存
            conn.setRequestMethod("POST");// 設定傳參方式
            conn.setRequestProperty("Charset", "UTF-8");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.connect();// 開始連接配接請求
            OutputStream out = conn.getOutputStream();
            out.write((jsonObj.toString()).getBytes());// 寫入請求的字元串
            out.flush();
            out.close();
            if (conn.getResponseCode() == 200) {// 請求傳回的狀态
                // 請求傳回的資料
                InputStream in = conn.getInputStream();
                try {
                    BufferedReader rd = new BufferedReader(new InputStreamReader(in,"UTF-8"));//這裡可以用這個也可以直接用流,buffer的話就是多了個緩存功能
                    int c = 0;
                    StringBuffer temp = new StringBuffer();//請求接口擷取json拼接字元串的話,比較長的傳回結果String接收是不夠的
                    while((c = rd.read())!= -1){//這裡可以用read也可用readLine,不清楚的話可以查一下兩者差別
                           temp.append((char)c);
                    }
                    JSONObject jsonobject = JSONObject.fromObject(temp.toString());
                    JSONArray dkobject = JSONArray.fromObject(jsonobject.get("recordresult"));//這裡就是将json轉成對象或者集合
                    List<Object> list = (List<Object>) JSONArray.toCollection(dkobject,Object.class);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            } else {
                System.out.println(String.valueOf(conn.getResponseCode()));;
            }

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("發送POST請求出現異常!" + e);
        }
    }
           

文中用到的JSONObject和JSONArray的包是

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;           

可以自行下載下傳導入,maven的話直接貼位址到pom.xml就好