消息分为两种 : 发送消息 接收消息 (目前我用到的是单对单的聊天 1v1)
*发送消息 : 1、发送普通文字消息 。 2、发送表情。 3、发送图片。4、发送语言。(常用的就这)
*接收消息: 文字、表情、图片、语言等 包括最近七天之内的历史消息等
1 .收消息
/* function getC2CHistoryMsgs
* 拉取C2C漫游消息
* params:
* options - 请求参数
* cbOk - function(msgList)类型, 成功时的回调函数, msgList 为消息数组,格式为[Msg 对象],
* cbErr - function(err)类型, 失败时回调函数, err 为错误对象
* return:
* (无)
*/
//获取最新的 C2C 历史消息,用于切换好友聊天,重新拉取好友的聊天消息
var getLastC2CHistoryMsgs = function (cbOk, cbError) {
if (selType == webim.SESSION_TYPE.GROUP) {
alert('当前的聊天类型为群聊天,不能进行拉取好友历史消息操作');
return;
}
var lastMsgTime = 0;//第一次拉取好友历史消息时,必须传0
var msgKey = '';
var options = {
'Peer_Account': selToID, //好友帐号,selToID 为全局变量,表示当前正在进行的聊天 ID,当聊天类型为私聊时,该值为好友帐号,否则为群号。
'MaxCnt': reqMsgCount, //拉取消息条数
'LastMsgTime': lastMsgTime, //最近的消息时间,即从这个时间点向前拉取历史消息
'MsgKey': msgKey
};
webim.getC2CHistoryMsgs(
options,
function (resp) {
var complete = resp.Complete;//是否还有历史消息可以拉取,1表示没有,0表示有
var retMsgCount = resp.MsgCount;//返回的消息条数,小于或等于请求的消息条数,小于的时候,说明没有历史消息可拉取了
if (resp.MsgList.length == 0) {
webim.Log.error("没有历史消息了:data=" + JSON.stringify(options));
return;
}
getPrePageC2CHistroyMsgInfoMap[selToID] = {//保留服务器返回的最近消息时间和消息 Key,用于下次向前拉取历史消息
'LastMsgTime': resp.LastMsgTime,
'MsgKey': resp.MsgKey
};
if (cbOk)
cbOk(resp.MsgList);
},
cbError
);
};
//获取所有会话 (这里可以根据需求使用)
var sessMap = webim.MsgStore.sessMap();
for (var i in sessMap) {
sess = sessMap[i];
if (selToID != sess.id()) {//更新其他聊天对象的未读消息数,selToID 为全局变量,表示当前正在进行的聊天 ID,当聊天类型为私聊时,该值为好友帐号,否则为群号。
updateSessDiv(sess.type(), sess.id(), sess.unread());
}
}
1 .发送消息
//发送消息(文本或者表情)
function onSendMsg() {
if (!selToID) { // selToID 为全局变量,表示当前正在进行的聊天 ID,当聊天类型为私聊时,该值为好友帐号,否则为群号。
alert("您还没有选中好友或者群组,暂不能聊天");
$("#send_msg_text").val('');
return;
}
//获取消息内容
var msgtosend = document.getElementsByClassName("msgedit")[0].value;
var msgLen = webim.Tool.getStrBytes(msgtosend);
if (msgtosend.length < 1) {
alert("发送的消息不能为空!");
$("#send_msg_text").val('');
return;
}
var maxLen, errInfo;
if (selType == webim.SESSION_TYPE.C2C) {
maxLen = webim.MSG_MAX_LENGTH.C2C;
errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)";
} else {
maxLen = webim.MSG_MAX_LENGTH.GROUP;
errInfo = "消息长度超出限制(最多" + Math.round(maxLen / 3) + "汉字)";
}
if (msgLen > maxLen) {
alert(errInfo);
return;
}
if (!selSess) {
var selSess = new webim.Session(selType, selToID, selToID, friendHeadUrl, Math.round(new Date().getTime() / 1000));
}
var isSend = true;//是否为自己发送
var seq = -1;//消息序列,-1表示 IM SDK 自动生成,用于去重
var random = Math.round(Math.random() * 4294967296);//消息随机数,用于去重
var msgTime = Math.round(new Date().getTime() / 1000);//消息时间戳
var subType;//消息子类型
if (selType == webim.SESSION_TYPE.C2C) {
subType = webim.C2C_MSG_SUB_TYPE.COMMON;
} else {
//webim.GROUP_MSG_SUB_TYPE.COMMON-普通消息,
//webim.GROUP_MSG_SUB_TYPE.LOVEMSG-点赞消息,优先级最低
//webim.GROUP_MSG_SUB_TYPE.TIP-提示消息(不支持发送,用于区分群消息子类型),
//webim.GROUP_MSG_SUB_TYPE.REDPACKET-红包消息,优先级最高
subType = webim.GROUP_MSG_SUB_TYPE.COMMON;
}
var msg = new webim.Msg(selSess, isSend, seq, random, msgTime, loginInfo.identifier, subType, loginInfo.identifierNick);
var text_obj, face_obj, tmsg, emotionIndex, emotion, restMsgIndex;
//解析文本和表情
var expr = /\[[^[\]]{1,3}\]/mg;
var emotions = msgtosend.match(expr);
if (!emotions || emotions.length < 1) {
text_obj = new webim.Msg.Elem.Text(msgtosend);
msg.addText(text_obj);
} else {
for (var i = 0; i < emotions.length; i++) {
tmsg = msgtosend.substring(0, msgtosend.indexOf(emotions[i]));
if (tmsg) {
text_obj = new webim.Msg.Elem.Text(tmsg);
msg.addText(text_obj);
}
emotionIndex = webim.EmotionDataIndexs[emotions[i]];
emotion = webim.Emotions[emotionIndex];
if (emotion) {
face_obj = new webim.Msg.Elem.Face(emotionIndex, emotions[i]);
msg.addFace(face_obj);
} else {
text_obj = new webim.Msg.Elem.Text(emotions[i]);
msg.addText(text_obj);
}
restMsgIndex = msgtosend.indexOf(emotions[i]) + emotions[i].length;
msgtosend = msgtosend.substring(restMsgIndex);
}
if (msgtosend) {
text_obj = new webim.Msg.Elem.Text(msgtosend);
msg.addText(text_obj);
}
}
webim.sendMsg(msg, function (resp) {
if (selType == webim.SESSION_TYPE.C2C) {//私聊时,在聊天窗口手动添加一条发的消息,群聊时,长轮询接口会返回自己发的消息
addMsg(msg);
}
webim.Tool.setCookie("tmpmsg_" + selToID, '', 0);
$("#send_msg_text").val('');
turnoffFaces_box();
}, function (err) {
alert(err.ErrorInfo);
$("#send_msg_text").val('');
});
}
腾讯云IM中获取用户头像的方法:
主要的方法是:webim.getProfilePortrait(options,cbOk,cbErr);
options里面主要是id和profileitem,根据官方文档指示,大概是:
{
"To_Account":["id1"], //需要获得资料的用户的id
"TagList":
[
"Tag_Profile_IM_Nick"//比如这就是昵称。我们这边主要是需要头像和昵称
]
}
var tag_list = new Array();
tag_list.push("Tag_Profile_IM_Nick");
tag_list.push("Tag_Profile_IM_Image");
var options = {};
var account = new Array();
var userId = selSess.getFromAccount();
account.push(userId);
options.To_Account = account;
options.TagList = tag_list;
//现目前只记起这种书写方式 --!然后
webim.getProfilePortrait(
options,
function (res) {
//这里面的数据就是用户的资料了,当然是获得的你所写了的资料
var UserProfileItem = res.UserProfileItem;
//嗯,是个数组
var C2cNick, C2cImage;
for (var i = 0; i < UserProfileItem.length; i++) {
var data = UserProfileItem[i].ProfileItem;
C2cNick = data[0].Value;
C2cImage = data[1].Value;
}
})
到这里基本都差别多了,这里很多代码都是官方的我们需要使用只需要调用就行了;
var webimhandler = require('../../../utils/webim_handler.js');这个JS文件是官方封装好了的直接调用里面方法即可。有问题多百度,多看文档。千万别问我,因为我也不知道;