lifuquan преди 1 година
родител
ревизия
f30453c8cb

+ 28 - 43
README.md

@@ -7,63 +7,48 @@
 ### 1. 引入依赖
 
 ```xml
+<!-- dingtalk-api-starter -->
 <dependency>
     <groupId>com.nokia</groupId>
-    <artifactId>request-log-interceptor-starter</artifactId>
+    <artifactId>dingtalk-api-starter</artifactId>
     <version>1.0</version>
 </dependency>
 ```
 
-### 2. 注入拦截器
+### 2. 添加配置
 
-- 自行注入方式
-
-```java
-// 引入配置类
-@Configuration
-public class RequestLogConfiguration implements WebMvcConfigurer {
+```yml
+dingtalk:
+  api:
+    enable: true
+    appKey: yourAppKey
+    appSecret: yourAppSecret
+    redis:
+      enable: true
+      host: 192.168.31.83
+      port: 6379
+```
 
-    /**
-     * 添加拦截器
-     */
-    @Override
-    public void addInterceptors(InterceptorRegistry registry) {
-        // 添加日志拦截器
-        registry.addInterceptor(new RequestLogHandlerInterceptor()).addPathPatterns("/**");
-    }
+> 注意,这里的独立redis可以不用配置,但需要自行注入一个`RedisTemplate<String, Object>`对象
 
-    /**
-     * 注入自定义的RequestLogDispatcherServlet替代默认的DispatcherServlet
-     */
-    @Bean
-    @Qualifier(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
-    public DispatcherServlet dispatcherServlet() {
-        return new RequestLogDispatcherServlet();
-    }
+### 3. 直接通过`@AutoWired`注入即可使用
 
+```java
+@Autowired
+    private DingtalkService service;
+
+@Test
+void test() throws InterruptedException {
+    String sendText = service.SendText("cidcWmmFwduUTDB3G0vPNOldQ==", "测试测试测试====");
+    System.out.println(sendText);
+    Thread.sleep(1000 * 5);
+    service.recallMessage("cidcWmmFwduUTDB3G0vPNOldQ==", sendText);
 }
 ```
 
-- 配置方式(不推荐)
-
-```yml
-request:
-  log:
-    enable: true
-spring:
-  main:
-    allow-bean-definition-overriding: true
-```
-
-> 注意,这里需要打开配置`spring.main.allow-bean-definition-overriding=true`,允许覆盖springbean,这样才能实现使用starter注入的DispatcherServlet替代默认的。这不是一种安全的做法,因此不建议使用。
-
 ## 版本更新记录
 
 ### v1.0
 
-1. 实现了打印日志的功能,日志样式如下:
-
-```text
-2023-05-25 18:26:44.649  INFO 9520 --- [nio-8080-exec-1] c.n.r.i.RequestLogHandlerInterceptor     : 请求地址: http://127.0.0.1:8080/test POST,请求头: {content-length=0, host=127.0.0.1:8080, content-type=application/json, connection=close, accept-encoding=gzip, deflate, user-agent=vscode-restclient},请求参数:
-2023-05-25 18:26:44.667  INFO 9520 --- [nio-8080-exec-1] c.n.r.i.RequestLogHandlerInterceptor     : 耗时 18 ms, 返回 200: ===
-```
+1. 支持通过机器人向钉钉群发送文件、图片、markdown、普通文本消息
+2. 支持根据发送消息返回的id撤回消息

+ 6 - 0
doc/lfq-dingtalk.md → doc/重要信息/lfq-dingtalk.md

@@ -1,6 +1,12 @@
 # lfq-dingtalk
 
+李福全测试环境的配置信息
+
 ```yml
+# appId
 dingothmdq6opv6hjrm5
+# 密钥
 SeoyAwUnzFIFY4j4CX089HJ0i-pj1BIzByB3AZcnbCQaq94lZvazFpfEGGQwPznc
+# 测试群
+cidcWmmFwduUTDB3G0vPNOldQ==
 ```

+ 3 - 0
doc/钉钉文档.md

@@ -0,0 +1,3 @@
+# 钉钉文档
+
+[服务端API总览](https://open.dingtalk.com/document/orgapp/api-overview)

+ 1 - 1
pom.xml

@@ -13,7 +13,7 @@
 
     <groupId>com.nokia</groupId>
     <artifactId>dingtalk-api-starter</artifactId>
-    <version>1.0.snipshot</version>
+    <version>1.0</version>
 
     <packaging>jar</packaging>
 

+ 20 - 0
src/main/java/com/nokia/dingtalkapi/service/DingtalkService.java

@@ -1,5 +1,8 @@
 package com.nokia.dingtalkapi.service;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 接口,定义对外开放的方法
  */
@@ -50,4 +53,21 @@ public interface DingtalkService {
      * @return
      */
     String sendMarkdown(String conversationId, String msg);
+
+    /**
+     * 批量撤回消息
+     * https://open.dingtalk.com/document/orgapp/enterprise-chatbot-withdraws-internal-group-messages?spm=ding_open_doc.document.0.0.4c134a97XELzgK
+     * 
+     * @param conversationId
+     * @param messageIdList
+     */
+    void recallMessage(String conversationId, List<String> messageIdList);
+
+    default void recallMessage(String conversationId, String messageId) {
+        recallMessage(conversationId, new ArrayList<String>() {
+            {
+                add(messageId);
+            }
+        });
+    }
 }

+ 38 - 0
src/main/java/com/nokia/dingtalkapi/service/impl/DingTalkServiceImpl.java

@@ -2,7 +2,10 @@ package com.nokia.dingtalkapi.service.impl;
 
 import java.time.Duration;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -267,4 +270,39 @@ public class DingTalkServiceImpl implements DingtalkService {
         }
         return (String) token;
     }
+
+    @Override
+    public void recallMessage(String conversationId, List<String> messageIdList) {
+        // 请求url
+        String url = "https://api.dingtalk.com/v1.0/robot/groupMessages/recall";
+        // 请求头
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+        httpHeaders.set("x-acs-dingtalk-access-token", getApiToken());
+
+        Map<String, Object> request = new HashMap<>();
+        request.put("openConversationId", conversationId);
+        request.put("robotCode", properties.getAppKey());
+        request.put("processQueryKeys", messageIdList);
+
+        HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(request, httpHeaders);
+        JsonNode node = restTemplate.postForObject(url, httpEntity, JsonNode.class);
+        if (node == null) {
+            throw new RuntimeException("钉钉API调用失败,返回值为空...");
+        }
+        Iterator<JsonNode> elements = node.get("successResult").elements();
+        StringBuffer stringBuffer = new StringBuffer();
+        stringBuffer.append("撤回成功的列表:");
+        while (elements.hasNext()) {
+            stringBuffer.append(elements.next()).append(",");
+        }
+        stringBuffer.deleteCharAt(stringBuffer.length() - 1).append(" === 撤回失败的列表及原因:");
+        Iterator<Entry<String, JsonNode>> fields = node.get("failedResult").fields();
+        while (fields.hasNext()) {
+            Entry<String, JsonNode> entry = fields.next();
+            stringBuffer.append(entry.getKey()).append("-->").append(entry.getValue().toString()).append(",");
+        }
+        stringBuffer.deleteCharAt(stringBuffer.length() - 1);
+        log.info(stringBuffer.toString());
+    }
 }