关键词:
文章目录
写在前面的的话
这是一个非常简单的聊天机器人的教程
本来我是不想写的(因为我是懒狗)
但是我在网上找不到类似的教程所以就自己打算写一个
这个机器人我只完成了最简单的功能
- 学习
- 根据关键词来产生回复
- 复读
还有很多其他的功能可以开发 但是因为我是懒狗所以我打算让我可爱的学弟去进行开发
如果你发现你的机器人群聊只能发送短字符并且机器人的私聊功能没有问题
那么你的机器人是被腾讯给风控了
这是正常的
解决方法是 你自己上机器人的QQ号多水群就行了
过一段时间风控就被解除了
免责声明
我不是大佬 我的水平也很低
里面实现的功能也是非常简单的功能(复杂的我也不会)
我从开始做到做完也就花了两天时间 对这个框架的很多功能也不是很了解
我的很多功能也是用很多的方法来实现的
如果你有更好的方法希望你也能写一篇教程让我也学习一下
你需要提前会的东西
- 最基本的MySQL
- 一点点Linux的使用经验
- 最简单的Mybatis的使用
- 一点点使用Spring这种框架的经验(不会也没什么问题)
我们要使用的框架
我希望你在看这篇教程之前先提前看一下教学视频 起码看一下二十多分钟的
<<稍微短一点的视频>>
这个是框架的地址里面已经包含的有教程
框架地址
这里是写框架的老哥录的教学视频 可以说是非常详细了
这里是链接地址
如果你懒得看这个长的 起码你得看一下这个教学视频
稍微短一点的视频
这里面所提供的资料足够你自己完成一个机器人的开发了
但是这篇文章是面向纯纯的小白的所以会更加详细一点
首先我们先下载一个Demo
在教学视频里面已经嗦了Demo在哪下 为了避免小白找不到Demo在哪下我直接把这个Demo的下载链接贴到这里了
文件配置
Demo里面的的目录结构
视频里面已经对监听器里面的功能已经嗦的很明白了
而且demo里面已经打了很多很多的注释去解释功能了 你们看一下就知道怎么用了
在配置文件中加上你小号的QQ名字和密码
为了避免不必要的问题我建议你
在这两个文件里面都配置好
因为我实在不知道还有什么能嗦的所以我下面会讲怎么用Mybatis
我们加完mybatis之后的目录结构
maven里面的配置
因为要用一点新的东西 所以要在
这个里面加一点点东西
因为我是懒狗所以我就不细嗦了
我直接把我的maven配置给放在这里了
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>simbot.example</groupId>
<artifactId>simbot-mirai-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<simbot.version>2.3.4</simbot.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.3.11.RELEASE</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.11</version>
</dependency>
<!--简化bean代码的工具包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<!-- mybatis-plus插件依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.1.1</version>
</dependency>
<!-- 使用 mirai 组件。 -->
<dependency>
<groupId>love.forte.simple-robot</groupId>
<artifactId>component-mirai</artifactId>
<version>$simbot.version</version><!--vv-->
</dependency>
<!-- 定时任务模块 -->
<dependency>
<groupId>love.forte.simple-robot.time-task</groupId>
<artifactId>time-task-quartz</artifactId>
<version>$simbot.version</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.yml</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
<include>**/*.**</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.yml</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<!-- main方法所在类。 -->
<mainClass>love.simbot.example.SimbotExampleApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
为了防止SQL注入问题我们用德鲁伊数据库
我们整一个druid文件夹 创建一个MyDruid
package love.simbot.example.druid;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.ibatis.datasource.DataSourceFactory;
import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Properties;
public class MyDruid implements DataSourceFactory
private Properties props;
@Override
public DataSource getDataSource()
DruidDataSource dds = new DruidDataSource();
dds.setDriverClassName(this.props.getProperty("driver"));
dds.setUrl(this.props.getProperty("url"));
dds.setUsername(this.props.getProperty("username"));
dds.setPassword(this.props.getProperty("password"));
try
dds.init();
catch (SQLException e)
e.printStackTrace();
return dds;
@Override
public void setProperties(Properties props)
this.props = props;
mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<!-- mybatis的配置环境 -->
<environment id="development">
<!-- 事物管理配置 -->
<transactionManager type="JDBC" />
<!-- 数据源的选择 -->
<dataSource type="love.simbot.example.druid.MyDruid">
<!-- 数据库链接的配置 -->
<property name="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://你数据库地址:3306/你的库名?characterEncoding=utf-8&createDatabaseIfNotExist=true&useSSL=false"/>
<property name="username" value="你数据库的名字"/>
<property name="password" value="你数据库的密码"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="mybatis/KVmapper.xml"/>
</mappers>
</configuration>
建立数据库
建立表这个就没什么值得细嗦的了
实在不会建表就直接右键建就完事了
Mybatis的映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="love.simbot.example.mybatis.mapper.Key_Value_Mapper">
<insert id="insertKV">
insert into kv values(NULL,#key,#value);
</insert>
<delete id="deleteKV">
delete from kv where id=#id
</delete>
<select id="get_One_KV_ByKey" resultType="love.simbot.example.mybatis.pojo.Key_Value">
SELECT * FROM kv WHERE `key`=#key
</select>
<select id="get_Some_KV_ByKey" resultType="love.simbot.example.mybatis.pojo.Key_Value">
SELECT * FROM kv WHERE `key`=#key
</select>
</mapper>
Mybatis的mapper层
package love.simbot.example.mybatis.mapper;
import love.simbot.example.mybatis.pojo.Key_Value;
import org.apache.ibatis.annotations.Param;
import java.util.ArrayList;
public interface Key_Value_Mapper
int insertKV(@Param("key")String key,@Param("value")String value);
Key_Value get_One_KV_ByKey(@Param("key")String key);
ArrayList<Key_Value> get_Some_KV_ByKey(@Param("key")String key);
int deleteKV(@Param("id")int id);
mybatis的增删改查
因为我是懒狗(主要原因) 而且我感觉没什么写改的必要 所以我没写改的方法
pojo层
packageswift3:如何用逗号写一个字符串?(代码片段)
为什么不能使用“2,78”字符串?funcaction1()time1+=2,78lbltime.text=String(time1)答案如果您想要数字的本地化表示,请使用NumberFormatter:letformatter=NumberFormatter()formatter.maximumFractionDigits=2letx=Float.piifletstring=formatte 查看详情
如何用chatgpt高效完成工作(代码片段)
...定了解。ChatGPT是一个基于GPT-3.5构建的大型语言模型聊天机器人。它将问答交互场景下的文本生成能力向前推进了一大步,超出了人们对对话式人工智能的预期。因此一经推出就惊艳世界,引爆了全球对ChatGPT的关注。ChatG... 查看详情
如何用java写一个小数
】如何用java写一个小数【英文标题】:Howtowriteasmallnumberusingjava【发布时间】:2015-11-1501:12:49【问题描述】:如何写一个非常小的数,接近极限0?像这样:doubleeps=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000... 查看详情
如何用python写一个简易的抽奖程序(代码片段)
不知道有多少人是被这个头图骗进来的:)事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下手... 查看详情
如何用python写一个贪吃蛇ai(代码片段)
前言这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏,估计大部分人都玩过。但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了。问题的关键在于,图片中的贪吃蛇真的很贪吃XD,它把矩形... 查看详情
javascript如何用javascript写日期?(代码片段)
如何用svg写一个环形进度条以及动画(代码片段)
本次案例主要使用了svg的三个元素,分别为circle、text、path,关于svg的介绍大家可以看MDN上的相关教程,传送门由于svg可以写到HTML中,所以这里我们就可以很方便的做进度条加载动画啦,这次案例以vue来做数据交互svg的viewBoxviewB... 查看详情
手把手创建一个聊天机器人(代码片段)
今天来写一个属于自己的聊天机器人。思路:当用户点击发送后,需要根据用户输入的内容,提交到服务器,然后由服务器根据你输入的内容,返回对应的结果,我们拿到结果展示到界面上当做机器人的回答即可。这里使用的接... 查看详情
python黑科技:python大佬用20行代码带你打造一个微信聊天机器人,真神了~(代码片段)
...ython环境2.安装python的itchat库3.安装itchat库4.Linux5.申请图灵机器人API和key6.编写python程序7.执行程序运行8.大致原理简介今天要教大家一个黑科技,20行代码实现自己定制的微信群聊助手,可以用来活跃群气氛,好多群主... 查看详情
如何用c/c++写一个linux文件系统模拟器(代码片段)
用C/C++写一个Linux文件系统模拟器1.程序演示1.登录--login2.切换目录---cd3.展示文件列表---ls4.查看物理块使用情况以及物理块存储内容—df5.cd命令的延伸:6.查看当前目录名和父目录名——now7.创建文件——touch8.打开文件... 查看详情
如何用记事本编写java代码?(代码片段)
首先,在使用记事本编写代码的前提下,需要安装好JDK和配置好环境变量1.在记事本上写HelloWorld一个Java文件中只有一个public的类保证类名和文件名保持一致publicclassHelloWorld publicstaticvoidmain(String[]args) System.out.println("Hel... 查看详情
python程序设计如何用python写一个可安装文件使移动硬盘不休眠(代码片段)
当我们外接移动硬盘时,有些移动硬盘或者硬盘盒是自带休眠功能的,但是单我们需要经常去调用硬盘时,每五分钟的休眠周期是我们无法忍受的,而且硬盘的频繁启动不仅导致读取写入时间比较慢,而且还会导致硬盘出现坏道... 查看详情
用go语言实现一个简单的聊天机器人(代码片段)
一、介绍目的:使用Go语言写一个简单的聊天机器人,复习整合Go语言的语法和基础知识。软件环境:Go1.9,Goland2018.1.5。 二、回顾Go语言基本构成要素:标识符、关键字、字面量、分隔符、操作符。它们可以组成各种表达式... 查看详情
面试官:如何用java实现一个栈?(代码片段)
目录一、使用单链表结构实现二、单链表+ReentrantLock三、使用CAS实现一个非阻塞的栈统计耗时 有很多人在及技术面试的时候经常会被各种刁钻问题给灵魂拷问到,怎样去实现一个数据结构? 因为我... 查看详情
面试官:如何用java实现一个栈?(代码片段)
目录一、使用单链表结构实现二、单链表+ReentrantLock三、使用CAS实现一个非阻塞的栈统计耗时 有很多人在及技术面试的时候经常会被各种刁钻问题给灵魂拷问到,怎样去实现一个数据结构? 因为我... 查看详情
如何用docker进行部署(代码片段)
一个全新的开发体验 在过去的时候,如果你想运行一个Java的app,你首要的事情就是安装一个Java的runtime(也就是JDK),但是就是在这一步一般都有很多问题。首先你要保证你安装的runtime适配的app所需的环境,而且还要保证... 查看详情
一日一技:如何用递归函数写出2**n-1?(代码片段)
一日一技:如何用递归函数写出2**n-1?摄影:产品经理实验室的年会下午茶已知n为正整数,写一个递归函数计算。在Python里面要计算非常简单:>>>defcalc(n):...return2**n-1...>>>calc(10)1023运行效果如下图所示:现在,需要... 查看详情
脑筋急转弯:如何用两个栈实现一个队列&&如何用两个队列实现一个栈(代码片段)
文章目录前言我的想法如何用两个栈实现一个队列如何用两个队列实现一个栈别人的想法两个栈实现一个队列如何用两个队列实现一个栈前言其实我也不知道这两个问题又什么意义,就像不知道我们平时刷的算法题除了练脑... 查看详情