路由器截获微信消息_肝了一晚上搞出来一个微信订阅号鉴黄机器人

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

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

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

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

1. 配置微信公众号

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

4d54fbe5e146fe6ad64f43980c88eb56.png

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

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

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

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

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

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

  6. 是否加密传输消息

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

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

  2. Token 随便生成一个 UUID 就可以

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

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

9c757307df7143c5e1e37a3f1450c8b1.png

2. 编写服务端

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

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

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

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

@Autowired
private 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();
}

编写到这里就可以找一个服务器部署起来,点击验证喽,这时候点击提交直接成功了,点击启用以后就生效了,生效以后你原来配置的自动回复就会生效,所以这个操作请谨慎。

ac4d6b095b14b6012bc7a0adef683703.png

3. 处理业务逻辑

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

@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 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 给发送消息的用户。效果图如下

50de0b3d79b0d6279d17723fbc76ac7b.png那么接下来就到了最关键的一步,如何鉴黄,这个具体的逻辑可以参考这一篇文章《怒爬某 Hub 资源就为撸了一个鉴黄平台》,现在我们直接把相关代码怼上。

按照上面的文章修改代码后结果如下,具体的 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;
}

最终效果如下9d77b3047cee4781c32280debf31f4fc.png

所以你会搭建自己的鉴黄机器人了吗?点击原文获取项目源码。

测试订阅号“Q谈面试”,“Q谈面试” 订阅号鉴黄能力仅供学习使用,后期会下线,如需体验请尽快。

遗漏热文?赶紧标星

5cec8235ff8ee0c4062db46d3d6f0552.png

1. 阿里社招面试指南

2. 阿里应届生面试指南

3. 探寻线程池是如何工作的

4. 到底线程池应该设置多少合适?

5. 跳槽的必备条件是有一份好的简历

6. 不是所有的 Github 都适合写在简历上

7. 所没有项目经验找工作处处碰壁怎么办

8. 每一个开发人员都应该懂得的 UML 规范

9. 工作环境没机会接触高并发、分布式怎么办?

10. 这算是有史以来讲数据库连接池数最清楚的文章了

11. 你以为认为 count(1) 比 count(*) 效率高么?

12. 用了这么多年 Spring Boot 你知道他爹有多大背景吗?

6459668b9e7448f8aca4d73fe507b0fd.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值