我想大家對QQ表情一定不會陌生,一個個小頭像極大豐富了聊天的樂趣,使得聊天不再是簡單的文字敘述,還能夠配上喜、怒、哀、樂等表達人物心情的小圖片。本文重點要介紹的內容就是怎樣在微信公眾平台使用QQ表情,即在微信公眾帳號開發模式下,怎樣發送QQ表情給用戶,以及怎樣識別用戶發來的是QQ表情。
QQ表情代碼表
首先須要明確的是:QQ表情盡管呈現為一張張動態的表情圖片,但在微信公眾平台的消息接口中卻是屬於文本消息;也就是說當用戶向公眾帳號發送QQ表情時,公眾帳號后台程序接收到的消息類型MsgType的值為text。僅僅要上面這點能理解了,以下的工作就好開展了。
對於QQ表情,發送的是文本消息,而呈現出來卻是表情圖片,那么每個QQ表情圖片一定會有與之相相應的表情代碼。以下是我已經整理好的微信公眾帳號中使用的QQ表情代碼對比表:
上面一共列出了105個QQ表情,每個表情都給出了與之相相應的文字代碼與符號代碼(或許這兩種叫法並不恰當),至於這兩種代碼怎么來的以及怎樣使用,以下立即會講到。
用戶向公眾帳號發送QQ表情
在微信上使用公眾帳號時,怎樣發送QQ表情,我想這個非常少有人不會的。在輸入框旁邊有一個笑臉的圖片button,點擊它將會彈出表情選擇界面,可選擇的表情依次為“QQ表情”、“符號表情”和“動畫表情”。當我們點擊選擇了某個QQ表情后,發如今輸入框中會顯示該表情的文字代碼,這里是用一對中括號引起的,例如以下圖所看到的:
事實上,當我們非常熟悉要使用QQ表情的文字代碼時,也能夠直接在輸入框中輸入表情的代碼,而不須要彈出表情選擇框。例如以下圖所看到的:
從上圖能夠看出,在輸入框中輸入“[呲牙]”、“/呲牙”和“/::D”這三種代碼的作用一樣,都是發送呲牙的QQ表情。這個時候,大家再回過頭去看文章最開始的QQ表情代碼對比表,就明確是怎么回事了。
公眾帳號向用戶發送QQ表情
與用戶向公眾帳號發送QQ表情一樣,在開發模式下,公眾帳號也能夠用相同的表情代碼(文字代碼或符號代碼)向用戶回復QQ表情。代碼片段例如以下:
- // 文本消息
- if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
- // 回復文本消息
- TextMessage textMessage = new TextMessage();
- textMessage.setToUserName(fromUserName);
- textMessage.setFromUserName(toUserName);
- textMessage.setCreateTime(new Date().getTime());
- textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
- textMessage.setFuncFlag(0);
- textMessage.setContent("[難過] /難過 /::(");
- // 文本消息對象轉換成xml字符串
- respMessage = MessageUtil.textMessageToXml(textMessage);
- }
上面代碼片段的作用是:推斷發送的消息類型,假設是文本消息(MsgType=text),則回復三個難過的QQ表情給用戶。能夠看出,無論是用戶發給公眾帳號,還是公眾帳號發給用戶,都能夠使用QQ表情的文字代碼(如:[難過] /難過)和符號代碼(如 /::()。
公眾帳號識別用戶發送的QQ表情
在掌握了怎樣發送QQ表情后,我們再來看看公眾帳號怎樣識別用戶發送的是QQ表情。這是什么意思呢?當用戶向公眾帳號發送一個QQ表情,在后台程序中接收到的會是什么值,我們又怎么知道這個值就是一個QQ表情。
事實上,僅僅要做個簡單的測試,比方:將接收到的文本消息輸出到日志中(能夠用log4j或者System.out.print),不難發現:向公眾帳號發送一個QQ表情,在后台程序中接收到的是QQ表情的符號代碼。
以下是我簡單封裝的一個方法,通過正則表達式實現的,用於推斷用戶發送的是否是單個QQ表情。
- /**
- * 推斷是否是QQ表情
- *
- * @param content
- * @return
- */
- public static boolean isQqFace(String content) {
- boolean result = false;
- // 推斷QQ表情的正則表達式
- String qqfaceRegex = "/::\\)|/::~|/::B|/::\\||/:8-\\)|/::<|/::$|/::X|/::Z|/::'\\(|/::-\\||/::@|/::P|/::D|/::O|/::\\(|/::\\+|/:--b|/::Q|/::T|/:,@P|/:,@-D|/::d|/:,@o|/::g|/:\\|-\\)|/::!|/::L|/::>|/::,@|/:,@f|/::-S|/:\\?|/:,@x|/:,@@|/::8|/:,@!|/:!!!|/:xx|/:bye|/:wipe|/:dig|/:handclap|/:&-\\(|/:B-\\)|/:<@|/:@>|/::-O|/:>-\\||/:P-\\(|/::'\\||/:X-\\)|/::\\*|/:@x|/:8\\*|/:pd|/:<W>|/:beer|/:basketb|/:oo|/:coffee|/:eat|/:pig|/:rose|/:fade|/:showlove|/:heart|/:break|/:cake|/:li|/:bome|/:kn|/:footb|/:ladybug|/:shit|/:moon|/:sun|/:gift|/:hug|/:strong|/:weak|/:share|/:v|/:@\\)|/:jj|/:@@|/:bad|/:lvu|/:no|/:ok|/:love|/:<L>|/:jump|/:shake|/:<O>|/:circle|/:kotow|/:turn|/:skip|/:oY|/:#-0|/:hiphot|/:kiss|/:<&|/:&>";
- Pattern p = Pattern.compile(qqfaceRegex);
- Matcher m = p.matcher(content);
- if (m.matches()) {
- result = true;
- }
- return result;
- }
以下是方法的使用,實現了這樣一個簡單的功能:用戶發什么QQ表情給公眾帳號,公眾帳號就回復什么QQ表情給用戶(xiaoqrobot就是這么做的)。實現代碼例如以下:
- // 文本消息
- if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
- // 文本消息內容
- String content = requestMap.get("Content");
- // 推斷用戶發送的是否是單個QQ表情
- if(XiaoqUtil.isQqFace(content)) {
- // 回復文本消息
- TextMessage textMessage = new TextMessage();
- textMessage.setToUserName(fromUserName);
- textMessage.setFromUserName(toUserName);
- textMessage.setCreateTime(new Date().getTime());
- textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
- textMessage.setFuncFlag(0);
- // 用戶發什么QQ表情,就返回什么QQ表情
- textMessage.setContent(content);
- // 將文本消息對象轉換成xml字符串
- respMessage = MessageUtil.textMessageToXml(textMessage);
- }
- }
好了,關於微信公眾帳號中QQ表情的使用就介紹這么多。事實上,我並不希望剛開始學習的人上來僅僅是簡單拷貝我貼出的代碼,實現了自己想要的功能就完事了,更希望初學的朋友能夠通過此文章學會一種思考問題和解決這個問題的方法。