Skip to content

Commit 3d5aad8

Browse files
committed
Initial commit
0 parents  commit 3d5aad8

34 files changed

+1788
-0
lines changed

.gitignore

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
HELP.md
2+
target/
3+
!.mvn/wrapper/maven-wrapper.jar
4+
!**/src/main/**/target/
5+
!**/src/test/**/target/
6+
7+
### STS ###
8+
.apt_generated
9+
.classpath
10+
.factorypath
11+
.project
12+
.settings
13+
.springBeans
14+
.sts4-cache
15+
16+
### IntelliJ IDEA ###
17+
.idea
18+
*.iws
19+
*.iml
20+
*.ipr
21+
22+
### NetBeans ###
23+
/nbproject/private/
24+
/nbbuild/
25+
/dist/
26+
/nbdist/
27+
/.nb-gradle/
28+
build/
29+
!**/src/main/**/build/
30+
!**/src/test/**/build/
31+
32+
### VS Code ###
33+
.vscode/

Readme.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# weChatRobot
2+
3+
一个基于微信公众号的智能聊天机器人项目,支持ChatGPT对话模式回复内容.
4+
5+
本项目是基于 ``weChatRobot``项目1.2 版本改造,去除了``Vert.x``相关模块,使用``Springboot``根据个人需要进行定制化升级改造。
6+
7+
``weChatRobot``项目地址:https://github.com/MartinDai/weChatRobot
8+
9+
![qrcode](doc/wechat.jpg "扫码关注,体验智能机器人")
10+
11+
## 项目介绍:
12+
13+
本项目是一个微信公众号项目,需配合微信公众号使用,在微信公众号配置本项目运行的服务器域名,用户关注公众号后,向公众号发送任意信息,公众号会根据用户发送的内容自动回复。
14+
15+
## 涉及框架及技术
16+
17+
- [Springboot](https://github.com/spring-projects/spring-boot)
18+
- [Jackson](https://github.com/FasterXML/jackson)
19+
- [OkHttp](https://github.com/square/okhttp)
20+
- [Guava](https://github.com/google/guava)
21+
- [Openai-java](https://github.com/TheoKanning/openai-java)
22+
23+
24+
## 支持的功能
25+
26+
+ [x] 自定义关键字回复内容
27+
+ [x] 调用ChatGPT接口回复内容(需配置启动参数或者环境变量:`OPENAI_API_KEY`
28+
+ [x] 多个``OPENAI_API_KEY``切换使用
29+
30+
## 使用说明:
31+
32+
1. 使用之前需要有微信公众号的帐号,没有的请戳[微信公众号申请](https://mp.weixin.qq.com/cgi-bin/readtemplate?t=register/step1_tmpl&lang=zh_CN)
33+
2. 如果需要使用图灵机器人的回复内容则需要[注册图灵机器人帐号](http://tuling123.com/register/email.jhtml)获取相应的ApiKey并配置在启动参数或者环境变量中
34+
3. 如果需要使用ChatGPT的回复内容则需要[创建OpenAI的API Key](https://platform.openai.com/account/api-keys)并配置在启动参数或者环境变量中,也可以直接配置多个Key在配置文件,程序会随机使用
35+
```java
36+
openai:
37+
keyList:
38+
- "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"
39+
- "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"
40+
```
41+
4. 可以通过配置启动参数或者环境变量`OPENAI_BASE_DOMAIN`更换访问OpenAI的域名
42+
5. 可以通过配置启动参数或者环境变量`OPENAI_PROXY`使用代理服务访问OpenAI,建议参考``https://github.com/Ice-Hazymoon/openai-scf-proxy/blob/master/README.md``直接搭建自己的反向代理替换OpenAI域名
43+
6. 内容响应来源的优先级`自定义关键 > ChatGPT
44+
7. 在微信公众号后台配置回调URL为<https://locahost/weChat/receiveMessage>,其中`locahost`是你自己的域名,token与`application.yml`里面配置的保持一致即可
45+
46+
## 开发部署
47+
48+
### 本地启动
49+
50+
直接运行类`com.eshare.wechatairobot.WechatAiRobotApplication`
51+
52+
### jar包运行
53+
54+
maven编译打包
55+
56+
```shell
57+
mvn clean package
58+
```
59+
60+
打包完成后,在wechat-ai-robot/target目录会生成wechat-ai-robot-1.0.0.jar
61+
62+
启动执行
63+
64+
```shell
65+
java -jar wechat-ai-robot-1.0.0.jar
66+
```
67+
68+
69+
服务器部署后台运行
70+
71+
```shell
72+
nohup java -DOPENAI_BASE_DOMAIN={{你反向代理的域名}}} -jar wechat-ai-robot-1.0.0.jar > ./console.log 2>&1 &
73+
```
74+
75+
在执行命令的当前目录查看console日志

doc/wechat.jpg

103 KB
Loading

pom.xml

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.7.10</version>
9+
<relativePath/> <!-- lookup parent from repository -->
10+
</parent>
11+
<groupId>com.eshare</groupId>
12+
<artifactId>wechat-ai-robot</artifactId>
13+
<version>1.0.0</version>
14+
<name>wechat-ai-robot</name>
15+
16+
<description>Demo project for Spring Boot</description>
17+
18+
19+
<properties>
20+
<revision>1.2</revision>
21+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
22+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
23+
<java.version>1.8</java.version>
24+
<maven.test.skip>true</maven.test.skip>
25+
<commons.lang3.version>3.12.0</commons.lang3.version>
26+
<commons.io.version>2.11.0</commons.io.version>
27+
<guava.version>32.1.1-jre</guava.version>
28+
<jackson.version>2.15.2</jackson.version>
29+
<kotlin-stdlib.version>1.6.20</kotlin-stdlib.version>
30+
<logback.version>1.3.8</logback.version>
31+
<lombok.version>1.18.24</lombok.version>
32+
<okhttp3.version>4.10.0</okhttp3.version>
33+
<openai-gpt3-java.version>0.18.2</openai-gpt3-java.version>
34+
<reactive-streams.version>1.0.3</reactive-streams.version>
35+
</properties>
36+
<dependencies>
37+
38+
39+
<dependency>
40+
<groupId>org.springframework.boot</groupId>
41+
<artifactId>spring-boot-starter-web</artifactId>
42+
</dependency>
43+
<dependency>
44+
<groupId>org.springframework.boot</groupId>
45+
<artifactId>spring-boot-starter-actuator</artifactId>
46+
</dependency>
47+
48+
<dependency>
49+
<groupId>org.springframework.boot</groupId>
50+
<artifactId>spring-boot-starter-logging</artifactId>
51+
<exclusions>
52+
<exclusion>
53+
<artifactId>logback-classic</artifactId>
54+
<groupId>ch.qos.logback</groupId>
55+
</exclusion>
56+
</exclusions>
57+
</dependency>
58+
59+
60+
<dependency>
61+
<groupId>org.springframework.boot</groupId>
62+
<artifactId>spring-boot-configuration-processor</artifactId>
63+
<optional>true</optional>
64+
</dependency>
65+
<dependency>
66+
<groupId>org.projectlombok</groupId>
67+
<artifactId>lombok</artifactId>
68+
<optional>true</optional>
69+
</dependency>
70+
<dependency>
71+
<groupId>org.springframework.boot</groupId>
72+
<artifactId>spring-boot-starter-test</artifactId>
73+
<scope>test</scope>
74+
<exclusions>
75+
<exclusion>
76+
<groupId>org.slf4j</groupId>
77+
<artifactId>slf4j-log4j12</artifactId>
78+
</exclusion>
79+
</exclusions>
80+
</dependency>
81+
82+
<dependency>
83+
<groupId>com.google.guava</groupId>
84+
<artifactId>guava</artifactId>
85+
<version>${guava.version}</version>
86+
<exclusions>
87+
<exclusion>
88+
<groupId>org.checkerframework</groupId>
89+
<artifactId>checker-qual</artifactId>
90+
</exclusion>
91+
</exclusions>
92+
</dependency>
93+
<dependency>
94+
<groupId>org.apache.commons</groupId>
95+
<artifactId>commons-lang3</artifactId>
96+
<version>${commons.lang3.version}</version>
97+
</dependency>
98+
99+
<dependency>
100+
<groupId>commons-io</groupId>
101+
<artifactId>commons-io</artifactId>
102+
<version>${commons.io.version}</version>
103+
</dependency>
104+
105+
<dependency>
106+
<groupId>com.fasterxml.jackson.dataformat</groupId>
107+
<artifactId>jackson-dataformat-xml</artifactId>
108+
<version>${jackson.version}</version>
109+
</dependency>
110+
<dependency>
111+
<groupId>com.fasterxml.jackson.core</groupId>
112+
<artifactId>jackson-annotations</artifactId>
113+
<version>${jackson.version}</version>
114+
</dependency>
115+
<dependency>
116+
<groupId>com.fasterxml.jackson.core</groupId>
117+
<artifactId>jackson-core</artifactId>
118+
<version>${jackson.version}</version>
119+
</dependency>
120+
<dependency>
121+
<groupId>com.fasterxml.jackson.core</groupId>
122+
<artifactId>jackson-databind</artifactId>
123+
<version>${jackson.version}</version>
124+
</dependency>
125+
126+
<dependency>
127+
<groupId>com.squareup.okhttp3</groupId>
128+
<artifactId>okhttp</artifactId>
129+
<version>${okhttp3.version}</version>
130+
<exclusions>
131+
<exclusion>
132+
<artifactId>kotlin-stdlib</artifactId>
133+
<groupId>org.jetbrains.kotlin</groupId>
134+
</exclusion>
135+
<exclusion>
136+
<artifactId>kotlin-stdlib-common</artifactId>
137+
<groupId>org.jetbrains.kotlin</groupId>
138+
</exclusion>
139+
</exclusions>
140+
</dependency>
141+
142+
<dependency>
143+
<groupId>com.theokanning.openai-gpt3-java</groupId>
144+
<artifactId>service</artifactId>
145+
<version>${openai-gpt3-java.version}</version>
146+
<exclusions>
147+
<exclusion>
148+
<artifactId>okhttp</artifactId>
149+
<groupId>com.squareup.okhttp3</groupId>
150+
</exclusion>
151+
</exclusions>
152+
</dependency>
153+
154+
<dependency>
155+
<groupId>org.reactivestreams</groupId>
156+
<artifactId>reactive-streams</artifactId>
157+
<version>${reactive-streams.version}</version>
158+
</dependency>
159+
160+
<dependency>
161+
<groupId>org.jetbrains.kotlin</groupId>
162+
<artifactId>kotlin-stdlib</artifactId>
163+
<version>${kotlin-stdlib.version}</version>
164+
<exclusions>
165+
<exclusion>
166+
<artifactId>kotlin-stdlib-common</artifactId>
167+
<groupId>org.jetbrains.kotlin</groupId>
168+
</exclusion>
169+
</exclusions>
170+
</dependency>
171+
<dependency>
172+
<groupId>org.jetbrains.kotlin</groupId>
173+
<artifactId>kotlin-stdlib-common</artifactId>
174+
<version>${kotlin-stdlib.version}</version>
175+
</dependency>
176+
177+
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
178+
<dependency>
179+
<groupId>org.slf4j</groupId>
180+
<artifactId>slf4j-api</artifactId>
181+
<version>1.7.30</version>
182+
</dependency>
183+
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple-->
184+
<dependency>
185+
<groupId>org.slf4j</groupId>
186+
<artifactId>slf4j-simple</artifactId>
187+
<version>1.7.30</version>
188+
<type>jar</type>
189+
</dependency>
190+
191+
</dependencies>
192+
193+
<build>
194+
<plugins>
195+
<plugin>
196+
<groupId>org.springframework.boot</groupId>
197+
<artifactId>spring-boot-maven-plugin</artifactId>
198+
</plugin>
199+
</plugins>
200+
</build>
201+
</project>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.eshare.wechatairobot;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class WechatAiRobotApplication {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(WechatAiRobotApplication.class, args);
11+
}
12+
13+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.eshare.wechatairobot.application.processor;
2+
3+
4+
import com.eshare.wechatairobot.domain.WeChatMessage;
5+
import com.eshare.wechatairobot.infrastructure.common.enums.WeChatEventType;
6+
import com.eshare.wechatairobot.infrastructure.common.enums.WeChatMsgType;
7+
import com.eshare.wechatairobot.infrastructure.tunnel.rest.dataobject.BaseMessage;
8+
import com.eshare.wechatairobot.infrastructure.tunnel.rest.dataobject.TextMessage;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.springframework.stereotype.Component;
11+
12+
/**
13+
* 事件类型消息处理类
14+
*/
15+
@Component
16+
@Slf4j
17+
public class EventMessageProcessor implements WeChatMessageProcessor {
18+
19+
20+
@Override
21+
public WeChatMsgType getMsgType() {
22+
return WeChatMsgType.EVENT;
23+
}
24+
25+
@Override
26+
public BaseMessage processMessage(WeChatMessage weChatMessage) {
27+
String event = weChatMessage.getEvent();
28+
String fromUserName = weChatMessage.getFromUserName();
29+
String toUserName = weChatMessage.getToUserName();
30+
WeChatEventType eventType = WeChatEventType.findByValue(event);
31+
if (eventType == WeChatEventType.SUBSCRIBE) {
32+
return new TextMessage(toUserName, fromUserName, "谢谢关注!可以开始跟我聊天啦😁我是Evan的沙雕AI助手,哈哈!如果想获取英语教程,请输入 \"神救救我吧\",问问题请输入其他信息,问题次数有限制噢!");
33+
} else if (eventType == WeChatEventType.UNSUBSCRIBE) {
34+
log.info("用户[" + weChatMessage.getFromUserName() + "]取消了订阅");
35+
}
36+
37+
return new TextMessage(toUserName, fromUserName, "bye!");
38+
}
39+
}

0 commit comments

Comments
 (0)