这些屌毛总是给订阅号发x图,连夜肝了一个微信订阅号鉴黄机器人抵御~

2023-12-15 06:48

本文主要是介绍这些屌毛总是给订阅号发x图,连夜肝了一个微信订阅号鉴黄机器人抵御~,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方 好好学java ,选择 星标 公众号

重磅资讯、干货,第一时间送达

今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招!

 个人原创100W+访问量博客:点击前往,查看更多

来源公众号:码匠笔记

顾名思义,我们就是来做一个订阅号机器人,大致是这样一个过程

公众号接收用户消息 -> 微信平台发送消息给我们的服务器 -> 我们的服务器处理消息 -> 返回处理结果给微信平台 -> 微信平台发送内容给用户。

基于这样一个大前提就有了下面的步骤。

1、填写服务器配置,可以接收微信平台发送的内容
2、开发服务端,并验证服务器地址的有效性
3、处理具体的业务逻辑


# 配置微信公众号

首先肯定需要有一个订阅号,然后在订阅号后台点击 开发者->基本配置进入如下页面,点击确定

然后进入配置页面,我们一一对配置进行讲解


  1. 开发者ID,开发者调用的唯一标示,调用接口的时候需要传递。

  2. 开发者密码,这个很重要一定要保存在自己的服务器上面,用于验证安全性。

  3. 服务地址,这个就是我们用来接收微信平台转发的用户消息的服务的地址

  4. 令牌,用户接收信息时候做验证是否请求来自微信平台

  5. 用于加密消息,防止被截获,如果 6 设置为明文模式不需要这个配置。

  6. 是否加密传输消息

我们本期只做接收图片消息,验证完成以后回复消息,所以只需要配置 3、4。


  • 是我们具体的服务器地址,path是 weixin/receive 这个下文中具体代码部分会详细讲解

  • Token 随便生成一个 UUID 就可以

  • 随机生成,后面如果调用 API 会用到。

这时候你点击提交会提示验证失败,是因为你还没有部署 API,配置到这里我们就开始编写代码。


# 编写服务端

服务器端使用现有的轮子非常简单,因为是 spring-boot 项目,直接引入一个现成的微信 starter,一定要添加 repository ,这个是依托 Github 自带的仓库。

<repositories>    <repository>        <id>developer-weapons-repository</id>        <url>https://raw.githubusercontent.com/developer-weapons/repository/master</url>    </repository></repositories><dependency>    <groupId>com.github.developer.weapons</groupId>    <artifactId>wechat-spring-boot-starter</artifactId>    <version>1.2.6</version></dependency>

然写两个接口,一个 GET 用于第一次绑定微信后台验证用,一个 POST 用于以后接收消息 /weixin/receive

把之前准备好的 token 配置到 application.properties 然后注入到 Controller 里面,大致的验证代码如下,如果验证签名成功就返回 echostr,算是通信的标示,如果验证失败返回 error。

@Autowiredprivate WechatOfficialService wechatOfficialService;
@Value("${weixin.token}")private String token;
@RequestMapping(value = "/weixin/receive", method = RequestMethod.GET)public void receive(        @RequestParam(value = "signature") String signature,        @RequestParam(value = "timestamp") String timestamp,        @RequestParam(value = "nonce") String nonce,        @RequestParam(value = "echostr") String echostr,        HttpServletResponse response) throws IOException {    boolean valid = wechatOfficialService.isValid(signature, timestamp, nonce, token);    PrintWriter writer = response.getWriter();    if (valid) {        writer.print(echostr);    } else {        writer.print("error");    }    writer.flush();    writer.close();}编写到这里就可以找一个服务器部署起来,点击验证喽,这时候点击提交直接成功
了,点击启用以后就生效了,生效以后你原来配置的自动回复就会生效,所以这个
操作请谨慎。


# 处理业务逻辑

处理业务逻辑首先是接收消息,下面是接收消息的代码

@RequestMapping(value = "/weixin/receive", method = RequestMethod.POST)public void receive(        @RequestParam(value = "signature") String signature,        @RequestParam(value = "timestamp") String timestamp,        @RequestParam(value = "nonce") String nonce,        HttpServletRequest request,        HttpServletResponse response) throws IOException {    request.setCharacterEncoding("UTF-8");    response.setCharacterEncoding("UTF-8");    boolean valid = wechatOfficialService.isValid(signature, timestamp, nonce, token);    PrintWriter writer = response.getWriter();    if (!valid) {        writer.print("error");        writer.flush();        writer.close();        return;    }    try {        Map<String, String> map = wechatOfficialService.toMap(request.getInputStream());        if (map.get("MsgType").equals("image")) {            String msg = OfficialAutoReplyMessage.build()                    .withContent("接收到图片链接为:" + map.get("PicUrl"))                    .withMsgtype(MessageTypeEnum.TEXT)                    .withFromUserName(map.get("ToUserName"))                    .withToUserName(map.get("FromUserName"))                    .toXml();            writer.print(msg);            writer.flush();            writer.close();            return;        }    } catch (Exception e) {        log.error("WeixinController receive error", e);    }    writer.print("success");    writer.flush();    writer.close();}

第一步还是验证消息是否来自微信平台,然后使用 wechatOfficialService.toMap 方法解析出接收消息的内容,当前判断比较简单,直接判断是否是图片消息,然后返回图片的 URL 给发送消息的用户。效果图如下

那么接下来就到了最关键的一步,如何鉴黄,现在我们直接把相关代码怼上。

按照上面的文章修改代码后结果如下,具体的 publicKey 和 privateKey 自己参考下哦

if (map.get("MsgType").equals("image")) {  String res = checkService.check(publicKey, privateKey, map.get("PicUrl"));  OfficialAutoReplyMessage officialAutoReplyMessage =          OfficialAutoReplyMessage.build()                  .withMsgtype(MessageTypeEnum.TEXT)                  .withFromUserName(map.get("ToUserName"))                  .withToUserName(map.get("FromUserName"));  if (StringUtils.equals("forbid", res)) {      officialAutoReplyMessage.withContent("小哥,你的图片有点问题哦");  } else {      officialAutoReplyMessage.withContent("骚年,你这图片刚刚的没问题");  }  writer.print(officialAutoReplyMessage.toXml());  writer.flush();  writer.close();  return;}

最终效果如下

所以,你会搭建自己的鉴黄机器人了吗?

完整源码获取方法,老规矩啦!

识别下方二维码,关注后回复【A109

即可获取机器人完整源码

????长按上方二维码 2 秒

推荐文章
  • 硬刚一周,3W字总结,一年的经验告诉你如何准备校招!

  • 今年的校招,Java 好拿 offer 吗?

  • 10月了,该聊聊今年秋招了!

  • 聊聊在腾讯实习快一个月的感受

原创电子书历时整整一年总结的 Java 面试 + Java 后端技术学习指南,这是本人这几年及校招的总结,各种高频面试题已经全部进行总结,按照章节复习即可,已经拿到了大厂offer。
原创思维导图扫码或者微信搜 程序员的技术圈子 回复 面试 领取原创电子书和思维导图。

这篇关于这些屌毛总是给订阅号发x图,连夜肝了一个微信订阅号鉴黄机器人抵御~的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/495516

相关文章

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

基于树梅派的视频监控机器人Verybot

最近这段时间做了一个基于树梅派 ( raspberry pi ) 的视频监控机器人平台 Verybot ,现在打算把这个机器人的一些图片、视频、设计思路进行公开,并且希望跟大家一起研究相关的各种问题,下面是两张机器人的照片:         图片1:                   图片2                    这个平台的基本组成是:

多数据源的事务处理总是打印很多无用的log日志

之前做了一个项目,需要用到多数据源以及事务处理,在使用事务处理,服务器总是打印很多关于事务处理的log日志(com.atomikos.logging.Slf4jLogger),但是我们根本不会用到这些log日志,反而使得查询一些有用的log日志变得困难。那要如何屏蔽这些log日志呢? 之前的项目是提高项目打印log日志的级别,后来觉得这样治标不治本。 现在有一个更好的方法: 我使用的是log

C++编程:ZeroMQ进程间(订阅-发布)通信配置优化

文章目录 0. 概述1. 发布者同步发送(pub)与订阅者异步接收(sub)示例代码可能的副作用: 2. 适度增加缓存和队列示例代码副作用: 3. 动态的IPC通道管理示例代码副作用: 4. 接收消息的超时设置示例代码副作用: 5. 增加I/O线程数量示例代码副作用: 6. 异步消息发送(使用`dontwait`标志)示例代码副作用: 7. 其他可以考虑的优化项7.1 立即发送(ZMQ_IM

基于微信小程序与嵌入式系统的智能小车开发(详细流程)

一、项目概述 本项目旨在开发一款智能小车,结合微信小程序与嵌入式系统,提供实时图像处理与控制功能。用户可以通过微信小程序远程操控小车,并实时接收摄像头采集的图像。该项目解决了传统遥控小车在图像反馈和控制延迟方面的问题,提升了小车的智能化水平,适用于教育、科研和娱乐等多个领域。 二、系统架构 1. 系统架构设计 本项目的系统架构主要分为以下几个部分: 微信小程序:负责用户界面、控制指令的

微信小程序uniappvue3版本-控制tabbar某一个的显示与隐藏

1. 首先在pages.json中配置tabbar信息 2. 在代码根目录下添加 tabBar 代码文件 直接把微信小程序文档里面的四个文件复制到自己项目中就可以了   3. 根据自己的需求更改index.js文件 首先我这里需要判断什么时候隐藏某一个元素,需要引入接口 然后在切换tabbar时,改变tabbar当前点击的元素 import getList from '../

微信小程序(一)数据流与数据绑定

一、单向数据流和双向数据流 1、单项数据流:指的是我们先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面 优点:数据跟踪方便,流向单一,追寻问题比较方便【主要体现:微信小程序】。 缺点:就是写起来不太方便,如果修改UI界面数据需要维护对应的model对象 2、双向数据流:值和UI是双向绑定的,大家都知道,只要UI里面的值发生