package com.lz.common.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.request.*; import com.dingtalk.api.response.*; import com.lz.modules.job.model.responseBo.DepartmentInfosBo; import com.lz.modules.job.model.responseBo.DepartmentStaffBo; import com.lz.modules.third.entity.ThirdAppConfig; import com.lz.modules.third.service.ThirdAppConfigService; import com.lz.modules.third.service.impl.ThirdAppConfigServiceImpl; import com.taobao.api.ApiException; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.File; import java.io.IOException; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Component("dingtalkRobotUtil") public class DingTalkUtil { protected static Logger logger = LoggerFactory.getLogger(DingTalkUtil.class); @Autowired RedisUtils redisUtils; @Autowired ThirdAppConfigService thirdAppConfigService; CloseableHttpClient getHttpClient(){ return null; } /** * 获取机器人的有效token值 * * @return * @throws IOException */ public String getAccessToken(String appid) { try { ThirdAppConfig thirdAppConfig = thirdAppConfigService.getByAppId(appid); DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken"); OapiGettokenRequest req = new OapiGettokenRequest(); req.setAppkey(thirdAppConfig.getAppKey()); req.setAppsecret(thirdAppConfig.getAppSecret()); req.setHttpMethod("GET"); OapiGettokenResponse rsp = client.execute(req); String resultStr = rsp.getBody(); JSONObject dataObj = JSON.parseObject(resultStr); String tenant_access_token = dataObj.getString("access_token"); return tenant_access_token; } catch (ApiException e) { e.printStackTrace(); } return null; } /** * 批量获取部门详情 * * @param accessToken * @return */ public List getDepartmentDetails(String accessToken, String departmentIds) { try { //下面获取所有部门的i就按单信息 List list = new ArrayList<>(); DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/list"); OapiDepartmentListRequest req = new OapiDepartmentListRequest(); req.setFetchChild(true); req.setId("1"); req.setHttpMethod("GET"); OapiDepartmentListResponse rsp = client.execute(req, accessToken); JSONObject json = JSONObject.parseObject(rsp.getBody()); if(json.getInteger("errcode") == 0){ JSONArray array = json.getJSONArray("department"); for (int i = 0; i < array.size(); i++){ json = array.getJSONObject(i); DepartmentInfosBo departmentInfosBo = new DepartmentInfosBo(); departmentInfosBo.setName(json.getString("name")); departmentInfosBo.setId(json.getString("id"));//自身ID departmentInfosBo.setParentId(json.getString("parentid"));//父级ID //下面获取详细信息 client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/get"); OapiDepartmentGetRequest deReq = new OapiDepartmentGetRequest(); deReq.setId(departmentInfosBo.getId()); deReq.setHttpMethod("GET"); OapiDepartmentGetResponse deRsp = client.execute(deReq, accessToken); json = JSONObject.parseObject(deRsp.getBody()); departmentInfosBo.setChatId(json.getString("deptGroupChatId")); departmentInfosBo.setLeaderEmployeeId(json.getString("deptManagerUseridList"));//部门主管,多个主管以|隔开 departmentInfosBo.setStatus(1); departmentInfosBo.setOrder(json.getInteger("order")); list.add(departmentInfosBo); } }else{ logger.info("获取部门详情异常{}", rsp.getBody()); } return list; } catch (ApiException e) { logger.info("获取部门详情异常{}", e); } return null; } /** * 获取部门用户详情 * * @param accessToken * @return */ public List getDepartmentStaffDetails(String accessToken, String departmentId) { try { List list =new ArrayList<>(); DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/listbypage"); OapiUserListbypageRequest req = new OapiUserListbypageRequest(); req.setDepartmentId(Long.parseLong(departmentId)); req.setSize(100L); req.setHttpMethod("GET"); boolean isNext = true; for(long page = 0; isNext; page++){ req.setOffset(page); OapiUserListbypageResponse rsp = client.execute(req, accessToken); JSONObject json = JSONObject.parseObject(rsp.getBody()); if(json.getInteger("errcode") == 0){ JSONArray array = json.getJSONArray("userlist"); isNext = json.getBoolean("hasMore");//获取是否由更多数据 for (int i = 0; i < array.size(); i++) { json = array.getJSONObject(i); DepartmentStaffBo departmentStaffBo = new DepartmentStaffBo(); departmentStaffBo.setEmployeeId(json.getString("userid"));//用户在企业内部的唯一编号,创建时可指定。可代表一定的含义 departmentStaffBo.setName(json.getString("name")); departmentStaffBo.setEmployeeNo(json.getString("jobnumber"));//工号 departmentStaffBo.setUnionId(json.getString("unionid"));//企业内部id,唯一 departmentStaffBo.setOpenId(json.getString("openId"));//和上面的值目前是一样的,未找到说明 departmentStaffBo.setMobile(json.getString("mobile"));//手机,需要单独授权手机权限 departmentStaffBo.setEmail(json.getString("email"));//邮箱,钉钉的企业邮箱才可以,需要单独授权手机权限 departmentStaffBo.setAvatar(json.getString("avatar"));//头像 departmentStaffBo.setPosition(json.getString("position")); if(json.getBoolean("active")){ //在职已激活 departmentStaffBo.setStatus(0); }else{ //在职未激活 departmentStaffBo.setStatus(4); } if(json.getBoolean("isLeader")){ departmentStaffBo.setIsLeader(1); }else{ departmentStaffBo.setIsLeader(0); } list.add(departmentStaffBo); } }else{ logger.info("获取部门详情异常{}", rsp.getBody()); } } return list; } catch (ApiException e) { e.printStackTrace(); } return null; } /** * 获取图片image_key * * @return * @throws IOException */ public String getImageKey(File file, String tenant_access_token) throws IOException { // File file = new File(imgUrl); String result = "";//SendImageByApacheHttpClient(file, tenant_access_token); JSONObject dataObj = JSON.parseObject(result); String image_key = dataObj.getJSONObject("data").getString("image_key"); return image_key; } /** * 获取飞书用户唯一标识 * * @param mobile * @param accessToken * @return */ public static String getUserId(String mobile, String accessToken) { String urlStr = "https://open.feishu.cn/open-apis/user/v1/batch_get_id?mobiles=" + mobile; String result = HttpUtil.feishuGet(urlStr, accessToken); JSONObject dataObj = JSON.parseObject(result); String userId = dataObj.getJSONObject("data").getJSONObject("mobile_users").getJSONArray(mobile).getJSONObject(0).getString("user_id"); return userId; } public static void main(String[] args) { DingTalkUtil dingTalkUtil = new DingTalkUtil(); String token = dingTalkUtil.getAccessToken("855818566"); } }