【腾讯云IM】即时通讯的登录,登出,用户列表,私聊,图片发送

uniapp即时通讯

      • 1,初始化(刚开始就紧跟着文档走)
      • 2,App.vue中项目引入腾讯云,(附上账号在其他地方登陆的监听)
      • 3,登录前必需
        • 3.1,获取登录id
        • 3.2,生成userSig,独立封装一下
          • 3.2.1,文档下载生成UserSig的内容
          • 3.2.2,新建GenerateTestUserSig.js
          • 3.2.3,页面使用生成Usersig
        • 3.3,App.vue中的onshow要监听登录,因为IM的sdk会在app重新进入的时候登出
        • 3.4,登录完,你可以获取用户信息来更新IM的用户信息,为将来用户列表的头像和昵称做铺垫
      • 4,用户模块,先给看一下成品的消息推送的截图
        • 4.0,先上一下HTMl截图
        • 4.1,先发送消息,然后才能获取用户列表
        • 4.2,滚动到底部的代码
        • 4.3,发送图片
        • 4.4,历史聊天记录
        • 4.5,监听对面发来的消息
        • 4.5,向上拉到获取旧历史记录
        • 4.6,向上拉到获取旧历史记录
        • 4.7,当用户列表展示未读数量的时候,进来聊天页面需要将消息已读
      • 5,用户列表展示,先看一下HTML截图
      • 5,嘿嘿,提供思路~

附上腾讯云文档链接:https://cloud.tencent.com/document/product/269/75285

1,初始化(刚开始就紧跟着文档走)

// 从v2.11.2起,SDK 支持了 WebSocket,推荐接入;v2.10.2及以下版本,使用 HTTP
npm install tim-wx-sdk --save
// 发送图片、文件等消息需要腾讯云 即时通信 IM 上传插件
npm install tim-upload-plugin --save
// 拦截或替换敏感词需要本地审核插件
npm install tim-profanity-filter-plugin --save

2,App.vue中项目引入腾讯云,(附上账号在其他地方登陆的监听)

<script>import TIM from 'tim-wx-sdk';import TIMUploadPlugin from 'tim-upload-plugin';import TIMProfanityFilterPlugin from 'tim-profanity-filter-plugin';import Vue from 'vue'export default {onLaunch: function() {console.log('App Launch')let options = {SDKAppID: xxxx// 接入时需要将0替换为您的即时通信 IM 应用的 SDKAppID};// 秘钥e8e585a65c480847f1a53046d5ba92c383168ba50dfd7dd8cb54325f18bc4fd5// 创建 SDK 实例,`TIM.create()`方法对于同一个 `SDKAppID` 只会返回同一份实例let tim = TIM.create(options); // SDK 实例通常用 tim 表示// 设置 SDK 日志输出级别,详细分级请参见 setLogLevel  https://web.sdk.qcloud.com/im/doc/zh-cn/SDK.html#setLogLevel 接口的说明</a>tim.setLogLevel(1); // 普通级别,日志量较多,接入时建议使用// tim.setLogLevel(1); // release 级别,SDK 输出关键信息,生产环境时建议使用// 注册腾讯云即时通信 IM 上传插件tim.registerPlugin({'tim-upload-plugin': TIMUploadPlugin});// 注册腾讯云即时通信 IM 本地审核插件tim.registerPlugin({'tim-profanity-filter-plugin': TIMProfanityFilterPlugin});let onKickedOut = function(event) {console.log(event.data.type, "被踢了,被踢了");uni.showToast({title: "账号在其他地方登陆,请重新登录!",icon: "none"})uni.clearStorage()setTimeout(() => {uni.reLaunch({url: "/pages/login/login"})}, 1000)// TIM.TYPES.KICKED_OUT_MULT_ACCOUNT(Web 端,同一帐号,多页面登录被踢)// TIM.TYPES.KICKED_OUT_MULT_DEVICE(同一帐号,多端登录被踢)// TIM.TYPES.KICKED_OUT_USERSIG_EXPIRED(签名过期)// TIM.TYPES.KICKED_OUT_REST_API(REST API kick 接口踢出。v2.20.0起支持)};tim.on(TIM.EVENT.KICKED_OUT, onKickedOut);//注册为全局变量Vue.prototype.$tim = timVue.prototype.$TIM = TIM},onShow: function() {console.log('App Show')},onHide: function() {console.log('App Hide')}}
</script><style lang="scss">
</style>

3,登录前必需

3.1,获取登录id

这个id相当于用户标识,一般采用用户id,但注意,传的 时候要转成字符串格式

3.2,生成userSig,独立封装一下

3.2.1,文档下载生成UserSig的内容

点击去下载:
在这里插入图片描述
在这里插入图片描述

3.2.2,新建GenerateTestUserSig.js
import LibGenerateTestUserSig from '@/common/lib-generate-test-usersig-es.min.js'
const _SECRETKEY = '';
/** Module:   GenerateTestUserSig** Function: 用于生成测试用的 UserSig,UserSig 是腾讯云为其云服务设计的一种安全保护签名。*           其计算方法是对 SDKAppID、UserID 和 EXPIRETIME 进行加密,加密算法为 HMAC-SHA256。** Attention: 请不要将如下代码发布到您的线上正式版本的 App 中,原因如下:**            本文件中的代码虽然能够正确计算出 UserSig,但仅适合快速调通 SDK 的基本功能,不适合线上产品,*            这是因为客户端代码中的 SECRETKEY 很容易被反编译逆向破解,尤其是 Web 端的代码被破解的难度几乎为零。*            一旦您的密钥泄露,攻击者就可以计算出正确的 UserSig 来盗用您的腾讯云流量。**            正确的做法是将 UserSig 的计算代码和加密密钥放在您的业务服务器上,然后由 App 按需向您的服务器获取实时算出的 UserSig。*            由于破解服务器的成本要高于破解客户端 App,所以服务器计算的方案能够更好地保护您的加密密钥。** Reference:https://cloud.tencent.com/document/product/647/17275#Server*/
function genTestUserSig(userID) {//调用的时候,传入userID/*** 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId。** 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ) 创建应用,即可看到 SDKAppId,* 它是腾讯云用于区分客户的唯一标识。*/var SDKAPPID = xxxx;//替换为您自己账号下的 SDKAppId/*** 签名过期时间,建议不要设置的过短* <p>* 时间单位:秒* 默认时间:7 x 24 x 60 x 60 = 604800 = 7 天*/var EXPIRETIME = 604800;/*** 计算签名用的加密密钥,获取步骤如下:** step1. 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ),如果还没有应用就创建一个,* step2. 单击“应用配置”进入基础配置页面,并进一步找到“帐号体系集成”部分。* step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中** 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。* 文档:https://cloud.tencent.com/document/product/647/17275#Server*/var SECRETKEY = 'xxxxx';//填入秘钥哦var generator = new LibGenerateTestUserSig(SDKAPPID, SECRETKEY, EXPIRETIME);var userSig = generator.genTestUserSig(userID);return {sdkappid: SDKAPPID,userSig: userSig};
}
export {genTestUserSig
}
3.2.3,页面使用生成Usersig
	import {genTestUserSig } from "@/common/GenerateTestUserSig.js"

在这里插入图片描述

getlogin() {let that = thisthat.POST('/login', {mobile: this.form.mobile,password: this.form.password,}).then(res => {console.log(res)if (res.code == 1) {let userid = String(res.data.userinfo.id)//拿到idlet UserSig = genTestUserSig(userid).userSig //生成UserSigconsole.log(UserSig, "")let getlogin = that.$tim.login({userID: userid,userSig: UserSig});getlogin.then(function(imResponse) {console.log(imResponse, "登陆成功"); // 登录成功uni.setStorageSync('userinfo', res.data.userinfo)uni.setStorageSync('token', res.data.userinfo.token)if (imResponse.data.repeatLogin === true) {// 标识帐号已登录,本次登录操作为重复登录。v2.5.1 起支持console.log(imResponse.data.errorInfo);that.myuserinfo()} else {that.myuserinfo()}}).catch(function(imError) {console.warn('重复登录', imError); // 登录失败的相关信息});} else {uni.showToast({title: res.msg,icon: "none"})}}).catch(err => {console.log(err)})

3.3,App.vue中的onshow要监听登录,因为IM的sdk会在app重新进入的时候登出

onShow: function() {console.log('App Show')if (uni.getStorageSync('token')) {let that = thislet userinfo = uni.getStorageSync('userinfo')let userid = String(userinfo.id)let UserSig = genTestUserSig(userid).userSig //生成UserSiglet getlogin = that.$tim.login({userID: userid,userSig: UserSig});getlogin.then(function(imResponse) {console.log(imResponse, "登陆成功"); // 登录成功if (imResponse.data.repeatLogin === true) {// 标识帐号已登录,本次登录操作为重复登录。v2.5.1 起支持console.log(imResponse.data.errorInfo);} else {}}).catch(function(imError) {console.warn('重复登录', imError); // 登录失败的相关信息});}
},

3.4,登录完,你可以获取用户信息来更新IM的用户信息,为将来用户列表的头像和昵称做铺垫

//个人信息
myuserinfo() {let that = thisthat.GET('/uInfo').then((res) => {if (res.code == 1) {let user;user = res.datasetTimeout(() => {console.log(user)// 修改个人标配资料let promise = that.$tim.updateMyProfile({nick: user.shop_name ? user.shop_name : user.nickname,avatar: user.avatar,gender: that.$TIM.TYPES.GENDER_UNKNOWN,selfSignature: user.shop_name ? user.shop_name : '用户',allowType: that.$TIM.TYPES.ALLOW_TYPE_ALLOW_ANY});promise.then(function(imResponse) {console.log(imResponse.data, "更新成功"); // 更新资料成功uni.switchTab({url: "/pages/index/index"})}).catch(function(imError) {console.warn('updateMyProfile error:',imError); // 更新资料失败的相关信息})}, 500)} else {uni.showToast({title: res.msg,icon: "none"})}})
},

4,用户模块,先给看一下成品的消息推送的截图

在这里插入图片描述

4.0,先上一下HTMl截图

在这里插入图片描述

4.1,先发送消息,然后才能获取用户列表

//发送消息
Go() {// 发送文本消息,Web 端与小程序端相同// 1. 创建消息实例,接口返回的实例可以上屏let that = thislet message = that.$tim.createTextMessage({to: that.To_user_id,//接受者IDconversationType: 'C2C',//c2c代表单聊payload: {text: that.Keyword,//要发送的内容},cloudCustomData:"",//needReadReceipt: true});// 2. 发送消息let promise = that.$tim.sendMessage(message);promise.then(function(imResponse) {// 发送成功.输入框清空that.Keyword = ""//消息列表push当前消息that.chatlist.push(imResponse.data.message)//列表滚动到底部that.scrollToBottom()}).catch(function(imError) {// 发送失败console.warn('sendMessage error:', imError);});
}

4.2,滚动到底部的代码

//滚动至聊天底部
scrollToBottom() {let that = thisthat.$nextTick(() => {that.intoindex = "text" + Number(that.chatlist.length - 1)})
},

4.3,发送图片

//发送图片
GoImage() {let that = thisuni.chooseImage({count: 2,sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有sourceType: ['album'], // 从相册选择success: (res) => {console.log(res)let message = that.$tim.createImageMessage({// to: '5MYfeMTrSEvmAF1cLct',to: that.To_user_id,conversationType: 'C2C',payload: {file: res},onProgress: function(event) {console.log('file uploading:', event)}});// 3. 发送图片let promise = that.$tim.sendMessage(message);promise.then(function(imResponse) {// 发送成功console.log(imResponse);that.chatlist.push(imResponse.data.message)that.scrollToBottom()}).catch(function(imError) {// 发送失败console.warn('sendMessage error:', imError);});}});
},

4.4,历史聊天记录

// 拉取历史消息
GetMessageList(groupid) {let that = this// 根据 sequence 拉群漫游消息,direction 0 向上拉,拉更旧的消息,direction 1 向下拉,拉更新的消息let promise = this.$tim.getMessageListHopping({conversationID: 'C2C' + that.To_user_id,count: 15,direction: 0});promise.then(function(imResponse) {console.log(imResponse, '历史消息')const messageList = imResponse.data.messageList; // 消息列表。that.nextReqMessageID = imResponse.data.messageList[0].ID; // 用于续拉,分页续拉时需传入该字段。console.log(that.nextReqMessageID)that.chatlist = messageListconsole.log(that.chatlist[that.chatlist.length - 1].type == "TIMImageElem")that.scrollToBottom()});
},

4.5,监听对面发来的消息

// 接收消息监听
function accentmiss(event) {vue.accentmiss(event)
}
export default {data() {return {};},onLoad(options) {this.To_user_id = String(options.To_user_id)// 接收消息监听this.$tim.on(this.$TIM.EVENT.MESSAGE_RECEIVED, accentmiss);}methods:{// 接收消息accentmiss(event) {console.log(event, "收到消息了")//由于收到是所有的监听消息,所以,这里应该区分一下,如果是本次聊天的,push。不是,则不pushif(event.data[0].from==this.To_user_id){this.chatlist.push(event.data[0])}this.readmiss()this.scrollToBottom()}},// 页面卸载,关闭监听onUnload() {this.$tim.off(this.$TIM.EVENT.MESSAGE_RECEIVED, accentmiss);},
},

4.5,向上拉到获取旧历史记录

上面第一次获取历史记录的时候,拿到了历史记录的第一条历史记录ID,nextReqMessageID
接下来,pages.json,开启为true
在这里插入图片描述

onPullDownRefresh() {// 下拉查看更多消息let that = thislet promise = this.$tim.getMessageList({conversationID: 'C2C' + that.To_user_id,//c2c是必要的nextReqMessageID: that.nextReqMessageID,direction: 0,//0向上,1向下count: 15,//拉取数量});promise.then(function(imResponse) {console.log(imResponse)setTimeout(function() {uni.stopPullDownRefresh();}, 1000);that.nextReqMessageID = imResponse.data.messageList[0].ID; // 用于续拉,分页续拉时需传入该字段。that.chatlist = [...imResponse.data.messageList, ...that.chatlist]//通过扩展运算符,向前拼接});
},

4.6,向上拉到获取旧历史记录

//聊天图片放大功能
openimg(index) {console.log(index)let that = thislet list = []list.push(that.chatlist[index].payload.imageInfoArray[0].url)uni.previewImage({urls: list,current: 1,longPressActions: {// itemList: ['发送给朋友', '保存图片', '收藏'],success: function(data) {console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');},fail: function(err) {console.log(err.errMsg);}}});
},

4.7,当用户列表展示未读数量的时候,进来聊天页面需要将消息已读

//消息已读
readmiss() {// 将某会话下所有未读消息已读上报let that = thislet promise = that.$tim.setMessageRead({conversationID: 'C2C' + that.To_user_id});promise.then(function(imResponse) {console.log("已读成功")// 已读上报成功,指定 ID 的会话的 unreadCount 属性值被置为0}).catch(function(imError) {// 已读上报失败console.warn('setMessageRead error:', imError);});
},

5,用户列表展示,先看一下HTML截图

在这里插入图片描述
在这里插入图片描述

//获取会话列表
getchatlist() {let that = thisthat.userlist = []let promise = that.$tim.getConversationList();promise.then(function(imResponse) {that.conversationList = imResponse.data.conversationList; // 全量的会话列表,用该列表覆盖原有的会话列表that.conversationList.forEach(item => {item.lastMessage.lastTime1 = that.stampTime(item.lastMessage.lastTime * 1000)//最新消息的时间})console.log(that.conversationList)const isSyncCompleted = imResponse.data.isSyncCompleted; // 从云端同步会话列表是否完成}).catch(function(imError) {console.warn('getConversationList error:', imError); // 获取会话列表失败的相关信息});
},

5,嘿嘿,提供思路~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33450.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云开发者平台

1.应用场景 轻量级代码托管产品, 2.学习/操作 2.1 介绍 官网: coding.net 腾讯云开发者平台是腾讯云与 CODING 共同为开发者打造的云端工具平台&#xff0c;旨在为更多的开发者带去便捷、高效的 开发体验&#xff0c;提供包括需求管理、代码编写、代码管理、代码运行的整套系…

上传图片到腾讯云(海外服务器)com.qcloud5.5.4版本

问题描述&#xff1a;上传图片至腾讯云服务器&#xff0c;存储桶Region一直在国内地址&#xff0c;访问正常的&#xff0c;新启一个项目&#xff0c;存储桶Region迁移到孟买ap-mumbai区域&#xff0c;出现上传不成功 问题原因&#xff1a; <dependency><groupId>…

微信小程序接入腾讯云实时音视频TRTC----基本使用

前言:虽然说的有点乱,我觉得有必要说一下什么是音视频与整体开发需要些什么东西,因为当时我也是不知道这是啥? .我的理解音视频就是类似微信视频通话的东西,以自己的角度来看,我与好友建立视频的步骤简单来讲就是我把我的视频信息推送到微信,微信处理发给我好友,然后我再将好友…

【新知实验室】手把手实现腾讯云音视频应用

腾讯云音视频是什么&#xff1f; 腾讯云音视频&#xff08;TRTC&#xff09;提供一站式视频解决方案&#xff0c;包括点播直播、实时视频通话、短视频等视频服务&#xff0c;广泛应用于在线视频、电商、游戏直播、在线教育等场景。实时音视频基于腾讯21年来在网络与音视频技术上…

TBS腾讯浏览服务的SDK接入

Share Only 版 引入依赖库compile com.jakewharton:butterknife:7.0.1&#xff0c;与项目本身无关&#xff0c;不喜欢findViewById而已&#xff0c;这里有个小坑&#xff0c;最新版本的butterknife结合插件使用可能会导致findViewById或者onClick绑定失败…将shareOnly版本的j…

web端对接语音通话(腾讯云)

实时音视频 实时语音通话(Web) - 场景实践 - 文档中心 - 腾讯云 按照要求注册腾讯云账号&#xff0c;跑通demo 1、集成TRTCCalling组件 // npm方式安装 npm install trtc-js-sdk --save npm install tim-js-sdk --save npm install tsignaling --save npm install trtc-calli…

新知实验室基于腾讯云实时音视频WEB端实验

腾讯实时音视频&#xff08;Tencent Real-Time Communication&#xff0c;TRTC&#xff09;主要用于互动直播和多人音视频。支持低延时直播观看、实时录制、屏幕分享、美颜特效、立体声等能力&#xff0c;还能和直播 CDN 无缝对接&#xff0c;适用于互动连麦、跨房 PK、语音电台…

腾讯云IM-SDK集成(web端)完成IM登录

一脸懵逼的看着腾讯云的文档&#xff0c;完成了所谓的采坑之旅 &#xff08;1&#xff09;很多人估计公司也需要用到聊天&#xff0c;以及音视频的功能&#xff0c;那么作为萌新的我&#xff0c;当然也是一来公司便得知需要用到这个技术&#xff0c;当时我是懵逼的&#xff0c…

[Web端接入经验分享] 腾讯云即时通信TIM、实时音视频TRTC

[Web端接入经验分享] 腾讯云即时通信TIM、实时音视频TRTC 即时通信TIM官网地址 即时通信TIM SDK API文档地址 实时音视频TRTC官网地址 实时音视频TRTC SDK API文档地址 概念与可能造成疑惑的问题 SDK 是什么&#xff1f; Github 地址 腾讯云将底层与后台代码封装混淆之后生成…

腾讯云部署清华大学ChatGLM-6B实战

简介&#xff08;来自官方&#xff09; ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别…

Chat GPT的到来,对普通人来说是福还是祸?

AI机器人的功能可能比我们想象的更大&#xff0c;可以创作也可以模拟人类的语言行为&#xff0c;与人类进行自然的聊天交流。同时已经开始代替人类做一些基础的工作&#xff0c;未来可能代替更多的人类工作。人工智能的出现也值得我们人类自己深思&#xff0c;如果我们的工作被…

使用Mendeley和CvtCNKI进行中英文参考文献引用管理(含硕博论文)

在写学术论文和学位论文的时候&#xff0c;往往需要引用大量参考文献&#xff0c;以前博主的做法都是边写论文边把相关参考文献以word批注的形式列在侧边栏&#xff08;因为后面修改的时候可能还会有所变动&#xff09;&#xff0c;等论文定稿之后再手动对引用的相关参考文献编…

关于硕士毕业论文中会议conference的参考文献格式修正GB7714-87#outputstyle#endnote

1问题描述 在硕士毕业论文中需要按照GB7714-87的参考文献引用标准对会议论文进行参考文献格式规范 GB7714-87中的要求如图&#xff1a;&#xff08;因为我们文中引用的论文一般 不会是论文集&#xff0c;而是论文集合中析出的一篇文章&#xff0c;so这个格式非常复杂&#xff…

IEEE Transactions模板中参考文献作者缩写、期刊名缩写

IEEE Transactions模板中参考文献作者缩写、期刊名缩写 本文章记录如何在IEEE Transactions的模板中&#xff0c;解决参考文献的作者缩写、期刊名字缩写的问题。 目录 IEEE Transactions模板中参考文献作者缩写、期刊名缩写0.上效果图1.如何设置.bib文件2.如何作者名字的缩写3…

ForeFront Chat 免费版GPT-4来了!

Forefront Chat简介 近日&#xff0c;Forefront AI 正式推出 Forefront Chat&#xff0c; 允许用户免费体验GPT-4 的强大功能 。 Forefront AI 在 Twitter 上表示&#xff1a;“今天&#xff0c;我们发布了 Forefront Chat 的免费 alpha 版&#xff0c;希望带来更出色的 ChatG…

女网红靠GPT-4交1000+男友,聊天按分钟收费,一周收入50万

点击关注公众号&#xff1a;互联网架构师&#xff0c;后台回复 2T获取2TB学习资源&#xff01; 上一篇&#xff1a;Alibaba开源内网高并发编程手册.pdf 编辑&#xff1a;鱼羊 转自&#xff1a;量子位 | 公众号 QbitAI 注意看&#xff0c;这个女人叫卡琳&#xff0c;靠着GPT-4&a…

熵在计算机方向的应用(浅谈信息熵)

信息是一个很抽象的东西&#xff0c;吃苹果的概率是二分之一&#xff0c;吃香蕉的概率是二分之一&#xff0c;这里面包含了多少信息量&#xff0c;由于信息很抽象&#xff0c;无法直观的量化。 信息熵原先是热力学中的名词&#xff0c;原先含义是表示分子状态的混乱程度。 香…

中文信息熵的计算

摘要&#xff1a;本文介绍了利用基于词的一元模型、二元模型、三元模型估计中文信息熵的计算方法&#xff0c;并通过中文维基百科语料得到三种统计语言模型计算得到的中文信息熵分别为13.711比特/词、6.402比特/词、1.508比特/词。 关键词&#xff1a;信息熵&#xff1b; 统计…

信息与熵值的计算

原文地址https://blog.csdn.net/kuang_liu/article/details/21469553 1. 什么是信息&#xff1f; 信息的定义涉及概率论中的随机事件概率&#xff0c;如果待分类事物可能划分在多个分类之中&#xff0c;则符号 Xi 的信息定义为&#xff1a; 其中 p(xi) 是选择该分类的概率。&…

信息熵的数值计算公式

1948年&#xff0c;信息论之父 C. E. Shannon &#xff08;香农&#xff09;借鉴了热力学的概念&#xff0c;把信息中排除了冗余后的平均信息量称为“信息熵”&#xff0c;并给出了计算信息熵的数学表达式。 信息熵介绍 一元变量信息熵&#xff1a; 式中对数一般取2为底&#…