如何将微信聊天记录永久保存并生成年度报告:WeChatMsg终极数据管理指南
2026/5/27 15:37:01
作为湖南的独立PHP开发者,近期承接了一个企业官网CMS系统开发项目。在预算极其有限(仅99元)的情况下,客户提出了在后台编辑器中增加多格式文档导入功能的需求。经过两周的技术探索与实践,最终通过开源方案组合实现了核心功能。现将完整开发过程记录如下:
在预算限制下,排除商业SDK方案,重点考察以下开源方案:
# 使用本地开发环境# 阿里云OSS使用免费额度(5GB存储/月,免费流量)# 开发工具:Zend Studio(已有授权)// /app/services/DocumentParser.phpclassDocumentParser{// Word文档解析(保留格式)publicstaticfunctionparseWord($filePath){require_once'PHPWord/autoload.php';$phpWord=\PhpOffice\PhpWord\IOFactory::load($filePath);$html='';foreach($phpWord->getSections()as$section){foreach($section->getElements()as$element){if(method_exists($element,'getElementss')){$html.=self::renderElement($element);}}}return$html.'';}privatestaticfunctionrenderElement($element){if($elementinstanceof\PhpOffice\PhpWord\Element\Text){return''.$element->getText().'';}// 其他元素处理...return'';}// PDF转图片(简化版)publicstaticfunctionpdfToImages($filePath){require_once'TCPDF/tcpdf.php';require_once'TCPDF/tcpdf_parser.php';$pdf=new\TCPDF();$pageCount=$pdf->setSourceFile($filePath);$images=[];for($i=1;$i<=$pageCount;$i++){$page=$pdf->importPage($i);$pdf->AddPage();$pdf->useTemplate($page);$tmpFile='/tmp/pdf_page_'.$i.'.png';$pdf->Output($tmpFile,'F');$images[]=$tmpFile;}return$images;}}// /app/services/OssService.phpclassOssService{privatestatic$ossClient;publicstaticfunctionuploadFile($filePath,$objectName=null){if(!self::$ossClient){require_once'aliyun-oss/autoload.php';self::$ossClient=new\OSS\OssClient(getenv('OSS_ACCESS_KEY'),getenv('OSS_SECRET_KEY'),getenv('OSS_ENDPOINT'));}$objectName=$objectName?:'docs/'.uniqid().'.'.pathinfo($filePath,PATHINFO_EXTENSION);self::$ossClient->uploadFile(getenv('OSS_BUCKET'),$objectName,$filePath);returngetenv('OSS_DOMAIN').'/'.$objectName;}// 处理Base64图片(微信公众号常用)publicstaticfunctionuploadBase64Image($base64){if(preg_match('/^data:image\/(\w+);base64,/',$base64,$matches)){$data=substr($base64,strpos($base64,',')+1);$tmpFile='/tmp/wechat_img_'.uniqid().'.'.$matches[1];file_put_contents($tmpFile,base64_decode($data));returnself::uploadFile($tmpFile);}returnfalse;}}// /src/plugins/kindeditor-doc-import.jsKindEditor.plugin('docimport',function(K){varself=this,name='docimport';self.clickToolbar(name,function(){// 创建文件选择对话框vardialog=K.dialog({title:'导入文档',width:500,height:200,body:' '+'开始导入',close:function(){dialog.remove();}});// 处理导入dialog.find('#importBtn').click(function(){varfile=dialog.find('#docFile')[0].files[0];if(!file)return;varformData=newFormData();formData.append('file',file);// 显示加载中K.loading('正在处理文档...');// 调用后端APIfetch('/api/document/import',{method:'POST',body:formData}).then(res=>res.json()).then(data=>{if(data.success){self.insertHtml(data.html);}else{alert('导入失败: '+data.message);}K.hideLoading();dialog.remove();});});});// 微信公众号内容粘贴处理self.afterCreate(function(){this.cmd.dom.addEventListener('paste',function(e){if(e.ctrlKey&&e.shiftKey&&e.key==='V'){// 自定义快捷键e.preventDefault();handleWechatPaste(self);}});});functionhandleWechatPaste(editor){// 获取剪贴板内容navigator.clipboard.readText().then(text=>{// 简单模拟公众号内容处理(实际需要更复杂的解析)varhtml=text.replace(/\[图片\]/g,function(){// 这里应该调用图片下载逻辑return'';});editor.insertHtml(html);// 实际项目中需要添加图片下载逻辑downloadWechatImages(html).then(processedHtml=>{editor.html(processedHtml);});});}});// /src/components/Editor.vueexportdefault{mounted(){this.initEditor();},methods:{initEditor(){KindEditor.ready(K=>{K.create('#editor_id',{items:['docimport',// 自定义文档导入按钮'bold','italic','underline','insertimage'],afterCreate:function(){// 注册快捷键提示this.cmd.dom.title='Ctrl+Shift+V 粘贴公众号内容';}});});}}}// /public/api/document.phprequire'../../bootstrap.php';header('Content-Type: application/json');$action=$_POST['action']??'';$result=['success'=>false];try{switch($action){case'import':$file=$_FILES['file'];$ext=pathinfo($file['name'],PATHINFO_EXTENSION);switch(strtolower($ext)){case'docx':$html=\App\Services\DocumentParser::parseWord($file['tmp_name']);$result['html']=$html;break;case'pdf':$images=\App\Services\DocumentParser::pdfToImages($file['tmp_name']);$html='';foreach($imagesas$img){$ossUrl=\App\Services\OssService::uploadFile($img);$html.='';}$html.='';$result['html']=$html;break;// 其他格式处理...}$result['success']=true;break;case'upload-wechat-img':$base64=$_POST['base64'];$url=\App\Services\OssService::uploadBase64Image($base64);$result['url']=$url;$result['success']=true;break;}}catch(Exception$e){$result['message']=$e->getMessage();}echojson_encode($result);| 项目 | 费用(元) | 说明 |
|---|---|---|
| 阿里云OSS | 0 | 使用免费额度(5GB存储) |
| 流量费用 | 0 | 开发测试期流量未超限 |
| 第三方库 | 0 | 全部使用开源解决方案 |
| 总计 | 0 | 远低于99元预算 |
图片处理:
前端优化:
// 延迟加载大文档内容functionlazyLoadDocument(html){constcontainer=document.createElement('div');container.innerHTML=html;// 只渲染可视区域内容constobserver=newIntersectionObserver(entries=>{entries.forEach(entry=>{if(entry.isIntersecting){// 实际渲染逻辑observer.unobserve(entry.target);}});});Array.from(container.querySelectorAll('.doc-section')).forEach(el=>{observer.observe(el);});returncontainer.innerHTML;}后端缓存:
// 简单缓存机制classDocumentCache{privatestatic$cache=[];publicstaticfunctionget($key){returnself::$cache[$key]??null;}publicstaticfunctionset($key,$value,$ttl=3600){self::$cache[$key]=['value'=>$value,'expire'=>time()+$ttl];}}功能完成度:
性能指标:
功能增强:
架构优化:
用户体验:
本次开发证明,在严格预算控制下,通过合理的技术选型和开源方案组合,完全可以实现企业级文档处理功能。项目代码已开源至GitHub(示例链接),可供同行参考交流。
在head中引入组件文件
注意,不要重复引入jquery,如果您的页面已经引入了jquery这里就不要再引入jquery 1.4了。
WordPaster For KindEditor-4.x # 初始化组件 WordPaster.getInstance({ui:{render:"wdpst"}//目标容器,一般为div});将插件添加到工具栏,并挂载KindEditor的Ctrl+V快捷键事件
1.如果接口字段名称不是file,请配置FileFieldName。
点击查看教程
2.如果接口返回JSON,请配置ImageMatch
点击查看教程
3.如果接口返回的图片地址没有域名,请配置ImageUrl
点击查看教程
一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
一键导入Word文件,并将Word文件转换成图片上传到服务器中。
一键导入PDF文件,并将PDF转换成图片上传到服务器中。
一键导入PPT文件,并将PPT转换成图片上传到服务器中。
下载完整示例