| 
					
				 | 
			
			
				@@ -1,6 +1,10 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.tzld.piaoquan.recommend.server.service.filter.strategy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.openservices.aliyun.log.producer.LogProducer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.openservices.aliyun.log.producer.Producer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.openservices.aliyun.log.producer.ProducerConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.openservices.aliyun.log.producer.ProjectConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.openservices.log.common.LogItem; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.google.common.cache.CacheBuilder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.google.common.cache.CacheLoader; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -15,6 +19,7 @@ import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.slf4j.LoggerFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Qualifier; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.beans.factory.annotation.Value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.data.redis.core.RedisTemplate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.scheduling.annotation.Scheduled; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Component; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -78,6 +83,21 @@ public class BlacklistContainer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @ApolloJsonValue("${content.security.filter.config:{}}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private Map<String, TagFilterConfig> tagFilterConfigMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${aliyun.log.blacklist.filter.log.project}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String project; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${aliyun.log.endpoint}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String endpoint; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${aliyun.log.accessKeyId}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String accessKeyId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${aliyun.log.accessKeySecret}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String accessKeySecret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${aliyun.log.blacklist.filter.log.store}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String logStore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${spring.profiles.active}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String activeProfile; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Producer producer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 保存Tag标签与视频列表的映射 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * <br> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -114,7 +134,10 @@ public class BlacklistContainer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @PostConstruct 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public void init() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LOG.info("generalizationUserConditionConfig: {}", generalizationUserConditionConfig); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LOG.info("tagFilterConfigMap: {}", tagFilterConfigMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         refreshVideoTagCache(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        initLogProducer(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Scheduled(cron = "0 0/5 * * * ? ") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -122,6 +145,14 @@ public class BlacklistContainer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         refreshVideoTagCache(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void initLogProducer() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LOG.info("BlacklistContainer.initLogProducer: project={}, endpoint={}, accessKeyId={}, accessKeySecret={}, logStore={}", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                producer, endpoint, accessKeyId, accessKeySecret, logStore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ProducerConfig producerConfig = new ProducerConfig(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        producer = new LogProducer(producerConfig); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        producer.putProjectConfig(new ProjectConfig(project, endpoint, accessKeyId, accessKeySecret)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public void refreshVideoTagCache() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         LOG.info("同步本地标签ID与视频列表的缓存任务开始"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Map<Long, Set<Long>> tmpMap = new ConcurrentHashMap<>(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -173,7 +204,7 @@ public class BlacklistContainer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return videoIds.stream().filter(videoId -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (videoTagAnyMatch(videoId, tagIdSet)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                LOG.error("用户 {} 在因命中 {} 移除对应的视频ID {}: 请求参数为: hotSceneType={}, cityCode={}, clientIP={}", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                LOG.info("用户 {} 在因命中 {} 移除对应的视频ID {}: 请求参数为: hotSceneType={}, cityCode={}, clientIP={}", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         uid, userType, videoId, hotSceneType, cityCode, clientIP); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -184,12 +215,11 @@ public class BlacklistContainer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private String matchUserBlacklistTypeEnum(String uid, Long hotSceneType, String cityCode, String clientIP) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             LOG.info("计算用户黑名单类型,判断参数: uid={}, hotSceneType={}, cityCode={}, clientIP={}", uid, hotSceneType, cityCode, clientIP); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            LOG.info("generalizationUserConditionConfig: {}", generalizationUserConditionConfig); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            LOG.info("tagFilterConfigMap: {}", tagFilterConfigMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             String key = this.calcUserRedisKey(uid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Map<String, String> uidBlacklistMap = blacklistCache.get(key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (uidBlacklistMap.containsKey(uid)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 String userType = uidBlacklistMap.get(uid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.filterLogUpload(uid, cityCode, hotSceneType, clientIP, userType, "UID"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 LOG.info("用户 {} 在UID黑名单中命中 {}", uid, userType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return userType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -197,11 +227,14 @@ public class BlacklistContainer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Map<String, String> ipBlacklistMap = blacklistCache.get(IP_VISIO_BLACKLIST_HASH_KEY); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (ipBlacklistMap.containsKey(clientIP)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 String userType = ipBlacklistMap.get(clientIP); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.filterLogUpload(uid, cityCode, hotSceneType, clientIP, userType, "IP"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 LOG.info("用户 {} 在IP黑名单中命中 {}, 参数为: clientIP为: {}", uid, userType, clientIP); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return userType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return this.matchGeneralizationUserType(uid, cityCode, hotSceneType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String userType = this.matchGeneralizationUserType(uid, cityCode, hotSceneType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.filterLogUpload(uid, cityCode, hotSceneType, clientIP, userType, "RegionAndHotSceneType"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return userType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } catch ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             LOG.error("blacklist filter isSafeVideoByUid error: ", e); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -267,6 +300,38 @@ public class BlacklistContainer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return tagFilterConfig.getRecommendExcludeTag(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void filterLogUpload(String uid, String cityCode, Long hotSceneType, String clientIp, String fullUserType, String blacklistType) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String[] split = fullUserType.split(USER_TYPE_SUB_TYPE_CONNECTOR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.filterLogUpload(uid, cityCode, hotSceneType, clientIp, split[0], split[1], blacklistType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            LOG.error("filterLogUpload error: ", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void filterLogUpload(String uid, String cityCode, Long hotSceneType, String clientIp, String userType, String userSubType, String blacklistType) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Map<String, String> logMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logMap.put("uid", uid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logMap.put("cityCode", cityCode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logMap.put("hotSceneType", hotSceneType.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logMap.put("clientIp", clientIp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logMap.put("userType", userType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logMap.put("userSubType", userSubType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logMap.put("env", activeProfile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logMap.put("blacklistType", blacklistType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logMap.put("uploadService", "recommend-server"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            LogItem logItem = new LogItem(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logMap.forEach(logItem::PushBack); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            producer.send(project, logStore, logItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            LOG.error("blacklist filter upload log error: ", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private static class GeneralizationUserConfig { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Set<Long> excludeHotSceneType; 
			 |