diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 5b90e79..0000000 --- a/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# ---> Go -# If you prefer the allow list template instead of the deny list, see community template: -# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore -# -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Dependency directories (remove the comment below to include it) -# vendor/ - -# Go workspace file -go.work -go.work.sum - -# env file -.env - diff --git a/README.md b/README.md index 4e7e643..8994fa0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,210 @@ -# yixiaogao +# 🔍 易搜高 - 微信公众号文章爬虫系统 -易小稿网站微信公众号文章爬取 \ No newline at end of file +一个功能完整的微信公众号文章爬虫与自媒体监控系统,支持文章采集、数据分析、用户管理等功能。 + +![License](https://img.shields.io/badge/license-MIT-blue.svg) +![Go Version](https://img.shields.io/badge/go-1.24.0-blue.svg) +![Status](https://img.shields.io/badge/status-active-success.svg) + +## ✨ 功能特性 + +### 📱 自媒体监控系统 +- **文章监控**:实时追踪公众号、头条号、百家号等平台的最新文章 +- **数据分析**:统计阅读量、点赞数、评论数、分享数等关键指标 +- **历史文章**:浏览和管理已采集的文章列表 +- **文章详情**:查看文章完整内容、统计数据和元信息 +- **用户中心**:个人信息管理、收藏夹、浏览历史 + +### 🚀 爬虫系统 +- **提取公众号主页**:从文章链接获取公众号主页 +- **获取文章列表**:批量获取公众号所有历史文章 +- **批量下载文章**:下载文章内容和图片资源 +- **获取文章详情**:获取阅读量、点赞数、评论等详细数据 + +### 👥 用户管理 +- **用户注册/登录**:完整的用户认证系统 +- **登录状态同步**:所有页面统一的登录状态管理 +- **安全认证**:基于 Token 的安全认证机制 + +## 🏗️ 项目架构 + +``` +Access_wechat_article/ +├── backend/ # 后端服务(Go) +│ ├── api/ # API 接口 +│ ├── cmd/ # 命令行工具 +│ ├── configs/ # 配置文件 +│ ├── pkg/ # 核心包 +│ └── tools/ # 工具函数 +├── frontend/ # 前端页面(HTML/CSS/JS) +│ ├── css/ # 样式文件 +│ ├── js/ # JavaScript 文件 +│ ├── frontend.html # 自媒体监控首页 +│ ├── index.html # 爬虫系统页面 +│ ├── login.html # 登录页面 +│ ├── register.html # 注册页面 +│ ├── user-center.html # 用户中心 +│ ├── history-articles.html # 历史文章列表 +│ └── article-detail.html # 文章详情页 +├── database/ # 数据库文件 +└── data/ # 数据存储目录 +``` + +## 🚀 快速开始 + +### 环境要求 + +- **Go**: 1.24.0 或更高版本 +- **Python**: 3.x(用于前端服务器) +- **浏览器**: Chrome、Firefox、Edge 等现代浏览器 + +### 安装步骤 + +1. **克隆项目** +```bash +git clone +cd Access_wechat_article +``` + +2. **安装后端依赖** +```bash +cd backend +go mod download +``` + +3. **启动系统** + +**方式一:使用启动脚本(推荐)** +```bash +# Windows 系统 +双击运行 "启动Web系统.bat" +``` + +**方式二:手动启动** +```bash +# 启动 API 服务器 +cd backend/api +go run start_api.go + +# 新开终端,启动前端服务器 +cd frontend +python -m http.server 8000 +``` + +4. **访问系统** +- 前端界面:http://localhost:8000 +- API 服务器:http://localhost:8080 + +## 📖 使用说明 + +### 1. 自媒体监控系统 + +访问 `http://localhost:8000/frontend.html` + +- **首页**:查看最新文章列表和热门内容 +- **历史文章**:浏览和搜索已采集的文章 +- **文章详情**:查看文章完整内容和数据分析 +- **用户中心**:管理个人信息和收藏 + +### 2. 爬虫系统 + +访问 `http://localhost:8000/index.html` + +#### 提取公众号主页 +1. 输入公众号下任意一篇文章链接 +2. 点击"提取主页链接" +3. 获取公众号主页 URL + +#### 获取文章列表 +1. 使用 Fiddler 抓取包含认证信息的 URL +2. 粘贴完整的 Access Token URL +3. 设置获取页数(留空表示全部) +4. 点击"开始获取" + +#### 批量下载文章 +1. 输入公众号名称或文章链接 +2. 选择是否保存图片和内容 +3. 点击"开始批量下载" + +#### 获取文章详情 +1. 粘贴 Access Token URL +2. 设置获取页数 +3. 点击"开始获取" +4. 数据保存在 `data/公众号名称/文章详细/` 目录 + +### 3. 用户系统 + +#### 注册账号 +1. 访问注册页面:`http://localhost:8000/register.html` +2. 填写用户名、邮箱、密码 +3. 点击"立即注册" + +#### 登录 +1. 访问登录页面:`http://localhost:8000/login.html` +2. 输入用户名和密码 +3. 选择"记住我"可保持登录状态 +4. 登录成功后自动跳转到首页 + +## 🛠️ 技术栈 + +### 后端 +- **语言**: Go 1.24.0 +- **HTTP 客户端**: go-resty/resty v2.17.0 +- **数据库**: SQLite (modernc.org/sqlite v1.40.1) + +### 前端 +- **HTML5/CSS3**: 响应式布局 +- **JavaScript**: 原生 JS + jQuery 3.6.0 +- **UI 设计**: 渐变配色、卡片式布局、动画效果 + +## 📊 API 接口 + +### 用户相关 +- `POST /api/user/register` - 用户注册 +- `POST /api/user/login` - 用户登录 +- `POST /api/user/logout` - 用户登出 +- `GET /api/user/info` - 获取用户信息 + +### 文章相关 +- `GET /api/articles` - 获取文章列表 +- `GET /api/articles/:id` - 获取文章详情 +- `POST /api/articles/collect` - 收藏文章 + +### 爬虫相关 +- `POST /api/crawler/homepage` - 提取公众号主页 +- `POST /api/crawler/articles` - 获取文章列表 +- `POST /api/crawler/batch` - 批量下载文章 +- `POST /api/crawler/detail` - 获取文章详情 + +## 📝 注意事项 + +1. **网络要求**:需要稳定的网络连接访问微信公众号平台 +2. **认证信息**:部分功能需要有效的 Access Token +3. **数据存储**:采集的数据保存在 `data/` 目录下 +4. **浏览器兼容**:建议使用 Chrome、Firefox、Edge 等现代浏览器 +5. **服务器端口**:确保 8000 和 8080 端口未被占用 + +## 🔒 安全说明 + +- 用户密码经过加密存储 +- 使用 Token 认证机制保护 API +- 所有敏感操作需要登录验证 +- 支持会话管理和自动过期 + +## 📄 许可证 + +本项目仅供学习研究使用,请勿用于商业用途。 + +## 🤝 贡献 + +欢迎提交 Issue 和 Pull Request! + +## 📧 联系方式 + +如有问题或建议,请通过以下方式联系: +- 提交 Issue +- 发送邮件 + +--- + +**⚠️ 免责声明**:本工具仅供学习交流使用,使用者需遵守相关法律法规和平台规则,不得用于非法用途。使用本工具产生的任何后果由使用者自行承担。 diff --git a/backend/api/API接口文档.md b/backend/api/API接口文档.md deleted file mode 100644 index 46ccfb6..0000000 --- a/backend/api/API接口文档.md +++ /dev/null @@ -1,460 +0,0 @@ -# 📡 微信公众号文章爬虫 - API 接口文档 - -## 服务器信息 - -- **服务地址**: http://localhost:8080 -- **协议**: HTTP/1.1 -- **数据格式**: JSON -- **字符编码**: UTF-8 -- **CORS**: 已启用(允许所有来源) - -## 统一响应格式 - -所有API接口返回格式统一为: - -```json -{ - "success": true, // 请求是否成功 - "message": "操作成功", // 提示信息 - "data": {} // 数据内容(可选) -} -``` - -## 接口列表 - -### 1. 提取公众号主页 - -**接口地址**: `/api/homepage/extract` -**请求方法**: POST -**功能说明**: 从文章链接中提取公众号主页链接 - -#### 请求参数 - -```json -{ - "url": "https://mp.weixin.qq.com/s?__biz=xxx&mid=xxx" -} -``` - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| url | string | 是 | 公众号文章链接 | - -#### 响应示例 - -**成功响应**: -```json -{ - "success": true, - "message": "提取成功", - "data": { - "homepage": "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=xxx&scene=124", - "output": "完整的命令行输出信息" - } -} -``` - -**失败响应**: -```json -{ - "success": false, - "message": "未能提取到主页链接" -} -``` - -#### 调用示例 - -**jQuery**: -```javascript -$.ajax({ - url: 'http://localhost:8080/api/homepage/extract', - method: 'POST', - contentType: 'application/json', - data: JSON.stringify({ - url: 'https://mp.weixin.qq.com/s?__biz=xxx&mid=xxx' - }), - success: function(response) { - if (response.success) { - console.log('主页链接:', response.data.homepage); - } - } -}); -``` - -**curl**: -```bash -curl -X POST http://localhost:8080/api/homepage/extract \ - -H "Content-Type: application/json" \ - -d '{"url":"https://mp.weixin.qq.com/s?__biz=xxx&mid=xxx"}' -``` - ---- - -### 2. 下载单篇文章 - -**接口地址**: `/api/article/download` -**请求方法**: POST -**功能说明**: 下载指定的单篇文章 - -#### 请求参数 - -```json -{ - "url": "https://mp.weixin.qq.com/s?__biz=xxx", - "save_image": true, - "save_content": true -} -``` - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| url | string | 是 | 文章链接 | -| save_image | boolean | 否 | 是否保存图片(默认false) | -| save_content | boolean | 否 | 是否保存内容(默认true) | - -#### 响应示例 - -```json -{ - "success": true, - "message": "下载任务已启动", - "data": { - "url": "https://mp.weixin.qq.com/s?__biz=xxx" - } -} -``` - ---- - -### 3. 获取文章列表 - -**接口地址**: `/api/article/list` -**请求方法**: POST -**功能说明**: 批量获取公众号的文章列表 - -#### 请求参数 - -```json -{ - "access_token": "https://mp.weixin.qq.com/mp/profile_ext?action=xxx&appmsg_token=xxx", - "pages": 0 -} -``` - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| access_token | string | 是 | 包含appmsg_token的URL | -| pages | integer | 否 | 获取页数,0表示全部(默认0) | - -#### 响应示例 - -```json -{ - "success": true, - "message": "任务已启动" -} -``` - ---- - -### 4. 批量下载文章 - -**接口地址**: `/api/article/batch` -**请求方法**: POST -**功能说明**: 批量下载公众号的所有文章 - -#### 请求参数 - -```json -{ - "official_account": "公众号名称或文章链接", - "save_image": true, - "save_content": true -} -``` - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| official_account | string | 是 | 公众号名称或任意文章链接 | -| save_image | boolean | 否 | 是否保存图片(默认false) | -| save_content | boolean | 否 | 是否保存内容(默认true) | - -#### 响应示例 - -```json -{ - "success": true, - "message": "任务已启动" -} -``` - ---- - -### 5. 获取数据列表 - -**接口地址**: `/api/data/list` -**请求方法**: GET -**功能说明**: 获取已下载的公众号数据列表 - -#### 请求参数 - -无 - -#### 响应示例 - -```json -{ - "success": true, - "data": [ - { - "name": "研招网资讯", - "article_count": 125, - "path": "D:\\workspace\\Access_wechat_article\\backend\\data\\研招网资讯", - "last_update": "2025-11-27" - } - ] -} -``` - -| 字段 | 类型 | 说明 | -|------|------|------| -| name | string | 公众号名称 | -| article_count | integer | 文章数量 | -| path | string | 存储路径 | -| last_update | string | 最后更新时间 | - -#### 调用示例 - -**jQuery**: -```javascript -$.get('http://localhost:8080/api/data/list', function(response) { - if (response.success) { - console.log('数据列表:', response.data); - } -}); -``` - -**curl**: -```bash -curl http://localhost:8080/api/data/list -``` - ---- - -### 6. 获取任务状态 - -**接口地址**: `/api/task/status` -**请求方法**: GET -**功能说明**: 获取当前任务的执行状态 - -#### 请求参数 - -无 - -#### 响应示例 - -**任务运行中**: -```json -{ - "success": true, - "data": { - "running": true, - "progress": 45, - "message": "正在下载第10篇文章..." - } -} -``` - -**无任务运行**: -```json -{ - "success": true, - "data": { - "running": false, - "progress": 0, - "message": "" - } -} -``` - -| 字段 | 类型 | 说明 | -|------|------|------| -| running | boolean | 是否有任务运行中 | -| progress | integer | 任务进度(0-100) | -| message | string | 任务状态描述 | -| error | string | 错误信息(可选) | - ---- - -## 错误码说明 - -### HTTP状态码 - -| 状态码 | 说明 | -|--------|------| -| 200 | 请求成功 | -| 400 | 请求参数错误 | -| 500 | 服务器内部错误 | - -### 业务错误码 - -所有业务错误通过响应中的 `success` 字段和 `message` 字段返回: - -```json -{ - "success": false, - "message": "具体的错误信息" -} -``` - -常见错误信息: - -| 错误信息 | 说明 | 解决方法 | -|----------|------|----------| -| 请求参数错误 | JSON格式不正确或缺少必填参数 | 检查请求参数格式 | -| 执行失败 | 后端程序执行出错 | 查看详细错误信息 | -| 未能提取到主页链接 | 文章链接格式错误或解析失败 | 使用有效的文章链接 | -| 读取数据目录失败 | data目录不存在或无权限 | 检查目录权限 | - ---- - -## 开发指南 - -### 本地测试 - -1. **启动API服务器**: -```bash -cd backend\api -start_api.bat -``` - -2. **测试接口**: -```bash -# 测试提取主页 -curl -X POST http://localhost:8080/api/homepage/extract \ - -H "Content-Type: application/json" \ - -d "{\"url\":\"文章链接\"}" - -# 测试获取数据列表 -curl http://localhost:8080/api/data/list -``` - -### 跨域配置 - -API服务器已启用CORS,允许所有来源访问: - -```go -w.Header().Set("Access-Control-Allow-Origin", "*") -w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS") -w.Header().Set("Access-Control-Allow-Headers", "Content-Type") -``` - -如需限制特定域名,修改 `server.go` 中的 `corsMiddleware` 函数。 - -### 超时设置 - -默认HTTP超时时间:30秒 - -如需修改,在 `server.go` 中添加: - -```go -server := &http.Server{ - Addr: ":8080", - ReadTimeout: 30 * time.Second, - WriteTimeout: 30 * time.Second, -} -``` - -### 日志记录 - -API服务器使用标准输出记录日志: - -```go -log.Printf("[%s] %s - %s", r.Method, r.URL.Path, message) -``` - ---- - -## 接口更新计划 - -### v1.1.0(计划中) -- [ ] 添加用户认证机制 -- [ ] 支持任务队列管理 -- [ ] 增加下载进度推送(WebSocket) -- [ ] 提供文章搜索接口 - -### v1.2.0(计划中) -- [ ] 数据统计分析接口 -- [ ] 导出功能(PDF/Word) -- [ ] 批量任务管理 -- [ ] 定时任务支持 - ---- - -## 技术栈 - -- **语言**: Go 1.20+ -- **Web框架**: net/http (标准库) -- **数据格式**: JSON -- **并发模型**: Goroutine - ---- - -## 性能说明 - -### 并发能力 -- 支持多客户端同时访问 -- 但同一时间只能执行一个爬虫任务(`currentTask`) - -### 资源占用 -- CPU: 低(主要I/O操作) -- 内存: <50MB -- 磁盘: 取决于下载的文章数量 - -### 性能优化建议 -1. 使用连接池管理HTTP请求 -2. 实现任务队列机制 -3. 添加结果缓存 -4. 启用gzip压缩 - ---- - -## 安全建议 - -### 1. 生产环境部署 -- 添加HTTPS支持 -- 实现API认证(JWT/OAuth) -- 限制跨域来源 -- 添加请求频率限制 - -### 2. 数据安全 -- 不要暴露敏感信息(Cookie) -- 定期清理临时文件 -- 备份重要数据 - -### 3. 访问控制 -- 添加IP白名单 -- 实现用户权限管理 -- 记录操作日志 - ---- - -## 常见问题 - -### Q1: 为什么任务启动后没有响应? -A: 检查后端 `wechat-crawler.exe` 是否存在并有执行权限。 - -### Q2: 如何查看详细的错误信息? -A: 查看API服务器窗口的控制台输出。 - -### Q3: 能同时执行多个下载任务吗? -A: 当前版本不支持,同时只能执行一个任务。 - -### Q4: 如何停止正在运行的任务? -A: 关闭API服务器窗口或重启服务器。 - ---- - -**文档版本**: v1.0.0 -**最后更新**: 2025-11-27 -**维护者**: AI Assistant diff --git a/backend/api/api-server.exe b/backend/api/api-server.exe new file mode 100644 index 0000000..28930ea Binary files /dev/null and b/backend/api/api-server.exe differ diff --git a/backend/api/api-server.exe~ b/backend/api/api-server.exe~ new file mode 100644 index 0000000..3b9f3d6 Binary files /dev/null and b/backend/api/api-server.exe~ differ diff --git a/backend/api/build.bat b/backend/api/build.bat index d07a9ee..91b9354 100644 --- a/backend/api/build.bat +++ b/backend/api/build.bat @@ -5,8 +5,8 @@ echo 📦 编译 API 服务器 echo =============================================== echo. -echo 🔨 正在编译 api_server.exe... -go build -o api_server.exe server.go +echo 🔨 正在编译 api-server.exe... +go build -o api-server.exe server.go if %errorlevel% neq 0 ( echo. @@ -18,7 +18,7 @@ if %errorlevel% neq 0 ( echo. echo ✅ 编译成功! -echo 📁 输出文件: api_server.exe +echo 📁 输出文件: api-server.exe echo. echo =============================================== echo 编译完成 diff --git a/backend/debug_article_raw.html b/backend/api/debug_article_raw.html similarity index 87% rename from backend/debug_article_raw.html rename to backend/api/debug_article_raw.html index 0af70ab..bdf60e5 100644 --- a/backend/debug_article_raw.html +++ b/backend/api/debug_article_raw.html @@ -1,5 +1,6 @@ @@ -15,15 +16,15 @@ - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -3433,13 +3578,116 @@ window.__ajaxTransferConfig = { 'mp/advertisement_report': 'mmbizwap_cgi_appmsg - - - -