最近在做一个小型的聊天工具,需要使用环信来实现即时通讯,可发送文字,表情,图片,以及文件
参考环信开发文档
(1)注册账号之后,登录进入即时通信云管理后台,并在我的应用下创建一个自己的应用,这样就可得到应用的appkey了
(1)下载web sdk并解压后,将 /sdk/dist/strophe-1.2.8.min.js、/sdk/dist/websdk-1.4.11.js、/demo/javascript/dist/webim.config.js 拷贝到系统相应的目录下。
(2)新建 html 文件并 严格按照如下顺序 引入相关 js 脚本。
(3)更改webim.config.js里的appkey,改为自己的appkey
/*头部连接*/
var conn = new WebIM.connection({
isMultiLoginSessions: WebIM.config.isMultiLoginSessions,
https: typeof WebIM.config.https === 'boolean' ? WebIM.config.https : location.protocol === 'https:',
url: WebIM.config.xmppURL,
heartBeatWait: WebIM.config.heartBeatWait,
autoReconnectNumMax: WebIM.config.autoReconnectNumMax,
autoReconnectInterval: WebIM.config.autoReconnectInterval,
apiUrl: WebIM.config.apiURL,
isAutoLogin: true
});
//注册用户
var options = {
username: userid,
password: password,
nickname: nickname,
appKey: WebIM.config.appkey,
success: function () {//注册成功之后回调函数
},
error: function () {},
apiUrl: WebIM.config.apiURL
};
conn.registerUser(options);
/*登录*/
var options = {
apiUrl: WebIM.config.apiURL,
user: user,
pwd: password,
appKey: WebIM.config.appkey
};
conn.open(options);
conn.listen({
onOpened: function ( message ) {}, //连接成功回调
onClosed: function ( message ) {}, //连接关闭回调
onTextMessage: function ( message ) {//收到文本消息
console.log(message);
console.log('收到'+message.from+'发送的消息:'+message.data);
detailMessage(message.data,message.from,'text',message.id,'');
showMessage();
},
onEmojiMessage: function ( message ) {//收到表情消息
console.log('收到'+message.from+'发送的Emoji'+':'+message.data);
//缓存数据
for(var i=0;i';}
}
string = string.replace('undefined','');
console.log(string);
detailMessage(string,message.from,'text',message.id,'');
showMessage();
},
onPictureMessage: function ( message ) {//收到图片消息
console.log(message);
console.log('收到'+message.from+'发送的图片'+':'+message.url);
detailMessage(message.url,message.from,'picture',message.id,'');
showMessage();
},
onCmdMessage: function ( message ) {}, //收到命令消息
onAudioMessage: function ( message ) {}, //收到音频消息
onLocationMessage: function ( message ) {},//收到位置消息
onFileMessage: function ( message ) {//收到文件消息
console.log(message);
console.log('收到'+message.from+'发送的文件'+':'+message.url);
detailMessage(message.url,message.from,'file',message.id,message.filename);
showMessage();
},
onVideoMessage: function (message) {
var node = document.getElementById('privateVideo');
var option = {
url: message.url,
headers: {
'Accept': 'audio/mp4'
},
onFileDownloadComplete: function (response) {
var objectURL = WebIM.utils.parseDownloadResponse.call(conn, response);
node.src = objectURL;
},
onFileDownloadError: function () {
console.log('File down load error.')
}
};
WebIM.utils.download.call(conn, option);
}, //收到视频消息
onPresence: function ( message ) {}, //处理“广播”或“发布-订阅”消息,如联系人订阅请求、处理群组、聊天室被踢解散等消息
onRoster: function ( message ) {}, //处理好友申请
onInviteMessage: function ( message ) {}, //处理群组邀请
onOnline: function () {}, //本机网络连接成功
onOffline: function () {}, //本机网络掉线
onError: function ( message ) {}, //失败回调
onBlacklistUpdate: function (list) { //黑名单变动
// 查询黑名单,将好友拉黑,将好友从黑名单移除都会回调这个函数,list则是黑名单现有的所有好友信息
console.log(list);
},
onReceivedMessage: function(message){}, //收到消息送达客户端回执
onDeliveredMessage: function(message){}, //收到消息送达服务器回执
onReadMessage: function(message){}, //收到消息已读回执
onCreateGroup: function(message){}, //创建群组成功回执(需调用createGroupNew)
onMutedMessage: function(message){} //如果用户在A群组被禁言,在A群发消息会走这个回调并且消息不会传递给群其它成员
});
/* 发送文字消息,这里的所有消息都是发送到群组的,send_to是群组id,群组是在环信管理后台建的,没有在前端自己创建 */
function sendPrivateText() {
var msg_content = $("#input_msg").val();//获取文本内容
if (msg_content.length==0) return;
console.log('发送至'+send_to);
var id = conn.getUniqueId(); // 生成本地消息id
var msg = new WebIM.message('txt', id); // 创建文本消息
msg.set({
msg: msg_content, // 消息内容
to: send_to, // 接收消息对象(用户id)
roomType: false,
chatType: 'groupchat',
success: function (id, serverMsgId) {
console.log('send private text Success');
$("#input_msg").val('');
var emojiMessage = WebIM.utils.parseEmoji(msg_content);
//缓存发送数据
console.log('msg_content:'+emojiMessage);
detailMessage(emojiMessage,"me",'text',msg.id,'');
showMessage();
},
fail:function(){
console.log("文字发送失败!");
}
});
msg.setGroup('groupchat');
conn.send(msg.body);
}
/* 发送图片消息 */
function sendPrivateImg() {
$("#image").change(function () {
var id = conn.getUniqueId(); // 生成本地消息id
var msg = new WebIM.message('img', id); // 创建图片消息
var input = document.getElementById('image'); // 选择图片的input id必填
var file = WebIM.utils.getFileUrl(input); // 将图片转化为二进制文件
var allowType = {'jpg': true,'gif': true,'png': true,'bmp': true};
var img_url;
if (file.filetype.toLowerCase() in allowType) {
var option = {
apiUrl: WebIM.config.apiURL,
file: file,
to: send_to, // 接收消息对象
roomType: false,
chatType: 'groupchat',
onFileUploadError: function () { // 消息上传失败
console.log('图片发送失败!');
},
onFileUploadComplete: function (aa) { // 消息上传成功
console.log('onFileUploadComplete');
img_url = aa.uri+"/"+aa.entities[0].uuid;
},
success: function () { // 消息发送成功
console.log('Success');
//缓存发送数据
console.log(img_url);
detailMessage(img_url,"me",'picture',file.id,'');
showMessage();
},
flashUpload: WebIM.flashUpload
};
msg.set(option);
msg.setGroup('groupchat');
conn.send(msg.body);
}
});
}
/* 发送文件消息 */
function sendPrivateFile() {
("#file").change(function () {
var id = conn.getUniqueId(); // 生成本地消息id
var msg = new WebIM.message('file', id); // 创建文件消息
var input = document.getElementById('file'); // 选择文件的input id必填
var file = WebIM.utils.getFileUrl(input); // 将文件转化为二进制文件
var allowType = {'jpg': true,'gif': true,'png': true,'bmp': true,'zip': true,'txt': true,'doc': true,'pdf': true};
var file_url;
if (file.filetype.toLowerCase() in allowType) {
var option = {
apiUrl: WebIM.config.apiURL,
file: file,
to: send_to, // 接收消息对象
roomType: false,
chatType: 'groupchat',
onFileUploadError: function () { // 消息上传失败
console.log('文件发送失败!');
},
onFileUploadComplete: function (aa) { // 消息上传成功
console.log('onFileUploadComplete');
file_url = aa.uri+"/"+aa.entities[0].uuid;
},
success: function () { // 消息发送成功
console.log('Success');
//缓存发送数据
detailMessage(file_url,"me",'file',file.id,file.filename);
showMessage();
},
flashUpload: WebIM.flashUpload
};
msg.set(option);
msg.setGroup('groupchat');
conn.send(msg.body);
}
});
}
/* 缓存消息处理 */
function detailMessage(data,from,type,id,filename){
var localContent = new Array();
if (localStorage[group]) {
localContent = JSON.parse(localStorage[group]);
}
localContent[localContent.length] = {
'time':getNowFormatDate(),
'data':data,//数据
'from':from,//谁发的
'type':type,//文本类型 text,file,picture
'id':id,//消息id
'filename':filename//文件名字
};
localStorage[group] = JSON.stringify(localContent);//存储本地;
}
/* 显示发送和接收的消息消息 */
function showMessage(){
//console.log('message:'+localContent);
var localContent = JSON.parse(localStorage[group]);
var obj = localContent[localContent.length-1];
//获取对应模板
showBox(obj);//调用模板
tobottom();
}
//模板
function showBox(obj){
//绑定模板
if (obj['from']=='me') {
var html = '';
if (obj.type=='text') {
html = template("my_text",{time:obj.time,msg_content:obj.data});
$(".chat_msg").append(imgShow(html));
}else if (obj.type=='picture') {
html = template("my_img",{time:obj.time,imgUrl:obj.data});
$(".chat_msg").append(html);
}else if (obj.type=='file') {
html = template("my_file",{time:obj.time,filename:obj.filename,fileUrl:obj.data});
$(".chat_msg").append(html);
}
}else{
if (obj.type=='text') {
html = template("other_text",{name:obj.from,time:obj.time,msg_content:obj.data});
$(".chat_msg").append(imgShow(html));
}else if (obj.type=='picture') {
html = template("other_img",{name:obj.from,time:obj.time,imgUrl:obj.data});
$(".chat_msg").append(html);
}else if (obj.type=='file') {
html = template("other_file",{name:obj.from,time:obj.time,filename:obj.filename,fileUrl:obj.data});
$(".chat_msg").append(html);
}
}
}
/*匹配所有表情图片的img标签*/
function imgShow(obj){
var emojiShow = obj.replace(new RegExp("<","gm"),"<");
emojiShow = emojiShow.replace(new RegExp(">","gm"),">");
emojiShow = emojiShow.replace(new RegExp(""","gm"),"'");
return emojiShow;
}
另外还需要将表情图片添加图片资源里去,再添加图片资源信息进去,如下:
WebIM.Emoji = {
path: 'images/faces/',
map: {
'[):]': 'ee_1.png',
'[:D]': 'ee_2.png',
'[;)]': 'ee_3.png',
'[:-o]': 'ee_4.png',
'[:p]': 'ee_5.png',
'[(H)]': 'ee_6.png',
'[:@]': 'ee_7.png',
'[:s]': 'ee_8.png',
'[:$]': 'ee_9.png',
'[:(]': 'ee_10.png',
'[:\'(]': 'ee_11.png',
'[:|]': 'ee_12.png',
'[(a)]': 'ee_13.png',
'[8o|]': 'ee_14.png',
'[8-|]': 'ee_15.png',
'[+o(]': 'ee_16.png',
'[
另外若需要建选择表情的面板,则自己写样式,将图片放到面板上。