简介:这份PHP源码面向微信公众号运营者、自媒体编辑及前端开发者,用于搭建文章编辑与排版工具,解决公众号内容排版样式单一、素材采集效率低的问题。资源包共1355个文件,约63.41MB,以gif、png图片素材和js脚本、php程序文件为主,辅以css样式表、html页面及scss、less预编译文件,另含字体、图标与数据库文件,构成完整的前后端结构。压缩包内附视频使用教程,可帮助读者快速理解采集功能与多种排版样式的调用方式,掌握编辑器模块的组织逻辑与二次开发思路。目前已有447人学习下载,适合需要自建公众号排版工具或研究PHP编辑器实现的技术人员参考。
1. 公众号排版的重复劳动,这套 PHP 源码想帮你省掉
做公众号运营的同行大概都有过这种体验:一篇文章在 Word 里排得好好的,粘进公众号后台就全乱了,行距、缩进、字号全得手动重来。更麻烦的是,如果你同时管着几个号,或者需要把历史文章批量整理成素材库,纯靠后台那点编辑功能根本不够用。这套 PHP 源码就是冲着这个场景来的——它把公众号文章的编辑排版和采集功能打包在一起,还附了一份视频使用教程,部署完就能在浏览器里操作。适合谁?一是手里有服务器、愿意自己搭环境的技术型运营;二是接公众号代运营、需要批量处理图文素材的小团队;三是想拿现成代码改一套内部工具的前后端开发者。它不解决“内容从哪来”的问题,但能让你在排版和素材归集上少点重复劳动。
2. 环境搭起来:PHP 版本、扩展依赖与目录权限
2.1 为什么这类工具偏爱 PHP 而不是 Node
公众号排版工具的核心逻辑其实不复杂:富文本编辑器负责前端交互,后端处理图片上传、样式过滤、文章存储。PHP 在这个场景里有几个现实优势——虚拟主机普及率高,部署成本低;GD 库和 cURL 扩展几乎是标配,处理图片下载和远程请求不用额外装依赖;源码交付后改起来门槛低,懂点 PHP 的人就能动。这套源码用的是原生 PHP 加 MySQL 的经典组合,没有上框架,好处是文件结构直白,坏处是代码组织偏松散,二次开发时得自己理清调用关系。如果你习惯 Laravel 或 ThinkPHP,可以把它当参考实现,把核心逻辑抽出来重构。
2.2 部署前的环境检查清单
别急着上传源码,先把环境对一遍。我见过太多人卡在“白屏”或“图片上传失败”上,最后发现是扩展没开。下面这张表是部署前必须确认的项:
| 检查项 | 要求 | 不满足时的典型现象 |
|---|---|---|
| PHP 版本 | 7.0 及以上(推荐 7.4) | 语法报错、页面空白 |
| MySQL | 5.6 及以上 | 安装向导连不上数据库 |
| GD 库 | 开启 | 图片采集后无法生成缩略图 |
| cURL 扩展 | 开启 | 采集功能提示“请求失败” |
| fileinfo 扩展 | 开启 | 上传图片时类型判断异常 |
| 目录权限 | uploads/、cache/ 可写 | 图片上传成功但前台不显示 |
检查命令很简单,建一个info.php放根目录,内容就一行<?php phpinfo(); ?>,浏览器访问后搜GD、cURL、fileinfo三个关键词,确认是 enabled 状态。看完记得删掉这个文件,别留在生产环境里。
2.3 安装向导与数据库配置
源码包解压后一般会有install目录,访问你的域名/install进入安装向导。数据库信息填你提前建好的库名、用户名和密码,表前缀建议改掉默认的wx_,换成你自己好记的。安装完成后系统会提示删除install目录,这一步别跳过——留着它等于把重装入口暴露在公网。
# 建库和专用用户,别直接用 root mysql -u root -p CREATE DATABASE wx_tools DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER 'wx_user'@'localhost' IDENTIFIED BY '你的强密码'; GRANT ALL PRIVILEGES ON wx_tools.* TO 'wx_user'@'localhost'; FLUSH PRIVILEGES; EXIT;上面这段 SQL 做了三件事:建了一个用 utf8mb4 字符集的库(支持 emoji,公众号文章里经常有),建了一个只对这个库有权限的专用用户,刷新权限表让配置立即生效。为什么不直接用 root?因为一旦源码里有未过滤的 SQL 拼接,专用用户能把损失限制在单库范围内。装完之后进后台,先改默认管理员密码,再检查一下config.php里的数据库配置是否和上面一致。
3. 采集功能怎么跑通:从目标地址到本地素材库
3.1 采集模块的工作链路
这套源码的采集功能,本质上是“抓取页面 → 解析 DOM → 提取正文和图片 → 本地化存储”四步。它不依赖第三方 API,而是直接请求目标页面,用正则或 DOM 解析拿到文章主体。常见做法是先用 cURL 拉取 HTML,再用DOMDocument加载,通过getElementsByTagName定位正文容器。图片处理是重点——公众号文章的图片有><?php // 采集核心逻辑简化示例,实际源码中封装在类里 function fetchArticle($url) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_TIMEOUT => 15, CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' ]); $html = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode !== 200 || empty($html)) { return ['error' => '请求失败,状态码:' . $httpCode]; } $dom = new DOMDocument(); libxml_use_internal_errors(true); // 忽略 HTML 结构不规范的警告 $dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $images = []; foreach ($dom->getElementsByTagName('img') as $img) { // 优先取># 测试单篇采集是否通,用 curl 模拟一下请求头 curl -I -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \ "https://mp.weixin.qq.com/s/示例文章ID" # 看返回的 HTTP 状态码和 Content-Type # 200 且 text/html 才说明能正常抓取
上面这条命令是排错用的。如果返回 403 或 302,说明目标站有反爬或需要登录态,这时候采集功能大概率跑不通,别在规则上死磕。参数方面,采集间隔建议设 3 到 5 秒,太快容易触发频率限制;图片下载并发数别超过 3,小服务器扛不住。采集回来的文章会进草稿箱,你可以在编辑器里二次排版后再发布或导出。
3.3 编辑器与排版样式的落地
采集只是把内容拿回来,真正让运营省心的是排版。这套源码内置的编辑器支持常见的公众号样式:字号、行距、字间距、两端缩进、引用块、分割线。它的实现方式是把样式写成内联 style,因为公众号后台会过滤掉<style>标签和 class,只认内联样式。所以你在这套工具里排好版,复制到公众号后台时格式基本能保留。
// 编辑器导出时把选中区域的样式转成内联,简化示意 function inlineStyles(node) { const computed = window.getComputedStyle(node); const props = ['font-size', 'line-height', 'color', 'margin', 'padding', 'text-align']; let styleStr = ''; props.forEach(p => { const val = computed.getPropertyValue(p); if (val) styleStr += `${p}:${val};`; }); node.setAttribute('style', styleStr); Array.from(node.children).forEach(inlineStyles); // 递归处理子节点 }这段逻辑说明了一个关键点:公众号只认内联样式,所以编辑器在导出时必须把计算后的样式逐个写到元素上。参数上,line-height建议 1.75 到 2.0,font-size正文 15 到 16px,两端缩进用padding控制。如果你发现复制过去后行距丢了,多半是某个父级样式没被递归到,检查一下inlineStyles有没有漏掉嵌套层级。
4. 避坑与排查:那些让你白忙半天的细节
4.1 采集回来的图片显示裂图
现象:文章采集成功,文字正常,但图片全是裂图或占位图。原因:公众号图片用了><?php // 把采集结果推送到自建知识库的示例 function pushToKnowledgeBase($article) { $payload = [ 'title' => $article['title'], 'content' => $article['html'], 'source' => $article['source_url'], 'images' => array_map(function($img) { return ['url' => $img['local_path'], 'alt' => $img['alt'] ?? '']; }, $article['images']), 'created_at' => date('Y-m-d H:i:s') ]; $ch = curl_init('https://你的知识库域名/api/v1/documents'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE), CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Authorization: Bearer ' . KB_TOKEN ], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10 ]); $resp = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $code === 200 || $code === 201; }
这段代码里JSON_UNESCAPED_UNICODE必须加,不然中文会变成\uXXXX转义,知识库那边解析出来是乱码。Authorization头用你知识库的 token,别硬编码在文件里,放环境变量。超时设 10 秒,知识库接口一般比采集目标站快,不需要太长。
验证方法很简单:采一篇带图文章,走完推送流程,去知识库里搜标题,看正文格式和图片是否完整。如果图片裂了,检查local_path是不是公网可访问的 URL;如果正文样式丢了,检查知识库前端有没有做 HTML 白名单过滤,把style属性加进允许列表。
我自己的习惯是,每次改完采集或推送逻辑,先拿三篇不同类型的文章跑一遍:一篇纯文字、一篇多图、一篇带表格。三篇都过了再上批量。从那以后我每次部署这类工具,都强制先跑一遍环境检查清单和这三篇样本,省得后面返工。希望帮到你。
本文还有配套的精品资源,点击获取