Jelajahi Sumber

回退版本 提交

zjy 1 bulan lalu
induk
melakukan
ec674c9c49
100 mengubah file dengan 25 tambahan dan 9069 penghapusan
  1. 7 0
      alien-store/pom.xml
  2. 18 0
      alien-util/pom.xml
  3. 0 33
      xiaokuihua-analysis/.gitignore
  4. 0 1
      xiaokuihua-analysis/README.md
  5. 0 210
      xiaokuihua-analysis/pom.xml
  6. 0 32
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/AnalysisApplication.java
  7. 0 107
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/analysis/DouYInEvil0ctal.java
  8. 0 247
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/analysis/DouYin.java
  9. 0 148
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/analysis/DouYinHub.java
  10. 0 69
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/config/ErrorMQConfiguration.java
  11. 0 32
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/config/NacosConfig.java
  12. 0 58
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/config/SwaggerConfig.java
  13. 0 233
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/controller/AnalysisController.java
  14. 0 97
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/handler/RabbitMQHandler.java
  15. 0 17
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/BareParser.java
  16. 0 39
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/ParsePlatformConfig.java
  17. 0 49
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/ParserFactory.java
  18. 0 58
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/Platform.java
  19. 0 17
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/enums/MediaType.java
  20. 0 103
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/AcFunParser.java
  21. 0 107
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/BeforeParser.java
  22. 0 79
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/DouPaiParser.java
  23. 0 120
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/DouYinParser.java
  24. 0 102
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/DuXiaoShiParser.java
  25. 0 88
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/HaoKanParser.java
  26. 0 86
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/HuYaParser.java
  27. 0 93
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/HuoShanParser.java
  28. 0 87
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/KaiYanParser.java
  29. 0 85
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/KuaiShouParser.java
  30. 0 88
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/LiShiPinParser.java
  31. 0 83
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/LvZhouParser.java
  32. 0 119
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/MeiPaiParser.java
  33. 0 189
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/MiaoPaiParser.java
  34. 0 77
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/MoMoParser.java
  35. 0 88
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/PiPiGaoXiaoParser.java
  36. 0 98
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/PiPiXiaParser.java
  37. 0 91
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/QingShiPingParser.java
  38. 0 89
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/QuanMinKGeParser.java
  39. 0 62
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/VueVlogParser.java
  40. 0 97
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/WeiBoParser.java
  41. 0 92
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/WeiShiParser.java
  42. 0 116
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/XiGuaParser.java
  43. 0 92
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/XiaoHongShuParser.java
  44. 0 95
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/XinPianChangParser.java
  45. 0 93
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/ZuiYouParser.java
  46. 0 85
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/result/BareResult.java
  47. 0 45
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/AnalysisLogService.java
  48. 0 73
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/AnalysisService.java
  49. 0 54
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/AnalysisTokenService.java
  50. 0 38
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/AnalysisUserService.java
  51. 0 90
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/impl/AnalysisLogServiceImpl.java
  52. 0 593
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/impl/AnalysisServiceImpl.java
  53. 0 77
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/impl/AnalysisTokenServiceImpl.java
  54. 0 55
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/impl/AnalysisUserServiceImpl.java
  55. 0 61
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/utils/AESUtil.java
  56. 0 31
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/utils/ApplicationContextGetBeanHelper.java
  57. 0 43
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/utils/MyEnvironmentPostProcessor.java
  58. 0 59
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/utils/StringUtil.java
  59. 0 126
      xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/utils/SysConvert.java
  60. 0 1
      xiaokuihua-analysis/src/main/resources/META-INF/spring.factories
  61. 0 11
      xiaokuihua-analysis/src/main/resources/banner.txt
  62. 0 24
      xiaokuihua-analysis/src/main/resources/bootstrap.yml
  63. 0 174
      xiaokuihua-analysis/src/main/resources/logback-spring.xml
  64. 0 33
      xiaokuihua-wechat/.gitignore
  65. 0 2
      xiaokuihua-wechat/README.md
  66. 0 189
      xiaokuihua-wechat/pom.xml
  67. 0 40
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/WechatApplication.java
  68. 0 33
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/config/NacosConfig.java
  69. 0 58
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/config/SwaggerConfig.java
  70. 0 77
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/config/XxlJobConfig.java
  71. 0 125
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/MiniProgramController.java
  72. 0 65
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/PanelController.java
  73. 0 38
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/TestWeChatHandlerController.java
  74. 0 88
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/VideoController.java
  75. 0 110
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/WeChatController.java
  76. 0 81
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/WeChatFerryController.java
  77. 0 44
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/AnalysisFeign.java
  78. 0 106
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/ApiFeign.java
  79. 0 36
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/BotFeign.java
  80. 0 36
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/MusicFeign.java
  81. 0 50
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/WeChatFeign.java
  82. 0 82
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/WeChatFerryFeign.java
  83. 0 52
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/handler/MiniProgramHandler.java
  84. 0 217
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/handler/WeChatHandler.java
  85. 0 50
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatGame.java
  86. 0 117
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatJudge.java
  87. 0 339
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatMenu.java
  88. 0 110
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatMsg.java
  89. 0 60
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatMusic.java
  90. 0 127
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatVideo.java
  91. 0 121
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatWeather.java
  92. 0 21
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/AnalysisLogService.java
  93. 0 58
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/MiniProgramService.java
  94. 0 21
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/WeChatFerryService.java
  95. 0 68
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/WeChatService.java
  96. 0 36
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/impl/AnalysisLogServiceImpl.java
  97. 0 186
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/impl/MiniProgramServiceImpl.java
  98. 0 260
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/impl/WeChatFerryServiceImpl.java
  99. 0 284
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/impl/WeChatServiceImpl.java
  100. 0 43
      xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/util/CheckUtil.java

+ 7 - 0
alien-store/pom.xml

@@ -253,6 +253,13 @@
             <scope>compile</scope>
         </dependency>
 
+        <dependency>
+            <groupId>shop.alien</groupId>
+            <artifactId>alien-util</artifactId>
+            <version>1.0.0</version>
+            <scope>compile</scope>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 18 - 0
alien-util/pom.xml

@@ -293,6 +293,24 @@
             <version>1.9</version> <!-- 使用最新版本 -->
         </dependency>
 
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.40.8.ALL</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.netease.yidun</groupId>
+            <artifactId>yidun-java-sdk</artifactId>
+            <version>1.4.11</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 0 - 33
xiaokuihua-analysis/.gitignore

@@ -1,33 +0,0 @@
-HELP.md
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**/target/
-!**/src/test/**/target/
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-build/
-!**/src/main/**/build/
-!**/src/test/**/build/
-
-### VS Code ###
-.vscode/

+ 0 - 1
xiaokuihua-analysis/README.md

@@ -1 +0,0 @@
-# mq消费者

+ 0 - 210
xiaokuihua-analysis/pom.xml

@@ -1,210 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>shop.alien</groupId>
-        <artifactId>alien-cloud</artifactId>
-        <version>1.0.0</version>
-    </parent>
-
-    <artifactId>xiaokuihua-analysis</artifactId>
-    <version>2.0.0</version>
-    <name>xiaokuihua-analysis</name>
-    <description>视频解析服务</description>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-    </properties>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-amqp</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-aop</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>druid-spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.github.pagehelper</groupId>
-            <artifactId>pagehelper-spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.7.5</version>
-        </dependency>
-
-        <dependency>
-            <groupId>jakarta.validation</groupId>
-            <artifactId>jakarta.validation-api</artifactId>
-            <version>2.0.2</version>
-            <scope>compile</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jsoup</groupId>
-            <artifactId>jsoup</artifactId>
-            <version>1.13.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.bouncycastle</groupId>
-            <artifactId>bcprov-jdk16</artifactId>
-            <version>1.46</version>
-        </dependency>
-
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-swagger2</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-annotations</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-models</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.github.xiaoymin</groupId>
-            <artifactId>swagger-bootstrap-ui</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpcore</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-fileupload</groupId>
-            <artifactId>commons-fileupload</artifactId>
-        </dependency>
-
-        <!--解析url-->
-        <dependency>
-            <groupId>io.github.url-detector</groupId>
-            <artifactId>url-detector</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>shop.alien</groupId>
-            <artifactId>alien-util</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>shop.alien</groupId>
-            <artifactId>alien-entity</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>shop.alien</groupId>
-            <artifactId>alien-config</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <version>3.1.2</version> <!-- 使用最新版本 -->
-                <executions>
-                    <execution>
-                        <id>copy-dependencies</id>
-                        <phase>prepare-package</phase> <!-- 在package之前执行 -->
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- 指定输出目录 -->
-                            <includeScope>runtime</includeScope> <!-- 仅包含运行时依赖 -->
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <configuration>
-                    <mainClass>cc.xiaokuihua.analysis.AnalysisApplication</mainClass>
-                    <layout>ZIP</layout>
-                    <includes>
-                        <include>
-                            <groupId>nothing</groupId>
-                            <artifactId>nothing</artifactId>
-                        </include>
-                    </includes>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>8</source>
-                    <target>8</target>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>

+ 0 - 32
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/AnalysisApplication.java

@@ -1,32 +0,0 @@
-package cc.xiaokuihua.analysis;
-
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.ComponentScan;
-
-@ComponentScan({
-        //配置
-        "cc.xiaokuihua.config.databases",
-//        "cc.xiaokuihua.config.feign",
-//        "cc.xiaokuihua.config.filter",
-        "cc.xiaokuihua.config.http",
-//        "cc.xiaokuihua.config.redis",
-        //工具
-        "cc.xiaokuihua.util.*",
-        //此项目
-        "cc.xiaokuihua.analysis.*"})
-@MapperScan({"cc.xiaokuihua.entity.analysis.mapper"})
-@SpringBootApplication
-public class AnalysisApplication {
-
-    public static void main(String[] args) {
-        /*因为Spring Boot本身已经集成了日志框架Logback,而在Alibaba Nacos中又集成了一套Logback框架
-        而Alibaba Nacos中的Logback加载要优先于项目自身的Logback框架,在一个项目中其context_name只能定义一次,
-        所以,在项目启动时,Alibaba Nacos的Logback先加载完成后,再加载项目本身的Logback时就出现了冲突,报错误日志 “ Failed to rename context [logback] as [nacos] java.lang.IllegalStateException: Context has been already given a name ” ,但是不影响使用,
-        解决这个,只要禁用掉其中一个Logback就可以了,一般禁用外部框架夹带的Logback即可*/
-        System.setProperty("nacos.logging.default.config.enabled", "false");
-        SpringApplication.run(AnalysisApplication.class, args);
-    }
-
-}

+ 0 - 107
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/analysis/DouYInEvil0ctal.java

@@ -1,107 +0,0 @@
-package cc.xiaokuihua.analysis.analysis;
-
-import cc.xiaokuihua.entity.analysis.entity.DouYinAnalysis;
-import cc.xiaokuihua.util.httpsend.spring.GetMethod;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 解析抖音链接
- *
- * @author ssk
- * @version 1.0
- * @date 2024/5/20 17:56
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class DouYInEvil0ctal {
-
-    private final GetMethod getMethod;
-
-    /**
-     * 抖音链接
-     */
-    @Value("${douyin_url}")
-    private String douyinUrl;
-
-    /**
-     * 解析抖音链接
-     *
-     * @param link 要解析的url
-     * @return DouYinAnalysis
-     */
-    public DouYinAnalysis getDouYinResult(String link) {
-        //拼接请求
-        Map<String, String> map = new HashMap<>();
-        map.put("url", link);
-        String result = getMethod.get(douyinUrl, map);
-        //处理返回结果
-        JSONObject jsonObject = JSONObject.parseObject(result);
-        if ("200".equals(jsonObject.getString("code"))) {
-            JSONObject data = jsonObject.getJSONObject("data");
-            //封装解析类
-            DouYinAnalysis douYinAnalysis = new DouYinAnalysis();
-            douYinAnalysis.setSource("抖音");
-            douYinAnalysis.setLink(link);
-            douYinAnalysis.setDesc(data.getString("desc"));
-            douYinAnalysis.setItemId(data.getString("aweme_id"));
-            JSONObject author = data.getJSONObject("author");
-            douYinAnalysis.setUid(author.getString("uid"));
-            douYinAnalysis.setNickname(author.getString("nickname"));
-
-            //解析返回内容
-            String type = data.getString("aweme_type");
-            if ("2".equals(type) || "68".equals(type) || "150".equals(type)) {
-                douYinAnalysis.setType("图片");
-            } else if ("4".equals(type) || "0".equals(type) || "51".equals(type) || "55".equals(type) || "58".equals(type) || "61".equals(type)) {
-                douYinAnalysis.setType("视频");
-            } else {
-                douYinAnalysis.setType("未知");
-            }
-            List<String> imageList = new ArrayList<>();
-            List<String> videoList = new ArrayList<>();
-            if ("图片".equals(douYinAnalysis.getType())) {
-                JSONArray images = data.getJSONArray("images");
-                for (int i = 0; i < images.size(); i++) {
-                    JSONArray jsonArray = images.getJSONObject(i).getJSONArray("url_list");
-                    imageList.add(jsonArray.get(0).toString());
-                    JSONObject video = images.getJSONObject(i).getJSONObject("video");
-                    //判断是否含有视频(抖音动图)
-                    if (video != null) {
-                        JSONObject bit_rate = video.getJSONArray("bit_rate").getJSONObject(0);
-                        JSONObject play_addr = bit_rate.getJSONObject("play_addr");
-                        JSONArray url_list = play_addr.getJSONArray("url_list");
-                        String urlList = url_list.get(url_list.size() - 1).toString();
-                        videoList.add(urlList);
-                        douYinAnalysis.setVideo_list(videoList);
-                    }
-                }
-                douYinAnalysis.setImage_list(imageList);
-            }
-            if ("视频".equals(douYinAnalysis.getType())) {
-                JSONObject video = data.getJSONObject("video");
-                JSONObject bit_rate = video.getJSONArray("bit_rate").getJSONObject(0);
-                JSONObject play_addr = bit_rate.getJSONObject("play_addr");
-                JSONArray url_list = play_addr.getJSONArray("url_list");
-                String urlList = url_list.get(url_list.size() - 1).toString();
-                videoList.add(urlList);
-                douYinAnalysis.setVideo_list(videoList);
-            }
-            return douYinAnalysis;
-        } else {
-            log.error(jsonObject.getString("message"));
-            return null;
-        }
-    }
-
-}

+ 0 - 247
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/analysis/DouYin.java

@@ -1,247 +0,0 @@
-package cc.xiaokuihua.analysis.analysis;
-
-import cc.xiaokuihua.entity.analysis.entity.DouYinAnalysis;
-import cc.xiaokuihua.util.analysis.UrlUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cc.xiaokuihua.util.httpsend.spring.GetMethod;
-import cc.xiaokuihua.util.typeconversion.String2Map;
-import cc.xiaokuihua.util.url.UrlUtils;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 解析抖音链接
- *
- * @author ssk
- * @version 1.0
- * @date 2022/12/27 10:47
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class DouYin {
-
-    private final GetMethod getMethod;
-
-    /**
-     * 抖音链接
-     * https://api.douyin.wtf/douyin_video_data/
-     */
-    @Value("${douyin_url}")
-    private String douyinUrl;
-
-    /**
-     * 解析抖音链接
-     *
-     * @param link 要解析的url
-     * @return DouYinAnalysis
-     */
-    public DouYinAnalysis getDouYinResult(String link) {
-        //拼接请求
-        Map<String, String> map = new HashMap<>();
-        map.put("douyin_video_url", link);
-        String result = getMethod.get(douyinUrl, map);
-        //处理返回结果
-        JSONObject jsonObject = JSONObject.parseObject(result);
-        if ("0".equals(jsonObject.getString("status_code")) || "success".equals(jsonObject.getString("status"))) {
-            //封装解析类
-            DouYinAnalysis douYinAnalysis = new DouYinAnalysis();
-            douYinAnalysis.setSource("抖音");
-            douYinAnalysis.setLink(link);
-            //解析返回内容
-            JSONArray awemeList = jsonObject.getJSONArray("aweme_list");
-            JSONObject awemeDetail = awemeList.getJSONObject(0);
-            JSONObject status = awemeDetail.getJSONObject("status");
-            douYinAnalysis.setDesc(awemeDetail.getString("desc"));
-            String aweme_id = status.getString("aweme_id");
-            douYinAnalysis.setItemId(aweme_id);
-            String type = awemeDetail.getString("aweme_type");
-            if ("2".equals(type) || "68".equals(type) || "150".equals(type)) {
-                douYinAnalysis.setType("图片");
-            } else if ("4".equals(type) || "0".equals(type) || "51".equals(type) || "55".equals(type) || "58".equals(type) || "61".equals(type)) {
-                douYinAnalysis.setType("视频");
-            } else {
-                douYinAnalysis.setType("未知");
-            }
-            List<String> imageList = new ArrayList<>();
-            if ("图片".equals(douYinAnalysis.getType())) {
-                JSONArray images = awemeDetail.getJSONArray("images");
-                for (int i = 0; i < images.size(); i++) {
-                    JSONArray jsonArray = images.getJSONObject(i).getJSONArray("url_list");
-                    imageList.add(jsonArray.get(0).toString());
-                }
-                douYinAnalysis.setImage_list(imageList);
-            }
-            List<String> videoList = new ArrayList<>();
-            if ("视频".equals(douYinAnalysis.getType())) {
-                JSONObject video = awemeDetail.getJSONObject("video");
-                JSONObject bit_rate = video.getJSONArray("bit_rate").getJSONObject(0);
-                JSONObject play_addr = bit_rate.getJSONObject("play_addr");
-                String url_list = play_addr.getJSONArray("url_list").get(0).toString();
-                videoList.add(url_list);
-                douYinAnalysis.setVideo_list(videoList);
-            }
-            return douYinAnalysis;
-        } else {
-            log.error(jsonObject.getString("message"));
-            return null;
-        }
-    }
-
-    /**
-     * 扒取用户主页列表链接分析数据
-     *
-     * @param link         链接
-     * @param douyinCookie cookie
-     * @param user_agent   设备
-     * @return List<DouYinAnalysis>
-     */
-    public List<DouYinAnalysis> getUserAllData(String link, String douyinCookie, String user_agent) {
-        List<DouYinAnalysis> resultList = new ArrayList<>();
-        String paramStr = link.substring(link.indexOf("?") + 1);
-        Map<String, String> map = String2Map.stringToMap(paramStr, "&");
-        Map<String, String> headerMap = new HashMap<>();
-        headerMap.put("Cookie", douyinCookie);
-        headerMap.put("User-Agent", user_agent);
-        headerMap.put("Referer", "https://www.douyin.com/user/" + map.get("sec_user_id"));
-        String resultStr = getMethod.getWithHeader(link, headerMap);
-        if (null != resultStr && !resultStr.isEmpty()) {
-            JSONObject jsonObject = JSONObject.parseObject(resultStr);
-            if ("0".equals(jsonObject.getString("status_code"))) {
-                String type = link.substring(0, link.indexOf("?") - 1);
-                type = type.substring(type.lastIndexOf("/") + 1);
-                JSONArray aweme_list = null;
-                JSONObject aweme_detail = null;
-                if ("detail".equals(type)) {
-                    aweme_detail = jsonObject.getJSONObject("aweme_detail");
-                } else {
-                    aweme_list = jsonObject.getJSONArray("aweme_list");
-                }
-                if (null == aweme_list && null == aweme_detail) {
-                    log.error("DouYin_getUserAllData_返回内容为空");
-                    return null;
-                } else {
-                    if (null != aweme_list && !aweme_list.isEmpty()) {
-                        log.info("getUserAllData_获取到用户数据{}条", aweme_list.size());
-                        for (int i = 0; i < aweme_list.size(); i++) {
-                            JSONObject one = aweme_list.getJSONObject(i);
-                            resultList.add(analysisOne(one, null));
-                        }
-                    }
-                    if (null != aweme_detail && !aweme_detail.isEmpty()) {
-                        log.info("getUserAllData_获取到单条数据");
-                        resultList.add(analysisOne(aweme_detail, null));
-                    }
-                    return resultList;
-                }
-            } else {
-                log.error("DouYin_getUserAllData_返回状态错误");
-                return null;
-            }
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * 获取分享视频id
-     *
-     * @param url 链接
-     * @return 抖音视频id
-     */
-    public String getItemId(String url) {
-        log.info("Douyin_getItemId_before: {}", url);
-        url = UrlUtils.getUrl(url);
-        log.info("Douyin_getItemId_after: {}", url);
-        String userAgent = UserAgentUtil.getOne();
-        String realUrl = UrlUtil.getRealUrl(userAgent, url);
-        log.info("Real_Url: " + realUrl);
-        int start;
-        int end = realUrl.lastIndexOf("/");
-        if (realUrl.contains("video")) {
-            start = realUrl.indexOf("/video/") + "/video/".length();
-        } else if (realUrl.contains("note")) {
-            start = realUrl.indexOf("/note/") + "/note/".length();
-        } else if (realUrl.contains("https://www.iesdouyin.com/share/slides/")) {
-            start = realUrl.indexOf("https://www.iesdouyin.com/share/slides/") + "https://www.iesdouyin.com/share/slides/".length();
-            end = realUrl.indexOf("?") - 2;
-        } else {
-            return null;
-        }
-        return realUrl.substring(start, end);
-    }
-
-    /**
-     * 解析内容
-     *
-     * @param jsonObject 返回数据转json
-     * @param link       解析链接
-     * @return DouYinAnalysis
-     */
-    private DouYinAnalysis analysisOne(JSONObject jsonObject, String link) {
-        //封装解析类
-        DouYinAnalysis douYinAnalysis = new DouYinAnalysis();
-        douYinAnalysis.setSource("抖音");
-        //存放了链接表示为单条视频
-        if (null != link) {
-            douYinAnalysis.setLink(link);
-        }
-        //解析返回内容
-        String awemeId = jsonObject.getString("aweme_id");
-        douYinAnalysis.setItemId(awemeId);
-        JSONObject author = jsonObject.getJSONObject("author");
-        douYinAnalysis.setNickname(author.getString("nickname"));
-        douYinAnalysis.setUid(author.getString("uid"));
-        douYinAnalysis.setDesc(jsonObject.getString("desc"));
-        String type = jsonObject.getString("aweme_type");
-        if ("2".equals(type) || "68".equals(type) || "150".equals(type)) {
-            douYinAnalysis.setType("图片");
-        } else if ("4".equals(type) || "0".equals(type) || "51".equals(type) || "55".equals(type) || "58".equals(type) || "61".equals(type)) {
-            douYinAnalysis.setType("视频");
-        } else {
-            douYinAnalysis.setType("未知");
-        }
-        List<String> imageList = new ArrayList<>();
-        List<String> videoList = new ArrayList<>();
-        if ("图片".equals(douYinAnalysis.getType())) {
-            JSONArray images = jsonObject.getJSONArray("images");
-            for (int i = 0; i < images.size(); i++) {
-                JSONArray jsonArray = images.getJSONObject(i).getJSONArray("url_list");
-                if (jsonArray.size() > 0) {
-                    imageList.add(jsonArray.get(0).toString());
-                    JSONObject video = images.getJSONObject(i).getJSONObject("video");
-                    //判断是否含有视频(抖音动图)
-                    if (video != null) {
-                        JSONObject bit_rate = video.getJSONArray("bit_rate").getJSONObject(0);
-                        JSONObject play_addr = bit_rate.getJSONObject("play_addr");
-                        JSONArray url_list = play_addr.getJSONArray("url_list");
-                        String urlList = url_list.get(url_list.size() - 1).toString();
-                        videoList.add(urlList);
-                        douYinAnalysis.setVideo_list(videoList);
-                    }
-                }
-            }
-            douYinAnalysis.setImage_list(imageList);
-        }
-        if ("视频".equals(douYinAnalysis.getType())) {
-            JSONObject video = jsonObject.getJSONObject("video");
-            JSONObject bit_rate = video.getJSONArray("bit_rate").getJSONObject(0);
-            JSONObject play_addr = bit_rate.getJSONObject("play_addr");
-            JSONArray url_list = play_addr.getJSONArray("url_list");
-            String urlList = url_list.get(url_list.size() - 1).toString();
-            videoList.add(urlList);
-            douYinAnalysis.setVideo_list(videoList);
-        }
-        return douYinAnalysis;
-    }
-
-}

+ 0 - 148
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/analysis/DouYinHub.java

@@ -1,148 +0,0 @@
-package cc.xiaokuihua.analysis.analysis;
-
-import cc.xiaokuihua.entity.analysis.entity.DouYinAnalysis;
-import cc.xiaokuihua.util.httpsend.apache.HttpGetRequestUtil;
-import cc.xiaokuihua.util.httpsend.spring.GetMethod;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 使用TikHubApi解析
- *
- * @author ssk
- * @version 1.0
- * @date 2023/5/27 10:09
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class DouYinHub {
-
-    private final GetMethod getMethod;
-
-    /**
-     * 解析单一抖音视频数据
-     *
-     * @param token token
-     * @param link  解析链接
-     * @return DouYinAnalysis
-     */
-    public DouYinAnalysis getOneVideoData(String token, String link) {
-        String apiUrl = "https://api.tikhub.io/douyin/video_data/";
-        Map<String, String> headerMap = new HashMap<>();
-        headerMap.put("Authorization", token);
-        Map<String, String> paramMap = new HashMap<>();
-        paramMap.put("douyin_video_url", link);
-        paramMap.put("language", "zh");
-//        String resultStr = getMethod.get(apiUrl, paramMap, headerMap);
-
-        String resultStr = HttpGetRequestUtil.getRequest(apiUrl, paramMap, headerMap);
-
-        //处理返回结果
-        JSONObject jsonObject = JSONObject.parseObject(resultStr);
-        if ("true".equals(jsonObject.getString("status")) && !jsonObject.getJSONArray("aweme_list").isEmpty()) {
-            return analysisOne(jsonObject, link);
-        } else {
-            log.error(jsonObject.getString("message"));
-            return null;
-        }
-    }
-
-    /**
-     * 解析抖音作者视频数据
-     *
-     * @param token token
-     * @param link  解析链接
-     * @return List<DouYinAnalysis>
-     */
-    public List<DouYinAnalysis> getUserVideoData(String token, String link) {
-        String apiUrl = "https://api.tikhub.io/douyin/user_profile_videos_data/";
-        Map<String, String> headerMap = new HashMap<>();
-        headerMap.put("Authorization", token);
-        Map<String, String> paramMap = new HashMap<>();
-        paramMap.put("douyin_user_url", link);
-        paramMap.put("cursor", "0");
-        paramMap.put("count", "9999");
-        paramMap.put("language", "zh");
-        String resultStr = getMethod.get(apiUrl, paramMap, headerMap);
-//        String resultStr = HttpGetRequestUtil.getRequest(apiUrl, paramMap, headerMap);
-        //处理返回结果
-        JSONObject jsonObject = JSONObject.parseObject(resultStr);
-        List<DouYinAnalysis> douYinAnalysisList = new ArrayList<>();
-        if ("true".equals(jsonObject.getString("status")) && !jsonObject.getJSONArray("aweme_list").isEmpty()) {
-            JSONArray aweme_list = jsonObject.getJSONArray("aweme_list");
-            if (null != aweme_list && !aweme_list.isEmpty()) {
-                for (int i = 0; i < aweme_list.size(); i++) {
-                    JSONObject one = aweme_list.getJSONObject(i);
-                    douYinAnalysisList.add(analysisOne(one, null));
-                }
-                return douYinAnalysisList;
-            } else {
-                return null;
-            }
-        } else {
-            log.error(jsonObject.getString("message"));
-            log.error(jsonObject.getJSONObject("detail").getString("message"));
-            return null;
-        }
-    }
-
-    /**
-     * 解析内容
-     *
-     * @param jsonObject 返回数据转json
-     * @param link       解析链接
-     * @return DouYinAnalysis
-     */
-    private DouYinAnalysis analysisOne(JSONObject jsonObject, String link) {
-        //封装解析类
-        DouYinAnalysis douYinAnalysis = new DouYinAnalysis();
-        douYinAnalysis.setSource("抖音");
-        //存放了链接表示为单条视频
-        if (null != link) {
-            douYinAnalysis.setLink(link);
-        } else {
-            //存放id为批量下载
-            douYinAnalysis.setLink(jsonObject.getString("aweme_id"));
-        }
-        //解析返回内容
-        JSONObject author = jsonObject.getJSONObject("author");
-        douYinAnalysis.setNickname(author.getString("nickname"));
-        douYinAnalysis.setDesc(jsonObject.getString("desc"));
-        String type = jsonObject.getString("aweme_type");
-        if ("2".equals(type) || "68".equals(type) || "150".equals(type)) {
-            douYinAnalysis.setType("图片");
-        } else if ("4".equals(type) || "0".equals(type) || "51".equals(type) || "55".equals(type) || "58".equals(type) || "61".equals(type)) {
-            douYinAnalysis.setType("视频");
-        } else {
-            douYinAnalysis.setType("未知");
-        }
-        List<String> imageList = new ArrayList<>();
-        if ("图片".equals(douYinAnalysis.getType())) {
-            JSONArray images = jsonObject.getJSONArray("images");
-            for (int i = 0; i < images.size(); i++) {
-                JSONArray jsonArray = images.getJSONObject(i).getJSONArray("url_list");
-                imageList.add(jsonArray.get(0).toString());
-            }
-            douYinAnalysis.setImage_list(imageList);
-        }
-        List<String> videoList = new ArrayList<>();
-        if ("视频".equals(douYinAnalysis.getType())) {
-            JSONObject video = jsonObject.getJSONObject("video");
-            JSONObject bit_rate = video.getJSONArray("bit_rate").getJSONObject(0);
-            JSONObject play_addr = bit_rate.getJSONObject("play_addr");
-            String url_list = play_addr.getJSONArray("url_list").get(0).toString();
-            videoList.add(url_list);
-            douYinAnalysis.setVideo_list(videoList);
-        }
-        return douYinAnalysis;
-    }
-}

+ 0 - 69
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/config/ErrorMQConfiguration.java

@@ -1,69 +0,0 @@
-package cc.xiaokuihua.analysis.config;
-
-import org.springframework.amqp.core.Binding;
-import org.springframework.amqp.core.BindingBuilder;
-import org.springframework.amqp.core.DirectExchange;
-import org.springframework.amqp.core.Queue;
-import org.springframework.amqp.rabbit.core.RabbitTemplate;
-import org.springframework.amqp.rabbit.retry.MessageRecoverer;
-import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * 消费者重试错误队列配置
- *
- * @author ssk
- * @version 1.0
- * @date 2023/12/11 12:02
- */
-@Configuration
-//获取某个属性,前缀,属性名, 属性内容
-@ConditionalOnProperty(prefix = "spring.rabbitmq.listener.simple.retry", name = "enabled", havingValue = "true")
-public class ErrorMQConfiguration {
-
-    /**
-     * 创建新交换机
-     *
-     * @return DirectExchange
-     */
-    @Bean
-    public DirectExchange directExchange() {
-        return new DirectExchange("error.direct");
-    }
-
-    /**
-     * 创建新队列
-     *
-     * @return Queue
-     */
-    @Bean
-    public Queue errorQueue() {
-        return new Queue("error.queue");
-    }
-
-    /**
-     * 绑定交换机和队列
-     *
-     * @param errorQueue
-     * @param directExchange
-     * @return
-     */
-    @Bean
-    public Binding errorBinding(Queue errorQueue, DirectExchange directExchange) {
-        return BindingBuilder.bind(errorQueue).to(directExchange).with("error");
-    }
-
-    /**
-     * 失败重发机制
-     *
-     * @param rabbitTemplate
-     * @return
-     */
-    @Bean
-    public MessageRecoverer messageRecoverer(RabbitTemplate rabbitTemplate) {
-        //重新发布
-        return new RepublishMessageRecoverer(rabbitTemplate, "error.direct", "error");
-    }
-}

+ 0 - 32
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/config/NacosConfig.java

@@ -1,32 +0,0 @@
-package cc.xiaokuihua.analysis.config;
-
-import lombok.Data;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.cloud.context.config.annotation.RefreshScope;
-import org.springframework.stereotype.Component;
-
-/**
- * 获取Nacos配置
- *
- * @author ssk
- * @version 1.0
- * @date 2024/1/3 15:01
- */
-@Data
-@Component
-@RefreshScope
-public class NacosConfig {
-
-    /**
-     * 抖音Cookie
-     */
-    @Value(value = "${douyin.cookie}")
-    private String douyinCookie;
-
-    /**
-     * 抖音用户代理
-     */
-    @Value(value = "${douyin.userAgent}")
-    private String userAgent;
-
-}

+ 0 - 58
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/config/SwaggerConfig.java

@@ -1,58 +0,0 @@
-package cc.xiaokuihua.analysis.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.Contact;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-/**
- * swagger配置类
- *
- * @author ssk
- * @version 1.0
- * @date 2022/07/07 09:07
- */
-@Configuration
-@EnableSwagger2
-public class SwaggerConfig {
-
-    /**
-     * controller扫描
-     *
-     * @return controller扫描
-     */
-    @Bean
-    public Docket docket() {
-        return new Docket(DocumentationType.SWAGGER_2)
-                .apiInfo(apiInfo())
-                .groupName("短视频平台视频图片解析")
-                .select()
-//                .apis(RequestHandlerSelectors.basePackage("cc.xiaokuihua.xiaokuihuaanalysis"))
-                .apis(RequestHandlerSelectors.any())
-                .paths(PathSelectors.any())
-                .build();
-    }
-
-    /**
-     * Api标题信息
-     *
-     * @return api标题Api标题信息
-     */
-    public ApiInfo apiInfo() {
-        Contact contact = new Contact("ssk", "https://analysis.xiaokuihua.cc", "172380199@qq.com");
-        return new ApiInfoBuilder()
-                .title("短视频平台视频图片解析API文档")
-                .description("短视频平台视频图片解析API")
-                .license("ssk")
-                .contact(contact)
-                .termsOfServiceUrl("https://analysis.xiaokuihua.cc")
-                .version("1.0.0")
-                .build();
-    }
-}

+ 0 - 233
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/controller/AnalysisController.java

@@ -1,233 +0,0 @@
-package cc.xiaokuihua.analysis.controller;
-
-import cc.xiaokuihua.analysis.service.AnalysisLogService;
-import cc.xiaokuihua.analysis.service.AnalysisService;
-import cc.xiaokuihua.util.url.UrlUtils;
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-import shop.alien.entity.analysis.entity.AnalysisLog;
-import shop.alien.entity.analysis.entity.DouYinAnalysis;
-import shop.alien.entity.result.R;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 短视频/图片去水印
- */
-@Slf4j
-@Api(tags = "短视频/图片去水印")
-@CrossOrigin
-@RestController
-//@RefreshScope
-@RequiredArgsConstructor
-public class AnalysisController {
-
-    private final AnalysisLogService analysisLogService;
-
-    private final AnalysisService analysisService;
-
-//    /**
-//     * 获取无水印资源地址列表
-//     *
-//     * @param link 复制的链接
-//     */
-//    @ApiOperation(value = "聚合接口", response = BareResult.class)
-//    @GetMapping("/bare")
-//    private ReturnObject<BareResult> bare(
-//            @NotBlank(message = "请输入复制链接")
-//            @ApiParam("复制的链接")
-//            @RequestParam("link") String link) throws Exception {
-//        return ResponseUtil.ok(bareService.parse(link));
-//    }
-
-    /**
-     * 根据链接修改项目id(用于没有item_id)
-     *
-     * @return R
-     */
-    @ApiOperation(value = "根据链接修改项目id(用于没有item_id)")
-    @GetMapping("/updateItemId")
-    public R updateItemId() {
-        return R.data(analysisLogService.updateItemId());
-    }
-
-    /**
-     * 下载到本地(直接下载)
-     *
-     * @param response 响应
-     * @param link     解析的链接
-     */
-    @ApiOperation(value = "下载到本地(直接下载)")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "link", value = "链接", dataType = "String", paramType = "query")
-    })
-    @GetMapping("/downloadToLocal")
-    public void downloadToLocal(HttpServletResponse response, String link) {
-        //解析链接
-        String url = UrlUtils.getUrl(link);
-        analysisService.downloadToLocal(response, url);
-    }
-
-    /**
-     * 下载用户主页所有(Nas)
-     *
-     * @param link         抖音浏览器版主页链接
-     * @param repeatFlag   去重标记, 用于主页解析, 单条默认去重(消息模块也会验证重复性)
-     * @param downloadFlag 下载标记, 用于主页解析, 默认全部下载(0:全部下载,1:只下载图片,2:只下载视频)
-     * @return R
-     */
-    @ApiOperation(value = "下载用户主页所有(Nas)")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "link", value = "抖音浏览器版主页链接", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "repeatFlag", value = "去重标记, 用于主页解析, 单条默认去重(消息模块也会验证重复性)", dataType = "Boolean", paramType = "query"),
-            @ApiImplicitParam(name = "downloadFlag", value = "下载标记, 用于主页解析, 默认全部下载(0:全部下载,1:只下载图片,2:只下载视频)", dataType = "Integer", paramType = "query")
-    })
-    @GetMapping("/downloadUserHomePageData")
-    public R downloadUserHomePageData(String link, boolean repeatFlag, Integer downloadFlag) {
-        List<DouYinAnalysis> douYinAnalysisList = analysisService.getUserHomePageData(link);
-        if (douYinAnalysisList == null) {
-            return R.fail("私密马赛, 解析失败, 可能Cookie失效");
-        } else {
-            //下载
-            analysisService.download(douYinAnalysisList, 1, repeatFlag, downloadFlag);
-            return R.success("解析成功, 正在下载, 请稍后查看");
-        }
-    }
-
-    /**
-     * 单条视频下载到Nas
-     *
-     * @param link 链接
-     */
-    @ApiOperation(value = "单条视频下载到Nas")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "link", value = "链接", dataType = "String", paramType = "query")
-    })
-    @GetMapping("/downloadToServer")
-    public R downloadToServer(String link) {
-        //解析链接
-        String url = UrlUtils.getUrl(link);
-        DouYinAnalysis douYinAnalysis = analysisService.getOneVideoData(url);
-        List<DouYinAnalysis> douYinAnalysisList = new ArrayList<>();
-        douYinAnalysisList.add(douYinAnalysis);
-        //获取视频状态
-        if (douYinAnalysis != null) {
-            //判断是否下载过
-            if ("have".equals(douYinAnalysis.getLink())) {
-                return R.fail("私密马赛, 该视频已下载");
-            }
-            //异步下载
-            analysisService.download(douYinAnalysisList, 0, true, 0);
-        } else {
-            return R.fail("私密马赛, 解析失败, 数据为空");
-        }
-        return R.success("解析成功, 正在下载, 请稍后查看");
-    }
-
-    /**
-     * 单条视频解析(douyinhub)
-     *
-     * @param link 链接
-     * @return R
-     */
-    @ApiOperation(value = "单条视频解析(douyinhub)")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "link", value = "链接", dataType = "String", paramType = "query")
-    })
-    @GetMapping("/douyinhub/analysisOneVideo")
-    public R analysisOneVideo(String link) {
-        //解析链接
-        String url = UrlUtils.getUrl(link);
-        //查询是否下载
-        AnalysisLog oneByLink = analysisLogService.getOneByLink(url);
-        if (null == oneByLink) {
-            //解析抖音链接
-            DouYinAnalysis douYinAnalysis = analysisService.douyinHubGetOneVideo(url);
-            if (douYinAnalysis == null) {
-                return R.fail("私密马赛, 解析失败, 数据为空");
-            } else if ("token".equals(douYinAnalysis.getLink())) {
-                return R.fail("私密马赛, 解析失败, 无可用Token");
-            } else {
-                //下载
-                List<DouYinAnalysis> list = new ArrayList<>();
-                list.add(douYinAnalysis);
-                analysisService.download(list, 0, true, 0);
-                return R.success("解析成功, 正在下载, 请稍后查看");
-            }
-        } else {
-            return R.fail("私密马赛, 该视频已下载");
-        }
-    }
-
-    /**
-     * 解析用户主页(douyinhub,会缺数据)
-     *
-     * @param link 链接
-     * @return R
-     */
-    @ApiOperation(value = "解析用户主页(douyinhub,会缺数据)")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "link", value = "抖音浏览器版主页链接", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "repeatFlag", value = "去重标记, 用于主页解析, 单条默认去重(消息模块也会验证重复性)", dataType = "Boolean", paramType = "query"),
-            @ApiImplicitParam(name = "downloadFlag", value = "下载标记, 用于主页解析, 默认全部下载(0:全部下载,1:只下载图片,2:只下载视频)", dataType = "Integer", paramType = "query")
-    })
-    @GetMapping("/douyinhub/analysisUserHomePage")
-    public R analysisUserHomePage(String link, boolean repeatFlag, Integer downloadFlag) {
-        //解析链接
-        String url = UrlUtils.getUrl(link);
-        //解析抖音链接
-        List<DouYinAnalysis> douYinAnalysisList = analysisService.douyinHubGetUserHomePage(url);
-        if (douYinAnalysisList == null) {
-            return R.fail("私密马赛, 解析失败, 数据为空");
-        } else if ("token".equals(douYinAnalysisList.get(0).getLink())) {
-            return R.fail("私密马赛, 解析失败, 无可用Token");
-        } else {
-            //下载
-            analysisService.download(douYinAnalysisList, 1, repeatFlag, downloadFlag);
-            return R.success("解析成功, 正在下载, 请稍后查看");
-        }
-    }
-
-    /**
-     * 分页查询解析记录
-     *
-     * @param pageNum  页数
-     * @param pageSize 条数
-     * @return R
-     */
-    @ApiOperation("分页查询解析记录-列表")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
-            @ApiImplicitParam(name = "pageSize", value = "分页条数", dataType = "int", paramType = "query", required = true)})
-    @GetMapping("/selectAll")
-    public R<PageInfo<AnalysisLog>> selectAll(Integer pageNum, Integer pageSize) {
-        PageHelper.startPage(pageNum, pageSize);
-        List<AnalysisLog> analysisLogs = analysisLogService.selectAll();
-        PageInfo<AnalysisLog> pageInfo = new PageInfo<>(analysisLogs);
-        return R.data(pageInfo);
-    }
-
-    /**
-     * 查询最新5条
-     *
-     * @return R List<AnalysisLog>
-     */
-    @ApiOperation("查询最新5条")
-    @GetMapping("/selectLimit")
-    public R<List<AnalysisLog>> selectLimit() {
-        List<AnalysisLog> analysisLogs = analysisLogService.selectLimit();
-        return R.data(analysisLogs);
-    }
-
-}

+ 0 - 97
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/handler/RabbitMQHandler.java

@@ -1,97 +0,0 @@
-package cc.xiaokuihua.analysis.handler;
-
-import cc.xiaokuihua.analysis.service.AnalysisService;
-import cc.xiaokuihua.entity.analysis.entity.DouYinAnalysis;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.amqp.rabbit.annotation.RabbitListener;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 队列处理
- *
- * @author ssk
- * @version 1.0
- * @date 2023/12/9 14:22
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class RabbitMQHandler {
-
-    private final AnalysisService analysisService;
-
-    /**
-     * 从队列获取单条消息并解析
-     *
-     * @param msg 单条视频
-     */
-    @RabbitListener(queues = "Douyin_Analysis_Queue")
-    public void DouyinAnalysisQueue(String msg) {
-        log.info("DouyinAnalysisQueue_获取到队列消息:" + msg);
-        DouYinAnalysis douYinAnalysis = analysisService.getOneVideoData(msg);
-        List<DouYinAnalysis> list = new ArrayList<>();
-        list.add(douYinAnalysis);
-        //获取视频状态
-        if (douYinAnalysis != null) {
-            //判断是否下载过
-            if ("have".equals(douYinAnalysis.getLink())) {
-                log.info("该视频已下载:" + msg);
-            } else {
-                analysisService.download(list, 0, true, 0);
-            }
-        } else {
-            log.info("解析失败数据为空:" + msg);
-        }
-    }
-
-    /**
-     * 从队列获取用户主页数据并解析
-     *
-     * @param msg 用户主页链接
-     */
-    @RabbitListener(queues = "Douyin_User_HomePage_Queue")
-    public void DouyinUserHomePageQueue(String msg) {
-        log.info("DouyinUserHomePageQueue_获取到队列消息:" + msg);
-        List<DouYinAnalysis> userHomePageData = analysisService.getUserHomePageData(msg);
-        if (null != userHomePageData && !userHomePageData.isEmpty()) {
-            log.info("DouyinUserHomePageQueue_正在处理用户主页数据");
-            analysisService.download(userHomePageData, 1, true, 0);
-        } else {
-            log.error("DouyinUserHomePageQueue_用书主页数据为空, 请检查Cookie");
-        }
-    }
-
-    //    @RabbitListener(queues = "error.queue")
-    public void errorQueue(String msg) {
-        if (msg.contains("https://www.douyin.com/aweme/v1/web")) {
-            log.info("errorQueue_获取到队列消息, 解析用户主页:" + msg);
-            List<DouYinAnalysis> userHomePageData = analysisService.getUserHomePageData(msg);
-            if (null != userHomePageData && !userHomePageData.isEmpty()) {
-                log.info("DouyinUserHomePageQueue_正在处理用户主页数据");
-                analysisService.download(userHomePageData, 1, true, 0);
-            } else {
-                log.error("DouyinUserHomePageQueue_用书主页数据为空, 请检查Cookie");
-            }
-        } else if (msg.contains("v.douyin.com")) {
-            log.info("errorQueue_获取到队列消息, 解析单条视频:" + msg);
-            DouYinAnalysis douYinAnalysis = analysisService.getOneVideoData(msg);
-            List<DouYinAnalysis> list = new ArrayList<>();
-            list.add(douYinAnalysis);
-            //获取视频状态
-            if (douYinAnalysis != null) {
-                //判断是否下载过
-                if ("have".equals(douYinAnalysis.getLink())) {
-                    log.info("该视频已下载:" + msg);
-                } else {
-                    analysisService.download(list, 0, true, 0);
-                }
-            } else {
-                log.info("解析失败数据为空:" + msg);
-            }
-        }
-    }
-}

+ 0 - 17
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/BareParser.java

@@ -1,17 +0,0 @@
-package cc.xiaokuihua.analysis.parse;
-
-import cc.xiaokuihua.analysis.result.BareResult;
-
-/**
- * 解析器接口
- */
-public interface BareParser {
-
-    /**
-     * 获取无水印资源信息
-     *
-     * @param link 复制的链接
-     * @return 无水印资源信息
-     */
-    BareResult parse(String link) throws Exception;
-}

+ 0 - 39
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/ParsePlatformConfig.java

@@ -1,39 +0,0 @@
-package cc.xiaokuihua.analysis.parse;
-
-/**
- * 平台配置
- */
-class ParsePlatformConfig {
-
-    /**
-     * 解析的平台集合
-     */
-    public static final Platform[] platforms = new Platform[]{
-            Platform.DOU_YIN,
-            Platform.KUAI_SHOU,
-            Platform.WEI_SHI,
-            Platform.PI_PI_XIA,
-            Platform.PI_PI_GAO_XIAO,
-            Platform.HUO_SHAN,
-            Platform.ZUI_YOU,
-            Platform.XI_GUA,
-            Platform.QING_SHI_PING,
-            Platform.XIN_PIAN_CHANGE,
-            Platform.WEI_BO,
-            Platform.AC_FUN,
-            Platform.LI_SHI_PIN,
-            Platform.LV_ZHOU,
-            Platform.DOU_PAI,
-            Platform.MEI_PAI,
-            Platform.VUE_VLOG,
-            Platform.BEFORE,
-            Platform.QUAN_MING_K_GE,
-            Platform.DU_XIAO_SHI,
-            Platform.MIAO_PAI,
-            Platform.KAI_YAN,
-            Platform.MO_MO,
-            Platform.HU_YA,
-            Platform.HAO_KAN,
-            Platform.XIAO_HONG_SHU
-    };
-}

+ 0 - 49
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/ParserFactory.java

@@ -1,49 +0,0 @@
-package cc.xiaokuihua.analysis.parse;
-
-import cc.xiaokuihua.analysis.utils.ApplicationContextGetBeanHelper;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ParserFactory {
-
-    /**
-     * 获取解析器
-     *
-     * @param url 分享链接文字
-     * @return 解析器
-     */
-    public BareParser getParser(String url) {
-        for (Platform platform : ParsePlatformConfig.platforms) {
-            if (isPlatform(url, platform)) {
-                return (BareParser) ApplicationContextGetBeanHelper.getBean(platform.getParserClass().getSimpleName());
-            }
-        }
-        return null;
-    }
-
-    /**
-     * 平台归属
-     *
-     * @param url      复制的链接地址
-     * @param platform 平台
-     * @return 是否是 {@link Platform}
-     */
-    private boolean isPlatform(String url, Platform platform) {
-        return url.contains(platform.getDomain());
-    }
-
-    /**
-     * 是否是支持的平台
-     *
-     * @param url 分享链接文字
-     * @return 是否支持
-     */
-    public boolean isSupportPlatform(String url) {
-        for (Platform platform : ParsePlatformConfig.platforms) {
-            if (isPlatform(url, platform)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}

+ 0 - 58
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/Platform.java

@@ -1,58 +0,0 @@
-package cc.xiaokuihua.analysis.parse;
-
-import cc.xiaokuihua.analysis.parse.parser.*;
-
-/**
- * 支持的平台
- */
-public enum Platform {
-
-    DOU_YIN("抖音", "v.douyin.com", DouYinParser.class),
-    KUAI_SHOU("快手", "v.kuaishou.com", KuaiShouParser.class),
-    WEI_SHI("微视", "isee.weishi.qq.com", WeiShiParser.class),
-    PI_PI_XIA("皮皮虾", "h5.pipix.com", PiPiXiaParser.class),
-    PI_PI_GAO_XIAO("皮皮搞笑", "h5.pipigx.com", PiPiGaoXiaoParser.class),
-    HUO_SHAN("抖音火山版", "share.huoshan.com", HuoShanParser.class),
-    ZUI_YOU("最右", "izuiyou.com", ZuiYouParser.class),
-    XI_GUA("西瓜视频", "ixigua.com", XiGuaParser.class),
-    QING_SHI_PING("轻视频", "bbq.bilibili.com", QingShiPingParser.class),
-    XIN_PIAN_CHANGE("新片场", "www.xinpianchang.com", XinPianChangParser.class),
-    WEI_BO("微博", "video.weibo", WeiBoParser.class),
-    AC_FUN("AcFun", "m.acfun.cn", AcFunParser.class),
-    LI_SHI_PIN("梨视频", "www.pearvideo.com", LiShiPinParser.class),
-    LV_ZHOU("绿洲", "oasis.weibo.cn", LvZhouParser.class),
-    DOU_PAI("逗拍", "p.doupai.cc", DouPaiParser.class),
-    MEI_PAI("美拍", "www.meipai.com", MeiPaiParser.class),
-    VUE_VLOG("VUE Vlog", "v.vuevideo.net", VueVlogParser.class),
-    BEFORE("Before 避风", "m.hanyuhl.com", BeforeParser.class),
-    QUAN_MING_K_GE("全民K歌", "static-play.kg.qq.com", QuanMinKGeParser.class),
-    DU_XIAO_SHI("度小视", "xspshare.baidu.com", DuXiaoShiParser.class),
-    MIAO_PAI("秒拍", "miaopai.com", MiaoPaiParser.class),
-    KAI_YAN("开眼", "eyepetizer.net", KaiYanParser.class),
-    MO_MO("陌陌", "immomo.com", MoMoParser.class),
-    HU_YA("虎牙", "huya.com", HuYaParser.class),
-    HAO_KAN("好看", "haokan.hao123.com", HaoKanParser.class),
-    XIAO_HONG_SHU("小红书", "xhslink.com", XiaoHongShuParser.class);
-
-    private final String name;
-    private final String domain;
-    private final Class<?> parserClass;
-
-    Platform(String name, String domain, Class<?> parserClass) {
-        this.name = name;
-        this.domain = domain;
-        this.parserClass = parserClass;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getDomain() {
-        return domain == null ? "" : domain;
-    }
-
-    public Class<?> getParserClass() {
-        return parserClass;
-    }
-}

+ 0 - 17
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/enums/MediaType.java

@@ -1,17 +0,0 @@
-package cc.xiaokuihua.analysis.parse.enums;
-
-public enum MediaType {
-
-    VIDEO("视频"),
-    IMAGE("图片");
-
-    public final String name;
-
-    MediaType(String name) {
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-}

+ 0 - 103
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/AcFunParser.java

@@ -1,103 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * AcFun解析器
- * ==============================================================
- * User-Agent PC
- * 1. 分享链接获取html内容
- * 2. 获取html里的数据json(正则)
- * 3. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> title
- * 封面 -> coverUrl
- * 视频 -> currentVideoInfo -> ksPlayJson(JSON String) -> adaptationSet[0] -> representation(Array) =>
- * (url, qualityLabel, width, height)
- * ==============================================================
- */
-@Component
-public class AcFunParser implements BareParser {
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("AcFun");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 获取html内容
-        String html = Jsoup
-                .connect(url)
-                .userAgent(UserAgentUtil.getPC())
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        // 获取json数据
-        String jsonStr = regexJson(html);
-        JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
-
-        // 标题、封面
-        result.setTitle(jsonObject.getStr("title"))
-                .setCover(new BareResult.Image(jsonObject.getStr("coverUrl")));
-
-        String playJson = jsonObject
-                .getJSONObject("currentVideoInfo")
-                .getStr("ksPlayJson");
-        JSONArray videoInfoList = JSONUtil.parseObj(playJson)
-                .getJSONArray("adaptationSet")
-                .getJSONObject(0)
-                .getJSONArray("representation");
-
-        // 视频信息
-        for (int i = 0; i < videoInfoList.size(); i++) {
-            JSONObject item = videoInfoList.getJSONObject(i);
-            videos.add(new BareResult.Video(
-                    item.getStr("url"),
-                    item.getStr("qualityLabel"),
-                    item.getInt("width"),
-                    item.getInt("height")
-            ));
-        }
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 正则获取数据json
-     *
-     * @param html 网页内容
-     */
-    public static String regexJson(String html) {
-        // 匹配网址
-        String regex = "window.videoInfo\\s=\\s(.*?);";
-        Pattern p = Pattern.compile(regex);
-        Matcher m = p.matcher(html);
-        if (m.find()) {
-            return html.substring(m.start(), m.end())
-                    .replace("window.videoInfo = ", "")
-                    .replace(";", "");
-        }
-        return "";
-    }
-}

+ 0 - 107
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/BeforeParser.java

@@ -1,107 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Before避风解析器
- * ==============================================================
- * User-Agent PC
- * 1. 获取分享链接ID(路径形式)
- * 2. 请求接口获取数据json
- * 3. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> data -> title
- * 封面 -> data -> cover[0](Object) -> (url, width, height)
- * 视频 -> data -> mediaInfoList[0] -> videoInfo -> manifest(Json String) -> adaptationSet[0] ->
- * representation(Array) => (url, qualityLabel, width, height)
- * ==============================================================
- */
-@Component
-public class BeforeParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://hlg.xiatou.com/h5/feed/detail?id=";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("Before避风");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 获取视频信息
-        String jsonStr = Jsoup
-                .connect(API + getItemId(url))
-                .userAgent(UserAgentUtil.getPC())
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject data = JSONUtil.parseObj(jsonStr)
-                .getJSONArray("data")
-                .getJSONObject(0);
-
-        JSONObject coverInfo = data.getJSONArray("cover").getJSONObject(0);
-        // 标题、封面
-        result.setTitle(data.getStr("title"))
-                .setCover(new BareResult.Image(
-                        coverInfo.getStr("url"),
-                        coverInfo.getInt("width"),
-                        coverInfo.getInt("height")
-                ));
-
-        String videoInfo = data
-                .getJSONArray("mediaInfoList")
-                .getJSONObject(0)
-                .getJSONObject("videoInfo")
-                .getStr("manifest");
-
-        JSONArray videoInfoList = JSONUtil.parseObj(videoInfo)
-                .getJSONArray("adaptationSet")
-                .getJSONObject(0)
-                .getJSONArray("representation");
-
-        // 视频信息
-        for (int i = 0; i < videoInfoList.size(); i++) {
-            JSONObject item = videoInfoList.getJSONObject(i);
-            videos.add(new BareResult.Video(
-                    item.getStr("url"),
-                    item.getStr("qualityLabel"),
-                    item.getInt("width"),
-                    item.getInt("height")
-            ));
-        }
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 获取分享视频id
-     *
-     * @param url 分享链接
-     */
-    public String getItemId(String url) {
-        int start = url.indexOf("/detail/") + "/detail/".length();
-        int end = url.lastIndexOf("?");
-        return url.substring(start, end);
-    }
-}

+ 0 - 79
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/DouPaiParser.java

@@ -1,79 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.analysis.utils.StringUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Connection;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 逗拍解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取分享链接ID(参数形式)
- * 2. 请求接口获取数据json
- * 3. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> data -> name
- * 封面 -> data -> imageUrl
- * 视频 -> data => (videoUrl, null, width, height)
- * ==============================================================
- */
-@Component
-public class DouPaiParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://v2.doupai.cc/v3/template/topic/";
-
-    /**
-     * 方法描述:短视频解析
-     *
-     * @param url 链接地址
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("逗拍");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-        Map<String, List<String>> queryParams = StringUtil.getQueryParams(url);
-        String jsonStr = Jsoup
-                .connect(API + queryParams.get("id").get(0))
-                .referrer("https://p.doupai.cc/")
-                .userAgent(UserAgentUtil.getOne())
-                .method(Connection.Method.GET)
-                .ignoreContentType(true)
-                .execute()
-                .body();
-        JSONObject data = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("data");
-
-        // 标题、封面
-        result.setTitle(data.getStr("name"))
-                .setCover(new BareResult.Image(data.getStr("imageUrl")));
-
-        // 视频信息
-        videos.add(new BareResult.Video(
-                data.getStr("videoUrl"),
-                null,
-                data.getInt("width"),
-                data.getInt("height")
-        ));
-
-        return result;
-    }
-}

+ 0 - 120
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/DouYinParser.java

@@ -1,120 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UrlUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONNull;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 抖音解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取重定向地址
- * 2. 获取分享链接ID(路径形式)
- * 3. 请求接口获取数据json
- * 4. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> item_list[0] -> desc
- * 封面 -> item_list[0] -> video -> cover -> url_list[0]
- * 视频 -> item_list[0] -> video => ( -> play_addr -> url_list[0], radio, width, height)
- * --------------------------------------------------------------
- * 图片 -> item_list[0] -> images => (url_list[0], null, null)
- * ==============================================================
- */
-@Component
-public class DouYinParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=";
-
-    /**
-     * 方法描述: 获取无水印资源信息
-     *
-     * @param url 复制的链接
-     * @return 无水印资源信息
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult();
-        result.setSource("抖音");
-        List<BareResult.Video> videos = new ArrayList<>();
-        List<BareResult.Image> images = new ArrayList<>();
-
-        String userAgent = UserAgentUtil.getOne();
-        // 获取分享资源信息
-        String jsonStr = Jsoup
-                .connect(API + getItemId(UrlUtil.getRealUrl(userAgent, url)))
-                .userAgent(userAgent)
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        // 解析无水印资源
-        JSONObject itemFirst = JSONUtil.parseObj(jsonStr)
-                .getJSONArray("item_list")
-                .getJSONObject(0);
-
-        // 标题、封面
-        result.setTitle(itemFirst.getStr("desc"))
-                .setCover(new BareResult.Image(itemFirst.getJSONObject("video")
-                        .getJSONObject("cover")
-                        .getJSONArray("url_list")
-                        .getStr(0)));
-
-        if (!JSONNull.NULL.equals(itemFirst.get("images"))) {
-
-            result.setType(MediaType.IMAGE);
-            result.setImages(images);
-
-            JSONArray imageJSONArray = itemFirst.getJSONArray("images");
-            for (int i = 0; i < imageJSONArray.size(); i++) {
-                images.add(new BareResult.Image(
-                        imageJSONArray.getJSONObject(i).getJSONArray("url_list").getStr(0),
-                        imageJSONArray.getJSONObject(i).getInt("width"),
-                        imageJSONArray.getJSONObject(i).getInt("height")
-                ));
-            }
-        } else {
-            JSONObject videoObject = itemFirst.getJSONObject("video");
-
-            result.setType(MediaType.VIDEO);
-            result.setVideos(videos);
-
-            // 视频信息
-            videos.add(new BareResult.Video(
-                    videoObject.getJSONObject("play_addr").getJSONArray("url_list").getStr(0).replace("playwm", "play"),
-                    videoObject.getStr("radio"),
-                    videoObject.getInt("width"),
-                    videoObject.getInt("height")
-            ));
-        }
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 获取分享视频id
-     *
-     * @param url 分享链接
-     */
-    public String getItemId(String url) {
-        int start = url.indexOf("/video/") + "/video/".length();
-        int end = url.lastIndexOf("/");
-        return url.substring(start, end);
-    }
-}

+ 0 - 102
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/DuXiaoShiParser.java

@@ -1,102 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.analysis.utils.StringUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.core.util.URLUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Connection;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 度小视解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取分享链接ID(参数形式)
- * 2. 请求接口获取数据json
- * 3. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> data -> meta -> title
- * 封面 -> data -> meta -> image
- * 视频 -> data -> meta -> video_info -> clarityUrl(Array) => (url, title, width, height)
- * ==============================================================
- */
-@Component
-public class DuXiaoShiParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://xspshare.baidu.com/wise/growth/api/sv/immerse?";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("度小视");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        Map<String, List<String>> queryParams = StringUtil.getQueryParams(url);
-
-        Map<String, String> paramMap = new HashMap<>();
-        paramMap.put("source", queryParams.get("source").get(0));
-        paramMap.put("pd", queryParams.get("pd").get(0));
-        paramMap.put("vid", queryParams.get("vid").get(0));
-        paramMap.put("shareTime", queryParams.get("shareTime").get(0));
-        paramMap.put("shareid", queryParams.get("shareid").get(0));
-        paramMap.put("shared_cuid", queryParams.get("shared_cuid").get(0));
-        paramMap.put("shared_uid", queryParams.get("shared_uid").get(0));
-        paramMap.put("_format", "json");
-        String paramStr = URLUtil.buildQuery(paramMap, StandardCharsets.UTF_8).toString();
-
-        String jsonStr = Jsoup
-                .connect(API + paramStr)
-                .userAgent(UserAgentUtil.getOne())
-                .referrer(url)
-                .method(Connection.Method.GET)
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject metaObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("data")
-                .getJSONObject("meta");
-
-        // 标题、封面
-        result.setTitle(metaObject.getStr("title"))
-                .setCover(new BareResult.Image(metaObject.getStr("image")));
-
-        JSONArray videoInfoList = metaObject.getJSONObject("video_info")
-                .getJSONArray("clarityUrl");
-
-        // 视频信息
-        for (int i = 0; i < videoInfoList.size(); i++) {
-            JSONObject item = videoInfoList.getJSONObject(i);
-            videos.add(new BareResult.Video(
-                    item.getStr("url"),
-                    item.getStr("title"),
-                    item.getInt("width"),
-                    item.getInt("height")
-            ));
-        }
-
-        return result;
-    }
-}

+ 0 - 88
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/HaoKanParser.java

@@ -1,88 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * 好看解析器
- */
-@Component
-public class HaoKanParser implements BareParser {
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("好看");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 获取html内容
-        String html = Jsoup
-                .connect(url)
-                .userAgent(UserAgentUtil.getPC())
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        // 获取json数据
-        String jsonStr = regexJson(html);
-        JSONObject videoObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("curVideoMeta");
-
-        // 标题、封面
-        result.setTitle(videoObject.getStr("title"))
-                .setCover(new BareResult.Image(videoObject.getStr("poster")));
-
-        JSONArray videoInfoList = videoObject.getJSONArray("clarityUrl");
-
-        // 视频信息
-        for (int i = 0; i < videoInfoList.size(); i++) {
-            JSONObject item = videoInfoList.getJSONObject(i);
-            String vodVideoHW = item.getStr("vodVideoHW");
-            videos.add(new BareResult.Video(
-                    item.getStr("url"),
-                    item.getStr("title"),
-                    Integer.parseInt(vodVideoHW.split("\\$\\$")[0]),
-                    Integer.parseInt(vodVideoHW.split("\\$\\$")[1])
-            ));
-        }
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 正则获取数据json
-     *
-     * @param html 网页内容
-     */
-    public static String regexJson(String html) {
-        // 匹配网址
-        String regex = "window.__PRELOADED_STATE__\\s=\\s\\{(.*?)\\};";
-        Pattern p = Pattern.compile(regex);
-        Matcher m = p.matcher(html);
-        if (m.find()) {
-            return html.substring(m.start(), m.end())
-                    .replace("window.__PRELOADED_STATE__ = ", "")
-                    .replace(";", "");
-        }
-        return "";
-    }
-}

+ 0 - 86
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/HuYaParser.java

@@ -1,86 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 虎牙解析器
- */
-@Component
-public class HuYaParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://liveapi.huya.com/moment/getMomentContent?videoId=";
-
-    /**
-     * 方法描述:短视频解析
-     *
-     * @param url 链接地址
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("虎牙");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 获取jsonStr
-        String jsonStr = Jsoup
-                .connect(API + getId(url))
-                .userAgent(UserAgentUtil.getOne())
-                .referrer("https://v.huya.com/")
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject videoInfoObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("data")
-                .getJSONObject("moment")
-                .getJSONObject("videoInfo");
-
-        // 标题、封面
-        result.setTitle(videoInfoObject.getStr("videoTitle"))
-                .setCover(new BareResult.Image(videoInfoObject.getStr("videoCover")));
-
-        JSONArray videoInfoList = videoInfoObject.getJSONArray("definitions");
-
-        // 视频信息
-        for (int i = 0; i < videoInfoList.size(); i++) {
-            JSONObject item = videoInfoList.getJSONObject(i);
-            videos.add(new BareResult.Video(
-                    item.getStr("url"),
-                    item.getStr("defName"),
-                    item.getInt("width"),
-                    item.getInt("height")
-            ));
-        }
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 获取分享视频id
-     *
-     * @param url 分享链接
-     */
-    public String getId(String url) {
-        int start = url.indexOf("/fans/") + "/fans/".length();
-        int end = url.lastIndexOf("?");
-        return url.substring(start, end).replace(".html", "");
-    }
-}

+ 0 - 93
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/HuoShanParser.java

@@ -1,93 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.analysis.utils.StringUtil;
-import cc.xiaokuihua.util.analysis.UrlUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 抖音火山版解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取重定向地址
- * 2. 获取分享链接ID(参数形式)
- * 3. 请求接口获取数据json
- * 4. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> null
- * 封面 -> data -> item_info -> cover
- * 视频 -> data -> item_info -> url
- * ==============================================================
- */
-@Component
-public class HuoShanParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://share.huoshan.com/api/item/info?item_id=";
-
-    /**
-     * 无水印视频地址
-     */
-    private static final String BASE_VIDEO_URL = "https://api-hl.huoshan.com/hotsoon/item/video/_playback/?video_id=";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("抖音火山版");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        String userAgent = UserAgentUtil.getOne();
-        // 获取重定向地址
-        String realUrl = UrlUtil.getRealUrl(userAgent, url);
-
-        // 获取URL参数
-        Map<String, List<String>> queryParams = StringUtil.getQueryParams(realUrl);
-
-        // 获取分享资源信息
-        String jsonStr = Jsoup
-                .connect(API + queryParams.get("item_id").get(0))
-                .userAgent(userAgent)
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject itemInfoObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("data")
-                .getJSONObject("item_info");
-
-        // 封面
-        result.setCover(new BareResult.Image(itemInfoObject.getStr("cover")));
-
-
-        // 解析出有水印的视频
-        String videoWmUrl = itemInfoObject.getStr("url");
-
-        BareResult.Video videoResult = new BareResult.Video(
-                BASE_VIDEO_URL + StringUtil.getQueryParams(videoWmUrl).get("video_id").get(0),
-                null,
-                null,
-                null);
-        videos.add(videoResult);
-
-        return result;
-    }
-}

+ 0 - 87
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/KaiYanParser.java

@@ -1,87 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.analysis.utils.StringUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Connection;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 开眼解析器
- */
-@Component
-public class KaiYanParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://proxy.eyepetizer.net/v1/content/item/get_item_detail_v2";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("开眼");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        Map<String, List<String>> queryParams = StringUtil.getQueryParams(url);
-
-        // 视频ID
-        String videoId = queryParams.get("video_id").get(0);
-
-        Map<String, String> headerMap = new HashMap<>();
-        headerMap.put("Content-type", "application/x-www-form-urlencoded");
-        headerMap.put("x-thefair-appid", "xfpa44crf2p70lk8");
-        headerMap.put("x-thefair-auth", "8JHDGTy9mkeGg5gvxhnm3du60+I38zKvNabkkwANNr0PS97YgbP3GJwStiBZgQ1Z4TDA8iR9fnPbHN1Rxp7QTOMPU0YBcbKs8F6+TxdtwjKLAa6JJMfAZDP6DZHuSPi1S8qMW739zFedR4aQOa5/QDkKzDOskQB0n+Ur91pNYshFGh7K9bqKzeRYpXPbIEG74G0Lfysha6htUyJ8EW6v++Jt2nNMUIuc6Diea0pCauTXfXy/uQkEmEegQwq/5g7X");
-        headerMap.put("x-thefair-cid", "44c6312e40444a5e5e5a726db4e6a542");
-        headerMap.put("x-thefair-forward-host", "https://api.eyepetizer.net");
-        headerMap.put("x-thefair-ua", "EYEPETIZER_UNIAPP_H5/100000 (android;android;OS_VERSION_UNKNOWN;zh-Hans-CN;h5;1.0.0;cn-bj;SOURCE_UNKNOWN;44c6312e40444a5e5e5a726db4e6a542;1920*1080;NETWORK_UNKNOWN) native/1.0");
-
-        // 获取分享资源信息
-        String jsonStr = Jsoup
-                .connect(API)
-                .method(Connection.Method.POST)
-                .headers(headerMap)
-                .userAgent(UserAgentUtil.getOne())
-                .referrer("https://m.eyepetizer.net/")
-                .data("resource_type", "pgc_video")
-                .data("resource_id", videoId)
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject videoObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("result")
-                .getJSONObject("video");
-
-        JSONObject coverObject = videoObject.getJSONObject("cover");
-
-
-        // 标题、封面
-        result.setTitle(videoObject.getStr("title"))
-                .setCover(new BareResult.Image(
-                        coverObject.getStr("url"),
-                        coverObject.getJSONObject("img_info").getInt("width"),
-                        coverObject.getJSONObject("img_info").getInt("height")));
-
-        videos.add(new BareResult.Video(videoObject.getStr("play_url"), null, null, null));
-
-        return result;
-    }
-}

+ 0 - 85
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/KuaiShouParser.java

@@ -1,85 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * 快手解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取html内容
- * 4. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> null
- * 封面 -> data -> item_info -> cover
- * 视频 -> data -> item_info -> url
- * ==============================================================
- */
-@Component
-public class KuaiShouParser implements BareParser {
-
-    /**
-     * 方法描述:短视频解析
-     *
-     * @param url 链接地址
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-        Document document = Jsoup
-                .connect(url)
-                .userAgent(UserAgentUtil.getOne())
-                .get();
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("快手");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 封面
-        String cover = regexCoverUrl(document.getElementsByClass("poster-content").attr("style"));
-
-        Element videoElement = document.getElementsByTag("video").get(0);
-        // 标题
-        String title = videoElement.attr("alt");
-
-        // 视频
-        String videoUrl = videoElement.attr("src");
-
-        result.setTitle(title)
-                .setCover(new BareResult.Image(cover))
-                .getVideos().add(new BareResult.Video(videoUrl, null, null, null));
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 正则获取封面图
-     *
-     * @param style 网页内容
-     */
-    public static String regexCoverUrl(String style) {
-        // 匹配网址
-        String regex = "background-image:url\\((.*?)\\);";
-        Pattern p = Pattern.compile(regex);
-        Matcher m = p.matcher(style);
-        if (m.find()) {
-            return style.substring(m.start(), m.end())
-                    .replace("background-image:url(", "")
-                    .replace(");", "");
-        }
-        return "";
-    }
-}

+ 0 - 88
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/LiShiPinParser.java

@@ -1,88 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UrlUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.core.util.RandomUtil;
-import cn.hutool.core.util.URLUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 梨视频解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取重定向定制
- * 1. 获取分享链接ID(路径形式)
- * 2. 请求接口获取数据json
- * 5. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> null
- * 封面 -> data -> videoInfo => (video_image, null, null)
- * 视频 -> data -> videoInfo -> videos => (srcUrl, null, null, null)
- * ==============================================================
- */
-@Component
-public class LiShiPinParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://www.pearvideo.com/videoStatus.jsp";
-
-    /**
-     * 方法描述: 获取无水印资源信息
-     *
-     * @param url 复制的链接
-     * @return 无水印资源信息
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("梨视频");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        String userAgent = UserAgentUtil.getOne();
-        String realUrl = UrlUtil.getRealUrl(userAgent, url);
-        String[] split = realUrl.split("\\?")[0].split("/");
-
-        Map<String, String> paramMap = new HashMap<>();
-        paramMap.put("contId", split[split.length - 1].split("_")[1]);
-        paramMap.put("mrd", String.valueOf(RandomUtil.randomDouble()));
-        String paramStr = URLUtil.buildQuery(paramMap, StandardCharsets.UTF_8);
-
-        // 获取分享资源信息
-        String jsonStr = Jsoup
-                .connect(API + "?" + paramStr)
-                .userAgent(userAgent)
-                .header("Referer", url)
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        // 解析无水印资源
-        JSONObject videoInfoObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("videoInfo");
-
-        // 封面
-        result.setCover(new BareResult.Image(videoInfoObject.getStr("video_image")));
-
-        videos.add(new BareResult.Video(videoInfoObject.getJSONObject("videos").getStr("srcUrl")));
-
-        return result;
-    }
-}

+ 0 - 83
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/LvZhouParser.java

@@ -1,83 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * 绿洲解析器
- */
-@Component
-public class LvZhouParser implements BareParser {
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("绿洲");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 获取网页信息
-        Document document = Jsoup
-                .connect(url)
-                .userAgent(UserAgentUtil.getOne())
-                .get();
-
-        // 标题
-        String title = document.getElementsByClass("content btn-status").get(0).getElementsByClass("title").get(0).text();
-
-        Element videoContainerElement = document.getElementsByClass("video-container").get(0);
-
-        // 封面
-        String cover = regexCoverUrl(videoContainerElement.getElementsByClass("finish-wrap").get(0).attr("style"));
-
-        // 视频标签
-        Element videoElement = videoContainerElement.getElementsByTag("video").get(0);
-
-        // 视频
-        String videoUrl = videoElement.attr("src").replace("&amp;", "");
-
-        // 标题、封面
-        result.setTitle(title)
-                .setCover(new BareResult.Image(cover));
-
-        // 视频
-        videos.add(new BareResult.Video(videoUrl));
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 正则获取封面图
-     *
-     * @param style 网页内容
-     */
-    public static String regexCoverUrl(String style) {
-        // 匹配网址
-        String regex = "background-image:url\\((.*?)\\)";
-        Pattern p = Pattern.compile(regex);
-        Matcher m = p.matcher(style);
-        if (m.find()) {
-            return style.substring(m.start(), m.end())
-                    .replace("background-image:url(", "")
-                    .replace(")", "");
-        }
-        return "";
-    }
-}

+ 0 - 119
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/MeiPaiParser.java

@@ -1,119 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.core.codec.Base64;
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.lang.Pair;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * 美拍解析器
- */
-@Component
-public class MeiPaiParser implements BareParser {
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("美拍");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 获取分享资源信息
-        String html = Jsoup
-                .connect(url)
-                .userAgent(UserAgentUtil.getOne())
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        String jsonStr = regexJson(html);
-
-        JSONObject mediaInfoObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("mediaInfo");
-
-        // 标题、封面
-        result.setTitle(mediaInfoObject.getStr("caption_origin"))
-                .setCover(new BareResult.Image(mediaInfoObject.getStr("cover_pic")));
-
-        // 视频
-        videos.add(new BareResult.Video("http:" + decode(mediaInfoObject.getStr("video"))));
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 正则获取数据json
-     *
-     * @param html 网页内容
-     */
-    public static String regexJson(String html) {
-        // 匹配网址
-        String regex = "<script>window.PHPDATA\\s=\\s(.*?)</script>";
-        Pattern p = Pattern.compile(regex);
-        Matcher m = p.matcher(html);
-        if (m.find()) {
-            return html.substring(m.start(), m.end())
-                    .replace("<script>window.PHPDATA = ", "")
-                    .replace("</script>", "");
-        }
-        return "";
-    }
-
-    public Pair<String, String> getHex(String text) {
-        List<String> reverse = CollectionUtil.reverse(Arrays.asList(text.substring(0, 4).split("")));
-        StringBuilder str = new StringBuilder();
-        for (String s : reverse) {
-            str.append(s);
-        }
-        return new Pair<>(text.substring(4), str.toString());
-    }
-
-    public Pair<String[], String[]> getDec(String t) {
-        String e = String.valueOf(Integer.parseInt(t, 16));
-        String[] pre = e.substring(0, 2).split("");
-        String[] tail = e.substring(2).split("");
-        return new Pair<>(pre, tail);
-    }
-
-    public String substr(String t, String[] e) {
-        String i = t.substring(0, Integer.parseInt(e[0]));
-        String a = t.substring(Integer.parseInt(e[0]), Integer.parseInt(e[0]) + Integer.parseInt(e[1]));
-        return i + t.substring(Integer.parseInt(e[0])).replace(a, "");
-    }
-
-    public String[] getPos(String t, String[] e) {
-        e[0] = String.valueOf(t.length() - Integer.parseInt(e[0]) - Integer.parseInt(e[1]));
-        return e;
-    }
-
-    /**
-     * 视频地址解码
-     *
-     * @param t 接口请求到的地址
-     */
-    public String decode(String t) {
-        Pair<String, String> e = this.getHex(t);
-        Pair<String[], String[]> i = this.getDec(e.getValue());
-        String a = this.substr(e.getKey(), i.getKey());
-        return Base64.decodeStr(this.substr(a, this.getPos(a, i.getValue())));
-    }
-}

+ 0 - 189
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/MiaoPaiParser.java

@@ -1,189 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.analysis.utils.AESUtil;
-import cc.xiaokuihua.analysis.utils.SysConvert;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.crypto.SecureUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.apache.tomcat.util.codec.binary.Base64;
-import org.jsoup.Connection;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import javax.crypto.Cipher;
-import java.nio.charset.StandardCharsets;
-import java.security.KeyFactory;
-import java.security.interfaces.RSAPublicKey;
-import java.security.spec.X509EncodedKeySpec;
-import java.util.*;
-
-/**
- * 秒拍解析器
- */
-@Component
-public class MiaoPaiParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://v5-api.miaopai.com/media/media/info";
-
-    /**
-     * 方法描述: 获取无水印资源信息
-     *
-     * @param url 复制的链接
-     * @return 无水印资源信息
-     */
-    @Override
-    public BareResult parse(String url) throws Exception {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("秒拍");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        String[] split = url.split("/");
-        String smId = split[split.length - 1];
-
-        Map<String, String> headerMap = createHeaders(smId);
-
-        // 获取分享资源信息
-        String jsonStr = Jsoup
-                .connect(API)
-                .method(Connection.Method.POST)
-                .data("smId", smId)
-                .headers(headerMap)
-                .userAgent(UserAgentUtil.getOne())
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject dataObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("data");
-
-        String title = dataObject.getJSONObject("basic")
-                .getStr("title");
-        JSONObject coverObject = dataObject.getJSONObject("cover")
-                .getJSONObject("b");
-
-        // 标题、封面
-        result.setTitle(title)
-                .setCover(new BareResult.Image(
-                        coverObject.getStr("url"),
-                        coverObject.getInt("width"),
-                        coverObject.getInt("height")
-                ));
-
-        JSONObject videoObject = dataObject.getJSONObject("video")
-                .getJSONArray("playUrl")
-                .getJSONObject(0);
-
-        // 视频
-        videos.add(new BareResult.Video(
-                videoObject.getStr("playUrl"),
-                null,
-                videoObject.getInt("width"),
-                videoObject.getInt("height")
-        ));
-
-        return result;
-    }
-
-    public Map<String, String> createHeaders(String smId) throws Exception {
-        String randomStr = this.getRandomStr();
-        Long timeStamp = this.getTimeStamp();
-        String rv = "1.0.0";
-        String ak = getAk(timeStamp, randomStr);
-        String ti = getTi(timeStamp, randomStr);
-        String pk = "com.yixia.videoeditor";
-        String si = getSi(ak);
-        String t = "{\"did\":\"80D57A2A73AA45888331D614B0E3652B\",\"dname\":\"Chrome 90.0.4430.93 WebKit 537.36 Windows NT 10.0 \",\"os\":\"web\"}";
-        String sk = getSk(smId, rv, timeStamp, pk, ti, t, ak);
-        String p = getP(t, ak);
-
-        Map<String, String> map = new HashMap<>();
-        map.put("Referer", "https://n.miaopai.com/");
-        map.put("Content-Type", "application/x-www-form-urlencoded");
-        map.put("p", p);
-        map.put("pk", pk);
-        map.put("rt", String.valueOf(timeStamp));
-        map.put("rv", rv);
-        map.put("si", si);
-        map.put("sk", sk);
-        map.put("ti", ti);
-
-        return map;
-    }
-
-    /**
-     * 时间戳
-     */
-    public Long getTimeStamp() {
-        return new Date().getTime();
-    }
-
-    /**
-     * 随机数(6位)
-     */
-    public String getRandomStr() {
-        String randomLongStr = SysConvert.getInstance().Convert(10, 36, String.valueOf(Math.random()), 18);
-        return randomLongStr.substring(randomLongStr.length() - 6);
-    }
-
-    /**
-     * ak
-     */
-    public String getAk(Long timeStamp, String randomStr) {
-        return SecureUtil.md5(timeStamp + randomStr).substring(16);
-    }
-
-    /**
-     * ti
-     */
-    public String getTi(Long timeStamp, String randomStr) {
-        return SecureUtil.md5(timeStamp + randomStr);
-    }
-
-    /**
-     * si
-     */
-    public String getSi(String ak) throws Exception {
-        String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvuIXFVCmesMB9dBaPzuj4R+5VAtDzK+KK+jfFtBTcynKD1JD4YMgPWJAQhR5pGh/a2DIGlCWk77ZqmcCv69jFoi9fFKimWMP2vQ1FK0NiVYDVa7h/AUh8wGjo9pVKjw1qTcp+lrAsfNzdttWlxZiJtST/H6gMii6lUj9YHufLhXovsqwKe4DcWondCiGV0xYaUC22aKELO9dhjv40wwDuAvp7aQ5Ky0fUI+DaZo9xAO9mZlr834RPgrk135TkXMmHM6cMiy8Fx3dtLcPpMqexLcEy1n/hRWkvBbGvInc9xKw6ARbsW1rQt2ExZYswKJrciz3oA38YfuR+Z8HWUzNtQIDAQAB";
-        return encrypt(ak, publicKey);
-    }
-
-    /**
-     * sk
-     */
-    public String getSk(String smId, String rv, Long timeStamp, String pk, String ti, String t, String ak) {
-        String s = SecureUtil.md5(smId);
-        String l = SecureUtil.md5(rv + timeStamp + pk + ti + t);
-        return SecureUtil.md5(l + s + ak);
-    }
-
-    public String getP(String e, String ak) {
-        AESUtil aesUtil = new AESUtil(ak);
-        return aesUtil.encrypt(e);
-    }
-
-    /**
-     * RSA公钥加密
-     *
-     * @param str       加密字符串
-     * @param publicKey 公钥
-     * @return 密文
-     * @throws Exception 加密过程中的异常信息
-     */
-    public String encrypt(String str, String publicKey) throws Exception {
-        byte[] decoded = Base64.decodeBase64(publicKey);
-        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
-        Cipher cipher = Cipher.getInstance("RSA");
-        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
-        return Base64.encodeBase64String(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));
-    }
-}

+ 0 - 77
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/MoMoParser.java

@@ -1,77 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Connection;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 陌陌解析器
- */
-@Component
-public class MoMoParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://m.immomo.com/inc/microvideo/share/profiles";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("陌陌");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 获取Json
-        String jsonStr = Jsoup
-                .connect(API)
-                .method(Connection.Method.POST)
-                .header("Content-Type", "application/x-www-form-urlencoded")
-                .data("feedids", getId(url))
-                .userAgent(UserAgentUtil.getOne())
-                .referrer(url.split("\\?")[0])
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject dataObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("data")
-                .getJSONArray("list")
-                .getJSONObject(0);
-
-        // 标题、封面
-        result.setTitle(dataObject.getStr("content"))
-                .setCover(new BareResult.Image(dataObject.getJSONObject("video").getStr("cover_play")));
-
-        // 视频
-        videos.add(new BareResult.Video(dataObject.getJSONObject("video").getStr("video_url")));
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 获取分享视频id
-     *
-     * @param url 分享链接
-     */
-    public String getId(String url) {
-        int start = url.indexOf("/new-share-v2/") + "/new-share-v2/".length();
-        int end = url.lastIndexOf("?");
-        return url.substring(start, end).replace(".html", "");
-    }
-}

+ 0 - 88
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/PiPiGaoXiaoParser.java

@@ -1,88 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.analysis.utils.StringUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.http.HttpUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.springframework.stereotype.Component;
-
-import java.util.*;
-
-/**
- * 皮皮搞笑解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取分享链接ID(参数形式)
- * 2. 请求接口获取数据json
- * 5. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> data -> post -> content
- * 封面 -> data -> post -> imgs[0] -> id => ('https://file.ippzone.com/img/view/id/' + id, null, null)
- * 视频 -> data -> post -> videos -> thumb(Var) => (url, null, null, null)
- * ==============================================================
- */
-@Component
-public class PiPiGaoXiaoParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://h5.pipigx.com/ppapi/share/fetch_content";
-
-    /**
-     * 方法描述:短视频解析
-     *
-     * @param url 链接地址
-     */
-    @Override
-    public BareResult parse(String url) {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("皮皮搞笑");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 获取URL参数
-        Map<String, List<String>> queryParams = StringUtil.getQueryParams(url);
-
-        Map<String, Object> map = new HashMap<>();
-        map.put("mid", Long.parseLong(queryParams.get("mid").get(0)));
-        map.put("pid", Long.parseLong(queryParams.get("pid").get(0)));
-        map.put("type", "post");
-
-        // 获取分享资源信息
-        String jsonStr = HttpUtil.createPost(API)
-                .header("User-Agent", UserAgentUtil.getOne())
-                .body(JSONUtil.toJsonStr(map))
-                .execute()
-                .body();
-
-        JSONObject postObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("data")
-                .getJSONObject("post");
-
-        JSONObject videosObject = postObject.getJSONObject("videos");
-
-        Set<String> set = videosObject.keySet();
-        String thumb = null;
-        for (String item : set) {
-            thumb = item;
-        }
-        JSONObject thumbObject = videosObject.getJSONObject(thumb);
-
-        // 标题、封面
-        result.setTitle(postObject.getStr("content"))
-                .setCover(new BareResult.Image("https://file.ippzone.com/img/view/id/" +
-                        postObject.getJSONArray("imgs").getJSONObject(0).getStr("id")));
-
-        // 视频信息
-        videos.add(new BareResult.Video(thumbObject.getStr("url")));
-
-        return result;
-    }
-}

+ 0 - 98
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/PiPiXiaParser.java

@@ -1,98 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UrlUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 皮皮虾解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取重定向地址
- * 1. 获取分享链接ID(路径形式)
- * 2. 请求接口获取数据json
- * 5. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> data -> data -> item -> content
- * 封面 -> data -> data -> item -> origin_video_download -> cover_image => (url_list[0].url, width, height)
- * 视频 -> data -> data -> item -> origin_video_download => (url_list[0].url, null, width, height)
- * ==============================================================
- */
-@Component
-public class PiPiXiaParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://is.snssdk.com/bds/cell/detail/?cell_type=1&aid=1319&app_name=super&cell_id=";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("皮皮虾");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        String userAgent = UserAgentUtil.getOne();
-        // 获取分享资源信息
-        String jsonStr = Jsoup
-                .connect(API + getItemId(UrlUtil.getRealUrl(userAgent, url)))
-                .userAgent(userAgent)
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        // 解析无水印资源
-        JSONObject itemObject = JSONUtil
-                .parseObj(jsonStr)
-                .getJSONObject("data")
-                .getJSONObject("data")
-                .getJSONObject("item");
-
-        JSONObject videoObject = itemObject
-                .getJSONObject("origin_video_download");
-
-        JSONObject coverObject = videoObject.getJSONObject("cover_image");
-
-        // 标题、封面
-        result.setTitle(itemObject.getStr("content"))
-                .setCover(new BareResult.Image(
-                        coverObject.getJSONArray("url_list").getJSONObject(0).getStr("url"),
-                        coverObject.getInt("width"),
-                        coverObject.getInt("height")));
-
-        videos.add(new BareResult.Video(
-                videoObject.getJSONArray("url_list").getJSONObject(0).getStr("url"),
-                null,
-                videoObject.getInt("width"),
-                videoObject.getInt("height")));
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 获取分享视频id
-     *
-     * @param url 分享链接
-     */
-    public String getItemId(String url) {
-        int start = url.indexOf("/item/") + "/item/".length();
-        int end = url.lastIndexOf("?");
-        return url.substring(start, end);
-    }
-}

+ 0 - 91
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/QingShiPingParser.java

@@ -1,91 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.analysis.utils.StringUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 轻视频解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取分享链接ID(参数形式)
- * 2. 请求接口获取数据json
- * 5. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> data -> title
- * 封面 -> data => (cover_url, cover_width, cover_height)
- * 视频 -> data -> play -> file_info(Array) => (url, null, null, null)
- * ==============================================================
- */
-@Component
-public class QingShiPingParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://bbq.bilibili.com/bbq/app-bbq/sv/detail?svid=";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("轻视频");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        Map<String, List<String>> queryParams = StringUtil.getQueryParams(url);
-
-        String userAgent = UserAgentUtil.getOne();
-        // 获取分享资源信息
-        String jsonStr = Jsoup
-                .connect(API + queryParams.get("id").get(0))
-                .header("User-Agent", userAgent)
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject dataObject = JSONUtil
-                .parseObj(jsonStr)
-                .getJSONObject("data");
-
-        // 标题、封面
-        result.setTitle(dataObject.getStr("title"))
-                .setCover(new BareResult.Image(
-                        dataObject.getStr("cover_url"),
-                        dataObject.getInt("cover_width"),
-                        dataObject.getInt("cover_height")));
-
-        JSONArray videoInfoList = dataObject
-                .getJSONObject("play")
-                .getJSONArray("file_info");
-
-        // 视频信息
-        for (int i = 0; i < videoInfoList.size(); i++) {
-            JSONObject item = videoInfoList.getJSONObject(i);
-            videos.add(new BareResult.Video(
-                    item.getStr("url"),
-                    null,
-                    null,
-                    null
-            ));
-        }
-
-        return result;
-    }
-}

+ 0 - 89
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/QuanMinKGeParser.java

@@ -1,89 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * 全民K歌解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取html内容
- * 2. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> detail -> content
- * 封面 -> detail -> cover
- * 视频 -> detail => (playurl_video, null, null, null)
- * ==============================================================
- */
-@Component
-public class QuanMinKGeParser implements BareParser {
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("全民K歌");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 获取分享资源信息
-        String html = Jsoup
-                .connect(url)
-                .userAgent(UserAgentUtil.getPC())
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        String jsonStr = filter(html);
-
-        JSONObject detailObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("detail");
-
-        // 标题、封面
-        result.setTitle(detailObject.getStr("content"))
-                .setCover(new BareResult.Image(detailObject.getStr("cover")));
-
-        videos.add(new BareResult.Video(
-                detailObject.getStr("playurl_video"),
-                null,
-                null,
-                null
-        ));
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 过滤网页内容的视频信息
-     *
-     * @param html 网页内容
-     */
-    public static String filter(String html) {
-        // 匹配网址
-        String regex = "window.__DATA__\\s=\\s\\{(.*?)\\};";
-        Pattern p = Pattern.compile(regex);
-        Matcher m = p.matcher(html);
-        if (m.find()) {
-            return html.substring(m.start(), m.end())
-                    .replace("window.__DATA__ = ", "")
-                    .replace(";", "");
-        }
-        return "";
-    }
-}

+ 0 - 62
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/VueVlogParser.java

@@ -1,62 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * VueVlog解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取html内容
- * 5. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> header -> meta(tag) -> property=og:title _> content
- * 封面 -> header -> meta(tag) -> property=og:image _> content
- * 视频 -> header -> meta(tag) => (property=og:video:url _> content, null, property=og:video:width _> content,
- * property=og:video:height _> content)
- * ==============================================================
- */
-@Component
-public class VueVlogParser implements BareParser {
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("VueVlog");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        // 获取分享资源信息
-        Document document = Jsoup
-                .connect(url)
-                .userAgent(UserAgentUtil.getPC())
-                .ignoreContentType(true)
-                .get();
-
-        // 标题、封面
-        result.setTitle(document.getElementsByAttributeValue("property", "og:title").get(0).attr("content"))
-                .setCover(new BareResult.Image(document.getElementsByAttributeValue("property", "og:image").get(0).attr("content")));
-
-        videos.add(new BareResult.Video(
-                document.getElementsByAttributeValue("property", "og:video:url").get(0).attr("content"),
-                null,
-                Integer.parseInt(document.getElementsByAttributeValue("property", "og:video:width").get(0).attr("content")),
-                Integer.parseInt(document.getElementsByAttributeValue("property", "og:video:height").get(0).attr("content"))));
-
-        return result;
-    }
-}

+ 0 - 97
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/WeiBoParser.java

@@ -1,97 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UrlUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.core.util.URLUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 微博解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取重定向地址
- * 2. 获取分享链接ID(路劲形式)
- * 3. 请求接口获取数据json
- * 4. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> null
- * 封面 -> data -> object -> image => (url, width, height)
- * 视频 -> data -> object -> stream => (url, null, width, height)
- * ==============================================================
- */
-@Component
-public class WeiBoParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://video.h5.weibo.cn/s/video/object";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("微博");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        String userAgent = UserAgentUtil.getOne();
-
-        String realUrl = UrlUtil.getRealUrl(userAgent, url);
-
-        String[] split = realUrl.split("/");
-        Map<String, String> paramMap = new HashMap<>();
-        paramMap.put("object_id", split[split.length - 2]);
-        paramMap.put("mid", split[split.length - 1]);
-        String paramStr = URLUtil.buildQuery(paramMap, StandardCharsets.UTF_8);
-
-
-        // 获取分享资源信息
-        String jsonStr = Jsoup
-                .connect(API + "?" + paramStr)
-                .userAgent(userAgent)
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject object = JSONUtil
-                .parseObj(jsonStr)
-                .getJSONObject("data")
-                .getJSONObject("object");
-
-        JSONObject streamObject = object.getJSONObject("stream");
-
-        // 标题、封面
-        result.setTitle(object.getStr("summary"))
-                .setCover(new BareResult.Image(
-                        object.getJSONObject("image").getStr("url"),
-                        object.getJSONObject("image").getInt("width"),
-                        object.getJSONObject("image").getInt("height")
-                ));
-
-        videos.add(new BareResult.Video(
-                streamObject.getStr("url"),
-                null,
-                streamObject.getInt("width"),
-                streamObject.getInt("height")));
-
-        return result;
-    }
-}

+ 0 - 92
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/WeiShiParser.java

@@ -1,92 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.analysis.utils.StringUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Connection;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 微视解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取分享链接ID(参数形式)
- * 2. 请求接口获取数据json
- * 5. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> data -> feeds[0] -> feed_desc
- * 封面 -> data -> feeds[0] -> video_cover -> static_cover => (url, width, height)
- * 视频 -> data -> feeds[0] -> video_url
- * ==============================================================
- */
-@Component
-public class WeiShiParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://h5.weishi.qq.com/webapp/json/weishi/WSH5GetPlayPage";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("微视");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        String feedId = StringUtil.getQueryParams(url).get("id").get(0);
-
-        Map<String, Object> map = new HashMap<>();
-        map.put("feedid", feedId);
-        map.put("recommendtype", 0);
-        map.put("datalvl", "all");
-        map.put("_weishi_mapExt", new Object());
-
-        // 获取分享资源信息
-        String jsonStr = Jsoup
-                .connect(API)
-                .method(Connection.Method.POST)
-                .userAgent(UserAgentUtil.getOne())
-                .referrer("https://isee.weishi.qq.com/")
-                .header("Content-Type", "application/json")
-                .requestBody(JSONUtil.toJsonStr(map))
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject feedObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("data")
-                .getJSONArray("feeds")
-                .getJSONObject(0);
-
-        JSONObject coverObject = feedObject.getJSONObject("video_cover")
-                .getJSONObject("static_cover");
-
-        // 标题、封面
-        result.setTitle(feedObject.getStr("feed_desc"))
-                .setCover(new BareResult.Image(
-                        coverObject.getStr("url"),
-                        coverObject.getInt("width"),
-                        coverObject.getInt("height")));
-
-        videos.add(new BareResult.Video(feedObject.getStr("video_url"), null, null, null));
-
-        return result;
-    }
-}

+ 0 - 116
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/XiGuaParser.java

@@ -1,116 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UrlUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.core.codec.Base64;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 西瓜视频解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取重定向地址
- * 2. 获取分享链接ID(路径形式)
- * 3. 获取html内容
- * 4. 获取数据json
- * 5. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> anyVideo -> gidInformation -> packerData -> video -> title
- * 封面 -> anyVideo -> gidInformation -> packerData -> video -> poster_url
- * 视频 -> anyVideo -> gidInformation -> packerData -> video -> dash -> dynamic_video -> dynamic_video_list =>
- * (main_url, definition, vwidth, vheight)
- * ==============================================================
- */
-@Component
-public class XiGuaParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://www.ixigua.com/";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("西瓜视频");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        String userAgent = UserAgentUtil.getPC();
-
-        String realUrl = UrlUtil.getRealUrl(userAgent, url);
-        String itemId = getItemId(realUrl);
-
-        // 获取分享资源信息
-        Document document = Jsoup
-                .connect(API + itemId)
-                .userAgent(userAgent)
-                .header("cookie", "MONITOR_WEB_ID=7892c49b-296e-4499-8704-e47c1b150c18; ixigua-a-s=1; ttcid=" +
-                        "af99669b6304453480454f150701d5c226; BD_REF=1; __ac_nonce=060d88ff000a75e8d17eb; " +
-                        "__ac_signature=_02B4Z6wo00f01kX9ZpgAAIDAKIBBQUIPYT5F2WIAAPG2ad; " +
-                        "ttwid=1%7CcIsVF_3vqSIk4XErhPB0H2VaTxT0tdsTMRbMjrJOPN8%7C1624806049%7C08ce7dd6f7d20506a41ba0a" +
-                        "331ef96a6505d96731e6ad9f6c8c709f53f227ab1")
-                .ignoreContentType(true)
-                .get();
-
-        String jsonStr = document.getElementById("SSR_HYDRATED_DATA").html()
-                .replace("window._SSR_HYDRATED_DATA=", "")
-                .replace("undefined", "null");
-
-        JSONObject videoObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("anyVideo")
-                .getJSONObject("gidInformation")
-                .getJSONObject("packerData")
-                .getJSONObject("video");
-
-        // 标题、封面
-        result.setTitle(videoObject.getStr("title"))
-                .setCover(new BareResult.Image(videoObject.getStr("poster_url")));
-
-        JSONArray videoInfoList = videoObject.getJSONObject("videoResource")
-                .getJSONObject("dash")
-                .getJSONObject("dynamic_video")
-                .getJSONArray("dynamic_video_list");
-
-        // 视频信息
-        for (int i = 0; i < videoInfoList.size(); i++) {
-            JSONObject item = videoInfoList.getJSONObject(i);
-            videos.add(new BareResult.Video(
-                    Base64.decodeStr(item.getStr("main_url")),
-                    item.getStr("definition"),
-                    item.getInt("vwidth"),
-                    item.getInt("vheight")
-            ));
-        }
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 获取分享视频id
-     *
-     * @param url 分享链接
-     */
-    public String getItemId(String url) {
-        int start = url.indexOf("ixigua.com/") + "ixigua.com/".length();
-        int end = url.lastIndexOf("?");
-        return url.substring(start, end);
-    }
-}

+ 0 - 92
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/XiaoHongShuParser.java

@@ -1,92 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.analysis.utils.StringUtil;
-import cc.xiaokuihua.util.analysis.UrlUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * 小红书解析器
- */
-@Component
-public class XiaoHongShuParser implements BareParser {
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("小红书");
-        List<BareResult.Image> images = new ArrayList<>();
-        result.setImages(images);
-
-        String realUrl = UrlUtil.getRealUrl(UserAgentUtil.getOne(), url);
-        String redirectPath = StringUtil.getQueryParams(realUrl).get("redirectPath").get(0);
-
-        // 获取html内容
-        String html = Jsoup
-                .connect(redirectPath)
-                .header("cookie", "xhsTrackerId=b1da7fa6-9a2f-4b71-cb7a-78628d52d940; xhsuid=ZJzD8ASvuaZBr7CT; xhsTracker=url=noteDetail&xhsshare=CopyLink; timestamp2=20210804f04f5ea8e904335c3516242c; timestamp2.sig=rA2FFH3kKjaO4G2vJ56GQ4Yc_02M9jtgdX91SwxukMU; extra_exp_ids=gif_exp1,ques_clt2; noteIndex=6")
-                .userAgent(UserAgentUtil.getOne())
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        // 获取json数据
-        String jsonStr = regexJson(html);
-        JSONObject contentObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("NoteView")
-                .getJSONObject("content");
-
-        // 标题
-        result.setTitle(contentObject.getStr("title"));
-
-        JSONArray imageArray = contentObject.getJSONArray("imageList");
-        // 图片信息
-        for (int i = 0; i < imageArray.size(); i++) {
-            JSONObject item = imageArray.getJSONObject(i);
-            images.add(new BareResult.Image(
-                    "http://ci.xiaohongshu.com/" + item.getStr("traceId"),
-                    item.getInt("width"),
-                    item.getInt("height")
-            ));
-        }
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 正则获取数据json
-     *
-     * @param html 网页内容
-     */
-    public static String regexJson(String html) {
-        // 匹配网址
-        String regex = "<script>window.__INITIAL_SSR_STATE__=\\{(.*?)\\}</script>";
-        Pattern p = Pattern.compile(regex);
-        Matcher m = p.matcher(html);
-        if (m.find()) {
-            return html.substring(m.start(), m.end())
-                    .replace("<script>window.__INITIAL_SSR_STATE__=", "")
-                    .replace("</script>", "")
-                    .replace("undefined", "null");
-        }
-        return "";
-    }
-}

+ 0 - 95
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/XinPianChangParser.java

@@ -1,95 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.analysis.utils.StringUtil;
-import cc.xiaokuihua.util.analysis.UrlUtil;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 新片场解析
- * ==============================================================
- * User-Agent Mobile
- * 1. 获取重定向地址
- * 2. 获取分享链接ID(参数形式)
- * 3. 请求接口获取数据json
- * 4. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> data -> title
- * 封面 -> data -> cover
- * 视频 -> data -> cover -> video -> content -> progressive(Array) => (url, profile, width, height)
- * ==============================================================
- */
-@Component
-public class XinPianChangParser implements BareParser {
-
-    /**
-     * 获取视频接口地址
-     */
-    private static final String API = "https://app.xinpianchang.com/article/";
-
-    /**
-     * 方法描述:短视频解析
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("新片场");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        String userAgent = UserAgentUtil.getOne();
-        // 获取分享资源信息
-        String jsonStr = Jsoup
-                .connect(API + getItemId(UrlUtil.getRealUrl(userAgent, url)))
-                .userAgent(userAgent)
-                .ignoreContentType(true)
-                .execute()
-                .body();
-
-        JSONObject dataObject = JSONUtil.parseObj(jsonStr)
-                .getJSONObject("data");
-
-        // 标题、封面
-        result.setTitle(dataObject.getStr("title"))
-                .setCover(new BareResult.Image(dataObject.getStr("cover")));
-
-        JSONArray videoInfoList = dataObject.getJSONObject("video")
-                .getJSONObject("content")
-                .getJSONArray("progressive");
-
-        // 视频信息
-        for (int i = 0; i < videoInfoList.size(); i++) {
-            JSONObject item = videoInfoList.getJSONObject(i);
-            videos.add(new BareResult.Video(
-                    item.getStr("url"),
-                    item.getStr("profile"),
-                    item.getInt("width"),
-                    item.getInt("height")
-            ));
-        }
-
-        return result;
-    }
-
-    /**
-     * 方法描述: 获取分享视频id
-     *
-     * @param url 分享链接
-     */
-    public String getItemId(String url) {
-        return StringUtil.getQueryParams(url).get("id").get(0);
-    }
-}

+ 0 - 93
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/parse/parser/ZuiYouParser.java

@@ -1,93 +0,0 @@
-package cc.xiaokuihua.analysis.parse.parser;
-
-import cc.xiaokuihua.analysis.parse.BareParser;
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import cc.xiaokuihua.analysis.result.BareResult;
-import cc.xiaokuihua.util.analysis.UserAgentUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 最右解析器
- * ==============================================================
- * User-Agent Mobile
- * 1. 分享链接获取html内容
- * 2. 获取html里的数据json(正则)
- * 3. 解析获取想要的结果
- * --------------------------------------------------------------
- * 标题 -> sharePost -> postDetail -> post -> content
- * 封面 -> sharePost -> postDetail -> post -> imgs[0] -> urls -> originWebp => (urls[0], w, h)
- * 视频 -> sharePost -> postDetail -> post -> videos -> thumb(Var) -> url
- * ==============================================================
- */
-@Component
-public class ZuiYouParser implements BareParser {
-
-    /**
-     * 方法描述:短视频解析
-     *
-     * @param url 链接地址
-     */
-    @Override
-    public BareResult parse(String url) throws IOException {
-
-        // 构建结果
-        BareResult result = new BareResult(MediaType.VIDEO);
-        result.setSource("最右");
-        List<BareResult.Video> videos = new ArrayList<>();
-        result.setVideos(videos);
-
-        Document document = Jsoup
-                .connect(url)
-                .userAgent(UserAgentUtil.getOne())
-                .get();
-
-        Element element = document.getElementById("appState");
-
-        String filter = element.html()
-                .replace("window.APP_INITIAL_STATE=", "")
-                .replace("new Date(", "")
-                .replace(")", "");
-
-        JSONObject postObject = JSONUtil.parseObj(filter)
-                .getJSONObject("sharePost")
-                .getJSONObject("postDetail")
-                .getJSONObject("post");
-
-        JSONObject videosObject = postObject.getJSONObject("videos");
-
-        String thumb = "";
-        for (String key : videosObject.keySet()) {
-            thumb = key;
-        }
-        JSONObject thumbObject = videosObject.getJSONObject(thumb);
-
-        JSONObject coverObject = postObject.getJSONArray("imgs")
-                .getJSONObject(0)
-                .getJSONObject("urls")
-                .getJSONObject("originWebp");
-
-        // 标题、封面
-        result.setTitle(postObject.getStr("content"))
-                .setCover(new BareResult.Image(
-                        coverObject.getJSONArray("urls").getStr(0),
-                        coverObject.getInt("w"),
-                        coverObject.getInt("h")
-                ));
-
-        // 视频
-        String videoUrl = thumbObject.getStr("url");
-
-        videos.add(new BareResult.Video(videoUrl, null, null, null));
-
-        return result;
-    }
-}

+ 0 - 85
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/result/BareResult.java

@@ -1,85 +0,0 @@
-package cc.xiaokuihua.analysis.result;
-
-import cc.xiaokuihua.analysis.parse.enums.MediaType;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import java.util.List;
-
-@Accessors(chain = true)
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-public class BareResult {
-
-    @ApiModelProperty(value = "视频来源")
-    private String source;
-
-    @ApiModelProperty(value = "类型:video->视频;image->图片集;")
-    private MediaType type;
-
-    @ApiModelProperty(value = "标题")
-    private String title;
-
-    @ApiModelProperty(value = "视频封面")
-    private Image cover;
-
-    @ApiModelProperty(value = "视频信息集合(type=video)")
-    private List<Video> videos;
-
-    @ApiModelProperty(value = "图片信息集合(type=image)")
-    private List<Image> images;
-
-    public BareResult(MediaType type) {
-        this.type = type;
-    }
-
-    @AllArgsConstructor
-    @NoArgsConstructor
-    @Data
-    public static class Video {
-
-        public Video(String url) {
-            this.url = url;
-        }
-
-        @Deprecated
-        public Video(String url, String cover) {
-            this.url = url;
-        }
-
-        @ApiModelProperty(value = "视频地址")
-        private String url;
-
-        @ApiModelProperty(value = "清晰度")
-        private String quality;
-
-        @ApiModelProperty(value = "视频宽")
-        private Integer width;
-
-        @ApiModelProperty(value = "视频高")
-        private Integer height;
-    }
-
-    @AllArgsConstructor
-    @NoArgsConstructor
-    @Data
-    public static class Image {
-
-        public Image(String url) {
-            this.url = url;
-        }
-
-        @ApiModelProperty(value = "图片地址")
-        private String url;
-
-        @ApiModelProperty(value = "图片宽")
-        private Integer width;
-
-        @ApiModelProperty(value = "图片高")
-        private Integer height;
-    }
-}

+ 0 - 45
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/AnalysisLogService.java

@@ -1,45 +0,0 @@
-package cc.xiaokuihua.analysis.service;
-
-import cc.xiaokuihua.entity.analysis.entity.AnalysisLog;
-
-import java.util.List;
-
-/**
- * 解析记录Service
- *
- * @author ssk
- * @version 1.0
- * @date 2022/10/31 14:19
- */
-public interface AnalysisLogService {
-
-    /**
-     * 修改所有itemId
-     *
-     * @return 修改个数
-     */
-    Integer updateItemId();
-
-    /**
-     * 根据链接查询单条
-     *
-     * @param link 链接
-     * @return AnalysisLog
-     */
-    AnalysisLog getOneByLink(String link);
-
-    /**
-     * 查询解析记录
-     *
-     * @return List
-     */
-    List<AnalysisLog> selectAll();
-
-    /**
-     * 查询最新5条
-     *
-     * @return R List<AnalysisLog>
-     */
-    List<AnalysisLog> selectLimit();
-
-}

+ 0 - 73
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/AnalysisService.java

@@ -1,73 +0,0 @@
-package cc.xiaokuihua.analysis.service;
-
-import cc.xiaokuihua.entity.analysis.entity.DouYinAnalysis;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * 解析Service
- *
- * @author ssk
- * @version 1.0
- * @date 2023/5/29 16:53
- */
-public interface AnalysisService {
-
-    /**************************************DouYinWeb**********************************************/
-
-    /**
-     * 解析用户主页数据
-     *
-     * @param link 抖音浏览器版主页链接
-     */
-    List<DouYinAnalysis> getUserHomePageData(String link);
-
-    /**************************************DouYinHubWebApi**********************************************/
-
-    /**
-     * 下载到本地(直接下载)
-     *
-     * @param response 响应
-     * @param link     链接
-     */
-    void downloadToLocal(HttpServletResponse response, String link);
-
-    /**
-     * 获取单条视频数据
-     *
-     * @param link 链接
-     */
-    DouYinAnalysis getOneVideoData(String link);
-
-    /**************************************DouYinHubApi**********************************************/
-
-    /**
-     * 解析单条视频
-     *
-     * @param link 链接
-     * @return DouYinAnalysis
-     */
-    DouYinAnalysis douyinHubGetOneVideo(String link);
-
-    /**
-     * 获取用户主页所有
-     *
-     * @param link 链接
-     * @return List<DouYinAnalysis>
-     */
-    List<DouYinAnalysis> douyinHubGetUserHomePage(String link);
-
-    /**************************************Download**********************************************/
-
-    /**
-     * 下载
-     *
-     * @param douYinAnalysisList 解析的单条或多条内容
-     * @param flag               flag:{0:单条,1:用户主页,2:}
-     * @param repeatFlag         去重标记, 单条默认去重(消息模块也会验证重复性)
-     * @param downloadFlag       下载标记,默认全部下载(0:全部下载,1:只下载图片,2:只下载视频)
-     */
-    void download(List<DouYinAnalysis> douYinAnalysisList, Integer flag, boolean repeatFlag, Integer downloadFlag);
-
-}

+ 0 - 54
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/AnalysisTokenService.java

@@ -1,54 +0,0 @@
-package cc.xiaokuihua.analysis.service;
-
-import cc.xiaokuihua.entity.analysis.entity.AnalysisToken;
-
-import java.util.List;
-
-/**
- * 解析用户TokenService
- *
- * @author ssk
- * @version 1.0
- * @date 2023/5/22 17:02
- */
-public interface AnalysisTokenService {
-
-    /**
-     * 根据id获取单条
-     *
-     * @param id 主键
-     * @return AnalysisToken
-     */
-    AnalysisToken getOne(Integer id);
-
-    /**
-     * 根据用户id获取单条
-     *
-     * @param id 主键
-     * @return AnalysisToken
-     */
-    AnalysisToken getByUserId(Integer id);
-
-    /**
-     * 查询所有
-     *
-     * @return list
-     */
-    List<AnalysisToken> selectAll();
-
-    /**
-     * 新增
-     *
-     * @param analysisToken token对象
-     * @return int
-     */
-    boolean insertToken(AnalysisToken analysisToken);
-
-    /**
-     * 修改
-     *
-     * @param analysisToken token对象
-     * @return int
-     */
-    boolean updateToken(AnalysisToken analysisToken);
-}

+ 0 - 38
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/AnalysisUserService.java

@@ -1,38 +0,0 @@
-package cc.xiaokuihua.analysis.service;
-
-import cc.xiaokuihua.entity.analysis.entity.AnalysisUser;
-
-import java.util.List;
-
-/**
- * 解析用户Service
- *
- * @author ssk
- * @version 1.0
- * @date 2023/5/22 15:38
- */
-public interface AnalysisUserService {
-
-    /**
-     * 获取所有用户
-     *
-     * @return List
-     */
-    List<AnalysisUser> getAllUser();
-
-    /**
-     * 获取单个用户
-     *
-     * @param id 主键
-     * @return AnalysisUser
-     */
-    AnalysisUser getOne(Integer id);
-
-    /**
-     * 修改
-     *
-     * @param analysisUser 用户对象
-     * @return boolean
-     */
-    boolean updateAnalysisUser(AnalysisUser analysisUser);
-}

+ 0 - 90
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/impl/AnalysisLogServiceImpl.java

@@ -1,90 +0,0 @@
-package cc.xiaokuihua.analysis.service.impl;
-
-import cc.xiaokuihua.analysis.analysis.DouYin;
-import cc.xiaokuihua.analysis.service.AnalysisLogService;
-import cc.xiaokuihua.entity.analysis.entity.AnalysisLog;
-import cc.xiaokuihua.entity.analysis.mapper.AnalysisLogMapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
- * 解析记录ServiceImpl
- *
- * @author ssk
- * @version 1.0
- * @date 2022/10/31 14:19
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class AnalysisLogServiceImpl extends ServiceImpl<AnalysisLogMapper, AnalysisLog> implements AnalysisLogService {
-
-    private final DouYin douYin;
-
-    /**
-     * 修改所有itemId
-     *
-     * @return 修改个数
-     */
-    public Integer updateItemId() {
-        List<AnalysisLog> analysisLogs = this.list();
-        int count = 0;
-        for (AnalysisLog analysisLog : analysisLogs) {
-            if (null == analysisLog.getItemId() || analysisLog.getItemId().isEmpty()) {
-                String itemId = douYin.getItemId(analysisLog.getLink());
-                if (!"0".equals(itemId)) {
-                    AnalysisLog updateOne = new AnalysisLog();
-                    updateOne.setId(analysisLog.getId());
-                    updateOne.setItemId(itemId);
-                    log.info("id:" + analysisLog.getId() + ", itemId: " + itemId);
-                    this.updateById(updateOne);
-                    count++;
-                }
-            }
-        }
-        return count;
-    }
-
-    /**
-     * 根据链接查询单条
-     *
-     * @param link 链接
-     * @return AnalysisLog
-     */
-    public AnalysisLog getOneByLink(String link) {
-        QueryWrapper<AnalysisLog> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("link", link);
-        return this.getOne(queryWrapper);
-    }
-
-    /**
-     * 查询解析记录
-     *
-     * @return List
-     */
-    @Override
-    public List<AnalysisLog> selectAll() {
-        QueryWrapper<AnalysisLog> queryWrapper = new QueryWrapper<>();
-        queryWrapper.orderByDesc("CREATED_TIME");
-        return this.list(queryWrapper);
-    }
-
-    /**
-     * 查询最新5条
-     *
-     * @return R List<AnalysisLog>
-     */
-    @Override
-    public List<AnalysisLog> selectLimit() {
-        QueryWrapper<AnalysisLog> queryWrapper = new QueryWrapper<>();
-        queryWrapper.orderByDesc("CREATED_TIME").last("LIMIT 5");
-        return this.list(queryWrapper);
-    }
-
-}

+ 0 - 593
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/impl/AnalysisServiceImpl.java

@@ -1,593 +0,0 @@
-package cc.xiaokuihua.analysis.service.impl;
-
-import cc.xiaokuihua.analysis.analysis.DouYInEvil0ctal;
-import cc.xiaokuihua.analysis.analysis.DouYin;
-import cc.xiaokuihua.analysis.analysis.DouYinHub;
-import cc.xiaokuihua.analysis.config.NacosConfig;
-import cc.xiaokuihua.analysis.service.AnalysisService;
-import cc.xiaokuihua.analysis.service.AnalysisTokenService;
-import cc.xiaokuihua.analysis.service.AnalysisUserService;
-import cc.xiaokuihua.entity.analysis.entity.AnalysisLog;
-import cc.xiaokuihua.entity.analysis.entity.AnalysisToken;
-import cc.xiaokuihua.entity.analysis.entity.AnalysisUser;
-import cc.xiaokuihua.entity.analysis.entity.DouYinAnalysis;
-import cc.xiaokuihua.entity.analysis.mapper.AnalysisLogMapper;
-import cc.xiaokuihua.util.image.WebpConvertUtil;
-import cc.xiaokuihua.util.string.StringUtil;
-import cc.xiaokuihua.util.url.UrlUtils;
-import cc.xiaokuihua.util.webdav.WebDavJackRabbitUtil;
-import cc.xiaokuihua.util.webdav.WebDavUpload;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.FileUtils;
-import org.apache.tomcat.util.http.fileupload.IOUtils;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.*;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-/**
- * 解析ServiceImpl
- *
- * @author ssk
- * @version 1.0
- * @date 2023/5/29 16:53
- * @date 2023/12/27
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class AnalysisServiceImpl implements AnalysisService {
-
-    /**
-     * 动态获取Nacos配置
-     */
-    private final NacosConfig nacosConfig;
-
-    /**
-     * 解析记录Mapper
-     */
-    private final AnalysisLogMapper analysisLogMapper;
-
-    /**
-     * 抖音用户Service
-     */
-    private final AnalysisUserService analysisUserService;
-
-    /**
-     * 抖音用户TokenService
-     */
-    private final AnalysisTokenService analysisTokenService;
-
-    private final DouYinHub douYinHub;
-
-    private final DouYin douYin;
-
-    private final DouYInEvil0ctal douYInEvil0ctal;
-
-    @Value("${filePath}")
-    private String filePath;
-
-    @Value("${webdav.url}")
-    private String webDavUrl;
-
-    @Value("${webdav.username}")
-    private String webDavUserName;
-
-    @Value("${webdav.password}")
-    private String webDavPassWord;
-
-    /**************************************DouYinWeb**********************************************/
-
-    /**
-     * 解析用户主页数据
-     *
-     * @param link 抖音浏览器版主页链接
-     */
-    @Override
-    public List<DouYinAnalysis> getUserHomePageData(String link) {
-        return douYin.getUserAllData(link, nacosConfig.getDouyinCookie(), nacosConfig.getUserAgent());
-    }
-
-    /**************************************DouYinHubWebApi**********************************************/
-
-    /**
-     * 下载到本地(直接下载)
-     *
-     * @param response 响应
-     * @param link     链接
-     */
-    @Override
-    public void downloadToLocal(HttpServletResponse response, String link) {
-        try {
-            //解析链接
-            String url = UrlUtils.getUrl(link);
-            DouYinAnalysis douYinResult = douYInEvil0ctal.getDouYinResult(url);
-            if (douYinResult == null) {
-                log.error("downloadToLocal: 解析数据为空");
-                return;
-            }
-
-            //所有要下载的链接
-            List<String> pathList = new ArrayList<>();
-
-            //规范文件名
-            String title = StringUtil.getString(douYinResult.getDesc());
-
-            //解析的视频链接
-            if (null != douYinResult.getVideo_list() && !douYinResult.getVideo_list().isEmpty()) {
-                pathList.addAll(douYinResult.getVideo_list());
-            }
-
-            //解析的图片链接
-            if (null != douYinResult.getImage_list() && !douYinResult.getImage_list().isEmpty()) {
-                pathList.addAll(douYinResult.getImage_list());
-            }
-
-            //下载多个文件
-            if (pathList.size() > 1) {
-                FileInputStream fis;
-                String downloadFileName;
-                // 创建临时zip文件
-                String zipFileName = title + nowTime();
-                if (zipFileName.length() > 100) {
-                    zipFileName = title;
-                }
-                File zip = File.createTempFile(zipFileName, ".zip");
-                ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(zip.toPath()));
-                int i = 1;
-                for (String s : pathList) {
-                    log.info("downloadFunction: ItemId:{}, 总文件数:{}, 当前个数:{}", douYinResult.getItemId(), pathList.size(), i);
-                    HttpURLConnection conn = conn(s);
-                    String fileType = new String(conn.getHeaderField("Content-Type").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
-                    fileType = "." + fileType.substring(fileType.lastIndexOf("/") + 1);
-                    //得到输入流
-                    InputStream inputStream = conn.getInputStream();
-                    if (".webp".equalsIgnoreCase(fileType)) {
-                        inputStream = WebpConvertUtil.webpConvertWithStream(inputStream, "jpg");
-                        fileType = ".jpg";
-                    }
-                    BufferedInputStream in = new BufferedInputStream(inputStream);
-                    out.putNextEntry(new ZipEntry(nowTime() + fileType));
-                    int b;
-                    while ((b = in.read()) != -1) {
-                        out.write(b);
-                    }
-                    in.close();
-                    i++;
-                }
-                out.close();
-                fis = new FileInputStream(zip);
-                //以防中文文件名乱码
-                downloadFileName = URLEncoder.encode(zip.getName(), "UTF-8");
-                //处理空格转为加号的问题
-                downloadFileName = downloadFileName.replaceAll("\\+", "%20");
-                response.setHeader("Content-Disposition", "attachment; filename=" + downloadFileName);
-                IOUtils.copy(fis, response.getOutputStream());
-                response.flushBuffer();
-                try {
-                    fis.close();
-                    if (zip.delete()) {
-                        log.info("downloadToLocal: 打包文件已删除");
-                    }
-                } catch (IOException e) {
-                    log.error("downloadToLocal: ERROR Msg={}&Stack={}", e.getMessage(), e.getStackTrace());
-                }
-            } else if (pathList.size() == 1) {
-                //单个下载
-                HttpURLConnection conn = conn(pathList.get(0));
-                String fileType = new String(conn.getHeaderField("Content-Type").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
-                fileType = "." + fileType.substring(fileType.lastIndexOf("/") + 1);
-                //得到输入流
-                InputStream inputStream = conn.getInputStream();
-                if (".webp".equalsIgnoreCase(fileType)) {
-                    inputStream = WebpConvertUtil.webpConvertWithStream(inputStream, "jpg");
-                    fileType = ".jpg";
-                }
-                String fileName = "attachment; filename=" + title + nowTime() + fileType;
-                if (fileName.length() > 100) {
-                    fileName = "attachment; filename=" + nowTime() + fileType;
-                }
-                response.setHeader("Content-Disposition", new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
-                IOUtils.copy(inputStream, response.getOutputStream());
-                response.flushBuffer();
-            }
-        } catch (Exception e) {
-            log.error("downloadToLocal: ERROR Msg={}&Stack={}", e.getMessage(), e.getStackTrace());
-        }
-    }
-
-    /**
-     * 获取单条视频数据
-     *
-     * @param link 链接
-     */
-    @Override
-    public DouYinAnalysis getOneVideoData(String link) {
-        DouYinAnalysis douYinAnalysis = new DouYinAnalysis();
-        //解析链接
-        String url = UrlUtils.getUrl(link);
-        //项目id
-        String itemId = douYin.getItemId(link);
-        List<AnalysisLog> list;
-        if (itemId == null) {
-            list = null;
-        } else {
-            //查询视频是否下载过
-            QueryWrapper<AnalysisLog> queryWrapper = new QueryWrapper<>();
-            queryWrapper.eq("link", url).or().eq(!itemId.isEmpty(), "item_id", itemId).orderByDesc("created_time");
-            list = analysisLogMapper.selectList(queryWrapper);
-        }
-        if (list != null && !list.isEmpty()) {
-            AnalysisLog one = list.get(0);
-            //下载过
-            douYinAnalysis.setLink("have");
-            if (!itemId.isEmpty()) {
-                douYinAnalysis.setItemId(itemId);
-                AnalysisLog analysisLog = new AnalysisLog();
-                analysisLog.setId(one.getId());
-                analysisLog.setItemId(itemId);
-                analysisLogMapper.updateById(analysisLog);
-            }
-        } else {
-            //解析链接
-            douYinAnalysis = douYInEvil0ctal.getDouYinResult(url);
-            if (douYinAnalysis == null) {
-                log.error("getOneVideoData: 解析数据为空");
-                return null;
-            }
-        }
-        return douYinAnalysis;
-    }
-
-    /**************************************DouYinHubApi**********************************************/
-
-    /**
-     * 解析单条视频
-     *
-     * @param link 链接
-     * @return DouYinAnalysis
-     */
-    @Override
-    public DouYinAnalysis douyinHubGetOneVideo(String link) {
-        String token = getToken();
-        if (!"".equals(token)) {
-            //解析链接
-            String url = UrlUtils.getUrl(link);
-            return douYinHub.getOneVideoData(token, url);
-        } else {
-            DouYinAnalysis douYinAnalysis = new DouYinAnalysis();
-            douYinAnalysis.setLink("token");
-            return douYinAnalysis;
-        }
-    }
-
-    /**
-     * 获取用户主页所有
-     *
-     * @param link 链接
-     * @return List<DouYinAnalysis>
-     */
-    @Override
-    public List<DouYinAnalysis> douyinHubGetUserHomePage(String link) {
-        List<DouYinAnalysis> resultList = new ArrayList<>();
-        String token = getToken();
-        if (!"".equals(token)) {
-            //解析链接
-            String url = UrlUtils.getUrl(link);
-            return douYinHub.getUserVideoData(token, url);
-        } else {
-            DouYinAnalysis douYinAnalysis = new DouYinAnalysis();
-            douYinAnalysis.setLink("token");
-            resultList.add(douYinAnalysis);
-            return resultList;
-        }
-    }
-
-    /**************************************Download**********************************************/
-
-    /**
-     * 下载
-     *
-     * @param douYinAnalysisList 解析的单条或多条内容
-     * @param flag               flag:{0:单条,1:用户主页,2:}
-     * @param repeatFlag         去重标记, 单条默认去重(消息模块也会验证重复性)
-     * @param downloadFlag       下载标记,默认全部下载(0:全部下载,1:只下载图片,2:只下载视频)
-     */
-    @Override
-    public void download(List<DouYinAnalysis> douYinAnalysisList, Integer flag, boolean repeatFlag, Integer downloadFlag) {
-        try {
-            // 开始时间
-            long stime = System.currentTimeMillis();
-            if (downloadFlag == null) {
-                downloadFlag = 0;
-            }
-            log.info("download: 共获取到: {} 条数据", douYinAnalysisList.size());
-            if (flag == 0) {
-                DouYinAnalysis douYinAnalysis = douYinAnalysisList.get(0);
-                log.info("download: 共获取到: {} 条数据, 当前为第: {} 条数据", douYinAnalysisList.size(), 1);
-                if (videoCount(douYinAnalysis) < 1) {
-                    AnalysisLog analysisLog = addLog(douYinAnalysis);
-                    localCacheFile();
-                    List<String> downloadList = addAllDownloadLink(douYinAnalysis, downloadFlag);
-                    downloadFunction(downloadList, 0, analysisLog, "");
-                } else {
-                    log.info("download: 解析单条视频: 当前视频已下载");
-                }
-            } else {
-                //用户主页解析放到同一个文件夹
-                String upLoadPath;
-                int count = 0;
-                for (DouYinAnalysis douYinAnalysis : douYinAnalysisList) {
-                    count++;
-                    log.info("download: 共获取到: {} 条数据, 当前为第: {} 条数据", douYinAnalysisList.size(), count);
-                    //全部下载或者增量下载
-                    if (repeatFlag && videoCount(douYinAnalysis) > 0) {
-                        //查重且多条, 跳过此条
-                        continue;
-                    }
-                    AnalysisLog analysisLog = addLog(douYinAnalysis);
-                    //第一次循环, 保证文件夹存在
-                    //用户昵称
-                    String nickname = douYinAnalysis.getNickname();
-                    //规范昵称
-                    nickname = StringUtil.getString(nickname);
-                    //保证都在文件夹下, 不然文件会有错误
-                    if (nickname == null || nickname.isEmpty()) {
-                        nickname = "未命名";
-                    }
-                    //放到user文件夹下
-                    upLoadPath = webDavUrl + "user/" + nickname + "/";
-                    if (count == 1) {
-                        WebDavJackRabbitUtil.init(webDavUrl, webDavUserName, webDavPassWord);
-                        //保证user根目录存在
-                        WebDavJackRabbitUtil.mkdir(webDavUrl + "user/");
-                        if (WebDavJackRabbitUtil.mkdir(upLoadPath)) {
-                            log.info("download: WebDav创建文件夹成功: {}", upLoadPath);
-                        }
-                    }
-                    localCacheFile();
-                    List<String> downloadList = addAllDownloadLink(douYinAnalysis, downloadFlag);
-                    downloadFunction(downloadList, 1, analysisLog, upLoadPath);
-                }
-            }
-            // 结束时间
-            long etime = System.currentTimeMillis();
-            // 计算执行时间
-            long time = etime - stime;
-            log.info("downloadFunction: 成功, 执行时间" + time + "毫秒");
-        } catch (Exception e) {
-            log.error("download: ERROR MSG={}&Stack={}", e.getMessage(), e.getStackTrace());
-        }
-    }
-
-    /**************************************Function**********************************************/
-
-    /**
-     * 查询视频是否存在
-     *
-     * @param douYinAnalysis 单条视频
-     * @return 查询的视频数量
-     */
-    private Integer videoCount(DouYinAnalysis douYinAnalysis) {
-        LambdaUpdateWrapper<AnalysisLog> queryWrapper = new LambdaUpdateWrapper<>();
-        queryWrapper.eq(AnalysisLog::getLink, douYinAnalysis.getLink()).or().eq(AnalysisLog::getItemId, douYinAnalysis.getItemId()).eq(AnalysisLog::getDeleteFlag, 0);
-        return analysisLogMapper.selectCount(queryWrapper);
-    }
-
-    /**
-     * 新增解析记录
-     *
-     * @param douYinAnalysis 视频数据
-     * @return AnalysisLog
-     */
-    private AnalysisLog addLog(DouYinAnalysis douYinAnalysis) {
-        AnalysisLog analysisLog = new AnalysisLog();
-        analysisLog.setItemId(douYinAnalysis.getItemId());
-        analysisLog.setNickname(douYinAnalysis.getNickname());
-        analysisLog.setUid(douYinAnalysis.getUid());
-        analysisLog.setLink(douYinAnalysis.getLink());
-        analysisLog.setPosition(1);
-        analysisLog.setSource(douYinAnalysis.getSource());
-        //规范文件名
-        String title = StringUtil.getString(douYinAnalysis.getDesc());
-        analysisLog.setTitle(title);
-        analysisLog.setType(douYinAnalysis.getType());
-        return analysisLog;
-    }
-
-    /**
-     * 保证本地缓存文件夹存在
-     * /Cache/douyin/
-     */
-    private void localCacheFile() {
-        //保证本地缓存文件夹存在
-        File file = new File(filePath);
-        if (!file.exists()) {
-            if (file.mkdirs()) {
-                log.info("localCacheFile: 文件夹不存在, 创建了新文件夹");
-            }
-        }
-    }
-
-    /**
-     * 添加所有要下载的链接
-     *
-     * @param douYinAnalysis 解析内容
-     * @param downloadFlag   下载标记(0:全部下载,1:只下载图片,2:只下载视频)
-     * @return list
-     */
-    private List<String> addAllDownloadLink(DouYinAnalysis douYinAnalysis, Integer downloadFlag) {
-        List<String> downloadList = new ArrayList<>();
-        if (downloadFlag == 0 || downloadFlag == 1) {
-            //解析的图片链接
-            if (null != douYinAnalysis.getImage_list() && !douYinAnalysis.getImage_list().isEmpty()) {
-                downloadList.addAll(douYinAnalysis.getImage_list());
-            }
-        }
-        if (downloadFlag == 0 || downloadFlag == 2) {
-            //解析的视频链接
-            if (null != douYinAnalysis.getVideo_list() && !douYinAnalysis.getVideo_list().isEmpty()) {
-                downloadList.addAll(douYinAnalysis.getVideo_list());
-            }
-        }
-        return downloadList;
-    }
-
-    /**
-     * 下载方法
-     *
-     * @param downloadList 下载的链接
-     * @param uploadFlag   上传标记{0:单条解析上传,其他:主页解析上传}
-     * @param analysisLog  解析记录
-     * @param uploadPath   上传路径(用户单独文件夹)
-     */
-    private void downloadFunction(List<String> downloadList, Integer uploadFlag, AnalysisLog analysisLog, String uploadPath) {
-        try {
-            //判断上传路径
-            if (uploadFlag == 0) {
-                //单条解析,传到指定文件夹
-                uploadPath = webDavUrl;
-            }
-            if (downloadList.size() > 1) {
-                // 创建临时zip文件
-                String lastFilePath = filePath + analysisLog.getTitle() + nowTime() + ".zip";
-                if (lastFilePath.length() > 100) {
-                    lastFilePath = filePath + nowTime() + ".zip";
-                }
-                File zip = new File(lastFilePath);
-                analysisLog.setFileName(zip.getName());
-                ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(zip.toPath()));
-                int i = 1;
-                for (String s : downloadList) {
-                    log.info("downloadFunction: ItemId:{}, 总文件数:{}, 当前个数:{}", analysisLog.getItemId(), downloadList.size(), i);
-                    HttpURLConnection conn = conn(s);
-                    String fileType = new String(conn.getHeaderField("Content-Type").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
-                    fileType = "." + fileType.substring(fileType.lastIndexOf("/") + 1);
-                    //得到输入流
-                    InputStream inputStream = conn.getInputStream();
-                    if (".webp".equalsIgnoreCase(fileType)) {
-                        inputStream = WebpConvertUtil.webpConvertWithStream(inputStream, "jpg");
-                        fileType = ".jpg";
-                    }
-                    if (".json".equalsIgnoreCase(fileType)) {
-                        throw new RuntimeException("勾八抖音又封IP啦~~~");
-                    }
-                    BufferedInputStream in = new BufferedInputStream(inputStream);
-                    out.putNextEntry(new ZipEntry(nowTime() + fileType));
-                    int b;
-                    while ((b = in.read()) != -1) {
-                        out.write(b);
-                    }
-                    in.close();
-                    i++;
-                }
-                out.close();
-                //从本地上传到Nas
-                if (WebDavUpload.upload(uploadPath, webDavUserName, webDavPassWord, lastFilePath)) {
-                    log.info("downloadFunction: WebDav上传成功");
-                    //删除本地文件
-                    log.info(zip.delete() ? "downloadFunction: 本地文件删除成功" : "downloadFunction: 本地文件删除失败");
-                    analysisLogMapper.insert(analysisLog);
-                }
-            } else if (downloadList.size() == 1) {
-                //单个下载
-                HttpURLConnection conn = conn(downloadList.get(0));
-                String fileType = new String(conn.getHeaderField("Content-Type").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
-                fileType = "." + fileType.substring(fileType.lastIndexOf("/") + 1);
-                //得到输入流
-                InputStream inputStream = conn.getInputStream();
-                if (".webp".equalsIgnoreCase(fileType)) {
-                    inputStream = WebpConvertUtil.webpConvertWithStream(inputStream, "jpg");
-                    fileType = ".jpg";
-                }
-                if (".json".equalsIgnoreCase(fileType)) {
-                    throw new RuntimeException("勾八抖音又封IP啦~~~");
-                }
-                String lastFilePath = filePath + analysisLog.getTitle() + nowTime() + fileType;
-                if (lastFilePath.length() > 100) {
-                    lastFilePath = filePath + nowTime() + fileType;
-                }
-                File file = new File(lastFilePath);
-                FileUtils.copyInputStreamToFile(inputStream, file);
-                analysisLog.setFileName(file.getName());
-                //从本地上传到Nas
-                if (WebDavUpload.upload(uploadPath, webDavUserName, webDavPassWord, lastFilePath)) {
-                    log.info("downloadFunction: WebDav上传成功");
-                    //删除本地文件
-                    log.info(file.delete() ? "downloadFunction: 本地文件删除成功" : "downloadFunction: 本地文件删除失败");
-                    analysisLogMapper.insert(analysisLog);
-                }
-            }
-        } catch (Exception e) {
-            log.error("downloadFunction: ERROR MSG={}&Stack={}", e.getMessage(), e.getStackTrace());
-        }
-    }
-
-    /**
-     * 获取Token和减少可用次数
-     *
-     * @return token
-     */
-    private String getToken() {
-        String token = "";
-        List<AnalysisUser> allUser = analysisUserService.getAllUser();
-        for (AnalysisUser analysisUser : allUser) {
-            if (Integer.parseInt(analysisUser.getRemainingTimes()) > 0) {
-                AnalysisToken analysisToken = analysisTokenService.getOne(analysisUser.getId());
-                token = analysisToken.getToken();
-                //减少可用次数,调用失败可用次数也会减少
-                int times = Integer.parseInt(analysisUser.getRemainingTimes()) - 1;
-                analysisUser.setRemainingTimes(times + "");
-                analysisUserService.updateAnalysisUser(analysisUser);
-                break;
-            }
-        }
-        return token;
-    }
-
-    /**
-     * 现在时间,无符号到毫秒
-     *
-     * @return String
-     */
-    private String nowTime() {
-        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmssSSS");
-        return formatter.format(new Date());
-    }
-
-    /**
-     * http链接
-     *
-     * @param link 解析地址
-     * @return HttpURLConnection
-     */
-    private HttpURLConnection conn(String link) {
-        HttpURLConnection conn = null;
-        try {
-            URL url = new URL(link);
-            conn = (HttpURLConnection) url.openConnection();
-            //设置超时间为3秒
-            conn.setConnectTimeout(3 * 1000);
-            //防止屏蔽程序抓取而返回403错误
-            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
-        } catch (IOException e) {
-            log.error(e.getMessage());
-        }
-        return conn;
-    }
-}

+ 0 - 77
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/impl/AnalysisTokenServiceImpl.java

@@ -1,77 +0,0 @@
-package cc.xiaokuihua.analysis.service.impl;
-
-import cc.xiaokuihua.analysis.service.AnalysisTokenService;
-import cc.xiaokuihua.entity.analysis.entity.AnalysisToken;
-import cc.xiaokuihua.entity.analysis.mapper.AnalysisTokenMapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
- * 解析用户Token impl
- *
- * @author ssk
- * @version 1.0
- * @date 2023/5/23 13:21
- */
-@Service
-public class AnalysisTokenServiceImpl extends ServiceImpl<AnalysisTokenMapper, AnalysisToken> implements AnalysisTokenService {
-
-    /**
-     * 根据id获取单条
-     *
-     * @param id 主键
-     * @return AnalysisToken
-     */
-    @Override
-    public AnalysisToken getOne(Integer id) {
-        return this.getById(id);
-    }
-
-    /**
-     * 根据用户id获取单条
-     *
-     * @param id 主键
-     * @return AnalysisToken
-     */
-    @Override
-    public AnalysisToken getByUserId(Integer id) {
-        QueryWrapper<AnalysisToken> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("analysis_user_id", id);
-        return this.getOne(queryWrapper);
-    }
-
-    /**
-     * 查询所有
-     *
-     * @return list
-     */
-    @Override
-    public List<AnalysisToken> selectAll() {
-        return this.list();
-    }
-
-    /**
-     * 新增
-     *
-     * @param analysisToken token对象
-     * @return boolean
-     */
-    @Override
-    public boolean insertToken(AnalysisToken analysisToken) {
-        return this.save(analysisToken);
-    }
-
-    /**
-     * 修改
-     *
-     * @param analysisToken token对象
-     * @return boolean
-     */
-    @Override
-    public boolean updateToken(AnalysisToken analysisToken) {
-        return this.updateById(analysisToken);
-    }
-}

+ 0 - 55
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/service/impl/AnalysisUserServiceImpl.java

@@ -1,55 +0,0 @@
-package cc.xiaokuihua.analysis.service.impl;
-
-import cc.xiaokuihua.analysis.service.AnalysisUserService;
-import cc.xiaokuihua.entity.analysis.entity.AnalysisUser;
-import cc.xiaokuihua.entity.analysis.mapper.AnalysisUserMapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
- * 解析用户impl
- *
- * @author ssk
- * @version 1.0
- * @date 2023/5/22 16:21
- */
-@Service
-public class AnalysisUserServiceImpl extends ServiceImpl<AnalysisUserMapper, AnalysisUser> implements AnalysisUserService {
-
-    /**
-     * 获取单个用户
-     *
-     * @param id 主键
-     * @return AnalysisUser
-     */
-    @Override
-    public AnalysisUser getOne(Integer id) {
-        return this.getById(id);
-    }
-
-    /**
-     * 修改
-     *
-     * @param analysisUser 用户对象
-     * @return boolean
-     */
-    @Override
-    public boolean updateAnalysisUser(AnalysisUser analysisUser) {
-        return this.updateById(analysisUser);
-    }
-
-    /**
-     * 获取所有用户
-     *
-     * @return List
-     */
-    @Override
-    public List<AnalysisUser> getAllUser() {
-        QueryWrapper<AnalysisUser> queryWrapper = new QueryWrapper<>();
-        return this.list(queryWrapper);
-    }
-
-}

+ 0 - 61
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/utils/AESUtil.java

@@ -1,61 +0,0 @@
-package cc.xiaokuihua.analysis.utils;
-
-import org.apache.tomcat.util.codec.binary.Base64;
-import org.bouncycastle.jce.provider.BouncyCastleProvider;
-
-import javax.crypto.Cipher;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-import java.security.Security;
-import java.security.spec.AlgorithmParameterSpec;
-
-public class AESUtil {
-
-    private static final String CHARSET_NAME = "UTF-8";
-    private static final String AES_NAME = "AES";
-    public static final String ALGORITHM = "AES/CBC/PKCS7Padding";
-    public final String KEY;
-    public final String IV;
-
-    static {
-        Security.addProvider(new BouncyCastleProvider());
-    }
-
-    public AESUtil(String iv) {
-        KEY = iv;
-        IV = iv;
-    }
-
-    /**
-     * 加密
-     */
-    public String encrypt(String content) {
-        byte[] result = null;
-        try {
-            Cipher cipher = Cipher.getInstance(ALGORITHM);
-            SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(CHARSET_NAME), AES_NAME);
-            AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes());
-            cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec);
-            result = cipher.doFinal(content.getBytes(CHARSET_NAME));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return Base64.encodeBase64String(result);
-    }
-
-    /**
-     * 解密
-     */
-    public String decrypt(String content) {
-        try {
-            Cipher cipher = Cipher.getInstance(ALGORITHM);
-            SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(CHARSET_NAME), AES_NAME);
-            AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes());
-            cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec);
-            return new String(cipher.doFinal(Base64.decodeBase64(content)), CHARSET_NAME);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return "";
-    }
-}

+ 0 - 31
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/utils/ApplicationContextGetBeanHelper.java

@@ -1,31 +0,0 @@
-package cc.xiaokuihua.analysis.utils;
-
-import org.springframework.beans.BeansException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ApplicationContextGetBeanHelper implements ApplicationContextAware {
-
-    private static ApplicationContext applicationContext;
-
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-        ApplicationContextGetBeanHelper.applicationContext = applicationContext;
-    }
-
-    public static Object getBean(String className) throws BeansException, IllegalArgumentException {
-        if (className == null || className.length() <= 0) {
-            throw new IllegalArgumentException("className为空");
-        }
-
-        String beanName;
-        if (className.length() > 1) {
-            beanName = className.substring(0, 1).toLowerCase() + className.substring(1);
-        } else {
-            beanName = className.toLowerCase();
-        }
-        return applicationContext != null ? applicationContext.getBean(beanName) : null;
-    }
-}

+ 0 - 43
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/utils/MyEnvironmentPostProcessor.java

@@ -1,43 +0,0 @@
-package cc.xiaokuihua.analysis.utils;
-
-import cc.xiaokuihua.util.port.ServerPortUtils;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.env.EnvironmentPostProcessor;
-import org.springframework.core.env.ConfigurableEnvironment;
-import org.springframework.core.env.PropertiesPropertySource;
-
-import java.util.Properties;
-
-/**
- * 自定义端口
- *
- * @author ssk
- * @version 1.0
- * @date 2024/5/14 10:38
- */
-public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {
-
-    /**
-     * 端口min
-     */
-    int portMin = 8040;
-
-    /**
-     * 端口max
-     */
-    int portMax = 8044;
-
-    /**
-     * Post-process the given {@code environment}.
-     *
-     * @param environment the environment to post-process
-     * @param application the application to which the environment belongs
-     */
-    @Override
-    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
-        Properties properties = new Properties();
-        properties.put("server.port", ServerPortUtils.getAvailablePort(portMin, portMax));
-        PropertiesPropertySource source = new PropertiesPropertySource("myCustom", properties);
-        environment.getPropertySources().addLast(source);
-    }
-}

+ 0 - 59
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/utils/StringUtil.java

@@ -1,59 +0,0 @@
-package cc.xiaokuihua.analysis.utils;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class StringUtil {
-
-    /**
-     * 方法描述: 过滤分享链接的中文汉字
-     *
-     * @param url 分享链接
-     */
-    public static String filterUrl(String url) {
-        // 匹配网址
-        String regex = "https?://(\\w|-)+(\\.(\\w|-)+)+(/((\\w|-|.)+(\\?(\\w+=(\\w|%|-)*(\\&\\w+=(\\w|%|-)*)*)?)?)?)+";
-        Pattern p = Pattern.compile(regex);
-        Matcher m = p.matcher(url);
-        if (m.find()) {
-            return url.substring(m.start(), m.end());
-        }
-        return "";
-    }
-
-    /**
-     * 获取查询参数
-     *
-     * @param url 地址
-     * @return 参数
-     */
-    public static Map<String, List<String>> getQueryParams(String url) {
-        try {
-            Map<String, List<String>> params = new HashMap<String, List<String>>();
-            String[] urlParts = url.split("\\?");
-            if (urlParts.length > 1) {
-                String query = urlParts[1];
-                for (String param : query.split("&")) {
-                    String[] pair = param.split("=");
-                    String key = URLDecoder.decode(pair[0], "UTF-8");
-                    String value = "";
-                    if (pair.length > 1) {
-                        value = URLDecoder.decode(pair[1], "UTF-8");
-                    }
-
-                    List<String> values = params.computeIfAbsent(key, k -> new ArrayList<>());
-                    values.add(value);
-                }
-            }
-            return params;
-        } catch (UnsupportedEncodingException ex) {
-            throw new AssertionError(ex);
-        }
-    }
-}

+ 0 - 126
xiaokuihua-analysis/src/main/java/cc/xiaokuihua/analysis/utils/SysConvert.java

@@ -1,126 +0,0 @@
-package cc.xiaokuihua.analysis.utils;
-
-public class SysConvert {
-
-    //声明当前对象
-    private static SysConvert instance = new SysConvert();
-    //可用计数字符
-    private static String unit = "0123456789abcdefghijklmnopqrstuvwxyz";
-    //输入数字
-    private String number;
-    //输入进制
-    private int sysIn;
-    //输出进制
-    private int sysOut;
-    //输入实际值
-    private double actualValue;
-    //小数计算精度
-    private int precision;
-    //用于存放结果
-    private StringBuilder result = new StringBuilder();
-
-    private SysConvert() {
-    }
-
-    public static SysConvert getInstance() {
-        return instance;
-    }
-
-    /**
-     * 获取当前位所代表的值
-     *
-     * @param sys   进制数
-     * @param index 距离小数点的距离
-     * @param var   当前位表示字符
-     * @return 当前位所代表的值
-     */
-    private static double changeNI(int sys, int index, char var) {
-        return unit.indexOf(var) * Math.pow(sys, index);
-    }
-
-    /**
-     * 将值转化为对应进制表示字符
-     *
-     * @param sys 进制数
-     * @param var 值
-     * @return 对应进制表示字符
-     */
-    private static char changeIN(int sys, int var) {
-        return unit.charAt(var);
-    }
-
-    /**
-     * 计算实际值
-     */
-    private void calculateActualValue() {
-        //检查小数点
-        int pointIndex = number.indexOf('.');
-
-        //计算整数部分
-        if (pointIndex < 0) {//如果没有小数部分
-            for (int i = 0; i < number.length(); i++) {
-                actualValue += (long) changeNI(sysIn, i, number.charAt(number.length() - i - 1));
-            }
-        } else {//有则
-            for (int i = 0; i < pointIndex; i++) {
-                actualValue += (long) changeNI(sysIn, i, number.charAt(pointIndex - i - 1));
-            }
-        }
-
-        if (!(pointIndex < 0)) {//如果有小数部分
-            //计算小数部分
-            for (int i = pointIndex + 1; i < number.length(); i++) {
-                actualValue += changeNI(sysIn, pointIndex - i, number.charAt(i));
-            }
-        }
-    }
-
-    /**
-     * 转换为指定进制
-     */
-    private void Convert() {
-        //分离整数和小数
-        long integerPart = (long) actualValue;
-        double decimalsPart = actualValue - integerPart;
-
-        //建立字符串以用于保存结果
-        while (integerPart >= sysOut) { //反复除进制,取余数
-            result.insert(0, changeIN(sysOut, (int) (integerPart % sysOut))); //追加结果
-            integerPart = integerPart / sysOut;//商
-        }
-        if (integerPart != 0) { //如果最后未被除尽
-            result.insert(0, changeIN(sysOut, (int) integerPart)); //追加结果
-        }
-
-        if (decimalsPart > 0) { //如果有小数部分
-            //添加小数点
-            result.append(".");
-            for (int t = 0; t < precision; t++) {
-                decimalsPart = decimalsPart * sysOut;
-                result.append(changeIN(sysOut, (int) decimalsPart));
-                decimalsPart = decimalsPart - (int) decimalsPart;
-            }
-        }
-    }
-
-    /**
-     * 进制转换
-     *
-     * @param sysIn     输入进制(Input base)
-     * @param sysOut    输出进制(Output base)
-     * @param number    输入数字(Input number)
-     * @param precision 输出精度(非小数此参数无效)(Output precision (non-decimal this parameter is not valid))
-     * @return 输出转换结果
-     */
-    public String Convert(int sysIn, int sysOut, String number, int precision) {
-        this.sysIn = sysIn;
-        this.sysOut = sysOut;
-        this.number = number;
-        this.precision = precision;
-        actualValue = 0;
-        result.delete(0, result.length());
-        calculateActualValue();
-        Convert();
-        return result.toString();
-    }
-}

+ 0 - 1
xiaokuihua-analysis/src/main/resources/META-INF/spring.factories

@@ -1 +0,0 @@
-org.springframework.boot.env.EnvironmentPostProcessor=cc.xiaokuihua.analysis.utils.MyEnvironmentPostProcessor

+ 0 - 11
xiaokuihua-analysis/src/main/resources/banner.txt

@@ -1,11 +0,0 @@
-${AnsiColor.BLUE}
-${AnsiStyle.BOLD}
-       _             _          _ _                                         _           _
-      (_)           | |        (_) |                                       | |         (_)
- __  ___  __ _  ___ | | ___   _ _| |__  _   _  __ _ ______ __ _ _ __   __ _| |_   _ ___ _ ___
- \ \/ / |/ _` |/ _ \| |/ / | | | | '_ \| | | |/ _` |______/ _` | '_ \ / _` | | | | / __| / __|
-  >  <| | (_| | (_) |   <| |_| | | | | | |_| | (_| |     | (_| | | | | (_| | | |_| \__ \ \__ \
- /_/\_\_|\__,_|\___/|_|\_\\__,_|_|_| |_|\__,_|\__,_|      \__,_|_| |_|\__,_|_|\__, |___/_|___/
-                                                                               __/ |
-                                                                              |___/
-1.0.0--小葵花

+ 0 - 24
xiaokuihua-analysis/src/main/resources/bootstrap.yml

@@ -1,24 +0,0 @@
-spring:
-  application:
-    name: xiaokuihua-analysis
-
-  cloud:
-    nacos:
-      #注册中心
-      discovery:
-#        server-addr: localhost:8848
-        server-addr: xiaokuihua.cc:8848
-        username: nacos
-        password: .,ZyL021405
-#        namespace: test
-
-      #配置中心
-      config:
-        enabled: true
-#        server-addr: localhost:8848
-        server-addr: xiaokuihua.cc:8848
-        username: nacos
-        password: .,ZyL021405
-        group: DEFAULT_GROUP
-        file-extension: yml
-#        namespace: test

+ 0 - 174
xiaokuihua-analysis/src/main/resources/logback-spring.xml

@@ -1,174 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<!-- 该信息是由于设置了当配置文件变化时重新加载,所以每当达到扫描时间的时候就会检查配置文件是否错误。但是由于一般配置文件都放在了JAR包中,
-    而扫描的时候无法扫描JAR包内,因此会提示没有可以检查的文件,所以每隔一段时间就输出一次-->
-<configuration scan="false" scanPeriod="60 seconds" debug="true">
-    <contextName>logback-spring</contextName>
-
-    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
-    <!-- 定义全局参数常量 -->
-    <property name="log.level" value="debug"/>
-    <property name="log.maxHistory" value="30"/><!-- 30表示30个 -->
-    <property name="logging.path" value="/javaLog/analysisLog"/>
-    <!--输出文件前缀-->
-    <springProperty scope="local" name="port" source="server.port" defaultValue=""/>
-    <property name="FILENAME" value="xiaokuihua_analysis_${port}"/>
-
-    <!--0. 日志格式和颜色渲染 -->
-    <!-- 彩色日志依赖的渲染类 -->
-    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
-    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
-    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
-
-    <!-- 文件输出格式 -->
-    <property name="FILE_LOG_PATTERN" value="[%d{MM/dd HH:mm:ss.SSS}][%-10.10thread][%-5level][%-40.40c{1}:%5line]:[%15method] || %m%n"/>
-    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-    <!--1. 输出到控制台-->
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
-        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>${log.level}</level>
-        </filter>
-        <encoder>
-            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-            <!-- 设置字符集 -->
-            <charset>UTF-8</charset>
-        </encoder>
-    </appender>
-
-    <!--2. 输出到文档-->
-    <!-- DEBUG 日志 -->
-    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 当前的日志文件存放路径 -->
-        <file>${logging.path}/DEBUG_${port}.log</file>
-        <!-- 日志滚动策略 -->
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 历史日志文件的存放路径和名称 -->
-            <fileNamePattern>${logging.path}/%d{yyyy-MM-dd}_${FILENAME}_DEBUG.log.gz</fileNamePattern>
-            <!-- 日志文件最大的保存历史 数量-->
-            <maxHistory>${log.maxHistory}</maxHistory>
-        </rollingPolicy>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
-            <pattern>${FILE_LOG_PATTERN}</pattern>
-        </encoder>
-        <!--日志文件最大的大小-->
-    <!--        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
-    <!--            <MaxFileSize>10MB</MaxFileSize>-->
-    <!--        </triggeringPolicy>-->
-        <!-- 此日志文档只记录debug级别的 -->
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>DEBUG</level>
-            <onMatch>ACCEPT</onMatch>  <!-- 用过滤器,只接受DEBUG级别的日志信息,其余全部过滤掉 -->
-            <onMismatch>DENY</onMismatch>
-        </filter>
-    </appender>
-
-    <!-- INFO 日志 -->
-    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${logging.path}/INFO_${port}.log</file>
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${logging.path}/%d{yyyy-MM-dd}_${FILENAME}_INFO.log.gz</fileNamePattern>
-            <maxHistory>${log.maxHistory}</maxHistory>
-        </rollingPolicy>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <pattern>${FILE_LOG_PATTERN}</pattern>
-        </encoder>
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>INFO</level>
-            <onMatch>ACCEPT</onMatch>
-            <onMismatch>DENY</onMismatch>
-        </filter>
-    </appender>
-
-    <!-- WARN 日志 -->
-    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${logging.path}/WARN_${port}.log</file>
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${logging.path}/%d{yyyy-MM-dd}_${FILENAME}_WARN.log.gz</fileNamePattern>
-            <maxHistory>${log.maxHistory}</maxHistory>
-        </rollingPolicy>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <pattern>${FILE_LOG_PATTERN}</pattern>
-        </encoder>
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>WARN</level>
-            <onMatch>ACCEPT</onMatch>
-            <onMismatch>DENY</onMismatch>
-        </filter>
-    </appender>
-
-    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${logging.path}/ERROR_${port}.log</file>
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${logging.path}/%d{yyyy-MM-dd}_${FILENAME}_ERROR.log.gz</fileNamePattern>
-            <maxHistory>${log.maxHistory}</maxHistory>
-        </rollingPolicy>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <pattern>${FILE_LOG_PATTERN}</pattern>
-        </encoder>
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
-            <onMatch>ACCEPT</onMatch>
-            <onMismatch>DENY</onMismatch>
-        </filter>
-    </appender>
-
-    <!--
-      <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
-      以及指定<appender>。<logger>仅有一个name属性,
-      一个可选的level和一个可选的addtivity属性。
-      name:用来指定受此logger约束的某一个包或者具体的某一个类。
-      level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-         还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
-         如果未设置此属性,那么当前logger将会继承上级的级别。
-      addtivity:是否向上级logger传递打印信息。默认是true。
-      <logger name="org.springframework.web" level="info"/>
-      <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
-    -->
-
-    <!--
-      使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
-      第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
-      第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-      【logging.level.org.mybatis=debug logging.level.dao=debug】
-     -->
-    <!-- mybatis显示sql,修改此处扫描包名 -->
-
-
-    <!--
-      root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
-      level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-      不能设置为INHERITED或者同义词NULL。默认是DEBUG
-      可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-    -->
-
-    <!-- 4. 最终的策略 -->
-    <!-- 4.1 开发环境:打印控制台-->
-    <!--打印sql-->
-    <!--    <logger name="com.veryhappy.music.dao" level="debug"/>-->
-
-    <!--打印log-->
-    <root level="info">
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="DEBUG_FILE"/>
-        <appender-ref ref="INFO_FILE"/>
-        <appender-ref ref="WARN_FILE"/>
-        <appender-ref ref="ERROR_FILE"/>
-    </root>
-
-    <!--   4.2 生产环境:输出到文档-->
-    <springProfile name="pro">
-        <root level="info">
-            <appender-ref ref="CONSOLE"/>
-            <appender-ref ref="DEBUG_FILE"/>
-            <appender-ref ref="INFO_FILE"/>
-            <appender-ref ref="ERROR_FILE"/>
-            <appender-ref ref="WARN_FILE"/>
-        </root>
-    </springProfile>
-</configuration>

+ 0 - 33
xiaokuihua-wechat/.gitignore

@@ -1,33 +0,0 @@
-HELP.md
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**/target/
-!**/src/test/**/target/
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-build/
-!**/src/main/**/build/
-!**/src/test/**/build/
-
-### VS Code ###
-.vscode/

+ 0 - 2
xiaokuihua-wechat/README.md

@@ -1,2 +0,0 @@
-# openfeign调用   
-# mq生产者

+ 0 - 189
xiaokuihua-wechat/pom.xml

@@ -1,189 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>shop.alien</groupId>
-        <artifactId>alien-cloud</artifactId>
-        <version>1.0.0</version>
-    </parent>
-
-    <artifactId>xiaokuihua-wechat</artifactId>
-    <version>1.0.0</version>
-    <name>xiaokuihua-wechat</name>
-    <description>xiaokuihua-wechat</description>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-    </properties>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-amqp</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-openfeign</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>io.github.openfeign</groupId>
-            <artifactId>feign-okhttp</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>druid-spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.github.pagehelper</groupId>
-            <artifactId>pagehelper-spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.xuxueli</groupId>
-            <artifactId>xxl-job-core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>cn.6tail</groupId>
-            <artifactId>lunar</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-swagger-ui</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-annotations</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-models</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.github.xiaoymin</groupId>
-            <artifactId>swagger-bootstrap-ui</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>shop.alien</groupId>
-            <artifactId>alien-util</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>shop.alien</groupId>
-            <artifactId>alien-entity</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>shop.alien</groupId>
-            <artifactId>alien-config</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <version>3.1.2</version> <!-- 使用最新版本 -->
-                <executions>
-                    <execution>
-                        <id>copy-dependencies</id>
-                        <phase>prepare-package</phase> <!-- 在package之前执行 -->
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- 指定输出目录 -->
-                            <includeScope>runtime</includeScope> <!-- 仅包含运行时依赖 -->
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <configuration>
-                    <mainClass>cc.xiaokuihua.wechat.WechatApplication</mainClass>
-                    <layout>ZIP</layout>
-                    <includes>
-                        <include>
-                            <groupId>nothing</groupId>
-                            <artifactId>nothing</artifactId>
-                        </include>
-                    </includes>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>8</source>
-                    <target>8</target>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>

+ 0 - 40
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/WechatApplication.java

@@ -1,40 +0,0 @@
-package cc.xiaokuihua.wechat;
-
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.openfeign.EnableFeignClients;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.scheduling.annotation.EnableScheduling;
-
-@ComponentScan({
-        //配置
-        "cc.xiaokuihua.config.databases",
-        "cc.xiaokuihua.config.feign",
-//        "cc.xiaokuihua.config.filter",
-        "cc.xiaokuihua.config.http",
-        "cc.xiaokuihua.config.redis",
-        //工具
-        "cc.xiaokuihua.util.httpsend",
-        "cc.xiaokuihua.util.string",
-        //实体
-        "cc.xiaokuihua.entity.analysis",
-        "cc.xiaokuihua.entity.device",
-        //此项目
-        "cc.xiaokuihua.wechat.*"
-})
-@MapperScan({
-        "cc.xiaokuihua.entity.analysis.mapper",
-        "cc.xiaokuihua.entity.device.mapper",
-        "cc.xiaokuihua.entity.msg.wechat.mapper"})
-@EnableFeignClients(basePackages = {"cc.xiaokuihua.wechat.feign"})
-@EnableScheduling
-@SpringBootApplication
-public class WechatApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(WechatApplication.class, args);
-    }
-
-}
-

+ 0 - 33
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/config/NacosConfig.java

@@ -1,33 +0,0 @@
-package cc.xiaokuihua.wechat.config;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.cloud.context.config.annotation.RefreshScope;
-import org.springframework.stereotype.Component;
-
-/**
- * 获取Nacos配置
- *
- * @author ssk
- * @version 1.0
- * @date 2024/1/3 15:01
- */
-@Component
-@RefreshScope
-public class NacosConfig {
-
-    /**
-     * 游戏等待时间
-     */
-    @Value("${xiaokuihua.game.waitSecond}")
-    private Integer waitSecond;
-
-    /**
-     * 获取等待时间
-     *
-     * @return Integer
-     */
-    public Integer getWaitSecond() {
-        return waitSecond;
-    }
-
-}

+ 0 - 58
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/config/SwaggerConfig.java

@@ -1,58 +0,0 @@
-package cc.xiaokuihua.wechat.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.Contact;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-/**
- * swagger配置类
- *
- * @author ssk
- * @version 1.0
- * @date 2022/07/07 09:07
- */
-@Configuration
-@EnableSwagger2
-public class SwaggerConfig {
-
-    /**
-     * controller扫描
-     *
-     * @return controller扫描
-     */
-    @Bean
-    public Docket docket() {
-        return new Docket(DocumentationType.SWAGGER_2)
-                .apiInfo(apiInfo())
-                .groupName("微信服务Api")
-                .select()
-//                .apis(RequestHandlerSelectors.basePackage("cc.xiaokuihua.wechat"))
-                .apis(RequestHandlerSelectors.any())
-                .paths(PathSelectors.any())
-                .build();
-    }
-
-    /**
-     * Api标题信息
-     *
-     * @return api标题Api标题信息
-     */
-    public ApiInfo apiInfo() {
-        Contact contact = new Contact("ssk", "https://wechat.xiaokuihua.cc", "172380199@qq.com");
-        return new ApiInfoBuilder()
-                .title("微信服务Api")
-                .description("微信服务Api")
-                .license("ssk")
-                .contact(contact)
-                .termsOfServiceUrl("https://wechat.xiaokuihua.cc")
-                .version("1.0.0")
-                .build();
-    }
-}

+ 0 - 77
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/config/XxlJobConfig.java

@@ -1,77 +0,0 @@
-package cc.xiaokuihua.wechat.config;
-
-import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * xxl-job config
- *
- * @author xuxueli 2017-04-28
- */
-@Configuration
-public class XxlJobConfig {
-    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
-
-    @Value("${xxl.job.admin.addresses}")
-    private String adminAddresses;
-
-    @Value("${xxl.job.accessToken}")
-    private String accessToken;
-
-    @Value("${xxl.job.executor.appname}")
-    private String appname;
-
-    @Value("${xxl.job.executor.address}")
-    private String address;
-
-    @Value("${xxl.job.executor.ip}")
-    private String ip;
-
-    @Value("${xxl.job.executor.port}")
-    private int port;
-
-    @Value("${xxl.job.executor.logpath}")
-    private String logPath;
-
-    @Value("${xxl.job.executor.logretentiondays}")
-    private int logRetentionDays;
-
-    @Bean
-    public XxlJobSpringExecutor xxlJobExecutor() {
-        logger.info(">>>>>>>>>>> xxl-job config init.");
-        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
-        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
-        xxlJobSpringExecutor.setAppname(appname);
-        xxlJobSpringExecutor.setAddress(address);
-        xxlJobSpringExecutor.setIp(ip);
-        xxlJobSpringExecutor.setPort(port);
-        xxlJobSpringExecutor.setAccessToken(accessToken);
-        xxlJobSpringExecutor.setLogPath(logPath);
-        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
-
-        return xxlJobSpringExecutor;
-    }
-
-    /**
-     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
-     *
-     *      1、引入依赖:
-     *          <dependency>
-     *             <groupId>org.springframework.cloud</groupId>
-     *             <artifactId>spring-cloud-commons</artifactId>
-     *             <version>${version}</version>
-     *         </dependency>
-     *
-     *      2、配置文件,或者容器启动变量
-     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
-     *
-     *      3、获取IP
-     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
-     */
-
-
-}

+ 0 - 125
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/MiniProgramController.java

@@ -1,125 +0,0 @@
-package cc.xiaokuihua.wechat.controller;
-
-import cc.xiaokuihua.entity.device.entity.MsgWechatUserInfo;
-import cc.xiaokuihua.entity.result.R;
-import cc.xiaokuihua.wechat.service.MiniProgramService;
-import com.alibaba.fastjson.JSONObject;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * 微信小程序Controller
- *
- * @author ssk
- * @version 1.0
- * @date 2024/5/27 10:08
- */
-
-@Api(tags = {"微信小程序Controller"})
-@Slf4j
-@CrossOrigin
-@RestController
-@RequestMapping("/miniProgram")
-@RequiredArgsConstructor
-public class MiniProgramController {
-
-    private final MiniProgramService miniProgramService;
-
-    /**
-     * 获取用户信息
-     *
-     * @param openId 微信小程序openId
-     * @return MsgWechatUserInfo
-     */
-    @ApiOperation(value = "获取用户信息")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "openId", value = "小程序openId", dataType = "String", paramType = "query")
-    })
-    @GetMapping("/getUserInfo")
-    public R<MsgWechatUserInfo> getUserInfo(String openId) {
-        log.info("MiniProgramController.getUserInfo?openId={}", openId);
-        return R.data(miniProgramService.getUserInfo(openId));
-    }
-
-    /**
-     * 添加用户
-     *
-     * @param msgWechatUserInfo 用户信息
-     * @return R
-     */
-    @ApiOperation(value = "添加用户")
-    @PostMapping("/addUser")
-    public R<String> addUser(@RequestBody MsgWechatUserInfo msgWechatUserInfo) {
-        log.info("MiniProgramController.addUser?msgWechatUserInfo={}", msgWechatUserInfo.toString());
-        if (miniProgramService.addUser(msgWechatUserInfo) > 0) {
-            return R.success("添加成功");
-        }
-        return R.fail("添加失败");
-    }
-
-    /**
-     * 发送设备待办消息
-     *
-     * @param openId     小程序openId
-     * @param deviceId   设备主键
-     * @param msgContent 消息内容
-     * @return R
-     */
-    @ApiOperation(value = "发送设备待办消息")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "openId", value = "小程序openId", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "deviceId", value = "设备主键", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "msgContent", value = "消息内容", dataType = "String", paramType = "query")
-    })
-    @GetMapping("/sendDeviceTodoMsg")
-    public R<String> sendDeviceTodoMsg(String openId, String deviceId, String msgContent) {
-        log.info("MiniProgramController.sendDeviceTodoMsg?openId={},deviceId={},msgContent={}", openId, deviceId, msgContent);
-        return R.data(miniProgramService.sendDeviceTodoMsg(openId, deviceId, msgContent));
-    }
-
-    /**
-     * 设置定时提醒消息
-     *
-     * @param openId     小程序openId
-     * @param time       推送时间
-     * @param msgContent 消息内容
-     * @return R
-     */
-    @ApiOperation(value = "设置定时提醒消息")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "openId", value = "小程序openId", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "time", value = "时间", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "msgContent", value = "消息内容", dataType = "String", paramType = "query")
-    })
-    @GetMapping("/setRemindMsg")
-    public R<Boolean> setRemindMsg(String openId, String time, String msgContent) {
-        log.info("MiniProgramController.setRemindMsg?openId={}&time={}&msgContent={}", openId, time, msgContent);
-        String msg = miniProgramService.setRemindMsg(openId, time, msgContent);
-        if (msg.contains("成功")) {
-            return R.success("设置成功");
-        }
-        return R.fail(msg);
-    }
-
-    /**
-     * 获取openId
-     *
-     * @param code 授权code
-     * @return JSONObject
-     */
-    @ApiOperation(value = "获取openId")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "code", value = "授权code", dataType = "String", paramType = "query")
-    })
-    @GetMapping("/getOpenId")
-    public R<JSONObject> getOpenId(String code) {
-        log.info("MiniProgramController.getOpenId?code={}", code);
-        return R.data(miniProgramService.getOpenId(code));
-    }
-
-}

+ 0 - 65
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/PanelController.java

@@ -1,65 +0,0 @@
-package cc.xiaokuihua.wechat.controller;
-
-import cc.xiaokuihua.entity.result.R;
-import cc.xiaokuihua.wechat.main.WeChatMsg;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 小葵花面板Controller
- *
- * @author ssk
- * @version 1.0
- * @date 2024/5/22 16:21
- */
-@Slf4j
-@Api(tags = "小葵花面板接口")
-@CrossOrigin
-@RestController
-@RequestMapping("/panel")
-@RequiredArgsConstructor
-public class PanelController {
-
-    private final WeChatMsg weChatMsg;
-
-    /**
-     * 获取绑定设备
-     *
-     * @param openId 微信OpenId
-     * @return 设备列表
-     */
-    @ApiOperation(value = "获取绑定设备")
-    @ApiImplicitParams({@ApiImplicitParam(name = "link", value = "链接", dataType = "String", paramType = "query")})
-    @GetMapping("/getBindDevice")
-    public R<List<String>> getBindDevice(String openId) {
-        String bindDevice = weChatMsg.getBindDevice(openId);
-        List<String> list = Arrays.asList(bindDevice.split(","));
-        return R.data(list);
-    }
-
-    /**
-     * 消息推送
-     *
-     * @param openId  微信OpenId
-     * @param content 消息内容
-     * @return 推送结果
-     */
-    @ApiOperation(value = "消息推送")
-    @ApiImplicitParams({@ApiImplicitParam(name = "openId", value = "微信OpenId", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "order", value = "消息内容", dataType = "String", paramType = "query")})
-    @GetMapping("/sendMsg")
-    public R<String> sendMsg(String openId, String content) {
-        return R.data(weChatMsg.sendMsg(openId, content));
-    }
-
-}

+ 0 - 38
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/TestWeChatHandlerController.java

@@ -1,38 +0,0 @@
-package cc.xiaokuihua.wechat.controller;
-
-import cc.xiaokuihua.wechat.handler.WeChatHandler;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * 微信推送测试接口
- *
- * @author ssk
- * @version 1.0
- * @date 2025/1/17 10:08
- */
-@Api(tags = "微信推送测试接口")
-@RestController
-@RequestMapping(value = "/testWeChatHandler")
-@RequiredArgsConstructor
-public class TestWeChatHandlerController {
-
-    private final WeChatHandler weChatHandler;
-
-    @ApiOperation(value = "推送今日信息")
-    @GetMapping(value = "/todayInfo")
-    public void todayInfo() {
-        weChatHandler.todayInfo();
-    }
-
-    @ApiOperation("天气推送")
-    @GetMapping(value = "/weatherInfo")
-    public void weatherInfo() {
-        weChatHandler.weatherInfo();
-    }
-
-}

+ 0 - 88
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/VideoController.java

@@ -1,88 +0,0 @@
-package cc.xiaokuihua.wechat.controller;
-
-import cc.xiaokuihua.entity.result.R;
-import cc.xiaokuihua.wechat.main.WeChatVideo;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
-/**
- * 抖音视频解析Controller
- *
- * @author ssk
- * @version 1.0
- * @date 2024/5/22 16:20
- */
-@Api(tags = "抖音视频解析接口")
-@Slf4j
-@CrossOrigin
-@RestController
-@RequestMapping("/douyin")
-@RequiredArgsConstructor
-public class VideoController {
-
-    private final WeChatVideo weChatVideo;
-
-    /**
-     * 解析单条视频
-     *
-     * @param link 链接
-     * @return R
-     */
-    @ApiOperation(value = "解析单条视频")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "link", value = "链接", dataType = "String", paramType = "query")
-    })
-    @GetMapping("/analysisOneVideo")
-    public R<String> analysisOneVideo(String link) {
-        return R.data(weChatVideo.analysisOneVideoToMQ(link));
-    }
-
-    /**
-     * 解析用户主页
-     *
-     * @param link 链接
-     * @return R
-     */
-    @ApiOperation(value = "解析用户主页")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "link", value = "链接", dataType = "String", paramType = "query")
-    })
-    @GetMapping("/analysisUserHomePage")
-    public R<String> analysisUserHomePage(String link) {
-        return R.data(weChatVideo.analysisUserHomePageToMQ(link));
-    }
-
-
-    /**
-     * 解析,不区分单条多条
-     *
-     * @param param 链接参数
-     * @return R
-     */
-    @ApiOperation(value = "解析,不区分单条多条")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "param", value = "链接参数", dataType = "String", paramType = "query")
-    })
-    @PostMapping("/analysis")
-    public R<String> analysis(@RequestBody Map<String, String> param) {
-        String link = param.get("link");
-        String enter = link.substring(link.length() - 1);
-        if ("\n".equals(enter)) {
-            link = link.substring(0, link.length() - 1);
-        }
-        if (link.contains("https://v.douyin.com")) {
-            return R.data(weChatVideo.analysisOneVideoToMQ(link));
-        } else if (link.contains("https://www.douyin.com/aweme/v1/web")) {
-            return R.data(weChatVideo.analysisUserHomePageToMQ(link));
-        }
-        return R.fail("解析失败, 请检查链接地址");
-    }
-
-}

+ 0 - 110
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/WeChatController.java

@@ -1,110 +0,0 @@
-package cc.xiaokuihua.wechat.controller;
-
-import cc.xiaokuihua.entity.result.R;
-import cc.xiaokuihua.wechat.service.WeChatService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.Map;
-
-/**
- * 微信验证, 获取消息
- *
- * @author ssk
- * @version 1.0
- * @date 2022/11/4 15:35
- */
-@Api(tags = {"微信验证, 获取消息"})
-@Slf4j
-@CrossOrigin
-@RestController
-@RequestMapping("/wechatApi")
-@RequiredArgsConstructor
-public class WeChatController {
-
-    private final WeChatService weChatService;
-
-    /**
-     * 用于获取微信消息等
-     *
-     * @param request 请求
-     * @return String
-     */
-    @ApiOperation("发送消息Post,用于获取微信消息等")
-    @PostMapping("/")
-    public String postMethod(HttpServletRequest request) {
-        return weChatService.getMessage(request);
-    }
-
-    /**
-     * 微信验证服务器配置
-     *
-     * @param request  请求
-     * @param response 响应
-     */
-    @ApiOperation("发送消息Get,微信验证服务器配置")
-    @GetMapping("/")
-    public void getMethod(HttpServletRequest request, HttpServletResponse response) {
-        weChatService.checkServer(request, response);
-    }
-
-    /**
-     * 用于获取微信消息等
-     *
-     * @return String
-     */
-    @ApiOperation("测试用, 发送消息Get, 菜单测试")
-    @GetMapping("/test")
-    public String test(String str) {
-        return weChatService.getMessageTest(str);
-    }
-
-    /**
-     * 获取微信AccessToken
-     *
-     * @return token
-     */
-    @GetMapping("/getAccessToken")
-    public String getAccessToken() {
-        return weChatService.getAccessToken();
-    }
-
-    /**
-     * 获取微信JsapiTicket
-     *
-     * @return JsapiTicket
-     */
-    @GetMapping("/getJsapiTicket")
-    public String getJsapiTicket() {
-        return weChatService.getJsapiTicket();
-    }
-
-    /**
-     * 获取微信js配置信息
-     *
-     * @param url 访问url
-     * @return map
-     */
-    @GetMapping("/getWeChatConfig")
-    public Map<String, Object> getWeChatConfig(String url) {
-        return weChatService.getWeChatConfig(url);
-    }
-
-    /**
-     * 设置菜单
-     *
-     * @return R
-     */
-    @GetMapping("/setMenu")
-    public R setMenu() {
-        if (weChatService.setMenu()) {
-            return R.success("设置菜单成功");
-        }
-        return R.fail("设置菜单失败");
-    }
-}

+ 0 - 81
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/controller/WeChatFerryController.java

@@ -1,81 +0,0 @@
-package cc.xiaokuihua.wechat.controller;
-
-import cc.xiaokuihua.entity.result.R;
-import cc.xiaokuihua.wechat.service.WeChatFerryService;
-import io.swagger.annotations.*;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 获取WeChatFerry转发的微信消息
- *
- * @author ssk
- * @version 1.0
- * @date 2024/10/11 13:53
- */
-@Api(tags = {"回调_WeChatFerry"})
-@ApiSort(1)
-@Slf4j
-@RestController
-@RequestMapping("/wechat")
-@RequiredArgsConstructor
-public class WeChatFerryController {
-
-    private final WeChatFerryService weChatFerryService;
-
-    /**
-     * WeChatFerry回调接口
-     *
-     * @param map 回调参数
-     * @return R
-     */
-    @ApiOperation("WeChatFerry回调接口")
-    @ApiOperationSupport(order = 1)
-    @ApiImplicitParams({@ApiImplicitParam(name = "map", value = "回调参数", dataType = "map", paramType = "query", required = true)})
-    @PostMapping("/getMsg")
-    public R<String> getMsg(@RequestBody Map<String, String> map) {
-        if (!map.isEmpty()) {
-            if (weChatFerryService.getMsg(map)) {
-                return R.success("回调成功");
-            }
-        }
-        return R.fail("回调失败");
-    }
-
-    /**
-     * 测试接口
-     *
-     * @param isAtMe  艾特我的
-     * @param isGroup 是否为群组
-     * @param content 消息内容
-     * @param roomId  群组id
-     * @param sender  发送者
-     * @return R
-     */
-    @ApiOperation("测试接口")
-    @ApiOperationSupport(order = 2)
-    @ApiImplicitParams({@ApiImplicitParam(name = "isAtMe", value = "艾特我的", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "isGroup", value = "是否为群组", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "content", value = "消息内容", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "roomId", value = "群组id", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "sender", value = "发送者", dataType = "String", paramType = "query", required = true)})
-    @GetMapping("/test")
-    public R<String> test(String isAtMe, String isGroup, String content, String roomId, String sender) {
-        Map<String, String> map = new HashMap<>();
-        map.put("isAtMe", isAtMe);
-        map.put("isGroup", isGroup);
-        map.put("content", content);
-        map.put("roomId", roomId);
-        map.put("sender", sender);
-        if (weChatFerryService.getMsg(map)) {
-            return R.success("回调成功");
-        }
-        return R.fail("回调失败");
-    }
-
-}

+ 0 - 44
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/AnalysisFeign.java

@@ -1,44 +0,0 @@
-package cc.xiaokuihua.wechat.feign;
-
-import com.alibaba.fastjson.JSONObject;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-/**
- * 解析Feign
- *
- * @author ssk
- * @version 1.0
- * @date 2025/2/6 15:10
- */
-@FeignClient(url = "${xiaokuihua.analysis-url}", name = "analysis")
-public interface AnalysisFeign {
-
-    /**
-     * 解析单条数据
-     *
-     * @param link 链接
-     * @return JSONObject
-     */
-    @GetMapping("/downloadToServer")
-    JSONObject analysisOne(@RequestParam("link") String link);
-
-    /**
-     * 解析用户主页数据
-     *
-     * @param link 链接
-     * @return JSONObject
-     */
-    @GetMapping("/douyinhub/analysisUserHomePage")
-    JSONObject analysisUserHomePageDouyinHubApi(@RequestParam("link") String link);
-
-    /**
-     * 解析记录
-     *
-     * @return JSONObject
-     */
-    @GetMapping("/selectLimit")
-    JSONObject analysisLog();
-
-}

+ 0 - 106
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/ApiFeign.java

@@ -1,106 +0,0 @@
-package cc.xiaokuihua.wechat.feign;
-
-import com.alibaba.fastjson.JSONObject;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-/**
- * 调用Api服务
- *
- * @author ssk
- * @version 1.0
- * @date 2024/10/31 19:29
- */
-@FeignClient(url = "${xiaokuihua.api-url}", name = "api")
-public interface ApiFeign {
-
-    /**
-     * 查询天气信息
-     *
-     * @param areaCode   区域code
-     * @param extensions 查询类型(base:查询当天,all:查询当天加未来)
-     * @return JSONObject
-     */
-    @GetMapping("/gaode/weatherInfo")
-    JSONObject todayWeather(@RequestParam("areaCode") String areaCode, @RequestParam("extensions") String extensions);
-
-    /**
-     * 查询天气预警信息
-     *
-     * @param adcode 区域code
-     * @return JSONObject
-     */
-    @GetMapping("/weatherbureau/map/alarm")
-    JSONObject weatherAlarm(@RequestParam("adcode") String adcode);
-
-    /**
-     * 高德-地理编码
-     * 每日配额5000,并发每秒30
-     * https://lbs.amap.com/api/webservice/guide/api/georegeo
-     *
-     * @param address 结构化地址信息, 规则遵循:国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦,如:北京市朝阳区阜通东大街6号。
-     * @return R<Object>
-     */
-    @GetMapping("/gaode/geo")
-    JSONObject geo(@RequestParam("address") String address);
-
-    /**
-     * 今日油价查询
-     * https://www.mxnzp.com/doc/detail?id=34
-     *
-     * @param province 省份,合法值为:【安徽、北京、重庆、福建、甘肃、广东、广西、贵州、海南、河北、黑龙江、河南、湖北、湖南、江苏、江西、吉林、辽宁、内蒙古、宁夏、青海、陕西、上海、山东、山西、四川、天津、西藏、新疆、云南、浙江】
-     * @return R<Object>
-     */
-    @GetMapping("/roll/oil/search")
-    JSONObject oilSearch(@RequestParam("province") String province);
-
-    /**
-     * 每日推荐精美语句
-     * https://www.mxnzp.com/doc/detail?id=25
-     *
-     * @param count 被查询的语句条数,范围【1~20】
-     * @return R<Object>
-     */
-    @GetMapping("/roll/daily_word/recommend")
-    JSONObject dailyWord(@RequestParam("count") Integer count);
-
-    /**
-     * 获取历史上的今天数据
-     * https://www.mxnzp.com/doc/detail?id=18
-     *
-     * @param type 是否需要详情,0:不需要详情 1:需要详情 默认值 0 可不传
-     * @return R<Object>
-     */
-    @GetMapping("/roll/history/today")
-    JSONObject historyToday(@RequestParam("type") Integer type);
-
-    /**
-     * 每日天气预报
-     *
-     * @param location 地区
-     * @param days     3/7/10/15/30天
-     * @return R<Object>
-     */
-    @GetMapping("/qWeather/weatherFutureDays")
-    JSONObject weatherFutureDays(@RequestParam("location") String location, @RequestParam("days") Integer days);
-
-    /**
-     * 天气灾害预警
-     *
-     * @param location 地区
-     * @return R<Object>
-     */
-    @GetMapping("/qWeather/weatherWarningNow")
-    JSONObject weatherWarningNow(@RequestParam("location") String location);
-
-    /**
-     * 实时天气
-     *
-     * @param location 地区
-     * @return R<Object>
-     */
-    @GetMapping("/qWeather/weatherNow")
-    JSONObject weatherNow(@RequestParam("location") String location);
-
-}

+ 0 - 36
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/BotFeign.java

@@ -1,36 +0,0 @@
-package cc.xiaokuihua.wechat.feign;
-
-import com.alibaba.fastjson.JSONObject;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-/**
- * 调用机器人服务
- *
- * @author ssk
- * @version 1.0
- * @date 2024/10/31 18:36
- */
-@FeignClient(url = "${xiaokuihua.bot-url}", name = "bot")
-public interface BotFeign {
-
-    /**
-     * 向机器人发送消息
-     *
-     * @param chatId 聊天id
-     * @param userId 用户id
-     * @param msg    消息内容
-     * @return JSONObject
-     */
-    @GetMapping("/chat/getMsg")
-    JSONObject getResult(@RequestParam("chatId") String chatId, @RequestParam("userId") String userId, @RequestParam("msg") String msg);
-
-    /**
-     * 获取今天信息, 用于定时推送
-     *
-     * @return JSONObject
-     */
-    @GetMapping("/today/getTodayInfo")
-    JSONObject getTodayInfo();
-}

+ 0 - 36
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/MusicFeign.java

@@ -1,36 +0,0 @@
-package cc.xiaokuihua.wechat.feign;
-
-import com.alibaba.fastjson.JSONObject;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-/**
- * 小葵花音乐服务接口
- *
- * @author ssk
- * @version 1.0
- * @date 2025/2/6 14:18
- */
-@FeignClient(url = "${xiaokuihua.musicapi-url}", name = "music")
-public interface MusicFeign {
-
-    /**
-     * 查询本地音乐
-     *
-     * @param param 查询参数
-     * @return JSONObject
-     */
-    @GetMapping("/musicDetails/selectByArtistOrTitleOrAlbum")
-    JSONObject getLocalMusic(@RequestParam("param") String param);
-
-    /**
-     * 待下载音乐记录
-     *
-     * @param param 查询参数
-     * @return JSONObject
-     */
-    @GetMapping("/recordDownloadMusic/addRecord")
-    JSONObject recordMusic(@RequestParam("param") String param);
-
-}

+ 0 - 50
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/WeChatFeign.java

@@ -1,50 +0,0 @@
-package cc.xiaokuihua.wechat.feign;
-
-import com.alibaba.fastjson.JSONObject;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-/**
- * 微信Feign
- *
- * @author ssk
- * @version 1.0
- * @date 2025/1/15 16:15
- */
-@FeignClient(url = "https://api.weixin.qq.com", name = "wechat")
-public interface WeChatFeign {
-
-    /**
-     * 获取小程序openId
-     *
-     * @param appid      小程序 appId
-     * @param secret     小程序 appSecret
-     * @param js_code    登录时获取的 code,可通过wx.login获取
-     * @param grant_type 授权类型,此处只需填写 authorization_code
-     * @return JSONObject
-     */
-    @GetMapping("/sns/jscode2session")
-    String getOpenId(@RequestParam("appid") String appid, @RequestParam("secret") String secret, @RequestParam("js_code") String js_code, @RequestParam("grant_type") String grant_type);
-
-    /**
-     * 获取微信AccessToken
-     *
-     * @param grantType 类型
-     * @param appid     公众号id
-     * @param secret    公众号密钥
-     * @return JSONObject
-     */
-    @GetMapping("/cgi-bin/token")
-    JSONObject getAccessToken(@RequestParam("grant_type") String grantType, @RequestParam("appid") String appid, @RequestParam("secret") String secret);
-
-    /**
-     * 获取微信JsapiTicket
-     *
-     * @param accessToken 公众号AccessToken
-     * @param type        类型
-     * @return JSONObject
-     */
-    @GetMapping("/cgi-bin/ticket/getticket")
-    JSONObject getJsapiTicket(@RequestParam("access_token") String accessToken, @RequestParam("type") String type);
-}

+ 0 - 82
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/feign/WeChatFerryFeign.java

@@ -1,82 +0,0 @@
-package cc.xiaokuihua.wechat.feign;
-
-import com.alibaba.fastjson.JSONObject;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-
-import java.util.Map;
-
-/**
- * 调用WeChatFerry
- *
- * @author ssk
- * @version 1.0
- * @date 2024/10/31 11:28
- */
-@FeignClient(url = "${wechat.ferry.link}", name = "wechat-ferry")
-public interface WeChatFerryFeign {
-
-    /**
-     * 获取联系人
-     *
-     * @return JSONObject
-     */
-    @PostMapping("/list/contacts")
-    JSONObject listContacts();
-
-    /**
-     * 查询群成员
-     *
-     * @param map {groupNo:群编号}
-     * @return JSONObject
-     */
-    @PostMapping("/groupMember/list")
-    JSONObject listGroupMember(@RequestBody Map<String, Object> map);
-
-    /**
-     * 获取消息类型
-     *
-     * @return JSONObject
-     */
-    @PostMapping("/list/msgType")
-    JSONObject listMsgType();
-
-    /**
-     * 查询登录状态
-     *
-     * @return JSONObject
-     */
-    @PostMapping("/loginStatus")
-    JSONObject loginStatus();
-
-    /**
-     * 拍一拍群友
-     *
-     * @param map {patUser:要拍的wxid, recipient:消息接收人,私聊为 wxid 群聊为 roomid}
-     * @return JSONObject
-     */
-    @PostMapping("/patOnePat")
-    JSONObject patOnePat(@RequestBody Map<String, String> map);
-
-    /**
-     * 发送图片
-     *
-     * @param map {resourcePath:资源路径 本地文件或图片链接, recipient:消息接收人,私聊为 wxid 群聊为 roomid}
-     * @return JSONObject
-     */
-    @PostMapping("/send/fileMsg")
-    JSONObject sendFileMsg(@RequestBody Map<String, String> map);
-
-    /**
-     * 发送文本
-     * 单人:{msgText:@王二狗 @小葵花 测试, recipient:群聊id, isAtAll:false, atUsers:[王二狗id,小葵花id]}
-     * 全体:{msgText:@所有人 测试, recipient:群聊id, isAtAll:true, atUsers:[]}
-     *
-     * @param map {msgText:消息文本 , recipient:消息接收人,私聊为 wxid 群聊为 roomid, isAtAll: 是否艾特全体, atUsers: 要艾特的用户 群聊时要@的wxid 所有人置空}
-     * @return JSONObject
-     */
-    @PostMapping("/send/textMsg")
-    JSONObject sendTextMsg(@RequestBody Map<String, Object> map);
-
-}

+ 0 - 52
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/handler/MiniProgramHandler.java

@@ -1,52 +0,0 @@
-package cc.xiaokuihua.wechat.handler;
-
-import cc.xiaokuihua.entity.msg.wechat.entity.MsgTimedRemind;
-import cc.xiaokuihua.entity.msg.wechat.mapper.MsgTimedRemindMapper;
-import cc.xiaokuihua.wechat.feign.WeChatFerryFeign;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 小程序定时任务
- *
- * @author ssk
- * @version 1.0
- * @date 2025/1/14 11:23
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class MiniProgramHandler {
-
-    private final MsgTimedRemindMapper msgTimedRemindMapper;
-
-    private final WeChatFerryFeign weChatFerryFeign;
-
-    /**
-     * 每分钟获取推送消息, 并推送
-     */
-    @Scheduled(cron = "0 * * * * *")
-    public void getTimedRemind() {
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-        String date = sdf.format(new Date());
-        log.info("开始获取定时推送消息: {}", date);
-        LambdaQueryWrapper<MsgTimedRemind> wrapper = new LambdaQueryWrapper<>();
-        wrapper.like(MsgTimedRemind::getRemindTime, date).orderByAsc(MsgTimedRemind::getCreatedTime);
-        List<MsgTimedRemind> msgTimedReminds = msgTimedRemindMapper.selectList(wrapper);
-        for (MsgTimedRemind msgTimedRemind : msgTimedReminds) {
-            Map<String, Object> map = new HashMap<>();
-            map.put("msgText", msgTimedRemind.getRemindContent());
-            map.put("recipient", msgTimedRemind.getReceiveUser());
-            weChatFerryFeign.sendTextMsg(map);
-        }
-    }
-}

+ 0 - 217
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/handler/WeChatHandler.java

@@ -1,217 +0,0 @@
-package cc.xiaokuihua.wechat.handler;
-
-import cc.xiaokuihua.wechat.feign.ApiFeign;
-import cc.xiaokuihua.wechat.feign.BotFeign;
-import cc.xiaokuihua.wechat.feign.WeChatFerryFeign;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.xxl.job.core.context.XxlJobHelper;
-import com.xxl.job.core.handler.annotation.XxlJob;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 微信定时推送
- *
- * @author ssk
- * @version 1.0
- * @date 2024/11/4 10:50
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class WeChatHandler {
-
-    private final BotFeign botFeign;
-
-    private final WeChatFerryFeign weChatFerryFeign;
-
-    private final ApiFeign apiFeign;
-
-    @XxlJob("weatherInfo")
-    public void weatherInfo() {
-        XxlJobHelper.log("天气推送");
-        String param = XxlJobHelper.getJobParam();
-//        String param = "wxid_hf5cppah85521";
-        if (!param.isEmpty()) {
-            //大连地区 id:101070201, lat: 38.91459, lon: 121.61862
-            //大连, 实时
-            JSONObject weatherNowJson = apiFeign.weatherNow("101070201");
-            //大连, 天气灾害预警
-            JSONObject weatherWarningNowJson = apiFeign.weatherWarningNow("101070201");
-            if (weatherNowJson != null && 200 == weatherNowJson.getInteger("code") && weatherWarningNowJson != null && 200 == weatherWarningNowJson.getInteger("code")) {
-                JSONObject weatherNowJsonData = weatherNowJson.getJSONObject("data");
-                JSONObject weatherNowJsonDataNow = weatherNowJsonData.getJSONObject("now");
-                StringBuilder msg = new StringBuilder();
-                msg.append("☁\t")
-                        .append("大连实时天气")
-                        .append("\n")
-                        .append("----------------")
-                        .append("\n")
-                        .append("\t")
-                        .append("☁天气 : ")
-                        .append(weatherNowJsonDataNow.getString("text"))
-                        .append("\n")
-                        .append("\t")
-                        .append("\uD83E\uDE81风力 : ")
-                        .append(weatherNowJsonDataNow.getString("windDir"))
-                        .append("\t")
-                        .append(weatherNowJsonDataNow.getString("windScale"))
-                        .append("级")
-                        .append("\n")
-                        .append("\t")
-                        .append("\uD83C\uDF21\uFE0F温度 : ")
-                        .append(weatherNowJsonDataNow.getString("temp"))
-                        .append("°C")
-                        .append("\n")
-                        .append("\t")
-                        .append("\uD83C\uDF21\uFE0F体感 : ")
-                        .append(weatherNowJsonDataNow.getString("feelsLike"))
-                        .append("°C")
-                        .append("\n")
-                        .append("\t")
-                        .append("\uD83D\uDCA7湿度 : ")
-                        .append(weatherNowJsonDataNow.getString("humidity"))
-                        .append("%");
-                //天气预警
-                JSONArray weatherWarningNowJsonData = weatherWarningNowJson.getJSONObject("data").getJSONArray("warning");
-                if (!weatherWarningNowJsonData.isEmpty()) {
-                    msg.append("\n")
-                            .append("\n")
-                            .append("⚠天气预警 : ")
-                            .append("\n")
-                            .append("----------------")
-                            .append("\n \t")
-                            .append(weatherWarningNowJsonData.getJSONObject(0).getString("title"))
-                            .append("\n \t")
-                            .append(weatherWarningNowJsonData.getJSONObject(0).getString("text"));
-                }
-                log.info("msg : {}", msg);
-                String[] split = param.split(",");
-                for (String s : split) {
-                    if (s.contains("@")) {
-                        //推送给群聊
-                        sendChatGroup(s, msg.toString());
-                    } else {
-                        //推送给个人
-                        sendChatPerson(s, msg.toString());
-                    }
-                }
-            } else {
-                XxlJobHelper.handleFail("推送失败, 获取今日信息失败");
-            }
-        } else {
-            XxlJobHelper.handleFail("推送失败, 未设置推送人员");
-        }
-    }
-
-    @XxlJob("todayInfo")
-    public void todayInfo() {
-        XxlJobHelper.log("推送今日信息");
-        String param = XxlJobHelper.getJobParam();
-//        String param = "wxid_hf5cppah85521";
-        //为空不推送
-        if (!param.isEmpty()) {
-            //获取大连天气
-            JSONObject todayInfo = botFeign.getTodayInfo();
-            if (todayInfo != null && 200 == todayInfo.getInteger("code")) {
-                String data = todayInfo.getString("data");
-                log.info("data : {}", data);
-                String[] split = param.split(",");
-                for (String s : split) {
-                    if (s.contains("@")) {
-                        //推送给群聊
-                        sendChatGroup(s, data);
-                    } else {
-                        //推送给个人
-                        sendChatPerson(s, data);
-                    }
-                }
-            } else {
-                XxlJobHelper.handleFail("推送失败, 获取今日信息失败");
-            }
-        } else {
-            XxlJobHelper.handleFail("推送失败, 未设置推送人员");
-        }
-    }
-
-    /**
-     * 推送给群聊
-     * {msgText:消息文本 , recipient:消息接收人,私聊为 wxid 群聊为 roomid, isAtAll: 是否艾特全体, atUsers: 要艾特的用户 群聊时要@的wxid 所有人置空}
-     * 单人:{msgText:@王二狗 @小葵花 测试, recipient:群聊id, isAtAll:false, atUsers:[王二狗id,小葵花id]}
-     * 全体:{msgText:@所有人 测试, recipient:群聊id, isAtAll:true, atUsers:[]}
-     *
-     * @param chatId 群聊id
-     * @param msg    消息内容
-     */
-    public void sendChatGroup(String chatId, String msg) {
-        Map<String, Object> map = new HashMap<>();
-        List<String> atList = new ArrayList<>();
-        map.put("msgText", msg);
-        map.put("recipient", chatId);
-        map.put("isAtAll", false);
-        map.put("atUsers", atList);
-        JSONObject jsonObject = weChatFerryFeign.sendTextMsg(map);
-        if (200 == jsonObject.getInteger("code")) {
-            XxlJobHelper.handleSuccess("推送成功");
-        } else {
-            XxlJobHelper.handleFail("推送失败");
-        }
-    }
-
-    /**
-     * 推送给个人
-     * {msgText:消息文本 , recipient:消息接收人,私聊为 wxid 群聊为 roomid, isAtAll: 是否艾特全体, atUsers: 要艾特的用户 群聊时要@的wxid 所有人置空}
-     *
-     * @param chatId
-     * @param msg
-     */
-    public void sendChatPerson(String chatId, String msg) {
-        Map<String, Object> map = new HashMap<>();
-        map.put("msgText", msg);
-        map.put("recipient", chatId);
-        JSONObject jsonObject = weChatFerryFeign.sendTextMsg(map);
-        if (200 == jsonObject.getInteger("code")) {
-            XxlJobHelper.handleSuccess("推送成功");
-        } else {
-            XxlJobHelper.handleFail("推送失败");
-        }
-    }
-
-    @XxlJob("demoJobHandler")
-    public void demoJobHandler() {
-        XxlJobHelper.log("定时任务");
-        String command = XxlJobHelper.getJobParam();
-        LocalDateTime localDateTime = LocalDateTime.now();
-        System.out.println(localDateTime);
-        int second = localDateTime.getSecond();
-        int minute = localDateTime.getMinute();
-        if (second == 0) {
-//        if (second == 0 && minute == 0) {
-            Map<String, Object> map = new HashMap<>();
-            StringBuilder sb = new StringBuilder();
-            sb.append("抛竿");
-//            sb.append("现在是北京时间")
-//                    .append(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
-//                    .append("\n老大派我来搞点气氛");
-//                    .append(localDateTime.getHour());
-//                    .append("点整");
-            map.put("msgText", sb.toString());
-            map.put("recipient", "19434025831@chatroom");
-            map.put("isAtAll", false);
-            List<String> atList = new ArrayList<>();
-            map.put("atUsers", atList);
-            JSONObject jsonObject = weChatFerryFeign.sendTextMsg(map);
-            System.out.println(jsonObject);
-        }
-        XxlJobHelper.handleSuccess("执行成功");
-        // default success
-    }
-}

+ 0 - 50
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatGame.java

@@ -1,50 +0,0 @@
-package cc.xiaokuihua.wechat.main;
-
-import shop.alien.config.redis.BaseRedisService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-/**
- * 游戏功能
- *
- * @author ssk
- * @version 1.0
- * @date 2023/2/2 16:17
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class WeChatGame {
-
-    private BaseRedisService baseRedisService;
-
-    /**
-     * 成语接龙
-     *
-     * @param openId 微信用户openid
-     * @param order  命令
-     * @return String
-     */
-    public String idiom(String openId, String order) {
-        baseRedisService.setString(openId + "_idiom", "0");
-        return "";
-    }
-
-    /**
-     * 1A2B
-     *
-     * @param openId 微信用户openid
-     * @param order  命令
-     * @return String
-     */
-    public String oneATwoB(String openId, String order) {
-        //答案
-        baseRedisService.setString(openId + "_oatb_answer", "0");
-        //记录
-        baseRedisService.setString(openId + "_oatb_log", "0");
-        return "";
-    }
-
-
-}

+ 0 - 117
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatJudge.java

@@ -1,117 +0,0 @@
-package cc.xiaokuihua.wechat.main;
-
-import shop.alien.config.redis.BaseRedisService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-/**
- * 功能判断
- *
- * @author ssk
- * @version 1.0
- * @date 2022/11/7 11:09
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class WeChatJudge {
-
-    private final WeChatMenu weChatMenu;
-
-    private final BaseRedisService baseRedisService;
-
-    /**
-     * 获取指令
-     *
-     * @param openId   微信OpenId
-     * @param orderStr 指令内容
-     * @return String
-     */
-    public String getOrder(String openId, String orderStr) {
-        String result = "";
-
-        if ("菜单".equals(orderStr)) {
-            //设置为初始菜单
-            baseRedisService.setString(openId + "_one", "menu");
-            weChatMenu.menuTwoReset(openId);
-        }
-
-        //默认下选择菜单
-        if ("menu".equals(baseRedisService.getString(openId + "_one"))) {
-            switch (orderStr) {
-                case "菜单":
-                    //菜单
-                    result = weChatMenu.mainMenu("main");
-                    baseRedisService.setString(openId + "_one", "menu");
-                    break;
-                case "1":
-                    //视频解析
-                    result = weChatMenu.mainMenu("video");
-                    baseRedisService.setString(openId + "_one", "video");
-                    break;
-                case "2":
-                    //音乐查询
-                    result = weChatMenu.mainMenu("music");
-                    baseRedisService.setString(openId + "_one", "music");
-                    break;
-                case "3":
-                    //天气查询
-                    result = weChatMenu.mainMenu("weather");
-                    baseRedisService.setString(openId + "_one", "weather");
-                    break;
-                case "4":
-                    //食物热量查询
-                    result = weChatMenu.mainMenu("food");
-                    baseRedisService.setString(openId + "_one", "food");
-                    break;
-                case "5":
-                    //文字游戏
-                    result = weChatMenu.mainMenu("game");
-                    baseRedisService.setString(openId + "_one", "game");
-                    break;
-                case "6":
-                    //消息推送
-                    result = weChatMenu.mainMenu("msg");
-                    baseRedisService.setString(openId + "_one", "msg");
-                    break;
-                default:
-                    result = orderStr;
-                    break;
-            }
-        } else {
-            //二级菜单及调用
-            switch (baseRedisService.getString(openId + "_one")) {
-                case "菜单":
-                    //菜单
-                    result = weChatMenu.mainMenu("main");
-                    baseRedisService.setString(openId + "_one", "menu");
-                    break;
-                case "video":
-                    //视频解析结果
-                    result = weChatMenu.videoFunction(openId, orderStr);
-                    break;
-                case "music":
-                    //音乐功能
-                    result = weChatMenu.musicFunction(openId, orderStr);
-                    break;
-                case "weather":
-                    //天气查询
-                    result = weChatMenu.weatherFunction(openId, orderStr);
-                    break;
-                case "food":
-                    break;
-                case "game":
-                    //游戏
-                    result = weChatMenu.gameFunction(openId, orderStr);
-                    break;
-                case "msg":
-                    //游戏
-                    result = weChatMenu.msgFunction(openId, orderStr);
-                    break;
-            }
-        }
-        return result;
-    }
-
-}

+ 0 - 339
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatMenu.java

@@ -1,339 +0,0 @@
-package cc.xiaokuihua.wechat.main;
-
-import shop.alien.config.redis.BaseRedisService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 微信菜单
- *
- * @author ssk
- * @version 1.0
- * @date 2022/11/7 11:05
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class WeChatMenu {
-
-    private final WeChatVideo weChatVideo;
-
-    private final WeChatWeather weChatWeather;
-
-    private final WeChatMusic weChatMusic;
-
-    private final WeChatGame weChatGame;
-
-    private final BaseRedisService baseRedisService;
-
-    private final WeChatMsg weChatMsg;
-
-    /**
-     * 主菜单
-     */
-    List<String> mainList = Arrays.asList(
-            "--------主菜单--------",
-            "1.抖音视频解析",
-            "2.音乐功能",
-            "3.天气查询",
-            "4.食物热量查询",
-            "5.文字游戏",
-            "6.App消息推送",
-            "Tips: 输入对应编号即可, 之后的操作都是在选择的功能之下进行, 输入菜单可重新选择功能哦~~~");
-
-    /**
-     * 视频
-     */
-    List<String> videoList = Arrays.asList(
-            "--------视频解析--------",
-            "1.解析抖音单条视频(下载到Nas)",
-            "2.解析抖音用户主页(下载到Nas)",
-            "3.查询下载记录, 默认最新5条");
-
-    /**
-     * 音乐
-     */
-    List<String> musicList = Arrays.asList(
-            "--------音乐功能--------",
-            "1.已下载音乐查询",
-            "2.待下载音乐记录");
-
-    /**
-     * 天气
-     */
-    List<String> weatherList = Arrays.asList(
-            "--------天气查询--------",
-            "1.获取今天天气",
-            "2.获取今天及未来天气");
-
-    /**
-     * 食物
-     */
-    List<String> foodList = Arrays.asList(
-            "------食物热量查询------",
-            "1.",
-            "2.");
-
-    /**
-     * 游戏
-     */
-    List<String> gameList = Arrays.asList(
-            "--------文字游戏--------",
-            "1.成语接龙",
-            "2.1A2B");
-    /**
-     * 消息推送
-     */
-    List<String> msgList = Arrays.asList(
-            "--------消息推送--------",
-            "1.绑定App",
-            "2.查看绑定的设备",
-            "3.消息推送");
-
-    /**
-     * 获取菜单
-     *
-     * @param type 类型
-     * @return 菜单内容
-     */
-    public String mainMenu(String type) {
-        StringBuilder result = new StringBuilder();
-        List<String> list = mainList;
-        switch (type) {
-            case "main":
-                list = mainList;
-                break;
-            case "video":
-                list = videoList;
-                break;
-            case "music":
-                list = musicList;
-                break;
-            case "weather":
-                list = weatherList;
-                break;
-            case "food":
-                list = foodList;
-                break;
-            case "game":
-                list = gameList;
-            case "msg":
-                list = msgList;
-                break;
-            default:
-                break;
-        }
-        for (String s : list) {
-            result.append(s).append("\n");
-        }
-        return result.toString();
-    }
-
-    /**
-     * 选择主菜单时重置二级菜单
-     *
-     * @param openId 微信OpenId
-     */
-    public void menuTwoReset(String openId) {
-        baseRedisService.setString(openId + "_two", "0");
-    }
-
-    /**
-     * 视频解析
-     *
-     * @param openId 微信OpenId
-     * @param order  命令
-     * @return String
-     */
-    public String videoFunction(String openId, String order) {
-        String resultMsg;
-        if ("0".equals(baseRedisService.getString(openId + "_two"))) {
-            if ("1".equals(order)) {
-                //1.解析单条数据
-                resultMsg = "请输入要解析下载的链接";
-                baseRedisService.setString(openId + "_two", "1");
-            } else if ("2".equals(order)) {
-                //2.解析用户主页数据
-                resultMsg = "请输入要解析下载的链接";
-                baseRedisService.setString(openId + "_two", "2");
-            } else if ("3".equals(order)) {
-                //3.查询下载记录, 默认最新5条"
-                resultMsg = weChatVideo.analysisLog();
-                baseRedisService.setString(openId + "_two", "3");
-            } else {
-                resultMsg = "暂无此功能~";
-                baseRedisService.setString(openId + "_two", "0");
-            }
-        } else {
-            if ("1".equals(baseRedisService.getString(openId + "_two"))) {
-                //1.解析单条数据
-                resultMsg = weChatVideo.analysisOneVideoToMQ(order);
-            } else if ("2".equals(baseRedisService.getString(openId + "_two"))) {
-                //2.解析用户主页数据
-                resultMsg = weChatVideo.analysisUserHomePageToMQ(order);
-            } else if ("3".equals(baseRedisService.getString(openId + "_two"))) {
-                //3.查询下载记录, 默认最新5条"
-                resultMsg = weChatVideo.analysisLog();
-            } else {
-                resultMsg = "暂无此功能~";
-                baseRedisService.setString(openId + "_two", "0");
-            }
-        }
-        return resultMsg;
-    }
-
-    /**
-     * 天气
-     *
-     * @param openId 微信OpenId
-     * @param order  命令
-     * @return String
-     */
-    public String weatherFunction(String openId, String order) {
-        String resultMsg;
-        if ("0".equals(baseRedisService.getString(openId + "_two"))) {
-            if ("1".equals(order)) {
-                //1.获取今天天气
-                resultMsg = "请输入要查询的城市";
-                baseRedisService.setString(openId + "_two", "1");
-            } else if ("2".equals(order)) {
-                //2.获取今天及未来天气
-                resultMsg = "请输入要查询的城市";
-                baseRedisService.setString(openId + "_two", "2");
-            } else {
-                resultMsg = "暂无此功能~";
-                baseRedisService.setString(openId + "_two", "0");
-            }
-        } else {
-            if ("1".equals(baseRedisService.getString(openId + "_two"))) {
-                //1.获取今天天气
-                resultMsg = weChatWeather.todayWeather(order);
-            } else if ("2".equals(baseRedisService.getString(openId + "_two"))) {
-                //2.获取今天及未来天气
-                resultMsg = weChatWeather.futureWeather(order);
-            } else {
-                resultMsg = "暂无此功能~";
-                baseRedisService.setString(openId + "_two", "0");
-            }
-        }
-        return resultMsg;
-    }
-
-    /**
-     * 音乐
-     *
-     * @param openId 微信OpenId
-     * @param order  命令
-     * @return String
-     */
-    public String musicFunction(String openId, String order) {
-        String resultMsg;
-        if ("0".equals(baseRedisService.getString(openId + "_two"))) {
-            if ("1".equals(order)) {
-                //1.已下载音乐查询
-                resultMsg = "请输入要查询的歌手,歌曲或专辑名称,支持模糊查询,默认返回5条数据";
-                baseRedisService.setString(openId + "_two", "1");
-            } else if ("2".equals(order)) {
-                //2.待下载音乐记录
-                resultMsg = "请输入要下载的音乐名称,默认为音乐,建议输入(歌手-歌名)以保证正确性,专辑请输入(专辑 歌手-专辑名),歌手请输入(歌手 歌手名)";
-                baseRedisService.setString(openId + "_two", "2");
-            } else {
-                resultMsg = "暂无此功能~";
-                baseRedisService.setString(openId + "_two", "0");
-            }
-        } else {
-            if ("1".equals(baseRedisService.getString(openId + "_two"))) {
-                //1.已下载音乐查询
-                resultMsg = weChatMusic.getLocalMusic(order);
-            } else if ("2".equals(baseRedisService.getString(openId + "_two"))) {
-                //2.待下载音乐记录
-                resultMsg = weChatMusic.recordMusic(order);
-            } else {
-                resultMsg = "暂无此功能~";
-                baseRedisService.setString(openId + "_two", "0");
-            }
-        }
-        return resultMsg;
-    }
-
-    /**
-     * 游戏
-     * 1.成语接龙, 2.1A2B
-     *
-     * @param openId 微信OpenId
-     * @param order  命令
-     * @return String
-     */
-    public String gameFunction(String openId, String order) {
-        String resultMsg;
-        if ("0".equals(baseRedisService.getString(openId + "_two"))) {
-            if ("1".equals(order)) {
-                //1.成语接龙
-                resultMsg = "由小葵花先出哦~ 第一个成语是: ";
-                baseRedisService.setString(openId + "_two", "1");
-            } else if ("2".equals(order)) {
-                //2.1A2B
-                resultMsg = "请输入数字, 根据数字位数决定答案为数~";
-                baseRedisService.setString(openId + "_two", "2");
-            } else {
-                resultMsg = "暂无此功能~";
-                baseRedisService.setString(openId + "_two", "0");
-            }
-        } else {
-            if ("1".equals(baseRedisService.getString(openId + "_two"))) {
-                //1.成语接龙
-                resultMsg = weChatGame.idiom(openId, order);
-            } else if ("2".equals(baseRedisService.getString(openId + "_two"))) {
-                //2.1A2B
-                resultMsg = weChatGame.oneATwoB(openId, order);
-            } else {
-                resultMsg = "暂无此功能~";
-                baseRedisService.setString(openId + "_two", "0");
-            }
-        }
-        return resultMsg;
-    }
-
-    /**
-     * 消息推送
-     *
-     * @param openId 微信OpenId
-     * @param order  命令
-     * @return String
-     */
-    public String msgFunction(String openId, String order) {
-        String resultMsg;
-        if ("0".equals(baseRedisService.getString(openId + "_two"))) {
-            if ("1".equals(order)) {
-                //1.绑定App
-                resultMsg = weChatMsg.bindApp(openId);
-                baseRedisService.setString(openId + "_two", "1");
-            } else if ("2".equals(order)) {
-                //2.查看绑定的设备
-                resultMsg = weChatMsg.getBindDevice(openId);
-                baseRedisService.setString(openId + "_two", "2");
-            } else if ("3".equals(order)) {
-                //3.消息推送
-                resultMsg = "请输入要推送的待办消息, 默认推送到所有设备, 若要指定设备请用(设备名(空格)消息)格式推送";
-                baseRedisService.setString(openId + "_two", "3");
-            } else {
-                resultMsg = "暂无此功能~";
-                baseRedisService.setString(openId + "_two", "0");
-            }
-        } else {
-            if ("3".equals(baseRedisService.getString(openId + "_two"))) {
-                //3.消息推送
-                resultMsg = weChatMsg.sendMsg(openId, order);
-            } else {
-                resultMsg = "暂无此功能~";
-                baseRedisService.setString(openId + "_two", "0");
-            }
-        }
-        return resultMsg;
-    }
-
-}

+ 0 - 110
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatMsg.java

@@ -1,110 +0,0 @@
-package cc.xiaokuihua.wechat.main;
-
-import cc.xiaokuihua.entity.device.entity.MsgPushLog;
-import cc.xiaokuihua.entity.device.entity.UserBindDeviceInfo;
-import cc.xiaokuihua.entity.device.service.DeviceInfoService;
-import cc.xiaokuihua.entity.device.service.MsgPushLogService;
-import cc.xiaokuihua.wechat.util.QueueUtil;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * 消息功能
- *
- * @author ssk
- * @version 1.0
- * @date 2023/3/25 14:34
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class WeChatMsg {
-
-    private final DeviceInfoService deviceInfoService;
-
-    private final MsgPushLogService msgPushLogService;
-
-    private final QueueUtil queueUtil;
-
-    /**
-     * 绑定App
-     *
-     * @param openId 微信OpenId
-     * @return url
-     */
-    public String bindApp(String openId) {
-        return "https://xiaokuihua.cc/wechat?openId=" + openId;
-    }
-
-    /**
-     * 获取绑定设备
-     *
-     * @param openId 微信OpenId
-     * @return 设备列表
-     */
-    public String getBindDevice(String openId) {
-        List<UserBindDeviceInfo> userBindInfo = deviceInfoService.getUserBindInfo(openId, null, null);
-        StringBuilder sb = new StringBuilder();
-        for (UserBindDeviceInfo userBindDeviceInfo : userBindInfo) {
-            sb.append(userBindDeviceInfo.getDeviceName()).append(",");
-        }
-        //去除最后一个逗号
-        return sb.substring(0, sb.length() - 1);
-    }
-
-    /**
-     * 消息推送
-     *
-     * @param openId 微信OpenId
-     * @param order  命令
-     * @return 推送结果
-     */
-    public String sendMsg(String openId, String order) {
-        if (order != null && !order.isEmpty()) {
-            if (order.contains(" ")) {
-                order = order.replaceAll("\\s+", ",");
-            }
-            //根据设备别名和openid查询设备是否存在
-            String[] split = order.split(",");
-            List<UserBindDeviceInfo> userBindInfo = deviceInfoService.getUserBindInfo(openId, split[0], null);
-            for (UserBindDeviceInfo userBindDeviceInfo : userBindInfo) {
-                MsgPushLog msgPushLog = new MsgPushLog();
-                msgPushLog.setUserId(userBindDeviceInfo.getUserId());
-                msgPushLog.setDeviceId(userBindDeviceInfo.getId());
-                msgPushLog.setMsgContent(split[1]);
-                msgPushLog.setCreatedUserId(userBindDeviceInfo.getUserId());
-                saveMsgLog(msgPushLog);
-            }
-            String exchangeName = "Msg.direct";
-            String routingKey = "TODO_MSG";
-            String msgContent = openId + "," + order;
-            if (split.length == 1) {
-                //发送到所有设备
-                return queueUtil.sendToMQ(exchangeName, routingKey, msgContent);
-            } else if (split.length == 2) {
-                //发送到指定设备
-                if (!userBindInfo.isEmpty()) {
-                    //发送示例: {openid,别名,消息内容}或者{openid,消息内容}
-                    return queueUtil.sendToMQ(exchangeName, routingKey, msgContent);
-                }
-                return "该设备不存在, 请检查名称后重试";
-            }
-            return "请检查消息后重试";
-        } else {
-            return "请检查消息后重试";
-        }
-    }
-
-    /**
-     * 保存消息
-     *
-     * @param msgPushLog 消息记录
-     */
-    private void saveMsgLog(MsgPushLog msgPushLog) {
-        msgPushLogService.save(msgPushLog);
-    }
-
-}

+ 0 - 60
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatMusic.java

@@ -1,60 +0,0 @@
-package cc.xiaokuihua.wechat.main;
-
-import cc.xiaokuihua.wechat.feign.MusicFeign;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-/**
- * 音乐功能
- *
- * @author ssk
- * @version 1.0
- * @date 2022/12/5 13:32
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class WeChatMusic {
-
-    private final MusicFeign musicFeign;
-
-    /**
-     * 查询本地音乐
-     *
-     * @param param 查询参数
-     * @return String
-     */
-    public String getLocalMusic(String param) {
-        StringBuilder msg = new StringBuilder();
-        JSONObject jsonObject = musicFeign.getLocalMusic(param);
-        JSONArray data = jsonObject.getJSONArray("data");
-        if (data.isEmpty()) {
-            msg.append("暂无数据");
-        } else {
-            for (int i = 0; i < data.size(); i++) {
-                msg.append("歌手: ").append(data.getJSONObject(i).getString("artist")).append("\n");
-                msg.append("曲名: ").append(data.getJSONObject(i).getString("title")).append("\n");
-                msg.append("专辑: ").append(data.getJSONObject(i).getString("album")).append("\n");
-                if (data.size() > i + 1) {
-                    msg.append("----------------------------------------\n");
-                }
-            }
-        }
-        return msg.toString();
-    }
-
-    /**
-     * 待下载音乐记录
-     *
-     * @param param 参数
-     * @return String
-     */
-    public String recordMusic(String param) {
-        JSONObject jsonObject = musicFeign.recordMusic(param);
-        return jsonObject.getString("msg");
-    }
-
-}

+ 0 - 127
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatVideo.java

@@ -1,127 +0,0 @@
-package cc.xiaokuihua.wechat.main;
-
-import cc.xiaokuihua.util.url.UrlUtils;
-import cc.xiaokuihua.wechat.feign.AnalysisFeign;
-import cc.xiaokuihua.wechat.util.QueueUtil;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-/**
- * 视频功能
- *
- * @author ssk
- * @version 1.0
- * @date 2022/11/7 14:52
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class WeChatVideo {
-
-    private final AnalysisFeign analysisFeign;
-
-    private final QueueUtil queueUtil;
-
-    /**
-     * MQ异步解析单条数据
-     *
-     * @param link 链接
-     * @return 解析结果
-     */
-    public String analysisOneVideoToMQ(String link) {
-        try {
-            //解析链接
-            String url = UrlUtils.getUrl(link);
-            if (url == null || "null".equals(url) || !url.contains("douyin")) {
-                return "请输入正确的链接哦~";
-            }
-            if (!link.contains("https://v.douyin.com")) {
-                return queueUtil.MQResultMsg(3);
-            }
-            String exchangeName = "Douyin.direct";
-            String routingKey = "Analysis_One_To_Nas";
-            return queueUtil.sendToMQ(exchangeName, routingKey, url);
-        } catch (Exception e) {
-            log.error("analysisOneVideoToMQ fail INFO: {}", e.getMessage());
-            return queueUtil.MQResultMsg(2);
-        }
-    }
-
-    /**
-     * 解析用户主页数据
-     *
-     * @param link 链接
-     * @return 解析结果
-     */
-    public String analysisUserHomePageToMQ(String link) {
-        try {
-            if (!link.contains("https://www.douyin.com/aweme/v1/web")) {
-                return queueUtil.MQResultMsg(3);
-            }
-            String exchangeName = "Douyin.direct";
-            String routingKey = "Analysis_User_HomePage_To_Nas";
-            return queueUtil.sendToMQ(exchangeName, routingKey, link);
-        } catch (Exception e) {
-            log.error("analysisUserHomePageToMQ fail INFO: {}", e.getMessage());
-            return queueUtil.MQResultMsg(2);
-        }
-    }
-
-    /**
-     * 解析单条数据
-     *
-     * @param link 链接
-     * @return 解析结果
-     */
-    public String analysisOne(String link) {
-        //解析链接
-        String url = UrlUtils.getUrl(link);
-        String msg = "";
-        JSONObject jsonObject = analysisFeign.analysisOne(url);
-        if (null != jsonObject) {
-            msg = jsonObject.get("msg").toString();
-        }
-        return msg;
-    }
-
-    /**
-     * 解析用户主页数据
-     *
-     * @param link 链接
-     * @return 解析结果
-     */
-    public String analysisUserHomePageDouyinHubApi(String link) {
-        //解析链接
-        String url = UrlUtils.getUrl(link);
-        String msg = "";
-        JSONObject jsonObject = analysisFeign.analysisUserHomePageDouyinHubApi(url);
-        if (null != jsonObject) {
-            msg = jsonObject.get("msg").toString();
-        }
-        return msg;
-    }
-
-    /**
-     * 解析记录
-     *
-     * @return 解析结果
-     */
-    public String analysisLog() {
-        StringBuilder msg = new StringBuilder();
-        JSONObject jsonObject = analysisFeign.analysisLog();
-        JSONArray data = jsonObject.getJSONArray("data");
-        for (int i = 0; i < data.size(); i++) {
-            msg.append("类型: ").append(data.getJSONObject(i).getString("type")).append("\n");
-            msg.append("标题: ").append(data.getJSONObject(i).getString("title")).append("\n");
-            msg.append("链接: ").append(data.getJSONObject(i).getString("link")).append("\n");
-            if (data.size() > i + 1) {
-                msg.append("----------------------------------------\n");
-            }
-        }
-        return msg.toString();
-    }
-
-}

+ 0 - 121
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/main/WeChatWeather.java

@@ -1,121 +0,0 @@
-package cc.xiaokuihua.wechat.main;
-
-import cc.xiaokuihua.util.string.StringUtil;
-import cc.xiaokuihua.wechat.feign.ApiFeign;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.Arrays;
-
-/**
- * 天气功能
- *
- * @author ssk
- * @version 1.0
- * @date 2022/11/9 20:12
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class WeChatWeather {
-
-    private final ApiFeign apiFeign;
-
-    /**
-     * 今日天气
-     *
-     * @param cityName 城市
-     * @return msg
-     */
-    public String todayWeather(String cityName) {
-        StringBuilder msg = new StringBuilder();
-        msg.append("--------今天天气--------\n");
-        JSONObject geo = apiFeign.geo(cityName);
-        JSONObject geoJson = geo.getJSONObject("data").getJSONArray("geocodes").getJSONObject(0);
-        if (geoJson != null) {
-            JSONObject weatherJson = apiFeign.todayWeather(geoJson.getString("adcode"), "base");
-            JSONObject data = weatherJson.getJSONObject("data");
-            if (null != data) {
-                msg.append("城市: ").append(cityName).append("\n");
-                msg.append("天气: ").append(data.getString("weather")).append("\n");
-                msg.append("风向: ").append(data.getString("winddirection")).append("\n");
-                msg.append("风力: ").append(data.getString("windpower")).append("风").append("\n");
-                msg.append("温度: ").append(data.getString("temperature")).append("℃").append("\n");
-                msg.append("湿度: ").append(data.getString("humidity")).append("%").append("\n");
-                return msg.toString();
-            } else {
-                return "获取天气失败";
-            }
-        } else {
-            return "未找到该区域, 请重新输入";
-        }
-    }
-
-    /**
-     * 今日及未来天气
-     *
-     * @param cityName 城市
-     * @return msg
-     */
-    public String futureWeather(String cityName) {
-        StringBuilder msg = new StringBuilder();
-        msg
-                .append("------")
-                .append(cityName)
-                .append("\t")
-                .append("今天及未来天气------\n");
-        JSONObject geo = apiFeign.geo(cityName);
-        JSONObject geoJson = geo.getJSONObject("data").getJSONArray("geocodes").getJSONObject(0);
-        if (geoJson != null) {
-            JSONObject weatherJson = apiFeign.todayWeather(geoJson.getString("adcode"), "all");
-            JSONObject data = weatherJson.getJSONObject("data");
-            if (null != data) {
-                JSONArray casts = data.getJSONArray("casts");
-                for (int i = 0; i < casts.size(); i++) {
-                    JSONObject one = casts.getJSONObject(i);
-                    msg.append(one.getString("date")).append(" 星期").append(StringUtil.weekNumToChar(one.getString("week"))).append("\n");
-                    msg.append("\t白天:").append("\t")
-                            .append(one.getString("dayweather")).append("\t")
-                            .append(one.getString("daytemp")).append("℃").append("\t")
-                            .append(one.getString("daywind")).append("风").append("\t")
-                            .append(one.getString("daypower")).append("级").append("\n");
-                    msg.append("\t夜间:").append("\t")
-                            .append(one.getString("nightweather")).append("\t")
-                            .append(one.getString("nighttemp")).append("℃").append("\t")
-                            .append(one.getString("nightwind")).append("风").append("\t")
-                            .append(one.getString("nightpower")).append("级").append("\n");
-                    if (casts.size() > i + 1) {
-                        msg.append("----------------------------------------\n");
-                    }
-                }
-                return msg.toString();
-            } else {
-                return "获取天气失败";
-            }
-        } else {
-            return "未找到该区域, 请重新输入";
-        }
-    }
-
-    /**
-     * 中文转浏览器编码
-     *
-     * @param str 中文
-     * @return
-     */
-    public String URLEncoder(String str) {
-        String encode = null;
-        try {
-            encode = URLEncoder.encode(str, "UTF-8");
-        } catch (UnsupportedEncodingException e) {
-            log.error(Arrays.toString(e.getStackTrace()));
-        }
-        return encode;
-    }
-
-}

+ 0 - 21
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/AnalysisLogService.java

@@ -1,21 +0,0 @@
-package cc.xiaokuihua.wechat.service;
-
-/**
- * 解析记录Service
- *
- * @author ssk
- * @version 1.0
- * @date 2022/10/31 14:19
- */
-public interface AnalysisLogService {
-
-    /**
-     * 根据链接和id查询
-     *
-     * @param url    链接
-     * @param itemId 项目id
-     * @return int
-     */
-    int selectByUrlAndItemId(String url, String itemId);
-
-}

+ 0 - 58
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/MiniProgramService.java

@@ -1,58 +0,0 @@
-package cc.xiaokuihua.wechat.service;
-
-import cc.xiaokuihua.entity.device.entity.MsgWechatUserInfo;
-import com.alibaba.fastjson.JSONObject;
-
-/**
- * 微信小程序Service
- *
- * @author ssk
- * @version 1.0
- * @date 2024/5/27 10:13
- */
-public interface MiniProgramService {
-
-    /**
-     * 根据openId获取用户信息
-     *
-     * @param openId 微信小程序openId
-     * @return MsgWechatUserInfo
-     */
-    MsgWechatUserInfo getUserInfo(String openId);
-
-    /**
-     * 添加用户
-     *
-     * @param msgWechatUserInfo 用户信息
-     * @return boolean
-     */
-    int addUser(MsgWechatUserInfo msgWechatUserInfo);
-
-    /**
-     * 发送设备待办消息
-     *
-     * @param openId     小程序openId
-     * @param deviceId   设备主键
-     * @param msgContent 消息内容
-     * @return String
-     */
-    String sendDeviceTodoMsg(String openId, String deviceId, String msgContent);
-
-    /**
-     * 设置定时提醒消息
-     *
-     * @param openId     小程序openId
-     * @param time       推送时间
-     * @param msgContent 消息内容
-     * @return String
-     */
-    String setRemindMsg(String openId, String time, String msgContent);
-
-    /**
-     * 获取openId
-     *
-     * @param code 微信code
-     * @return JSONObject
-     */
-    JSONObject getOpenId(String code);
-}

+ 0 - 21
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/WeChatFerryService.java

@@ -1,21 +0,0 @@
-package cc.xiaokuihua.wechat.service;
-
-import java.util.Map;
-
-/**
- * WeChatFerryService
- *
- * @author ssk
- * @version 1.0
- * @date 2024/10/12 13:37
- */
-public interface WeChatFerryService {
-
-    /**
-     * WeChatFerry回调接口
-     *
-     * @param map 回调参数
-     * @return boolean
-     */
-    boolean getMsg(Map<String, String> map);
-}

+ 0 - 68
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/WeChatService.java

@@ -1,68 +0,0 @@
-package cc.xiaokuihua.wechat.service;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.Map;
-
-/**
- * Wechat服务
- *
- * @author ssk
- * @version 1.0
- * @date 2022/11/4 17:28
- */
-public interface WeChatService {
-
-    /**
-     * 用于获取微信消息等
-     *
-     * @param request 请求
-     * @return String
-     */
-    String getMessage(HttpServletRequest request);
-
-    /**
-     * 用于验证服务器
-     *
-     * @param request  请求
-     * @param response 响应
-     */
-    void checkServer(HttpServletRequest request, HttpServletResponse response);
-
-    /**
-     * 菜单测试
-     *
-     * @param str 指令
-     * @return String
-     */
-    String getMessageTest(String str);
-
-    /**
-     * 获取微信AccessToken
-     *
-     * @return token
-     */
-    String getAccessToken();
-
-    /**
-     * 获取微信JsapiTicket
-     *
-     * @return JsapiTicket
-     */
-    String getJsapiTicket();
-
-    /**
-     * 获取微信js配置信息
-     *
-     * @param url 访问url
-     * @return map
-     */
-    Map<String, Object> getWeChatConfig(String url);
-
-    /**
-     * 设置菜单
-     *
-     * @return boolean
-     */
-    boolean setMenu();
-}

+ 0 - 36
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/impl/AnalysisLogServiceImpl.java

@@ -1,36 +0,0 @@
-package cc.xiaokuihua.wechat.service.impl;
-
-import cc.xiaokuihua.entity.analysis.entity.AnalysisLog;
-import cc.xiaokuihua.entity.analysis.mapper.AnalysisLogMapper;
-import cc.xiaokuihua.wechat.service.AnalysisLogService;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-/**
- * 解析记录ServiceImpl
- *
- * @author ssk
- * @version 1.0
- * @date 2022/10/31 14:19
- */
-@Slf4j
-@Service
-public class AnalysisLogServiceImpl extends ServiceImpl<AnalysisLogMapper, AnalysisLog> implements AnalysisLogService {
-
-    /**
-     * 根据链接和id查询
-     *
-     * @param url    链接
-     * @param itemId 项目id
-     * @return int
-     */
-    @Override
-    public int selectByUrlAndItemId(String url, String itemId) {
-        QueryWrapper<AnalysisLog> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("link", url).or().eq("item_id", itemId);
-        return this.count(queryWrapper);
-    }
-
-}

+ 0 - 186
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/impl/MiniProgramServiceImpl.java

@@ -1,186 +0,0 @@
-package cc.xiaokuihua.wechat.service.impl;
-
-import cc.xiaokuihua.entity.device.entity.DeviceInfo;
-import cc.xiaokuihua.entity.device.entity.MsgPushLog;
-import cc.xiaokuihua.entity.device.entity.MsgWechatUserInfo;
-import cc.xiaokuihua.entity.device.entity.UserBindDeviceInfo;
-import cc.xiaokuihua.entity.device.mapper.MsgWechatUserInfoMapper;
-import cc.xiaokuihua.entity.device.service.DeviceInfoService;
-import cc.xiaokuihua.entity.device.service.MsgPushLogService;
-import cc.xiaokuihua.entity.msg.wechat.entity.MsgTimedRemind;
-import cc.xiaokuihua.entity.msg.wechat.mapper.MsgTimedRemindMapper;
-import cc.xiaokuihua.util.date.DateUtils;
-import cc.xiaokuihua.wechat.feign.WeChatFeign;
-import cc.xiaokuihua.wechat.service.MiniProgramService;
-import cc.xiaokuihua.wechat.util.QueueUtil;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-
-/**
- * 微信小程序ServiceImpl
- *
- * @author ssk
- * @version 1.0
- * @date 2024/5/27 10:14
- */
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class MiniProgramServiceImpl implements MiniProgramService {
-
-    private final MsgWechatUserInfoMapper msgWechatUserInfoMapper;
-
-    private final DeviceInfoService deviceInfoService;
-
-    private final MsgPushLogService msgPushLogService;
-
-    private final MsgTimedRemindMapper msgTimedRemindMapper;
-
-    private final QueueUtil queueUtil;
-
-    private final WeChatFeign weChatFeign;
-
-    @Value("${wechat.miniProgram.appId}")
-    private String miniProgramAppId;
-
-    @Value("${wechat.miniProgram.secret}")
-    private String miniProgramSecret;
-
-    /**
-     * 根据openId获取用户信息
-     *
-     * @param openId 微信小程序openId
-     * @return MsgWechatUserInfo
-     */
-    @Override
-    public MsgWechatUserInfo getUserInfo(String openId) {
-        LambdaQueryWrapper<MsgWechatUserInfo> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(MsgWechatUserInfo::getOpenId, openId);
-        return msgWechatUserInfoMapper.selectOne(wrapper);
-    }
-
-    /**
-     * 添加用户
-     *
-     * @param msgWechatUserInfo 用户信息
-     * @return boolean
-     */
-    @Override
-    public int addUser(MsgWechatUserInfo msgWechatUserInfo) {
-        //存在和新增成功都返回1
-        LambdaQueryWrapper<MsgWechatUserInfo> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(MsgWechatUserInfo::getOpenId, msgWechatUserInfo.getOpenId());
-        List<MsgWechatUserInfo> msgWechatUserInfos = msgWechatUserInfoMapper.selectList(queryWrapper);
-        if (!msgWechatUserInfos.isEmpty()) {
-            return 1;
-        } else {
-            return msgWechatUserInfoMapper.insert(msgWechatUserInfo);
-        }
-    }
-
-    /**
-     * 发送设备待办消息
-     *
-     * @param openId     小程序openId
-     * @param deviceId   设备主键
-     * @param msgContent 消息内容
-     * @return String
-     */
-    @Override
-    public String sendDeviceTodoMsg(String openId, String deviceId, String msgContent) {
-        try {
-            String deviceName;
-            if ("0".equals(deviceId)) {
-                deviceName = null;
-                deviceId = null;
-            } else {
-                DeviceInfo deviceInfo = new DeviceInfo();
-                deviceInfo.setId(Integer.parseInt(deviceId));
-                DeviceInfo oneDevice = deviceInfoService.getOneDevice(deviceInfo);
-                deviceName = oneDevice.getDeviceName();
-                //改为设备id
-                deviceId = oneDevice.getDeviceId();
-            }
-            //关联用户信息
-            List<UserBindDeviceInfo> userBindInfo = deviceInfoService.getUserBindInfo(openId, deviceName, deviceId);
-            //发送一个或多个消息
-            for (UserBindDeviceInfo userBindDeviceInfo : userBindInfo) {
-                MsgPushLog msgPushLog = new MsgPushLog();
-                msgPushLog.setUserId(userBindDeviceInfo.getUserId());
-                msgPushLog.setDeviceId(userBindDeviceInfo.getId());
-                msgPushLog.setMsgContent(msgContent);
-                msgPushLog.setCreatedUserId(userBindDeviceInfo.getUserId());
-                msgPushLogService.save(msgPushLog);
-                String exchangeName = "Msg.direct";
-                String routingKey = "TODO_MSG";
-                //设备客户端id, 消息内容, 消息主键
-                String content = userBindDeviceInfo.getClientId() + "," + msgContent + "," + msgPushLog.getId();
-                queueUtil.sendToMQ(exchangeName, routingKey, content);
-            }
-            return "已加入解析队列, 请稍后查看~";
-        } catch (Exception e) {
-            log.error("MiniProgramServiceImpl ERROR : {}", e.getMessage());
-            return "发送失败, 请重试或联系管理员~";
-        }
-    }
-
-    /**
-     * 设置定时提醒消息
-     *
-     * @param openId     小程序openId
-     * @param time       推送时间
-     * @param msgContent 消息内容
-     * @return String
-     */
-    @Override
-    public String setRemindMsg(String openId, String time, String msgContent) {
-        try {
-            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-            Date date = simpleDateFormat.parse(time);
-            //当前时间大于设置时间
-            if (DateUtils.dateCompare(new Date(), date)) {
-                return "提醒时间不能小于当前时间哦~";
-            }
-        } catch (ParseException e) {
-            throw new RuntimeException(e);
-        }
-        LambdaQueryWrapper<MsgWechatUserInfo> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(MsgWechatUserInfo::getOpenId, openId);
-        MsgWechatUserInfo msgWechatUserInfo = msgWechatUserInfoMapper.selectOne(wrapper);
-        if (null == msgWechatUserInfo || StringUtils.isEmpty(msgWechatUserInfo.getWechatUid())) {
-            return "未获取到微信号, 请确保在管理端设置个人信息并添加可莉为好友";
-        }
-        MsgTimedRemind message = new MsgTimedRemind();
-        message.setOpenId(openId);
-        message.setRemindTime(time);
-        message.setRemindContent(msgContent);
-        message.setReceiveUser(msgWechatUserInfo.getWechatUid());
-        if (msgTimedRemindMapper.insert(message) > 0) {
-            return "设置成功~";
-        }
-        return "设置失败, 请重试或联系管理员";
-    }
-
-    /**
-     * 获取openId
-     *
-     * @param code 微信code
-     * @return JSONObject
-     */
-    @Override
-    public JSONObject getOpenId(String code) {
-        String authorizationCode = weChatFeign.getOpenId(miniProgramAppId, miniProgramSecret, code, "authorization_code");
-        return JSONObject.parseObject(authorizationCode);
-    }
-
-}

+ 0 - 260
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/impl/WeChatFerryServiceImpl.java

@@ -1,260 +0,0 @@
-package cc.xiaokuihua.wechat.service.impl;
-
-import shop.alien.config.redis.BaseRedisService;
-import cc.xiaokuihua.wechat.config.NacosConfig;
-import cc.xiaokuihua.wechat.feign.BotFeign;
-import cc.xiaokuihua.wechat.feign.WeChatFerryFeign;
-import cc.xiaokuihua.wechat.service.WeChatFerryService;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.*;
-
-/**
- * WeChatFerryServiceImpl
- *
- * @author ssk
- * @version 1.0
- * @date 2024/10/12 13:37
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WeChatFerryServiceImpl implements WeChatFerryService {
-
-    private final BotFeign botFeign;
-
-    private final WeChatFerryFeign weChatFerryFeign;
-
-    private final BaseRedisService baseRedisService;
-
-    private final NacosConfig nacosConfig;
-
-    /**
-     * 公用定时器
-     */
-    private Timer timerOne;
-
-    private Timer timerTwo;
-
-    /**
-     * WeChatFerry回调接口
-     *
-     * @param map 回调参数
-     * @return boolean
-     */
-    @Override
-    public boolean getMsg(Map<String, String> map) {
-        log.info("收到消息: " + map);
-        String chatId = map.get("roomId");
-        String userId = map.get("sender");
-        //收到了消息
-        if (!map.isEmpty()) {
-            Map<String, Object> resultMap = new HashMap<>();
-            //判断消息来源
-            if ("true".equals(map.get("isGroup"))) {
-                String content = map.get("content");
-                //群聊
-                String contentMap = map.get("content");
-                if (contentMap.contains(" ")) {
-                    String[] contentSplit = contentMap.split(" ");
-                    //取艾特后的内容
-                    if (contentSplit.length < 2) {
-                        content = "";
-                    } else {
-                        content = contentSplit[1];
-                    }
-                }
-                String gameModelStatus = baseRedisService.getString(chatId + "_game_model");
-                if (gameModelStatus == null) {
-                    gameModelStatus = "false";
-                }
-                //判断是否@我 || 游戏模式
-                if ("true".equals(map.get("isAtMe")) || "true".equals(gameModelStatus)) {
-                    //拿到消息后, 去机器人服务处理
-                    JSONObject data = botFeign.getResult(chatId, userId, content);
-                    String botMsg = data.getString("data");
-                    if (null != botMsg && !botMsg.isEmpty()) {
-                        Map<String, Object> getGroupListMap = new HashMap<>();
-                        getGroupListMap.put("groupNo", chatId);
-                        //获取群员信息
-                        JSONObject getGroupListJson = weChatFerryFeign.listGroupMember(getGroupListMap);
-                        JSONArray getGroupListArray = getGroupListJson.getJSONArray("data");
-                        String atUserName = "";
-                        for (int i = 0; i < getGroupListArray.size(); i++) {
-                            JSONObject jsonObject = getGroupListArray.getJSONObject(i);
-                            String weChatUid = jsonObject.getString("weChatUid");
-                            if (weChatUid.equals(map.get("sender"))) {
-                                atUserName = jsonObject.getString("groupNickName");
-                            }
-                        }
-                        List<String> atList = new ArrayList<>();
-                        atList.add(map.get("sender"));
-                        String dataStr = data.getString("data");
-                        if (dataStr.contains("[")) {
-                            resultMap.put("msgText", "21点~\t游戏结束~\n" + twentyPointResult(getGroupListArray, dataStr));
-                            resultMap.put("atUsers", new ArrayList<>());
-                        } else {
-                            resultMap.put("msgText", "@" + atUserName + "\n" + data.getString("data"));
-                            resultMap.put("atUsers", atList);
-                        }
-                        resultMap.put("recipient", chatId);
-                        resultMap.put("isAtAll", false);
-                        JSONObject jsonObject = weChatFerryFeign.sendTextMsg(resultMap);
-                        //取消所有定时
-                        if (null != timerOne) {
-                            timerOne.cancel();
-                        }
-                        if (null != timerTwo) {
-                            timerTwo.cancel();
-                        }
-                        //判断是否为游戏模式
-                        if ("true".equals(baseRedisService.getString(chatId + "_game_model"))) {
-                            //创建定时器
-                            Map<String, Object> timerMap = new HashMap<>();
-                            timerMap.put("recipient", chatId);
-                            timerMap.put("isAtAll", false);
-                            timerMap.put("atUsers", new ArrayList<>());
-                            timerOne = new Timer();
-                            getGameStatus(timerOne, timerMap);
-                        }
-                        return 200 == jsonObject.getInteger("code");
-                    }
-                    return true;
-                }
-            } else {
-                //私聊或其他
-                //拿到消息后, 去机器人服务处理
-                JSONObject data = botFeign.getResult(chatId, userId, map.get("content"));
-                resultMap.put("recipient", chatId);
-                resultMap.put("msgText", data.getString("data"));
-                JSONObject jsonObject = weChatFerryFeign.sendTextMsg(resultMap);
-                //取消所有定时
-                if (null != timerOne) {
-                    timerOne.cancel();
-                }
-                if (null != timerTwo) {
-                    timerTwo.cancel();
-                }
-                //判断是否为游戏模式
-                if ("true".equals(baseRedisService.getString(chatId + "_game_model"))) {
-                    //创建定时器
-                    Map<String, Object> timerMap = new HashMap<>();
-                    timerMap.put("recipient", chatId);
-                    timerMap.put("isAtAll", false);
-                    timerMap.put("atUsers", new ArrayList<>());
-                    timerOne = new Timer();
-                    getGameStatus(timerOne, timerMap);
-                }
-                return 200 == jsonObject.getInteger("code");
-            }
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * 获取游戏状态,并定时30s
-     *
-     * @param timer     定时器
-     * @param resultMap 消息内容
-     */
-    private void getGameStatus(Timer timer, Map<String, Object> resultMap) {
-        log.info("游戏模式, 开始定时30s");
-        timer.schedule(new TimerTask() {
-            public void run() {
-                //定时取消
-                timer.cancel();
-                //重新定时并发送
-                timerTwo = new Timer();
-                createTimer(timerTwo, resultMap);
-            }
-        }, nacosConfig.getWaitSecond() * 1000);
-    }
-
-    /**
-     * 创建定时器
-     *
-     * @param timer     定时器
-     * @param resultMap 消息内容
-     */
-    private void createTimer(Timer timer, Map<String, Object> resultMap) {
-        log.info("游戏模式, 发送结束提醒, " + nacosConfig.getWaitSecond() + "秒后退出");
-        String chatId = resultMap.get("recipient").toString();
-        //发送定时提醒
-        resultMap.put("msgText", "还剩" + nacosConfig.getWaitSecond() + "秒, 请积极参与哦~");
-        sendMsg(resultMap);
-        timer.schedule(new TimerTask() {
-            public void run() {
-                String gameName = baseRedisService.getString(chatId + "_game");
-                if ("1a2b".equals(gameName)) {
-                    List<String> oneA2bAnswer = baseRedisService.getList(chatId + "_1a2b_answer");
-                    StringBuilder answer = new StringBuilder();
-                    for (String s : oneA2bAnswer) {
-                        answer.append(s);
-                    }
-                    resultMap.put("msgText", "1A2B\n都猜不到喽~\n答案是➡" + answer + "⬅\n游戏结束~");
-                } else if ("idiom".equals(gameName)) {
-                    List<String> history = baseRedisService.getList(chatId + "_idiom_history");
-                    resultMap.put("msgText", "成语接龙\n➡" + history.get(history.size() - 1) + "⬅接龙失败~\n游戏结束~");
-                } else {
-                    resultMap.put("msgText", "无人参与~ 游戏结束~");
-                }
-                //发送游戏结束, 并取消定时
-                sendMsg(resultMap);
-                timer.cancel();
-                //清除游戏模式
-                baseRedisService.delete(chatId + "_two");
-                baseRedisService.setString(chatId + "_one", "menu");
-                baseRedisService.setString(chatId + "_game_model", "false");
-            }
-        }, nacosConfig.getWaitSecond() * 1000);
-    }
-
-    /**
-     * 发送游戏结束通知
-     *
-     * @param resultMap 消息内容
-     */
-    public void sendMsg(Map<String, Object> resultMap) {
-        weChatFerryFeign.sendTextMsg(resultMap);
-    }
-
-    /**
-     * 21点游戏结果
-     *
-     * @param getGroupListArray 群成员
-     * @param msg               21点结果
-     * @return 加群成员后的结果
-     */
-    private String twentyPointResult(JSONArray getGroupListArray, String msg) {
-        StringBuilder stringBuilder = new StringBuilder();
-        stringBuilder.append("游戏结束~\n");
-        //游戏结果
-        msg = msg.substring(1, msg.length() - 1);
-        String[] split = msg.split(", ");
-        for (int i = 0; i < split.length; i++) {
-            String a = split[i];
-            for (int i1 = 0; i1 < getGroupListArray.size(); i1++) {
-                JSONObject jsonObject = getGroupListArray.getJSONObject(i1);
-                String weChatUid = jsonObject.getString("weChatUid");
-                if (a.contains(weChatUid)) {
-                    stringBuilder.append("第")
-                            .append(i + 1)
-                            .append("名:\t")
-                            .append(jsonObject.getString("groupNickName"))
-                            .append("\t")
-                            .append(a.substring(a.indexOf("=") + 1))
-                            .append("点")
-                            .append("\n");
-                }
-            }
-        }
-        return stringBuilder.substring(0, stringBuilder.length());
-    }
-
-}

+ 0 - 284
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/service/impl/WeChatServiceImpl.java

@@ -1,284 +0,0 @@
-package cc.xiaokuihua.wechat.service.impl;
-
-import shop.alien.config.redis.BaseRedisService;
-import cc.xiaokuihua.util.httpsend.apache.HttpPostRequestUtil;
-import cc.xiaokuihua.wechat.feign.WeChatFeign;
-import cc.xiaokuihua.wechat.main.WeChatJudge;
-import cc.xiaokuihua.wechat.service.WeChatService;
-import cc.xiaokuihua.wechat.util.CheckUtil;
-import cc.xiaokuihua.wechat.util.SHA1Util;
-import cc.xiaokuihua.wechat.util.WeChatUtil;
-import cc.xiaokuihua.wechat.util.WxMessageUtil;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Wechat服务Impl
- *
- * @author ssk
- * @version 1.0
- * @date 2022/11/4 17:28
- */
-@Slf4j
-@Service
-@RequiredArgsConstructor
-public class WeChatServiceImpl implements WeChatService {
-
-    private final CheckUtil checkUtil;
-
-    private final WeChatJudge weChatJudge;
-
-    private final BaseRedisService baseRedisService;
-
-    private final WeChatUtil weChatUtil;
-
-    private final WeChatFeign weChatFeign;
-
-    @Value("${wechat.appId}")
-    private String wechatAppId;
-
-    @Value("${wechat.appSecret}")
-    private String wechatAppSecret;
-
-    /**
-     * 用于获取微信消息等
-     *
-     * @param request 请求
-     * @return String
-     */
-    @Override
-    public String getMessage(HttpServletRequest request) {
-        String message = "success";
-        try {
-            request.setCharacterEncoding("UTF-8");
-            // 把微信返回的xml信息转义成map
-            Map<String, String> xmlMessage = WxMessageUtil.xmlToMap(request);
-            // 这个就是你关注公众号的openId
-            String fromUserName = xmlMessage.get("FromUserName");
-            // 这个是用户微信的id
-//            String toUserName = xmlMessage.get("ToUserName");
-            // 消息类型(event或者text)
-//            String msgType = xmlMessage.get("MsgType");
-            // 消息创建时间 (整型)
-//            String createTime = xmlMessage.get("CreateTime");
-//            log.info("消息来自(公众号的openId)=>" + fromUserName);
-//            log.info("用户微信的id=>" + toUserName);
-//            log.info("消息类型为=>" + msgType);
-//            log.info("消息创建时间 (整型)=>" + createTime);
-            // 如果是事件推送
-            if ("event".equals(xmlMessage.get("MsgType"))) {
-                // 事件类型
-                String eventType = xmlMessage.get("Event");
-                // 如果是订阅消息
-                if ("subscribe".equals(eventType)) {
-                    //设置为初始菜单
-                    baseRedisService.setString(fromUserName + "_one", "menu");
-                    baseRedisService.setString(fromUserName + "_two", "0");
-                    String subscribeContent = "感谢关注~ 默认鹦鹉学舌~ \n发送\"菜单\"开始使用哦~";
-                    return WxMessageUtil.getWxReturnMsg(xmlMessage, subscribeContent);
-                }
-                // 如果是扫码消息
-                if ("SCAN".equals(eventType)) {
-                    String scanContent = "扫码成功";
-                    return WxMessageUtil.getWxReturnMsg(xmlMessage, scanContent);
-                }
-            }
-            // 如果是文本消息推送
-            if ("text".equals(xmlMessage.get("MsgType"))) {
-                // 接收到的消息内容
-                String content = xmlMessage.get("Content");
-                log.info("消息内容: {}", content);
-                //处理消息
-                String order = weChatJudge.getOrder(fromUserName, content);
-                // 将接收到的文本消息变成xml格式再返回
-                return WxMessageUtil.getWxReturnMsg(xmlMessage, order);
-            }
-        } catch (Exception e) {
-            log.error(e.getMessage());
-            return "fail";
-        }
-        return message;
-    }
-
-    /**
-     * 用于验证服务器
-     * 接收微信服务器发送的4个参数并返回echostr
-     *
-     * @param request  请求
-     * @param response 响应
-     */
-    @Override
-    public void checkServer(HttpServletRequest request, HttpServletResponse response) {
-        try {
-            // 为了防止消息乱码
-            request.setCharacterEncoding("UTF-8");
-            response.setCharacterEncoding("UTF-8");
-            // 接收微信服务器以Get请求发送的4个参数
-            String signature = request.getParameter("signature");
-            String timestamp = request.getParameter("timestamp");
-            String nonce = request.getParameter("nonce");
-            String echostr = request.getParameter("echostr");
-//            log.info("signature:{}, timestamp:{}, nonce:{}, echostr:{}", signature, timestamp, nonce, echostr);
-            PrintWriter out = response.getWriter();
-            if (checkUtil.checkSignature(signature, timestamp, nonce)) {
-                // 校验通过,原样返回echostr参数内容
-                out.print(echostr);
-            }
-        } catch (IOException e) {
-            log.error(e.getMessage());
-        }
-    }
-
-    /**
-     * 菜单测试
-     *
-     * @param str 指令
-     * @return String
-     */
-    @Override
-    public String getMessageTest(String str) {
-        return weChatJudge.getOrder("test", str);
-    }
-
-    /**
-     * 获取微信AccessToken
-     *
-     * @return token
-     */
-    @Override
-    public String getAccessToken() {
-        //从redis获取
-        String wechatAccessToken = baseRedisService.getString("wechat_access_token");
-        if (wechatAccessToken != null && !wechatAccessToken.isEmpty()) {
-            return wechatAccessToken;
-        } else {
-            //过期后重新生成
-            JSONObject result = weChatFeign.getAccessToken("client_credential", wechatAppId, wechatAppSecret);
-            if (result != null && !result.isEmpty()) {
-                String accessToken = result.getString("access_token");
-                baseRedisService.setString("wechat_access_token", accessToken, result.getLong("expires_in"));
-                return accessToken;
-            }
-            return null;
-        }
-    }
-
-    /**
-     * 获取微信JsapiTicket
-     *
-     * @return JsapiTicket
-     */
-    @Override
-    public String getJsapiTicket() {
-        //从redis获取
-        String wechatJsapiTicket = baseRedisService.getString("wechat_jsapi_ticket");
-        if (wechatJsapiTicket != null && !wechatJsapiTicket.isEmpty()) {
-            return wechatJsapiTicket;
-        } else {
-            JSONObject result = weChatFeign.getJsapiTicket(getAccessToken(), "jsapi");
-            if (result != null && !result.isEmpty()) {
-                String jsapiTicket = result.getString("ticket");
-                baseRedisService.setString("wechat_jsapi_ticket", jsapiTicket, result.getLong("expires_in"));
-                return jsapiTicket;
-            }
-            return null;
-        }
-    }
-
-    /**
-     * 获取微信js配置信息
-     *
-     * @param url 访问url
-     * @return map
-     */
-    @Override
-    public Map<String, Object> getWeChatConfig(String url) {
-        Map<String, Object> resultMap = new HashMap<>();
-        Map<String, Object> paramMap = new HashMap<>();
-        //当前网页Url
-        paramMap.put("url", url);
-        //随机字符串
-        String randomString = weChatUtil.generateRandomString();
-        paramMap.put("noncestr", randomString);
-        resultMap.put("nonceStr", randomString);
-        //有效的jsapi_ticket
-        paramMap.put("jsapi_ticket", getJsapiTicket());
-        //时间戳
-        long timestamp = System.currentTimeMillis() / 1000;
-        paramMap.put("timestamp", timestamp);
-        resultMap.put("timestamp", timestamp);
-        //对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
-        String requestParam = WeChatUtil.formatUrlMap(paramMap, false, false);
-        //sha1加密
-        String sha1 = SHA1Util.sha1(requestParam);
-        resultMap.put("signature", sha1);
-        resultMap.put("appId", wechatAppId);
-        return resultMap;
-    }
-
-    /**
-     * 设置菜单
-     *
-     * @return boolean
-     */
-    @Override
-    public boolean setMenu() {
-        String accessToken = getAccessToken();
-        String setMenuUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + accessToken;
-        Map<String, String> param = new HashMap<>();
-        param.put("access_token", accessToken);
-        //结果集
-        JSONObject resultJson = new JSONObject();
-        JSONArray button = new JSONArray();
-        //一级菜单1
-        JSONObject firstMenuOne = new JSONObject();
-        //一级菜单名称
-        firstMenuOne.put("name", "你点我呀");
-        //一级菜单子菜单
-        JSONArray firstMenuOneSon = new JSONArray();
-        //一级一
-        JSONObject firstMenuOneSonOne = new JSONObject();
-        firstMenuOneSonOne.put("type", "click");
-        firstMenuOneSonOne.put("name", "1");
-        firstMenuOneSonOne.put("key", "1");
-        firstMenuOneSon.add(firstMenuOneSonOne);
-        //一级二
-        JSONObject firstMenuOneSonTwo = new JSONObject();
-        firstMenuOneSonTwo.put("type", "click");
-        firstMenuOneSonTwo.put("name", "1");
-        firstMenuOneSonTwo.put("url", "https://xiaokuihua.fun:777");
-        firstMenuOneSon.add(firstMenuOneSonOne);
-        //添加到一级下
-        firstMenuOne.put("sub_button", firstMenuOneSonTwo);
-        //添加到button下
-        button.add(firstMenuOne);
-        //一级菜单2
-        JSONObject firstMenuTwo = new JSONObject();
-        firstMenuTwo.put("type", "view");
-        firstMenuTwo.put("name", "扫码登录");
-        firstMenuTwo.put("url", "https://xiaokuihua.cc/wechat");
-        //添加到button下
-        button.add(firstMenuTwo);
-        //添加到结果集
-        resultJson.put("button", button);
-        String result = HttpPostRequestUtil.postRequest(setMenuUrl, resultJson, param);
-        if (result != null || !result.isEmpty()) {
-            JSONObject jsonObject = JSONObject.parseObject(result);
-            return (jsonObject.getIntValue("errcode")) == 0 ? true : false;
-        } else {
-            return false;
-        }
-    }
-
-}

+ 0 - 43
xiaokuihua-wechat/src/main/java/cc/xiaokuihua/wechat/util/CheckUtil.java

@@ -1,43 +0,0 @@
-package cc.xiaokuihua.wechat.util;
-
-import org.apache.commons.codec.digest.DigestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Component;
-
-import java.util.Arrays;
-
-/**
- * 校验的工具类
- */
-@Component
-public class CheckUtil {
-
-    @Value("${wechat.token}")
-    private String token;
-
-    public boolean checkSignature(String signature, String timestamp, String nonce) {
-        String[] arr = new String[]{token, timestamp, nonce};
-        // 排序
-        Arrays.sort(arr);
-        // 生成字符串
-        StringBuilder content = new StringBuilder();
-        for (String s : arr) {
-            content.append(s);
-        }
-        // sha1加密
-        String temp = getSHA1String(content.toString());
-        return temp.equals(signature); // 与微信传递过来的签名进行比较,标识该请求来源于微信
-    }
-
-    /**
-     * 使用commons codec生成sha1字符串
-     *
-     * @param data
-     * @return
-     */
-    private String getSHA1String(String data) {
-        return DigestUtils.sha1Hex(data);
-    }
-}

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini