企业微信-拉取企业微信聊天记录

完整代码下载地址:https://download.csdn.net/download/lyn5284767/11485236

一,前提

1,企业微信开通了会话内容存档

2,程序运行环境windows平台,VS2017,c++

3,你是企业微信的管理员

二,准备工作

1,获取RSA公私钥对,推荐用http://web.chacuo.net/netrsakeypair这个网址生成。

生成密钥位数:2048位,密钥格式:PKCS1,如下:

2,上传公钥给微信

3,设置可访问IP

三,关键代码

需要用到的第三方库:1,企业微信SDK;2,Openssl;3,jsoncpp;

// 私钥解密,cipherText--待解密字符串;    priKey--私钥
std::string rsa_pri_decrypt(const std::string &cipherText, const std::string &priKey)
{
    std::string strRet;
    RSA *rsa = RSA_new();
    BIO *keybio;
    keybio = BIO_new_mem_buf((void *)priKey.c_str(), -1);

    // 读取私钥成RSA
    rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);

    // 分配大小
    int len = RSA_size(rsa);
    char *decryptedText = (char *)malloc(len + 1);
    memset(decryptedText, 0, len + 1);

    // 解密函数  
    int ret = RSA_private_decrypt(cipherText.length(), (const unsigned char*)cipherText.c_str(), (unsigned char*)decryptedText, rsa, RSA_PKCS1_PADDING);
    unsigned long error = ERR_peek_last_error();
    if (ret >= 0)
        strRet = std::string(decryptedText, ret);

    // 释放内存  
    free(decryptedText);
    BIO_free_all(keybio);
    RSA_free(rsa);

    return strRet;
}

RSA * createRSA(unsigned char* key, int publickey)
{
    RSA *rsa = NULL;
    BIO *keybio;
    keybio = BIO_new_mem_buf(key, -1);
    if (keybio == NULL)
    {
        printf("Failed to create key BIO");
        return 0;
    }
    if (publickey)
    {
        rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL);
    }
    else
    {
        rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);
    }
    if (rsa == NULL)
    {
        printf("Failed to create RSA");
    }
    return rsa;
}

int private_decrypt(unsigned char* enc_data, int data_len, unsigned char* key, unsigned char*decrypted)
{
    RSA * rsa = createRSA(key, 0);

    int result = RSA_private_decrypt(data_len, enc_data, decrypted, rsa, RSA_PKCS1_PADDING);

    return result;
}

string StringToUtf(string strValue)
{
    int nwLen = MultiByteToWideChar(CP_UTF8, 0, strValue.c_str(), -1, NULL, 0);
    wchar_t * pwBuf = new wchar_t[nwLen + 1];//加上末尾'\0'
    memset(pwBuf, 0, nwLen * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, strValue.c_str(), strValue.length(), pwBuf, nwLen);
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
    char * pBuf = new char[nLen + 1];
    memset(pBuf, 0, nLen + 1);
    WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
    std::string retStr = pBuf;
    delete[]pBuf;
    delete[]pwBuf;
    return retStr;
}

nt main(int argc, char* argv[]) {
    // 初始化SDK
    auto sdk = NewSdk();
    int ret = Init(sdk, "ww7a7bad72f50751ad", "DVXpWlp1MSkOjhvbfApIF43OQ5OHReuC3IQNGynJc7I"); 
    if (ret != 0) {
           printf("init sdk err ret:%d\n", ret);
    }
    // 获取数据
    std::ifstream readFile;
    readFile.open("data.txt");   //将文件流对象与文件连接起来 
    assert(readFile.is_open());   //若失败,则输出错误消息,并终止程序运行 
    std::string s; 
    getline(readFile, s);
    readFile.close();
    unsigned long long seq;

    std::string dt = getTime();
    if (s.empty())
    {
        seq = 0;
    }
    else
    {
        seq = std::stoll(s);
    }
    Slice_t sli;
    ret = GetChatData(sdk, seq, 1000, nullptr, nullptr, 100, &sli);
    if (ret != 0) {
        printf("GetChatData err ret:%d\n", ret);
        return -1;
    }
    // 解析字符串
    std::string strJsonContent = sli.buf;
    Json::Reader reader;
    Json::Value root;
    if (reader.parse(strJsonContent.c_str(), root)) {
        if (root["errcode"].asInt()== 0) {
            if (root["chatdata"].isArray()) {
                int nArraySize = root["chatdata"].size();
                for (int i = 0; i < nArraySize; i++)
                {
                    unsigned char decrypted[4098] = {};
                    int seq= root["chatdata"][i]["seq"].asInt();
                    std::string msgid = root["chatdata"][i]["msgid"].asString();
                    int publickey_ver = root["chatdata"][i]["publickey_ver"].asInt();
                    std::string encrypt_random_key = root["chatdata"][i]["encrypt_random_key"].asString();
                    std::string encrypt_chat_msg = root["chatdata"][i]["encrypt_chat_msg"].asString();
                    std::string base_decode = decode_base64(encrypt_random_key,false);
                    int ret = private_decrypt((unsigned char *)base_decode.c_str(),256, priKey, decrypted);
                    // RSA解密成功
                    if (ret > 0)
                    {
                        ret = DecryptData((const char*)(char*)decrypted, encrypt_chat_msg.c_str(), &sli);
                        // 微信SDK解密成功
                        if (ret == 0) {
                            std::string chardata = GetContentFromSlice(&sli);
                            Json::Reader datareader;
                            Json::Value dataroot;
                            // 解析json数据
                            if (datareader.parse(chardata.c_str(), dataroot)) {
                                std::string msgid = dataroot["msgid"].asString();
                                std::string from = dataroot["from"].asString();
                                double msgtime = dataroot["msgtime"].asDouble();
                                std::string msgtype = dataroot["msgtype"].asString();
                                if (msgtype == "text")// 文本类型
                                {
                                    Json::Value  &text = dataroot["text"];
                                    std::string content = text["content"].asString();
                                    content = StringToUtf(content);
                                }
                                else if(msgtype == "image") //图片
                                {
                                    Json::Value  &image = dataroot["image"];
                                    int filesize = image["filesize"].asInt();
                                    std::string sdkfileid = image["sdkfileid"].asString();
                                    std::string index = "";
                                    while (true) {
                                        MediaData_t* media = NewMediaData();
                                        int mediaret = GetMediaData(sdk, index.c_str(), sdkfileid.c_str(), nullptr, nullptr, 50, media);
                                        if (mediaret != 0) {
                                            printf("GetMediaData err ret:%d\n", ret);
                                            FreeMediaData(media);
                                            return -1;
                                        }
                                        GetData(media);
                                        GetOutIndexBuf(media);
                                        IsMediaDataFinish(media);
                                        char file[200];
                                        snprintf(file, sizeof(file), "%s%d.jpg", "upload/", seq);
                                        FILE *fp = fopen(file, "ab+");
                                        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);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    seq= root["chatdata"][i]["seq"].asInt();
                    std::fstream file("data.txt", std::ios::out);
                    file << seq << std::endl;
                    file.close();
                }
            }
        }
        else
        {
            printf("PraseChatData err ret:%s\n", root["errcode"].asString());
            return -1;
        }
    }
    DestroySdk(sdk);
    return 0;
}

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

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

相关文章

企业微信 sendChatMessage接口,聊天工具栏分享消息到会话。

微信一惯的怎么为难开发者怎么来&#xff0c;分享一个使用sendChatMessage的过程。 微信官方文档给出的使用方法 wx.invoke(sendChatMessage, {msgtype:"text", //消息类型&#xff0c;必填text: {content:"你好", //文本内容},image:{mediaid: "&qu…

企业微信客户端调试工具

最近自己在搞企业微信上的第三方应用&#xff0c;需要调试一些东西。没有像谷歌那样的开发者工具真的好头疼。 还好企业微信提供这样的工具。那我来说说自己是如何下载和使用的。 第一步&#xff0c;先去官网下载 常见问题 - FAQ - 接口文档 - 企业微信开发者中心 直接下载 …

企业微信的corpsecret在哪里?

问题&#xff1a; 查看“企业微信”的官方开发文档&#xff0c;在“获取access_token”部分提到&#xff0c;使用GET请求方法&#xff0c;访问 https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpidID&corpsecretSECRET ,可以获得应用的“access_token”。参数说明里&am…

如何控制企业微信

在GitHub上有一个项目叫《vworkApi》它是基于PC端的企业微信封装的、REST风格的接口&#xff0c;开发者可通过HTTP轻松调用&#xff0c;真正实现“跨语言”操作&#xff01;使用非常简单&#xff0c;任何一门语言都可以直接上手 GitHub地址&#xff1a;https://github.com/mrsa…

集成企业微信,给企业微信用户发消息

1.企业微信申请 企业微信官方地址&#xff1a;https://work.weixin.qq.com/ 2.企业微信给用户发消息 申请企业微信以后&#xff0c;我们可以用管理员登录企业微信后台。 2.1.登录企业微信后台管理 2.2.创建应用 在应用管理模块&#xff0c;创建一个应用 2.3.发送消息 进…

调用企业微信接口发送微信消息

准备工作&#xff1a; 1.需要注册个企业微信账号&#xff0c;地址&#xff1a;https://work.weixin.qq.com/wework_admin/loginpage_wx 2.在企业微信中&#xff0c;创建一个应用&#xff0c;如下图&#xff1a; 需要上传应用logo、填写应用名称、并选择成员&#xff0c;之后点…

李彦宏:谷歌比百度多付4000万美元 也没做出ChatGPT

雷递网 乐天 5月5日 百度CEO李彦宏日前在百度骄傲颁奖典礼上就有媒体指百度错失了首先做出ChatGPT的机会传闻做出回应&#xff0c;称谷歌当时比百度多支付了4000多万美元&#xff0c;也一样没有先做出ChatGPT。Ilya Sutskever转身就离开Google去参与创建了OpenAI。 李彦宏指出&…

百度李彦宏:文心一言和 ChatGPT 水平差距不是很大,也就一两个月

3 月 26 日消息&#xff0c;近日&#xff0c;李彦宏在极客公园的直播中表示&#xff0c;文心一言确实不如现在最好的 ChatGPT 版本&#xff0c;但差距也不是很大&#xff0c;可能就是一两个月的差别。 李彦宏称&#xff0c;“我也不断在讲文心一言不够完美&#xff0c;事实上如…

你画过哪些好玩儿的作品?

CJQtime &#xff0c;搬砖师在读 韦易笑、 朱炫、 ze ran 等 18453 人赞同 进知乎两年了&#xff0c;一直是个透明人&#xff0c;从来不问不答&#xff0c;只是看到自己喜欢的答案会点个赞而已。基友在 身边有个会画画的朋友是怎样的体验&#xff1f; - 艺术发了些我平时瞎画的…

程序员的绘画

作为一个爱好画画的程序员&#xff0c;记录一下自己的绘画作品&#xff1a; 1.2016年过年时在家画的&#xff1a; 2.2016年四份左右画的&#xff1a; 3.2016年四月份左右画的&#xff1a; 4.2016年五月份左右画的&#xff1a; 5.2016年六月份左右画的&#xff1a; 6.2016年6月份…

谷歌内部文件泄露:我们和 OpenAI 都赢不了,因为正被“开源”偷家!

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 由 ChatGPT 掀起的 AI 大模型之战&#xff0c;已在全球范围内持续了几个月&#xff0c;其中业界尤为关注的&#xff0c;就是 OpenAI 和谷歌二者之间的博弈。 曾经&#xff0c;2017 年率先发布的 Tran…

如何用 AI 练英语口语?

语言学习&#xff0c;就得靠多训练。 痛点 有的小伙伴学了很长时间的英语&#xff0c;但学到的却是「哑巴英语」&#xff0c;特点是见着外国人张不开嘴。这里面有多种因素&#xff0c;但最主要还是练得太少。语言这东西就得靠多训练。经常和外国人说话&#xff0c;语言能力很快…

无账号体验Google的texttospeech API

如果你有google云账号&#xff0c;可以自行参考&#xff08;https://codelabs.developers.google.com/codelabs/cloud-text-speech-python3&#xff09;完成体验。如果你没有google云账号&#xff0c;也不想用信用卡注册一个&#xff0c;但是又想快速体验一下&#xff0c;请继续…

热门招聘丨 XTransfer史上最全产品技术岗位公开招聘

简介&#xff1a;XTransfer是一站式外贸企业跨境金融和风控服务公司&#xff0c;致力于帮助中小微企业大幅降低全球展业的门槛和成本&#xff0c;提升全球竞争力&#xff0c;已服务超15万家客户。公司已完成D轮融资&#xff0c;总部设立在上海&#xff0c;并在中国香港地区、深…

GPT-3.5 也能直接联网了

ChatGPT 常令人诟病的一个问题&#xff0c;就是它的模型训练数据&#xff0c;迄今为止用的还是 2021 年的老数据。 对于当下这个信息大爆炸时代&#xff0c;相隔两小时&#xff0c;消息都有可能滞后&#xff0c;更别说相隔两年了。 目前正式开放了 Web Browsing 这款插件。 …

GPT-4更新了哪些功能-GPT-4 Plus申请流程

GPT-4相比GPT3有哪些更新 以下是对GPT-4的优势的详解&#xff1a; 1.更强大的语言生成能力&#xff1a;GPT-4将有望比其前身——GPT-3模型生成更精准、更准确、更自然的文本&#xff0c;同时在更短的时间内完成。 2.更高的文本理解能力&#xff1a;随着深度学习的技术进步&a…

《终结者2》短评 以及对电影分级的思考

(后面部分截图口味略重) 《终结者2》是一部十分经典的科幻片&#xff0c;场面不是一般的震撼&#xff0c;相比第一部还尝试引导观众思考&#xff0c;不愧是卡梅隆的大作呀。 第一次是跟堂哥一起看这部影片&#xff0c;是十几年前还未上学的时候&#xff0c;还真的完全被吓坏了…

Linux系统下超级好用的终端——Terminator终结者

注意&#xff1a;仅作个人笔记使用&#xff0c;如果对您无用或者产生误导&#xff0c;请见谅并移步其他博客 1. 安装Terminator sudo apt-get install terminator疑惑&#xff1a; 我有一个疑惑的地方&#xff0c;安装某个包或者软件是&#xff0c;加不加sudo的区别是什么&am…

jovi五子棋下载_五子棋终结者

五子棋终结者拥有简约的画风以及众多贴心的功能呈现&#xff0c;没有任何花里胡哨的操作让玩家沉浸这指尖操作中去。线上提供了多种模式选择&#xff0c;强大的人机等你来战。下棋的过程中棋盘会放大哦&#xff0c;帮助大家精准落子&#xff01; 五子棋终结者介绍 传统五子棋执…

终结者2免费教程_如何在模拟器上玩(匹配的还是手机服)_适用最新客户端

电脑上玩终结者2的简单教程&#xff08;匹配的还是手机服&#xff0c;优势巨大&#xff09; 游戏效果如下图&#xff0c;部分模拟器玩的话是没有草的&#xff0c;这个是游戏和模拟器本身的问题 1. 第一步&#xff1a;下载安装安卓模拟器 Windows系统建议用蓝叠模拟器&#xff…