Browse Source

进群如果在写死黑名单里 立即踢出

刘立冬 3 weeks ago
parent
commit
99bbc9d21a

+ 64 - 0
risk-control-core/src/main/java/com/tzld/piaoquan/risk/control/model/qywx/RoomAddMemberMessage.java

@@ -0,0 +1,64 @@
+package com.tzld.piaoquan.risk.control.model.qywx;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class RoomAddMemberMessage {
+    @JSONField(name = "innerkf_vid")
+    private long innerkVid;
+
+    private long flag;
+
+    private long receiver;
+
+    @JSONField(name = "extraContent")
+    private Map<String, Object> extraContent;
+
+    @JSONField(name = "devInfo")
+    private long devInfo;
+
+    @JSONField(name = "sender_name")
+    private String senderName;
+
+    @JSONField(name = "is_room")
+    private int isRoom;  // 1=true, 0=false
+
+    @JSONField(name = "server_id")
+    private long serverId;
+
+    @JSONField(name = "kf_id")
+    private long kfId;
+
+    private long invitee;
+
+    private boolean issync;
+
+    @JSONField(name = "send_time")
+    private long sendTime;
+
+    private long sender;
+
+    @JSONField(name = "referid")
+    private long referId;
+
+    @JSONField(name = "member_list")
+    private List<Long> memberList;
+
+    @JSONField(name = "app_info")
+    private String appInfo;
+
+    @JSONField(name = "room_conversation_id")
+    private String roomConversationId;
+
+    @JSONField(name = "readuinscount")
+    private int readUinsCount;
+
+    @JSONField(name = "msg_id")
+    private long msgId;
+
+    @JSONField(name = "msgtype")
+    private int msgType;
+}

+ 1 - 1
risk-control-core/src/main/java/com/tzld/piaoquan/risk/control/service/impl/RiskUserHandleService.java

@@ -59,7 +59,7 @@ public class RiskUserHandleService {
             }
             //这里的room都是已经打开的
             for (RoomListResponse.RoomInfo roomInfo : roomInfoList) {
-                if (riskUserInfo.getJoinScene() == 3){//risk用户在这个群内,且开关打开
+                if (riskUserInfo.getJoinScene() == 3){//risk用户在这个群
                     //固定规则校验,chatId转化到roomId
                     long roomId = chatIdToRoomId(staff.getUuid(), riskUserInfo.getChatId());
                     if ((roomId + "").equals(roomInfo.getRoomId())) {//匹配群

+ 41 - 4
risk-control-core/src/main/java/com/tzld/piaoquan/risk/control/service/impl/RiskUserOperateService.java

@@ -6,10 +6,7 @@ import com.tzld.piaoquan.risk.control.dao.mapper.WorkWechatRoomInfoMapper;
 import com.tzld.piaoquan.risk.control.model.po.UserBase;
 import com.tzld.piaoquan.risk.control.model.po.WorkWechatRoomInfo;
 import com.tzld.piaoquan.risk.control.model.po.WorkWechatRoomInfoExample;
-import com.tzld.piaoquan.risk.control.model.qywx.QwCommonResModel;
-import com.tzld.piaoquan.risk.control.model.qywx.RiskUserInfo;
-import com.tzld.piaoquan.risk.control.model.qywx.RoomListResponse;
-import com.tzld.piaoquan.risk.control.model.qywx.RoomMemberListInfo;
+import com.tzld.piaoquan.risk.control.model.qywx.*;
 import com.tzld.piaoquan.risk.control.util.HttpClientUtil;
 import com.tzld.piaoquan.risk.control.util.HttpPoolClient;
 import lombok.extern.slf4j.Slf4j;
@@ -33,6 +30,42 @@ public class RiskUserOperateService {
     private long corpid;
     private static final HttpPoolClient httpPoolClientDefault = HttpClientUtil.create(10000, 10000, 2000, 5000, 5, 10000);
     private static final Logger LOGGER = LoggerFactory.getLogger(RiskUserHandleService.class);
+    private static final List<Long> BLACKLIST_VID = Collections.unmodifiableList(Arrays.asList(7881302926289574L,7881299753025521L));
+
+
+    public boolean quickKick(RoomAddMemberMessage message,String uuid) {
+        if(message.getIsRoom() == 1) {
+            Map<String, Object> requestBody = new HashMap<>();
+            requestBody.put("uuid", uuid);
+            requestBody.put("oprType", 1);
+            if(message.getMemberList().isEmpty()) {
+                return false;
+            }
+            long vid = message.getMemberList().get(0);
+            if(!BLACKLIST_VID.contains(vid)) {
+                LOGGER.info("quickKick, vid: {} is in blacklist, skip kick", vid);
+                return false;
+            }
+            // 如果是群聊,直接踢出
+            LOGGER.info("quickKick, message: {}, uuid: {}", message, uuid);
+            requestBody.put("blacklist_vid",Arrays.asList(message.getMemberList().get(0)));
+            String params = JSON.toJSONString(requestBody);
+            Optional<String> response = httpPoolClientDefault.postJson(qywxConfig.getDomain() + qywxConfig.getPath("kick-external"), params);
+            if (response.isPresent()) {
+                QwCommonResModel<RoomListResponse> roomInfo = QwCommonResModel.parseResponse(response.get(), RoomListResponse.class);
+                if (roomInfo.getErrcode() == 0) {
+                    LOGGER.info("quick Kick external user {} from room {} successfully", vid);
+                    return true;
+                } else {
+                    LOGGER.error("Failed to kick external user {} f: {}", vid, roomInfo.getErrmsg());
+                }
+            } else {
+                LOGGER.error("Failed to kick external user {} from : No response", vid);
+            }
+            return false;
+        }
+        return false;
+    }
 
     public boolean checkAndKickExternalUser(UserBase staff,RiskUserInfo riskUserInfo,long vid,long roomId) {
         LOGGER.info("checkAndKickExternalUser, staff: {}, riskUserInfo: {}, vid: {}, roomId: {}", staff, riskUserInfo, vid, roomId);
@@ -48,6 +81,10 @@ public class RiskUserOperateService {
     }
 
     public boolean kick(UserBase staff, long roomId, long vid) {
+        if(BLACKLIST_VID.contains(vid)) {
+            LOGGER.info("kick, vid: {} is in blacklist, skip normal kick", vid);
+            return false;
+        }
         Map<String, Object> requestBody = new HashMap<>();
         requestBody.put("uuid", staff.getUuid());
         requestBody.put("oprType", 1);

+ 5 - 1
risk-control-core/src/main/java/com/tzld/piaoquan/risk/control/service/qywx/Constant.java

@@ -22,7 +22,7 @@ public class Constant {
     public static int ROOM_USER_DELETE=115002;
 
     //邀请进群通知
-    public static int ROOM_USER_ADD=115003;
+    public static final int ROOM_USER_ADD = 115003;
 
     //群成员自己退群通知
     public static int ROOM_USER_OUT=115004;
@@ -33,6 +33,10 @@ public class Constant {
     //转让群主通知
     public static final int ROOM_ADMIN_UPDATE=115006;
 
+    public static final int ROOM_UPDATE = 115009;//群变动通知
+
+
+
 
     //登录成功
     public static final int LOGIN_SUCCESS = 104001;

+ 9 - 0
risk-control-server/src/main/java/com/tzld/piaoquan/risk/control/controller/QwCallbackController.java

@@ -3,7 +3,9 @@ package com.tzld.piaoquan.risk.control.controller;
 import com.alibaba.fastjson.JSON;
 import com.tzld.piaoquan.risk.control.common.annotation.UnAuth;
 import com.tzld.piaoquan.risk.control.model.qywx.QwCallBackWrapperData;
+import com.tzld.piaoquan.risk.control.model.qywx.RoomAddMemberMessage;
 import com.tzld.piaoquan.risk.control.service.impl.QywxUserDataService;
+import com.tzld.piaoquan.risk.control.service.impl.RiskUserOperateService;
 import com.tzld.piaoquan.risk.control.service.qywx.Constant;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -18,6 +20,8 @@ public class QwCallbackController {
     private static final Logger LOGGER = LoggerFactory.getLogger(QwLoginController.class);
     @Autowired
     private QywxUserDataService userDataService;
+    @Autowired
+    private RiskUserOperateService riskUserOperateService;
     @UnAuth
     @PostMapping("/callback")
     public void onMessage(@RequestBody String callbackData) {
@@ -60,6 +64,11 @@ public class QwCallbackController {
                 userDataService.cancelScanCode(callbackData);
                 LOGGER.info("Login cancel scan code: {}", callbackData);
                 break;
+            case Constant.ROOM_USER_ADD:
+                LOGGER.info("room added member: {}", callbackData);
+                RoomAddMemberMessage msg = JSON.parseObject(wrapperData.getJson(), RoomAddMemberMessage.class);
+                riskUserOperateService.quickKick(msg, wrapperData.getUuid());
+                break;
             default:
                 LOGGER.warn("Unknown message type: {}", wrapperData.getType());
         }