Python實戰社羣
Java實戰社羣
長按識別下方二維碼,按需求添加
掃碼關注添加客服
進Python社羣▲
掃碼關注添加客服
進Java社羣▲
作者丨碼匠筆記
來源丨碼匠筆記(ID:majiangbiji)
顧名思義,我們就是來做一個訂閱號機器人,大致是這樣一個過程
公衆號接收用戶消息 -> 微信平臺發送消息給我們的服務器 -> 我們的服務器處理消息 -> 返回處理結果給微信平臺 -> 微信平臺發送內容給用戶。
基於這樣一個大前提就有了下面的步驟。
1、填寫服務器配置,可以接收微信平臺發送的內容
2、開發服務端,並驗證服務器地址的有效性
3、處理具體的業務邏輯
1. 配置微信公衆號
首先肯定需要有一個訂閱號,然後在訂閱號後臺點擊 開發者->基本配置進入如下頁面,點擊確定
然後進入配置頁面,我們一一對配置進行講解
開發者ID,開發者調用的唯一標示,調用接口的時候需要傳遞。
開發者密碼,這個很重要一定要保存在自己的服務器上面,用於驗證安全性。
服務地址,這個就是我們用來接收微信平臺轉發的用戶消息的服務的地址
令牌,用戶接收信息時候做驗證是否請求來自微信平臺
用於加密消息,防止被截獲,如果 6 設置爲明文模式不需要這個配置。
是否加密傳輸消息
我們本期只做接收圖片消息,驗證完成以後回覆消息,所以只需要配置 3、4。
是我們具體的服務器地址,path是 weixin/receive 這個下文中具體代碼部分會詳細講解
Token 隨便生成一個 UUID 就可以
隨機生成,後面如果調用 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 秒
回覆「源碼」即可獲取資料
程序員專欄 掃碼關注填加客服 長按識別下方二維碼進羣
近期精彩內容推薦:
在看點這裏好文分享給更多人↓↓