添加用户消息记录接口;
This commit is contained in:
152
backend/lib/sdk/WeWorkFinanceSdk_C.h
Normal file
152
backend/lib/sdk/WeWorkFinanceSdk_C.h
Normal file
@@ -0,0 +1,152 @@
|
||||
// All Rights Reserved.
|
||||
// *File : WeWorkFinanceSdk_C.h
|
||||
// @Brief:拉取企业聊天记录与媒体消息sdk头文件
|
||||
|
||||
#pragma once
|
||||
//返回码 错误说明
|
||||
//10000 参数错误,请求参数错误
|
||||
//10001 网络错误,网络请求错误
|
||||
//10002 数据解析失败
|
||||
//10003 系统失败
|
||||
//10004 密钥错误导致加密失败
|
||||
//10005 fileid错误
|
||||
//10006 解密失败
|
||||
//10007 找不到消息加密版本的私钥,需要重新传入私钥对
|
||||
//10008 解析encrypt_key出错
|
||||
//10009 ip非法
|
||||
//10010 数据过期
|
||||
//10011 证书错误
|
||||
|
||||
typedef struct WeWorkFinanceSdk_t WeWorkFinanceSdk_t;
|
||||
|
||||
// 数据
|
||||
typedef struct Slice_t
|
||||
{
|
||||
char *buf;
|
||||
int len;
|
||||
} Slice_t;
|
||||
|
||||
typedef struct MediaData
|
||||
{
|
||||
char *outindexbuf;
|
||||
int out_len;
|
||||
char *data;
|
||||
int data_len;
|
||||
int is_finish;
|
||||
} MediaData_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
WeWorkFinanceSdk_t *NewSdk();
|
||||
|
||||
/**
|
||||
* 初始化函数
|
||||
* Return值=0表示该API调用成功
|
||||
*
|
||||
* @param [in] sdk NewSdk返回的sdk指针
|
||||
* @param [in] corpid 调用企业的企业id,例如:wwd08c8exxxx5ab44d,可以在企业微信管理端--我的企业--企业信息查看
|
||||
* @param [in] secret 聊天内容存档的Secret,可以在企业微信管理端--管理工具--聊天内容存档查看
|
||||
*
|
||||
*
|
||||
* @return 返回是否初始化成功
|
||||
* 0 - 成功
|
||||
* !=0 - 失败
|
||||
*/
|
||||
int Init(WeWorkFinanceSdk_t *sdk, const char *corpid, const char *secret);
|
||||
|
||||
/**
|
||||
* 拉取聊天记录函数
|
||||
* Return值=0表示该API调用成功
|
||||
*
|
||||
*
|
||||
* @param [in] sdk NewSdk返回的sdk指针
|
||||
* @param [in] seq 从指定的seq开始拉取消息,注意的是返回的消息从seq+1开始返回,seq为之前接口返回的最大seq值。首次使用请使用seq:0
|
||||
* @param [in] limit 一次拉取的消息条数,最大值1000条,超过1000条会返回错误
|
||||
* @param [in] proxy 使用代理的请求,需要传入代理的链接。如:socks5://10.0.0.1:8081 或者 http://10.0.0.1:8081
|
||||
* @param [in] passwd 代理账号密码,需要传入代理的账号密码。如 user_name:passwd_123
|
||||
* @param [in] timeout 超时时间,单位秒
|
||||
* @param [out] chatDatas 返回本次拉取消息的数据,slice结构体.内容包括errcode/errmsg,以及每条消息内容。示例如下:
|
||||
|
||||
{"errcode":0,"errmsg":"ok","chatdata":[{"seq":196,"msgid":"CAQQ2fbb4QUY0On2rYSAgAMgip/yzgs=","publickey_ver":3,"encrypt_random_key":"ftJ+uz3n/z1DsxlkwxNgE+mL38H42/KCvN8T60gbbtPD+Rta1hKTuQPzUzO6Hzne97MgKs7FfdDxDck/v8cDT6gUVjA2tZ/M7euSD0L66opJ/IUeBtpAtvgVSD5qhlaQjvfKJc/zPMGNK2xCLFYqwmQBZXbNT7uA69Fflm512nZKW/piK2RKdYJhRyvQnA1ISxK097sp9WlEgDg250fM5tgwMjujdzr7ehK6gtVBUFldNSJS7ndtIf6aSBfaLktZgwHZ57ONewWq8GJe7WwQf1hwcDbCh7YMG8nsweEwhDfUz+u8rz9an+0lgrYMZFRHnmzjgmLwrR7B/32Qxqd79A==","encrypt_chat_msg":"898WSfGMnIeytTsea7Rc0WsOocs0bIAerF6de0v2cFwqo9uOxrW9wYe5rCjCHHH5bDrNvLxBE/xOoFfcwOTYX0HQxTJaH0ES9OHDZ61p8gcbfGdJKnq2UU4tAEgGb8H+Q9n8syRXIjaI3KuVCqGIi4QGHFmxWenPFfjF/vRuPd0EpzUNwmqfUxLBWLpGhv+dLnqiEOBW41Zdc0OO0St6E+JeIeHlRZAR+E13Isv9eS09xNbF0qQXWIyNUi+ucLr5VuZnPGXBrSfvwX8f0QebTwpy1tT2zvQiMM2MBugKH6NuMzzuvEsXeD+6+3VRqL"}]}
|
||||
|
||||
*
|
||||
* @return 返回是否调用成功
|
||||
* 0 - 成功
|
||||
* !=0 - 失败
|
||||
*/
|
||||
int GetChatData(WeWorkFinanceSdk_t *sdk, unsigned long long seq, unsigned int limit, const char *proxy, const char *passwd, int timeout, Slice_t *chatDatas);
|
||||
|
||||
/**
|
||||
* @brief 解析密文.企业微信自有解密内容
|
||||
* @param [in] encrypt_key, getchatdata返回的encrypt_random_key,使用企业自持对应版本秘钥RSA解密后的内容
|
||||
* @param [in] encrypt_msg, getchatdata返回的encrypt_chat_msg
|
||||
* @param [out] msg, 解密的消息明文
|
||||
* @return 返回是否调用成功
|
||||
* 0 - 成功
|
||||
* !=0 - 失败
|
||||
*/
|
||||
int DecryptData(const char *encrypt_key, const char *encrypt_msg, Slice_t *msg);
|
||||
|
||||
/**
|
||||
* 拉取媒体消息函数
|
||||
* Return值=0表示该API调用成功
|
||||
*
|
||||
*
|
||||
* @param [in] sdk NewSdk返回的sdk指针
|
||||
* @param [in] sdkFileid 从GetChatData返回的聊天消息中,媒体消息包括的sdkfileid
|
||||
* @param [in] proxy 使用代理的请求,需要传入代理的链接。如:socks5://10.0.0.1:8081 或者 http://10.0.0.1:8081
|
||||
* @param [in] passwd 代理账号密码,需要传入代理的账号密码。如 user_name:passwd_123
|
||||
* @param [in] indexbuf 媒体消息分片拉取,需要填入每次拉取的索引信息。首次不需要填写,默认拉取512k,后续每次调用只需要将上次调用返回的outindexbuf填入即可。
|
||||
* @param [in] timeout 超时时间,单位秒
|
||||
* @param [out] media_data 返回本次拉取的媒体数据.MediaData结构体.内容包括data(数据内容)/outindexbuf(下次索引)/is_finish(拉取完成标记)
|
||||
|
||||
*
|
||||
* @return 返回是否调用成功
|
||||
* 0 - 成功
|
||||
* !=0 - 失败
|
||||
*/
|
||||
int GetMediaData(WeWorkFinanceSdk_t *sdk, const char *indexbuf,
|
||||
const char *sdkFileid, const char *proxy, const char *passwd, int timeout, MediaData_t *media_data);
|
||||
|
||||
/**
|
||||
* @brief 释放sdk,和NewSdk成对使用
|
||||
* @return
|
||||
*/
|
||||
void DestroySdk(WeWorkFinanceSdk_t *sdk);
|
||||
|
||||
//--------------下面接口为了其他语言例如python等调用c接口,酌情使用--------------
|
||||
Slice_t *NewSlice();
|
||||
|
||||
/**
|
||||
* @brief 释放slice,和NewSlice成对使用
|
||||
* @return
|
||||
*/
|
||||
void FreeSlice(Slice_t *slice);
|
||||
|
||||
/**
|
||||
* @brief 为其他语言提供读取接口
|
||||
* @return 返回buf指针
|
||||
* !=NULL - 成功
|
||||
* NULL - 失败
|
||||
*/
|
||||
char *GetContentFromSlice(Slice_t *slice);
|
||||
int GetSliceLen(Slice_t *slice);
|
||||
|
||||
// 媒体记录相关工具
|
||||
|
||||
MediaData_t *NewMediaData();
|
||||
|
||||
void FreeMediaData(MediaData_t *media_data);
|
||||
|
||||
char *GetOutIndexBuf(MediaData_t *media_data);
|
||||
char *GetData(MediaData_t *media_data);
|
||||
int GetIndexLen(MediaData_t *media_data);
|
||||
int GetDataLen(MediaData_t *media_data);
|
||||
int IsMediaDataFinish(MediaData_t *media_data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
BIN
backend/lib/sdk/libWeWorkFinanceSdk_C.so
Normal file
BIN
backend/lib/sdk/libWeWorkFinanceSdk_C.so
Normal file
Binary file not shown.
1
backend/lib/sdk/md5.txt
Normal file
1
backend/lib/sdk/md5.txt
Normal file
@@ -0,0 +1 @@
|
||||
d422224e67eb07a195d1d7115b39284c
|
||||
142
backend/lib/sdk/sample.cpp
Normal file
142
backend/lib/sdk/sample.cpp
Normal file
@@ -0,0 +1,142 @@
|
||||
#include "WeWorkFinanceSdk_C.h"
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string>
|
||||
using std::string;
|
||||
|
||||
// 私钥内容,示例
|
||||
static const char* priKey =
|
||||
"-----BEGIN RSA PRIVATE KEY-----\n"
|
||||
"MIIEogIBAAKCAQEAngIe+L+lJFQOWu+FtgWzTYcG+bQTANvgatpjM0CswTLR5oY+\n"
|
||||
"IvpQ9X0EID3AEC0PyaatOgSvmvWCUQunZtA3lhdkdsJG1Nxe1FOOI+Q1qlgW/ykT\n"
|
||||
"JkuJJv8qnd9HFdpkTkkAB3CxW5zGoYYtBlnp3G3mUhGXZ/6dIWQ4Wln4lJlUlxSe\n"
|
||||
"Qv4YvDOGN2dWbIG79nL9YNKyk9yYgLop2O7XJGXgqCuV5CUz4jdxB5XCH3SzqFgJ\n"
|
||||
"A36JguG5jD7ovFh7cL+yp1iTyF/+1woDARXXpIj+W6K3Skoo5cpt0BboPYu0EuCz\n"
|
||||
"YQtfn+hUfkcS6kltnwSXUBFzrSLhjCkf5tY/LwIDAQABAoIBADxB8M/KPk9hYuwZ\n"
|
||||
"BjQJbny1btqRauHb+HSnfkdQddFj8RppvY6XSYKlP4qQIgvJM4kicFN87/83e5Au\n"
|
||||
"0pNp+pjZqO2FX3/T3rI4fy9+21xwJaz/XBcxnUdq7jSwrqpN1Azq2AD+YBTg7/sv\n"
|
||||
"cUJHzeDLZJeNr+Dv/7p5PuhuAVehm3g+b0GwuWK2HieXAlRR240vn+dCZoq8ti6Y\n"
|
||||
"jmcZcJ9E6urY/L3d5bqByN2SGSbgJav6VAQYf8vfOU+SeAXFunGUWasuS3tvQlMO\n"
|
||||
"eEPW37oNAsKHkKDQcKAcPo59fwPdbPKE/5N/wKPsbN8nVYTqdzociQdZnNpG8DK2\n"
|
||||
"SdE5ZzkCgYEA4S3mNaklMA0vNR20lSum68j4L0r57Q7pN0ATmItBhF5ihEbtLlAg\n"
|
||||
"OsLsxQZ2XIzevsnvUvRKDi7pcu3u2VqlX/89aWOcTOyEyKGHCUPkkOr4+3m2cGtQ\n"
|
||||
"WF676TtNcfj4yOyJ5gMmtld84yUwrHjHgvtP/L73MftHzssQFj0Qk20CgYEAs6Ka\n"
|
||||
"kXLAHtKwB5R/knXmkCYnfRX/TqjhTVO3Hr2PvqojAmiuWmWp9YsXtbYDFpxQPOp0\n"
|
||||
"Y1qosC1qW+pZCXgSlsjsdhJa3t2hhsF2SAWoy2QpAsuHWizHq9T8XFb14U/4PjBz\n"
|
||||
"B9P1mf5c84Iox3tUnwKuBsNt8FOXwJRPnddsH4sCgYB2zpLR6SaXzb0El2G5+sgd\n"
|
||||
"S3G28iYfb2iZIBO2vnKY9nugMxPdBaWbm1D1O02j0yeLHlxJNl8EULgXTXZh87Oh\n"
|
||||
"jLfILShAZeJBQQhQWSP1WiR3+mXJtrUzivg2PHXGFoic6kBvvWXlew+HgQ3HUgpi\n"
|
||||
"D1rKja87Dct7TiR0t09RmQKBgBspvWG9Dlwa089xnxDQjzrA6ju59c85Lkh5Hjmh\n"
|
||||
"xHi6VWzp02OL9/VPQRiTG0hx/pgXg936OYPaejjH6QrLg1QVsdvwzpjgvqoX2wDt\n"
|
||||
"CicnUCRCDoeOOes726VC6Q9W/ly5CsvmOz87/WY9ClmPxq38w7/2EUvD+DCAvMFL\n"
|
||||
"b+gdAoGAUiY1xefNe4qnbQzJXpPUUcOGiJcl7r9HwrZx8tDwGgBg+/5zbwi/0TfH\n"
|
||||
"YrIj86g+JHaMEQCcKko8H0KdQzzp1vNECNxOGvz8ckOrO+NsLzHOpZ4jhojV/vFg\n"
|
||||
"FNl6PhOdUozqTYwrnszoO67a/jKS/rWQh5Ta2Y2K5sUNprk8Z1w=\n"
|
||||
"-----END RSA PRIVATE KEY-----\n";
|
||||
|
||||
// rsa 解密函数,需企业自行实现
|
||||
int RsaDecryptChatData(const string &encryptdata,const string &priKey,string &aeskey);
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ret = 0;
|
||||
if (argc < 2)
|
||||
{
|
||||
printf("./sdktools 1 seq limit proxy passwd timeout\n");
|
||||
printf("./sdktools 2 fileid savefile proxy passwd timeout\n");
|
||||
printf("./sdktools 3 encrypt_key encrypt_msg\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// new sdk api
|
||||
WeWorkFinanceSdk_t* sdk = NewSdk();
|
||||
|
||||
// init api
|
||||
ret = Init(sdk, "wwd08coe7d775abaaa","zJ6k0naVVQ--gt9PUSSEvs03zW_nlDVmjAkPOTAfrew");
|
||||
if (ret != 0) {
|
||||
|
||||
printf("init sdk err ret:%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int type = strtoul(argv[1], NULL, 10);
|
||||
if (type == 1)
|
||||
{
|
||||
uint64_t iSeq = strtoul(argv[2], NULL, 10);
|
||||
uint64_t iLimit = strtoul(argv[3], NULL, 10);
|
||||
uint64_t timeout = strtoul(argv[6], NULL, 10);
|
||||
Slice_t* chatDatas = NewSlice();
|
||||
|
||||
// getchatdata api
|
||||
ret = GetChatData(sdk, iSeq, iLimit, argv[4],argv[5], timeout, chatDatas);
|
||||
if (ret != 0) {
|
||||
printf("GetChatData err ret:%d\n", ret);
|
||||
return -1;
|
||||
}
|
||||
printf("GetChatData len:%d data:%s\n", chatDatas->len, GetContentFromSlice(chatDatas));
|
||||
FreeSlice(chatDatas);
|
||||
}
|
||||
else if (type == 2)
|
||||
{
|
||||
std::string index = "";
|
||||
uint64_t timeout = strtoul(argv[6], NULL, 10);
|
||||
while(true){
|
||||
printf("index:%s\n",index.c_str());
|
||||
MediaData_t* media = NewMediaData();
|
||||
|
||||
// getmediadata api
|
||||
ret = GetMediaData(sdk, index.c_str(), argv[2],argv[4],argv[5], timeout, media);
|
||||
|
||||
if (ret != 0) {
|
||||
printf("GetMediaData err ret:%d\n", ret);
|
||||
FreeMediaData(media);
|
||||
return -1;
|
||||
}
|
||||
printf("content size:%d isfin:%d outindex:%s\n",GetDataLen(media),IsMediaDataFinish(media),GetOutIndexBuf(media));
|
||||
|
||||
char file[200];
|
||||
snprintf(file, sizeof(file), "%s%s", "/home/qspace/upload/", argv[3]);
|
||||
FILE *fp = fopen(file, "ab+");
|
||||
printf("filename:%s \n", file);
|
||||
if (NULL == fp) {
|
||||
printf("open file err\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
fwrite(GetData(media),GetDataLen(media), 1, fp);
|
||||
fclose(fp);
|
||||
|
||||
if(IsMediaDataFinish(media)==1)
|
||||
{
|
||||
FreeMediaData(media);
|
||||
break;
|
||||
}
|
||||
else{
|
||||
// assign index value if not finish
|
||||
index.assign(GetOutIndexBuf(media));
|
||||
|
||||
// need free media
|
||||
FreeMediaData(media);
|
||||
}
|
||||
}
|
||||
} else if (type == 3) {
|
||||
Slice_t* msg = NewSlice();
|
||||
std::string encrypt_key;
|
||||
|
||||
// rsa decrypt code .need do it by yourself
|
||||
int ret = RsaDecryptChatData(argv[2], priKey, encrypt_key);
|
||||
printf("Rsadecrypt key :%s ret :%d\n" ,encrypt_key.c_str(), ret);
|
||||
|
||||
// decryptdata api
|
||||
ret = DecryptData(encrypt_key.c_str(), argv[3], msg);
|
||||
printf("chatdata :%s ret :%d\n" ,GetContentFromSlice(msg), ret);
|
||||
FreeSlice(msg);
|
||||
} else if(type == 4){
|
||||
Slice_t* msg = NewSlice();
|
||||
ret = DecryptData(argv[2], argv[3], msg);
|
||||
printf("chatdata :%s ret :%d\n" ,GetContentFromSlice(msg), ret);
|
||||
}
|
||||
DestroySdk(sdk);
|
||||
return ret;
|
||||
}
|
||||
148
backend/lib/sdk/tool_testSdk.cpp
Normal file
148
backend/lib/sdk/tool_testSdk.cpp
Normal file
@@ -0,0 +1,148 @@
|
||||
#include "WeWorkFinanceSdk_C.h"
|
||||
#include <dlfcn.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string>
|
||||
using std::string;
|
||||
|
||||
typedef WeWorkFinanceSdk_t* newsdk_t();
|
||||
typedef int Init_t(WeWorkFinanceSdk_t*, const char*, const char*);
|
||||
typedef void DestroySdk_t(WeWorkFinanceSdk_t*);
|
||||
|
||||
typedef int GetChatData_t(WeWorkFinanceSdk_t*, unsigned long long, unsigned int, const char*, const char*, int, Slice_t*);
|
||||
typedef Slice_t* NewSlice_t();
|
||||
typedef void FreeSlice_t(Slice_t*);
|
||||
|
||||
typedef int GetMediaData_t(WeWorkFinanceSdk_t*, const char*, const char*, const char*, const char*, int, MediaData_t*);
|
||||
typedef int DecryptData_t(const char*, const char*, Slice_t*);
|
||||
typedef MediaData_t* NewMediaData_t();
|
||||
typedef void FreeMediaData_t(MediaData_t*);
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int ret = 0;
|
||||
//seq 表示该企业存档消息序号,该序号单调递增,拉取序号建议设置为上次拉取返回结果中最大序号。首次拉取时seq传0,sdk会返回有效期内最早的消息。
|
||||
//limit 表示本次拉取的最大消息条数,取值范围为1~1000
|
||||
//proxy与passwd为代理参数,如果运行sdk的环境不能直接访问外网,需要配置代理参数。sdk访问的域名是"https://qyapi.weixin.qq.com"。
|
||||
//建议先通过curl访问"https://qyapi.weixin.qq.com",验证代理配置正确后,再传入sdk。
|
||||
//timeout 为拉取会话存档的超时时间,单位为秒,建议超时时间设置为5s。
|
||||
//sdkfileid 媒体文件id,从解密后的会话存档中得到
|
||||
//savefile 媒体文件保存路径
|
||||
//encrypt_key 拉取会话存档返回的encrypt_random_key,使用配置在企业微信管理台的rsa公钥对应的私钥解密后得到encrypt_key。
|
||||
//encrypt_chat_msg 拉取会话存档返回的encrypt_chat_msg
|
||||
if (argc < 2) {
|
||||
printf("./sdktools 1(chatmsg) 2(mediadata) 3(decryptdata)\n");
|
||||
printf("./sdktools 1 seq limit proxy passwd timeout\n");
|
||||
printf("./sdktools 2 fileid proxy passwd timeout savefile\n");
|
||||
printf("./sdktools 3 encrypt_key encrypt_chat_msg\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
void* so_handle = dlopen("./libWeWorkFinanceSdk_C.so", RTLD_LAZY);
|
||||
if (!so_handle) {
|
||||
printf("load sdk so fail:%s\n", dlerror());
|
||||
return -1;
|
||||
}
|
||||
newsdk_t* newsdk_fn = (newsdk_t*)dlsym(so_handle, "NewSdk");
|
||||
WeWorkFinanceSdk_t* sdk = newsdk_fn();
|
||||
|
||||
//使用sdk前需要初始化,初始化成功后的sdk可以一直使用。
|
||||
//如需并发调用sdk,建议每个线程持有一个sdk实例。
|
||||
//初始化时请填入自己企业的corpid与secrectkey。
|
||||
Init_t* init_fn = (Init_t*)dlsym(so_handle, "Init");
|
||||
DestroySdk_t* destroysdk_fn = (DestroySdk_t*)dlsym(so_handle, "DestroySdk");
|
||||
ret = init_fn(sdk, "wwdf65802ca25ec195", "-Ta6WMWxBhfGolWnnlO15nQckj3DRKAowUOdX2fwvzE");
|
||||
if (ret != 0) {
|
||||
//sdk需要主动释放
|
||||
destroysdk_fn(sdk);
|
||||
printf("init sdk err ret:%d\n", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int type = strtoul(argv[1], NULL, 10);
|
||||
if (type == 1) {
|
||||
//拉取会话存档
|
||||
uint64_t iSeq = strtoul(argv[2], NULL, 10);
|
||||
uint64_t iLimit = strtoul(argv[3], NULL, 10);
|
||||
uint64_t timeout = strtoul(argv[6], NULL, 10);
|
||||
|
||||
NewSlice_t* newslice_fn = (NewSlice_t*)dlsym(so_handle, "NewSlice");
|
||||
FreeSlice_t* freeslice_fn = (FreeSlice_t*)dlsym(so_handle, "FreeSlice");
|
||||
|
||||
//每次使用GetChatData拉取存档前需要调用NewSlice获取一个chatDatas,在使用完chatDatas中数据后,还需要调用FreeSlice释放。
|
||||
Slice_t* chatDatas = newslice_fn();
|
||||
GetChatData_t* getchatdata_fn = (GetChatData_t*)dlsym(so_handle, "GetChatData");
|
||||
ret = getchatdata_fn(sdk, iSeq, iLimit, argv[4], argv[5], timeout, chatDatas);
|
||||
if (ret != 0) {
|
||||
freeslice_fn(chatDatas);
|
||||
printf("GetChatData err ret:%d\n", ret);
|
||||
return -1;
|
||||
}
|
||||
printf("GetChatData len:%d data:%s\n", chatDatas->len, chatDatas->buf);
|
||||
freeslice_fn(chatDatas);
|
||||
}
|
||||
else if (type == 2) {
|
||||
//拉取媒体文件
|
||||
std::string index;
|
||||
uint64_t timeout = strtoul(argv[5], NULL, 10);
|
||||
int isfinish = 0;
|
||||
|
||||
GetMediaData_t* getmediadata_fn = (GetMediaData_t*)dlsym(so_handle, "GetMediaData");
|
||||
NewMediaData_t* newmediadata_fn = (NewMediaData_t*)dlsym(so_handle, "NewMediaData");
|
||||
FreeMediaData_t* freemediadata_fn = (FreeMediaData_t*)dlsym(so_handle, "FreeMediaData");
|
||||
|
||||
//媒体文件每次拉取的最大size为512k,因此超过512k的文件需要分片拉取。若该文件未拉取完整,mediaData中的is_finish会返回0,同时mediaData中的outindexbuf会返回下次拉取需要传入GetMediaData的indexbuf。
|
||||
//indexbuf一般格式如右侧所示,”Range:bytes=524288-1048575“,表示这次拉取的是从524288到1048575的分片。单个文件首次拉取填写的indexbuf为空字符串,拉取后续分片时直接填入上次返回的indexbuf即可。
|
||||
while (isfinish == 0) {
|
||||
//每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个mediaData,在使用完mediaData中数据后,还需要调用FreeMediaData释放。
|
||||
printf("index:%s\n", index.c_str());
|
||||
MediaData_t* mediaData = newmediadata_fn();
|
||||
ret = getmediadata_fn(sdk, index.c_str(), argv[2], argv[3], argv[4], timeout, mediaData);
|
||||
if (ret != 0) {
|
||||
//单个分片拉取失败建议重试拉取该分片,避免从头开始拉取。
|
||||
freemediadata_fn(mediaData);
|
||||
printf("GetMediaData err ret:%d\n", ret);
|
||||
return -1;
|
||||
}
|
||||
printf("content size:%d isfin:%d outindex:%s\n", mediaData->data_len, mediaData->is_finish, mediaData->outindexbuf);
|
||||
|
||||
//大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。
|
||||
char file[200];
|
||||
snprintf(file, sizeof(file), "%s", argv[6]);
|
||||
FILE* fp = fopen(file, "ab+");
|
||||
printf("filename:%s \n", file);
|
||||
if (NULL == fp) {
|
||||
freemediadata_fn(mediaData);
|
||||
printf("open file err\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
fwrite(mediaData->data, mediaData->data_len, 1, fp);
|
||||
fclose(fp);
|
||||
|
||||
//获取下次拉取需要使用的indexbuf
|
||||
index.assign(string(mediaData->outindexbuf));
|
||||
isfinish = mediaData->is_finish;
|
||||
freemediadata_fn(mediaData);
|
||||
}
|
||||
}
|
||||
else if (type == 3) {
|
||||
//解密会话存档内容
|
||||
//sdk不会要求用户传入rsa私钥,保证用户会话存档数据只有自己能够解密。
|
||||
//此处需要用户先用rsa私钥解密encrypt_random_key后,作为encrypt_key参数传入sdk来解密encrypt_chat_msg获取会话存档明文。
|
||||
//每次使用DecryptData解密会话存档前需要调用NewSlice获取一个Msgs,在使用完Msgs中数据后,还需要调用FreeSlice释放。
|
||||
NewSlice_t* newslice_fn = (NewSlice_t*)dlsym(so_handle, "NewSlice");
|
||||
FreeSlice_t* freeslice_fn = (FreeSlice_t*)dlsym(so_handle, "FreeSlice");
|
||||
|
||||
Slice_t* Msgs = newslice_fn();
|
||||
// decryptdata api
|
||||
DecryptData_t* decryptdata_fn = (DecryptData_t*)dlsym(so_handle, "DecryptData");
|
||||
ret = decryptdata_fn(argv[2], argv[3], Msgs);
|
||||
printf("chatdata :%s ret :%d\n", Msgs->buf, ret);
|
||||
|
||||
freeslice_fn(Msgs);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
1
backend/lib/sdk/version.txt
Normal file
1
backend/lib/sdk/version.txt
Normal file
@@ -0,0 +1 @@
|
||||
20240606
|
||||
BIN
backend/lib/sdk_20240606.tgz
Normal file
BIN
backend/lib/sdk_20240606.tgz
Normal file
Binary file not shown.
Reference in New Issue
Block a user