小红书如何实现私信自动回复
前言
声明:本文章只做技术探讨
我们是使用真机做矩阵,之前也尝试过使用云手机和指纹浏览器做矩阵,但是会被限流,很难做起来,真机相对而言,会好很多。
一、实现方案
1:每个账号每个月都消费1000聚光,也就是1000RMB,可以使用私信通
优势:简单、省事、有马内即可为
劣势:壕无人性,一两个号还好,对于我们做矩阵的来说,根本就不现实
2:通过自动化脚本,实现自动回复
优势:需要技术支撑
劣势:省钱😄
二、方案选择
因为我们矩阵的账号比较多,不可能为每个号每个月都投入1000,当然也有可能是我们做的赛道不怎么赚钱,还没有让我们壕到这种地步,所以作为技术的我,毅然决然的选择了第二种方案
三、怎么实现
1:通过接口,获取私信的数据
2:通过自动化脚本, 实现消息的回复
四、代码展示
public Boolean uploadChatRecord(Long accountId, String body) {
JSONObject entries = JSONUtil.parseObj(body);
Boolean isInit = entries.getBool("init");
MsgChatUserVo chatUser = entries.get("chatUser", MsgChatUserVo.class);
JSONArray historyChatList = entries.getJSONArray("historyChatList");
for (Object o : historyChatList) {
JSONObject historyChatJson = JSONUtil.parseObj(o);
Long storeId = historyChatJson.getLong("store_id");
//判断这条消息是否存在,如果已经存在,证明消息上传完毕
if (this.existsByChatUserIdAndStoreId(chatUser.getChatUserId(), storeId)) {
return true;
}
MsgChatRecord chatRecord = this.buildMsgChatRecordByJson(chatUser, historyChatJson);
this.baseMapper.insert(chatRecord);
// 如果此消息不是自己发的,并且不是初始化消息记录,进行消息提示
if (!isInit && !ObjUtil.equals(chatRecord.getUid(), chatRecord.getReceiverId())) {
//自动回复
triggerHandle.messageTriggerHandle(chatRecord);
SseMessageUtils.sendMessage(chatRecord.getUserId(),
new SseMessageModel(SseMessageType.NEW_MESSAGE, "您收到了一条新的私信,请及时查看!"));
}
}
return false;
上面的方法,接收到手机推送过来的消息后,调用triggerHandle.messageTriggerHandle()进行异步的处理
@Async
public void messageTriggerHandle(MsgChatRecord record) {
try {
Long accountId = record.getAccountId();
//根据账号ID查询对于的触发配置ID
Long triggerId = triggerService.queryTriggerIdByAccountId(accountId);
if (ObjUtil.isNull(triggerId)) {
return;
}
//根据触发配置ID,查询触发ID
TriggerVo trigger = triggerService.queryById(triggerId);
if (ObjUtil.isNull(trigger)) {
return;
}
boolean flag = false;
//此消息的storeId是1,并且开启了开口回复
if (ObjUtil.equals(1L, record.getStoreId()) && GlobalSwitch.isEnable(trigger.getFirstMsgReplyEnable())) {
//下发私信回复
List<LexiconDetailsVo> lexiconDetailsList = lexiconDetailsService.queryListByLexicoId(trigger.getFirstMsgReplyLexiconId());
if (CollectionUtil.isNotEmpty(lexiconDetailsList)) {
String content = record.getContent();
//获取关键词匹配度最高的词组
LexiconDetailsVo lexicon = lexiconDetailsService.matchLexicon(content, lexiconDetailsList);
if (ObjUtil.isNotNull(lexicon)) {
flag = true;
String recipientId = record.getUid();
SendMsgTask task = SendMsgTask.buildByLexiconDetails(accountId, recipientId, lexicon);
task.setBusinessId(record.getChatRecordId());
task.setTriggerId(trigger.getTriggerId());
task.setTriggerType("first_msg");
sendMsgTaskStrategy.executeTask(task);
}
}
}
//不是开会回复,且开启了自动回复
if (!flag && GlobalSwitch.isEnable(trigger.getAutoReplyMsgEnable())) {
//下发私信回复
List<LexiconDetailsVo> lexiconDetailsList = lexiconDetailsService.queryListByLexicoId(trigger.getReplyMsgLexiconId());
if (CollectionUtil.isNotEmpty(lexiconDetailsList)) {
String content = record.getContent();
//获取关键词匹配度最高的词组
LexiconDetailsVo lexicon = lexiconDetailsService.matchLexicon(content, lexiconDetailsList);
if (ObjUtil.isNotNull(lexicon)) {
String recipientId = record.getUid();
SendMsgTask task = SendMsgTask.buildByLexiconDetails(accountId, recipientId, lexicon);
task.setBusinessId(record.getChatRecordId());
task.setTriggerId(trigger.getTriggerId());
task.setTriggerType("msg");
sendMsgTaskStrategy.executeTask(task);
}
}
}
} catch (Exception e) {
log.error("消息触发处理异常:", e);
}
}
在messageTriggerHandle()方法中,我们会对消息的内容以及是不是第一条消息进行判断,如果是第一条消息,就会执行开口回复,如果不是第一条消息,需要对消息内容进行匹配,做出最正确的回复。
同理,也可以实现评论的自动回复
总结
以上就是我实现消息自动回复的方案,如果大家有更好的方案,欢迎一起来探讨探讨!