teamtalk API
teamtalk 使用的API
HTTP API(http_msg_server)
默认应答
{
"error_code":0,//非0值则为失败了
"error_msg": "成功"//附加信息
}
baseurl:http://ip:8400/
url必带的参数(可以任意填写 因为默认并没有实现相关的作用)
app_key: 验证
req_user_id: 验证
action:post data_type:json
批量用户推送接口
给一批用户发通知 这样减少http的请求次数
POST query/SendBroadCastMessage
data_type:json
parameters:
req_user_id: 发送者ID
session_ids: 接收者ID数组
msg: 消息内容 可以用特殊格式如json封装
msg_type: 默认用3(新定义的 用于推送通知) 1 用户文本消息 2 用户音频 17 群文本消息 18 群音频消息
example:
{
"from_user_id":8,
"session_ids":[1,2],
"msg":"{\"url:\",\"http://ip/note/id\"}",
"msg_type":3
}
客户端需要对消息类型为3的消息 特殊处理以及解析 json封装的会是种约定好的格式
推送接口
给指定用户 通过http发送消息
POST /query/SendP2PMessage
data_type:json
parameters:
req_user_id: 发送者ID
session_id: 接收者ID
msg: 消息内容 可以用特殊格式如json封装
msg_type: 默认用3(新定义的 用于推送通知) 1 用户文本消息 2 用户音频 17 群文本消息 18 群音频消息
example:
{
"from_user_id":8,
"session_id":1,
"msg":"{\"url:\",\"http://www.mworldex.com/note/id\"}",
"msg_type":3
}
客户端需要对消息类型为3的消息 特殊处理以及解析 json封装的会是种约定好的格式
创建群
客户端只能创建临时群 这个http的api可用于创建正式群
POST /query/CreateGroup
data_type:json
parameters:
req_user_id: 请求创建群的用户ID
group_name: 创建群的名称
group_type: 群类型
group_avatar: 群icon的url
user_id_list: 群成员
example:
{
"req_user_id":1,
"group_name":"测试群",
"group_type":1,
"group_avatar":"http://dadsd/dsds/icon.png",
"user_id_list":[1]
}
修改群成员
客户端走tcp的接口也有 不过通过这个也能达到目的 就是得到服务端的反馈内容会少些
POST /query/ChangeMembers
data_type:json
paramters:
from_user_id: 请求修改群成员的用户ID
group_id: 操作的群ID
modify_type: 修改行为 1:add 2:remove
user_id_list: 被操作的用户ID列表
example:
{
"req_user_id":1,
"group_id":123,
"modify_type":1,
"user_id_list":[1]
}
上传图片(msfs)
POST http://ip:8700/
data_type:multipart/form-data
filename=filepath
curl example
curl -F "filename=@./head.jpeg" http://ip:8700/
应答
{
"error_code":0,
"error_msg": "成功",
"path":"g0/000/000/1468217208421049_140410609219.jpeg",
"url":"http://ip:8700/g0/000/000/1468217208421049_140410609219.jpeg"
}
TCP数据包(与msg_server交互用的)
向msg_server发送的每个数据包是由16个字节长度的头加上对应的pb(google buffer protocol)序列化后的字节数组组成 header+pb
header的结构如下
typedef struct {
uint32_t length; // 整个包的长度(16+pb序列化字节数组的长度)
uint16_t version; // 版本号
uint16_t flag; // 保留
uint16_t service_id; // 决定pb的种类
uint16_t command_id; // 决定pb具体实例化用的类
uint16_t seq_num; // 包序号
uint16_treversed;// 保留
} PduHeader_t;
seq_num 对于每个request服务端返回的response中的seq_num是一样的。他的目的就是为了标示这个应答是对应哪个请求的
各种pb
一.登录相关
//service_idSID_LOGIN(0x0001)
1.登录请求
请求:IMLoginReq
//service_idSID_LOGIN(0x0001)
//cmd id: CID_LOGIN_REQ_USERLOGIN(0x0103)
message IMLoginReq{
required string user_name = 1;//用户名
required string password = 2; //密码MD5
required IM.BaseDefine.UserStatType online_status = 3;//状态(登录时用在线 更多可看IM.BaseDefine.UserStatType)
required IM.BaseDefine.ClientType client_type = 4;//客户端类型
optional string client_version = 5; //客户端的版本号
}
应答:IMLoginRes
//service_idSID_LOGIN(0x0001)
//cmd id: CID_LOGIN_RES_USERLOGIN(0x0104)
message IMLoginRes{
required uint32 server_time = 1; //时间戳
required IM.BaseDefine.ResultType result_code = 2; //登录结果(0成功)
optional string result_string = 3; //登录失败返回信息
optional IM.BaseDefine.UserStatType online_status = 4; //登录状态
optional IM.BaseDefine.UserInfo user_info = 5; //登录用户的信息(用户名之类的基本信息)
}
2.退出登录
请求:IMLogoutReq
//service_idSID_LOGIN(0x0001)
//cmd id: CID_LOGIN_REQ_LOGINOUT(0x0105)
message IMLogoutReq{
}
应答:IMLogoutRsp
//cmd id: CID_LOGIN_RES_LOGINOUT(0x0106)
message IMLogoutRsp{
required uint32 result_code = 1; //登出反馈
}
二.用户相关
//service_idSID_BUDDY_LIST(0x0002)
1.请求用户列表
每次登录后都得进行的请求根据latest_update_time跟服务端做用户列表的差分达到同步最新用户列表的目的
请求:IMAllUserReq
//cmd id: CID_BUDDY_LIST_ALL_USER_REQUES(0x0208)
message IMAllUserReq{
//cmd id: 0x0208
required uint32 user_id = 1; //用户id
required uint32 latest_update_time = 2;//上次更新时间(服务端得根据这个时间戳比较出新用户以及被修改的用户 若为0则返回所有的用户列表)
optional bytes attach_data = 20; //服务端用 保留
}
应答:IMAllUserRsp
//cmd id: CID_BUDDY_LIST_ALL_USER_RESPONSE(0x0209)
message IMAllUserRsp{
//cmd id: 0x0209
required uint32 user_id = 1; //用户id
required uint32 latest_update_time = 2; //最新时间戳 保存到本地 下次请求时用
repeated IM.BaseDefine.UserInfo user_list = 3;//用户列表
optional bytes attach_data = 20;
}
2.请求部门列表
与获取用户列表的类似 都要达到获取最新的列表
请求:IMDepartmentReq
//cmd id: CID_BUDDY_LIST_DEPARTMENT_REQUEST(0x0210)
message IMDepartmentReq{
//cmd id: 0x0210
required uint32 user_id = 1; //用户id
required uint32 latest_update_time = 2;//上次更新时间
optional bytes attach_data = 20;
}
应答:IMDepartmentRsp
//cmd id: CID_BUDDY_LIST_DEPARTMENT_RESPONSE(0x0211)
message IMDepartmentRsp{
//cmd id: 0x0211
required uint32 user_id = 1;//用户ID
required uint32 latest_update_time = 2; //最新时间戳 保存到本地 下次请求时用
repeated IM.BaseDefine.DepartInfo dept_list = 3;//部门列表
optional bytes attach_data = 20;
}
3.请求最近聊天会话列表
请求:IMRecentContactSessionReq
//cmd id: CID_BUDDY_LIST_RECENT_CONTACT_SESSION_REQUEST(x0201)
message IMRecentContactSessionReq{
//cmd id: 0x0201
required uint32 user_id = 1;
required uint32 latest_update_time = 2;//本地会话列表中的最大时间戳(若没有就用0 则返回全部的了)
optional bytes attach_data = 20;
}
应答:IMRecentContactSessionRsp
//cmd id: CID_BUDDY_LIST_RECENT_CONTACT_SESSION_RESPONSE(x0202)
message IMRecentContactSessionRsp{
//cmd id: 0x0202
required uint32 user_id = 1;
repeated IM.BaseDefine.ContactSessionInfo contact_session_list = 2;//会话列表
optional bytes attach_data = 20;
}
4.移除会话(session)
//cmd id: CID_BUDDY_LIST_REMOVE_SESSION_REQ 0x0206
message IMRemoveSessionReq{
//cmd id: 0x0206
required uint32 user_id = 1;
required IM.BaseDefine.SessionType session_type = 2; //群聊 或者单聊
required uint32 session_id = 3; //对方ID或者群号
optional bytes attach_data = 20;
}
三.群聊相关
//service_idSID_GROUP(0x0004)
1.请求群聊列表
请求:IMNormalGroupListReq
//cmd id: CID_GROUP_NORMAL_LIST_REQUEST(0x0401)
message IMNormalGroupListReq{
//cmd id: 0x0401
required uint32 user_id = 1;//用户ID
optional bytes attach_data = 20;
}
应答:IMNormalGroupListRsp
//cmd id: CID_GROUP_NORMAL_LIST_RESPONSE(0x0402)
message IMNormalGroupListRsp{
//cmd id: 0x0402
required uint32 user_id = 1; //用户ID
repeated IM.BaseDefine.GroupVersionInfo group_version_list = 2;//群聊列表,每个GroupVersionInfo都会包含群的ID以及一个version(用于后续请求群详情)
optional bytes attach_data = 20;
}
2.请求群详情:
前面的API只能获取到用户所在的群号(通过用户与群的关系表查得。所以再用这个接口获取群的具体详情) 这个API还可以更新本地存储的群详情(每次修改群相关信息,群的version就会加1。所以把本地的群的version发送过过去就能知道该群有没有被修改了)
请求:IMGroupInfoListReq
//cmd id: CID_GROUP_INFO_REQUEST(0x0403)
message IMGroupInfoListReq{
//cmd id: 0x0403
required uint32 user_id = 1;//用户id
repeated IM.BaseDefine.GroupVersionInfo group_version_list = 2; //第一次请求时 group_version_list中的每个GroupVersionInfo的version设置为0 服务端会只会返回比version大的群的详情
optional bytes attach_data = 20;
}
应答:IMGroupInfoListRsp
//cmd id: CID_GROUP_INFO_RESPONSE(0x0404)
message IMGroupInfoListRsp{
//cmd id: 0x0404
required uint32 user_id = 1;
repeated IM.BaseDefine.GroupInfo group_info_list = 2;//群详情的列表(群名以及相关基本信息)
optional bytes attach_data = 20;
}
3.创建群
请求:IMGroupCreateReq
//cmd id: (CID_GROUP_CREATE_REQUEST)0x0405
message IMGroupCreateReq{
//cmd id: 0x0405
required uint32 user_id = 1;
required IM.BaseDefine.GroupType group_type = 2 [default = GROUP_TYPE_TMP];//默认是创建临时群,且客户端只能创建临时群
required string group_name = 3; //群的名称
required string group_avatar = 4; //群头像
repeated uint32 member_id_list = 5; //群初始化成员列表(相关用户id数组)
optional bytes attach_data = 20;
}
应答:IMGroupCreateRsp
//cmd id:(CID_GROUP_CREATE_REQUEST)0x0406
message IMGroupCreateRsp{
//cmd id: 0x0406
required uint32 user_id = 1;
required uint32 result_code = 2; //创建成功的状态值
optional uint32 group_id = 3;
required string group_name = 4;
repeated uint32 user_id_list = 5;
optional bytes attach_data = 20;
}
4.修改群成员列表
请求:IMGroupChangeMemberReq
//cmd id:(CID_GROUP_CHANGE_MEMBER_REQUEST)0x0407
message IMGroupChangeMemberReq{
//cmd id: 0x0407
required uint32 user_id = 1;//操作的用户ID
required IM.BaseDefine.GroupModifyType change_type = 2; //1:添加 2:移除
required uint32 group_id = 3; //群ID
repeated uint32 member_id_list = 4; //被操作的用户ID数组
optional bytes attach_data = 20;
}
应答:IMGroupChangeMemberRsp
//cmd id:(CID_GROUP_CHANGE_MEMBER_RESPONSE)0x0408
message IMGroupChangeMemberRsp{
//cmd id: 0x0408
required uint32 user_id = 1;
required IM.BaseDefine.GroupModifyType change_type = 2;
required uint32 result_code = 3; //操作结果
required uint32 group_id = 4;
repeated uint32 cur_user_id_list = 5; //现有的成员id
repeated uint32 chg_user_id_list = 6; //变动的成员id,add: 表示添加成功的id, del: 表示删除的id
optional bytes attach_data = 20;
}
四.聊天相关
//service_idSID_MSG(0x0003)
1.发送消息以及新消息
请求:IMMsgData
客户端端向服务端发消息以及收到的新消息都是用这个封装
//cmd id:CID_MSG_DATA(0x0301)
message IMMsgData{
//cmd id: 0x0301
required uint32 from_user_id = 1; //消息发送方(用户ID)
required uint32 to_session_id = 2; //消息接受方(接收用户的ID或者接收的群ID)
required uint32 msg_id = 3; //若是发送则为0
required uint32 create_time = 4; //消息创建的时间
required IM.BaseDefine.MsgType msg_type = 5; //消息类型(单聊文本 单聊图片 单聊语音 群聊文本 群聊图片 群聊语音)
required bytes msg_data = 6; //消息内容(aes-256-nopadding加密)
optional bytes attach_data = 20;
}
应答(发送成功后服务端返回的):IMMsgDataAck
//cmd id:CID_MSG_DATA_ACK(0x0302)
message IMMsgDataAck{
//cmd id: 0x0302
required uint32 user_id = 1; //发送此信令的用户id
required uint32 session_id = 2; //接收用户或群的ID
required uint32 msg_id = 3; //>0的值
required IM.BaseDefine.SessionType session_type = 4;//标记类型单聊 群聊
}
应答(应答来自服务器给你发的新消息):IMMsgDataReadAck
结构与IMMsgDataAck类似。就是接收到新消息后用这个给服务器反馈说你读到了
//cmd id:CID_MSG_READ_ACK(0x0303)
message IMMsgDataReadAck{
//cmd id: 0x0303
required uint32 user_id = 1; //发送此信令的用户id
required uint32 session_id = 2;
required uint32 msg_id = 3;
required IM.BaseDefine.SessionType session_type = 4;
}
2.获取未读消息数量
请求:IMUnreadMsgCntReq
//cmd_id: CID_MSG_UNREAD_CNT_REQUEST(0x0307)
message IMUnreadMsgCntReq{
//cmd id: 0x0307
required uint32 user_id = 1;
optional bytes attach_data = 20;
}
应答:IMUnreadMsgCntRsp
//cmd_id: CID_MSG_UNREAD_CNT_RESPONSE(0x0308)
message IMUnreadMsgCntRsp{
//cmd id: 0x0308
required uint32 user_id = 1;
required uint32 total_cnt = 2;//未读消息的总数
repeated IM.BaseDefine.UnreadInfo unreadinfo_list = 3;//未读消息列(每个UnreadInfo都会包含对最近会话列表进行跟新的相关信息)
optional bytes attach_data = 20;
}
3.获取消息列表(加载聊天历史之类的操作)
请求:IMGetMsgListReq
//cmd id:CID_MSG_LIST_REQUEST(0x0309)
message IMGetMsgListReq{
//cmd id: 0x0309
required uint32 user_id = 1;
required IM.BaseDefine.SessionType session_type = 2; //单聊 群聊
required uint32 session_id = 3; //用户ID或者群ID
required uint32 msg_id_begin = 4;//0 则返回最新的msg_cnt条 否则返回比msg_id_begin小于或等于的msg_cnt条记录
required uint32 msg_cnt = 5; //要请求的个数
optional bytes attach_data = 20;
}
应答:IMGetMsgListRsp
群聊只能获取到用户加群以后的聊天记录
//cmd id:CID_MSG_LIST_RESPONSE(0x030a)
message IMGetMsgListRsp{
//cmd id: 0x030a
required uint32 user_id = 1;
required IM.BaseDefine.SessionType session_type = 2;
required uint32 session_id = 3;
required uint32 msg_id_begin = 4;
repeated IM.BaseDefine.MsgInfo msg_list = 5; //消息列表
optional bytes attach_data = 20;
}
五.文件传输相关
1.创建好一个文件传输的task,客户端会连接file_server验证身份,接着会收到file_server的拉流请求(接收方在线则是转发接收方的拉流请求,若是离线传输则是file_server自动生成),根据拉流请求的偏移。客户端应答后续定量(32768字节)的文件文件偏移一直到传输完整。
2.离线文件的下载。 客户端也要连接file_server验证身份,然后进行拉流请求直到离线文件传输完整
3.离线文件传输结束后,需要通知msg_server把这个离线文件传输的task通过db_proxy_server写入数据库
//service_idSID_FILE(0x0005)
1.创建一个文件传输的任务
请求:IMFileReq
//cmd id: CID_FILE_REQUEST 0x0506
message IMFileReq{
//cmd id: 0x0506
required uint32 from_user_id = 1; //发送方ID
required uint32 to_user_id = 2;//接收方ID
required string file_name = 3; //文件路径
required uint32 file_size = 4; //文件大小
required IM.BaseDefine.TransferFileType trans_mode = 5;//在线或离线
}
应答:IMFileRsp
//cmd id: CID_FILE_RESPONSE 0x0507
message IMFileRsp{
//cmd id: 0x0507
required uint32 result_code = 1; //1: 失败 0:成功
required uint32 from_user_id = 2;
required uint32 to_user_id = 3;
required string file_name = 4;
required string task_id = 5; //传输任务的标示
repeated IM.BaseDefine.IpAddr ip_addr_list = 6; //用于文件传输的file_server 的ip以及port列表
required IM.BaseDefine.TransferFileType trans_mode = 7;
}
2.检查自己是否有离线文件需要接收
请求:IMFileHasOfflineReq
//cmd id: CID_FILE_HAS_OFFLINE_REQ 0x0509
message IMFileHasOfflineReq{
//cmd id: 0x0509
required uint32 user_id = 1;
optional bytes attach_data = 20;
}
应答
//cmd id: CID_FILE_HAS_OFFLINE_RSP 0x050a
message IMFileHasOfflineRsp{
//cmd id: 0x050a
required uint32 user_id = 1;
repeated IM.BaseDefine.OfflineFileInfo offline_file_list = 2; //离线文件列表
repeated IM.BaseDefine.IpAddr ip_addr_list = 3; //file_server的ip与port
optional bytes attach_data = 20;
}
3.生成一条离线任务的记录
得通知服务器写入数据库 对方上线后可以通过上面那个请求查询
请求:IMFileAddOfflineReq
//cmd id: CID_FILE_ADD_OFFLINE_REQ 0x050b
message IMFileAddOfflineReq{
//cmd id: 0x050b
required uint32 from_user_id = 1;
required uint32 to_user_id = 2;
required string task_id = 3;
required string file_name = 4;
required uint32 file_size = 5;
}
4.标记一条离线任务已被用户下载
下载完离线文件应该通知数据去修改这条记录的状态
//cmd id: CID_FILE_DEL_OFFLINE_REQ 0x050c
message IMFileDelOfflineReq{
//cmd id: 0x050c
required uint32 from_user_id = 1;
required uint32 to_user_id = 2;
required string task_id = 3;
}
5.验证用户(与file_server的交互)
请求:IMFileLoginReq
//cmd id: CID_FILE_LOGIN_REQ 0x0501
message IMFileLoginReq{
//cmd id: 0x0501
required uint32 user_id = 1;
required string task_id = 2;
required IM.BaseDefine.ClientFileRole file_role= 3; //在线传输则是发送者或接收者 离线文件则分上传者跟下载者
}
请求:IMFileLoginRsp
//cmd id: CID_FILE_LOGIN_RES 0x0502
message IMFileLoginRsp{
//cmd id: 0x0502
required uint32 result_code = 1; //0:successed1:failed
required string task_id = 2;
}
6.拉流(与file_server的交互)
请求:IMFilePullDataReq
如果是离线文件,则又服务器发起。若是在线传输则由接收方发起(file_server充当中转的角色)
//cmd id:CID_FILE_PULL_DATA_REQ 0x0504
message IMFilePullDataReq{
//cmd id: 0x0504
required string task_id = 1;
required uint32 user_id = 2;
required IM.BaseDefine.TransferFileType trans_mode = 3; //传输类型(在线或离线)
required uint32 offset = 4; //文件偏移
required uint32 data_size = 5; //要读取的大小
}
应答:IMFilePullDataRsp
message IMFilePullDataRsp{
//cmd id: 0x0505
required uint32 result_code = 1;
required string task_id = 2;
required uint32 user_id = 3;
required uint32 offset = 4; //偏移位置
required bytes file_data = 5;//文件数据
}