★我要吧★

 找回密码
 注册[Register]
搜索
qq空间相册密码查看为什么登陆后需要激活无法注册?

[交流] QQ表情的发送与接收

[复制链接]
发表于 2016-5-9 15:57:15 | 显示全部楼层 |阅读模式
我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜、怒、哀、乐等表达人物心情的小图片。本文重点要介绍的内容就是如何在微信公众平台使用QQ表情,即在微信公众帐号开发模式下,如何发送QQ表情给用户,以及如何识别用户发来的是QQ表情。+ q  H6 ?0 v0 F
2 f; @* o  G& Q( V+ G2 T8 v2 t# `3 m
QQ表情代码表
$ w3 p6 z& A4 l$ L8 k* f首先需要明确的是:QQ表情虽然呈现为一张张动态的表情图片,但在微信公众平台的消息接口中却是属于文本消息;也就是说当用户向公众帐号发送QQ表情时,公众帐号后台程序接收到的消息类型MsgType的值为text。只要上面这点能理解了,下面的工作就好开展了。
9 v4 H0 _' P; _% ]$ w对于QQ表情,发送的是文本消息,而呈现出来却是表情图片,那么每一个QQ表情图片一定会有与之相对应的表情代码。下面是我已经整理好的微信公众帐号中使用的QQ表情代码对照表:  Q  ^* \; E1 L) v: E  K
; L" o& V$ a( S0 W7 r8 z% }
; S" j6 k  v) R: D

6 c8 S6 m+ L* d  F. S  Y! w: ~
- t; m* p( V9 x7 o0 V: U
( Z, ]# ]  ~! u6 @* _3 |$ w) }
) c5 U2 Q% H, w. r* Y+ o# Z上面一共列出了105个QQ表情,每个表情都给出了与之相对应的文字代码与符号代码(也许这两种叫法并不恰当),至于这两种代码怎么来的以及如何使用,下面马上会讲到。
. G1 K, n4 l$ \: a/ w% ^0 f5 n9 u) V, J2 L6 K/ J, ^
用户向公众帐号发送QQ表情
# A; D! X5 Y8 B" {, h' A* M在微信上使用公众帐号时,如何发送QQ表情,我想这个很少有人不会的。在输入框旁边有一个笑脸的图片按钮,点击它将会弹出表情选择界面,可选择的表情依次为“QQ表情”、“符号表情”和“动画表情”。当我们点击选择了某个QQ表情后,发现在输入框中会显示该表情的文字代码,这里是用一对中括号引起的,如下图所示:4 |2 v) C% I: L) F2 F" a0 F% v

% T0 A2 V' @4 O2 c其实,当我们很熟悉要使用QQ表情的文字代码时,也可以直接在输入框中输入表情的代码,而不需要弹出表情选择框。如下图所示:: r; _: R4 W7 `: N

+ u9 m" O4 K$ E9 T
6 G* M+ D% g+ ]% o- k+ T从上图可以看出,在输入框中输入“[呲牙]”、“/呲牙”和“/::D”这三种代码的作用一样,都是发送呲牙的QQ表情。这个时候,大家再回过头去看文章最开始的QQ表情代码对照表,就明白是怎么回事了。
4 E$ Q* m! E5 C8 }
/ m0 m) s; p6 g/ m& q公众帐号向用户发送QQ表情
( l$ L7 H; j. f: Z# G7 Q& s1 }4 m' _" |与用户向公众帐号发送QQ表情一样,在开发模式下,公众帐号也可以用同样的表情代码(文字代码或符号代码)向用户回复QQ表情。代码片段如下:1 F9 X2 L0 I; Q- @! J

, v% F. C9 b! o( L# e4 i

    ; f+ g2 @0 P: n. R8 k) t7 ^! ?- J( F// 文本消息   
  • if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {   2 _' I! S! `0 F' G
        // 回复文本消息   
  •     TextMessage textMessage = new TextMessage();   
    , l8 B" {" X6 [    textMessage.setToUserName(fromUserName);   
  •     textMessage.setFromUserName(toUserName);   9 R2 Y+ _* L8 g5 f, J
        textMessage.setCreateTime(new Date().getTime());   
  •     textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);   
    1 H- d$ v+ E9 v2 f/ b6 k" z    textMessage.setFuncFlag(0);   
  •     textMessage.setContent("[难过] /难过 /::(");   
    * `* L; U5 o6 o* h+ U- I      
  •     // 文本消息对象转换成xml字符串   , a$ s; r9 F, g& A
        respMessage = MessageUtil.textMessageToXml(textMessage);   
  • }   
    : l" H* _( o, ~# i. h) p' A
2 L$ ^( J4 ?& P2 V- ?
上面代码片段的作用是:判断发送的消息类型,如果是文本消息(MsgType=text),则回复三个难过的QQ表情给用户。可以看出,不管是用户发给公众帐号,还是公众帐号发给用户,都可以使用QQ表情的文字代码(如:[难过]  /难过)和符号代码(如 /::()。
( a2 P3 `8 ]; ~9 U9 M/ m: I( e* S% N) R* X) w$ P2 _
公众帐号识别用户发送的QQ表情' I/ F2 ?: g1 L6 \
在掌握了如何发送QQ表情后,我们再来看看公众帐号如何识别用户发送的是QQ表情。这是什么意思呢?当用户向公众帐号发送一个QQ表情,在后台程序中接收到的会是什么值,我们又怎么知道这个值就是一个QQ表情。0 _9 a* x9 }& c# J) q" [" w
其实,只要做个简单的测试,比如:将接收到的文本消息输出到日志中(可以用log4j或者System.out.print),不难发现:向公众帐号发送一个QQ表情,在后台程序中接收到的是QQ表情的符号代码。# i' D* I4 E( ]  v
下面是我简单封装的一个方法,通过正则表达式实现的,用于判断用户发送的是否是单个QQ表情。
* y+ }+ N' _" @& c& M( d  a& n! \4 v& w; z8 @  a- s# Y
    / }& _1 E8 Z+ Q) o4 Q. q
    /**  
  • * 判断是否是QQ表情  + V! g, H# W; s: |9 [6 `' q8 Q& J7 _% }
    *   
  • * @param content  . a( a) |. S6 ^  H: T2 C
    * @return  
  • */   
    " w$ v# y) i7 e5 o. {( K5 ?public static boolean isQqFace(String content) {   
  •     boolean result = false;   
    $ v0 v/ b3 h2 A, R5 V) v4 R: [4 V   
  •     // 判断QQ表情的正则表达式   
    - w. V% x6 E, h1 G' H, G8 B. v' P! @    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);   ! h% Q2 Y! d9 u# Q9 ]% e
        Matcher m = p.matcher(content);   
  •     if (m.matches()) {   : L4 X% c5 e5 h. p0 k) n
            result = true;   
  •     }   2 C7 @. S4 y6 T! D3 w# R7 @
        return result;   
  • }   
    - P4 |8 Q9 D- P+ P7 C0 x; P
$ S. d* U5 S& R/ Y
下面是方法的使用,实现了这样一个简单的功能:用户发什么QQ表情给公众帐号,公众帐号就回复什么QQ表情给用户(xiaoqrobot就是这么做的)。实现代码如下:% I+ H: J: [4 H% \8 k
& O+ V& C- J$ G$ q# ^
    ! r& t# ?$ d- t9 n+ r! v! C& i
    // 文本消息   
  • if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {   
    * c- b  x( @, e    // 文本消息内容   
  •     String content = requestMap.get("Content");   ) P2 t) M$ f7 o
          
  •     // 判断用户发送的是否是单个QQ表情   
    9 G- ?$ @& v( E6 E3 ?& T6 |* Q    if(XiaoqUtil.isQqFace(content)) {   
  •         // 回复文本消息   
    & T8 b  H( G, t        TextMessage textMessage = new TextMessage();   
  •         textMessage.setToUserName(fromUserName);     p6 C2 T7 m; m/ D1 X3 {' ?: s
            textMessage.setFromUserName(toUserName);   
  •         textMessage.setCreateTime(new Date().getTime());   
    2 i8 c. L$ Y7 |5 M4 q, a- Q        textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);   
  •         textMessage.setFuncFlag(0);   8 z: N: f9 G* U0 V' ^+ Y
            // 用户发什么QQ表情,就返回什么QQ表情   
  •         textMessage.setContent(content);   ( M( [, S. W2 u, `$ I
               
  •         // 将文本消息对象转换成xml字符串   
    2 @* x& W2 i+ X% a4 |1 G        respMessage = MessageUtil.textMessageToXml(textMessage);   
  •     }   
  • }   
      @! W  c& X! X4 K( V8 C  L6 }- f0 ?

, ]( d+ |( H( K( Q3 A/ K好了,关于微信公众帐号中QQ表情的使用就介绍这么多。其实,我并不希望初学者上来只是简单拷贝我贴出的代码,实现了自己想要的功能就完事了,更希望初学的朋友能够通过此文章学会一种思考问题和解决问题的方法。
+ t) g2 N& Y9 Y. r& d$ T' h
( A% {# B/ a9 M0 P
发表于 2016-7-22 19:11:52 来自手机 | 显示全部楼层
感谢分享。      
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

QQ|手机版|小黑屋|☆我要吧☆ ( 豫ICP备13016831号-1 )

GMT+8, 2025-12-19 19:41 , Processed in 0.212274 second(s), 22 queries .

Powered by abc369 X3.4

© 2001-2023 abc369.

快速回复 返回顶部 返回列表