肝了一晚上搞出來一個微信訂閱號鑑黃機器人

Python實戰社羣

Java實戰社羣

長按識別下方二維碼,按需求添加

掃碼關注添加客服

進Python社羣▲

掃碼關注添加客服

進Java社羣

作者丨碼匠筆記

來源丨碼匠筆記(ID:majiangbiji)

顧名思義,我們就是來做一個訂閱號機器人,大致是這樣一個過程

公衆號接收用戶消息 -> 微信平臺發送消息給我們的服務器 -> 我們的服務器處理消息 -> 返回處理結果給微信平臺 -> 微信平臺發送內容給用戶。

基於這樣一個大前提就有了下面的步驟。

1、填寫服務器配置,可以接收微信平臺發送的內容
2、開發服務端,並驗證服務器地址的有效性
3、處理具體的業務邏輯

1. 配置微信公衆號

首先肯定需要有一個訂閱號,然後在訂閱號後臺點擊 開發者->基本配置進入如下頁面,點擊確定

然後進入配置頁面,我們一一對配置進行講解

  1. 開發者ID,開發者調用的唯一標示,調用接口的時候需要傳遞。

  2. 開發者密碼,這個很重要一定要保存在自己的服務器上面,用於驗證安全性。

  3. 服務地址,這個就是我們用來接收微信平臺轉發的用戶消息的服務的地址

  4. 令牌,用戶接收信息時候做驗證是否請求來自微信平臺

  5. 用於加密消息,防止被截獲,如果 6 設置爲明文模式不需要這個配置。

  6. 是否加密傳輸消息

我們本期只做接收圖片消息,驗證完成以後回覆消息,所以只需要配置 3、4。

  1. 是我們具體的服務器地址,path是 weixin/receive 這個下文中具體代碼部分會詳細講解

  2. Token 隨便生成一個 UUID 就可以

  3. 隨機生成,後面如果調用 API 會用到。

這時候你點擊提交會提示驗證失敗,是因爲你還沒有部署 API,配置到這裏我們就開始編寫代碼。

2. 編寫服務端

服務器端使用現有的輪子非常簡單,因爲是 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。

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

編寫到這裏就可以找一個服務器部署起來,點擊驗證嘍,這時候點擊提交直接成功了,點擊啓用以後就生效了,生效以後你原來配置的自動回覆就會生效,所以這個操作請謹慎。

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<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 給發送消息的用戶。效果圖如下

那麼接下來就到了最關鍵的一步,如何鑑黃,這個具體的邏輯可以參考這一篇文章

《怒爬某 Hub 資源就爲擼了一個鑑黃平臺》

https://mp.weixin.qq.com/s/cB7n0ou8ggg1u65tpdez4w

現在我們直接把相關代碼懟上。

按照上面的文章修改代碼後結果如下,具體的 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;
}

最終效果如下

所以你會搭建自己的鑑黃機器人了嗎?

完整源碼獲取方法,老規矩啦!

如何獲取?

1. 識別並關注下方公衆號、;
2. 在下面公衆號後臺回覆關鍵字「源碼」。

????長按上方二維碼 2 秒

回覆「源碼」即可獲取資料

程序員專欄 掃碼關注填加客服 長按識別下方二維碼進羣

近期精彩內容推薦:  

 看電影前一定要檢查一下域名是不是HTTPS的

 有個大神級女朋友是什麼體驗

 世界上五個最不務正業的科學家!

 魂鬥羅只有128KB爲何可以實現那麼長的劇情


在看點這裏好文分享給更多人↓↓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章