wcplusPro 源代码

1
关于 wcplusPro 源码版

过去的 5 年,wcplusPro 一直专注于公众号数据采集、分析,积累大量一手经验、独家心得、稳定策略,这些都呈现在源代码中。有理由相信,wcplusPro源码版一定能助贵司公众号数据业务发展一臂之力。

以下是对源码版的简要介绍,如有其他疑问,欢迎微信、邮箱联系客服,联系方式见底部。

2
客户群体
  1. 企业,搭建自动化公众号数据情报系统
  2. 研究人员,需要大量公众号数据为原料,从事某项研究

除此之外,我们发现 wcplusPro 源码用户中,有一定比例的 Python 开发者,他们希望从 wcplusPro 中借鉴 Python 开发商用产品的经验。

3
技术框架

wcplusPro 采用现代 Web 开发架构,实现了前后端分离,前端使用 Vue2 构建,后端使用 Python3.7.7+ 开发。前后之间通过 RESTful API 和 Websocket 进行通信。

用户可以将 wcplusPro 运行在本地,也可以部署在远程服务器,方便随时随地使用。

支持开箱即用,目标机器安装完 Python3.7.7+ 之后,即可运行使用、二次开发 wcplusPro。如需修改前端 UI,还需安装 node+npm 环境。

4
采集效率

wcplusPro 实现了对任意公众号全部历史文章的采集,可采集数据至少包括:

  1. 第一类,文章基本信息。公众号昵称、标题、封面链接、作者、摘要、推文时间戳、版权标志、推文IP属地、文章位置(头条、次1条等)、永久文章链接
  2. 第二类,文章内容。支持 html 格式和 markdown 格式
  3. 第三类,阅读数据。阅读数量、点赞数量、在看数量、评论数量、赞赏数量在内的数据

采集效率方面,以上三类数据有所不同:

  1. 第一类,文章基本信息。2次推文/秒,换算成文章数量,大约是 2~18篇文章/秒,取决于每次推文数量
  2. 第二类,文章内容。20~40篇文章/秒,取决于网络和硬件的并发性能
  3. 第三类,阅读数据。0.33篇/秒,也就是 1篇/3秒

wcplusPro 本质上是模拟微信用户阅读公众号的文章,后台自动保存目标公众号的推文数据,原理上并不涉及逆行、破解等有害行为,请放心使用。多客户端、多微信用户同时运行,可线性倍速。用户也可以在熟悉数据采集原理之后,自行开发调度策略,实现更大规模的数据采集。

5
升级形式

源码版的升级分为两种情况:

  1. bug 修复性升级,免费升级。这种情况一般发生在公众号更新后,导致 wcplusPro 无法正常采集数据
  2. 功能增强性升级,¥200/次。比如 wcplusPro 推出新功能、新特性

升级并非强制性,用户可自行决定;可跨版本升级,按单次升级收费。

6
源码结构
后端源码结构
-> wcplusPro源码版后端工程
├── articles
├── cmp
│   ├── __init__.py
│   ├── database
│   │   ├── __init__.py
│   │   └── utils.py
│   ├── iphone.py
│   ├── mongo
│   │   ├── __init__.py
│   │   └── data_schema.py
│   ├── proxy_server
│   │   ├── __init__.py
│   │   ├── addons.py
│   │   └── setproxy.py
│   ├── req_data
│   │   └── __init__.py
│   ├── search
│   │   ├── __init__.py
│   │   └── api.py
│   ├── spider
│   │   ├── __init__.py
│   │   ├── article.py
│   │   ├── article_list.py
│   │   ├── comment.py
│   │   ├── reading_data.py
│   │   └── request.py
│   └── update_note
│       └── __init__.py
├── controller
│   ├── __init__.py
│   ├── article.py
│   ├── bark.py
│   ├── event.py
│   ├── gzh.py
│   ├── report.py
│   ├── req_data.py
│   ├── search.py
│   ├── settings.py
│   ├── task.py
│   └── wcplus_export.py
├── db_folder
├── excel
├── macos_install_package.command
├── macos_run_wcplusPro.command
├── main.py
├── model
│   ├── __init__.py
│   ├── article.py
│   ├── gzh.py
│   ├── req_data.py
│   ├── search.py
│   ├── settings.py
│   └── task.py
├── requirement.txt
├── settings.py
├── utils
│   ├── __init__.py
│   ├── data_process.py
│   ├── dev.py
│   └── network.py
├── view
│   ├── __init__.py
│   ├── article.py
│   ├── category.py
│   ├── gzh.py
│   ├── report.py
│   ├── req_data.py
│   ├── task.py
│   └── wcplus_export.py
├── webserver
│   ├── __init__.py
│   ├── handler
│   │   ├── __init__.py
│   │   ├── article.py
│   │   ├── gzh.py
│   │   ├── help.py
│   │   ├── pca.py
│   │   ├── report.py
│   │   ├── req_data.py
│   │   ├── task.py
│   │   ├── test.py
│   │   └── user.py
│   ├── instance.py
│   ├── sio
│   │   ├── __init__.py
│   │   └── events.py
│   └── static
│       ├── css
│       │   ├── app.95c0334a.css
│       │   ├── chunk-1b13f9ed.96ffad72.css
│       │   ├── chunk-25474645.be18db89.css
│       │   ├── chunk-41a04990.e034db36.css
│       │   ├── chunk-5cccc9a2.3c7f5ad9.css
│       │   ├── chunk-5e6a2399.30714ffe.css
│       │   ├── chunk-6997ea3b.a048f015.css
│       │   ├── chunk-8fac7d52.3a62ebdf.css
│       │   ├── chunk-c0d1a904.6064858a.css
│       │   ├── chunk-e56ac1ce.2e5a6760.css
│       │   ├── chunk-elementUI.68c70ad5.css
│       │   └── chunk-libs.417a0e7c.css
│       ├── favicon.ico
│       ├── fonts
│       │   ├── element-icons.535877f5.woff
│       │   ├── element-icons.732389de.ttf
│       │   ├── fontawesome-webfont.674f50d2.eot
│       │   ├── fontawesome-webfont.af7ae505.woff2
│       │   ├── fontawesome-webfont.b06871f2.ttf
│       │   └── fontawesome-webfont.fee66e71.woff
│       ├── img
│       │   ├── 404.a57b6f31.png
│       │   ├── 404_cloud.0f4bc32b.png
│       │   └── fontawesome-webfont.912ec66d.svg
│       ├── index.html
│       └── js
│           ├── app.3b77e89a.js
│           ├── chunk-1b13f9ed.ee236f20.js
│           ├── chunk-25474645.bd6d7d8b.js
│           ├── chunk-40b58352.5045cf5b.js
│           ├── chunk-41a04990.dd747a82.js
│           ├── chunk-5cccc9a2.6921f155.js
│           ├── chunk-5e6a2399.7969dcce.js
│           ├── chunk-6997ea3b.69b93eff.js
│           ├── chunk-8fac7d52.8151b315.js
│           ├── chunk-c0d1a904.a072f1f4.js
│           ├── chunk-e56ac1ce.f5d86af5.js
│           ├── chunk-elementUI.41d70156.js
│           └── chunk-libs.6248ee4e.js
├── windows_install_package.bat
└── windows_run_wcplusPro.bat
前端源码结构
-> wcplusPro源码版前端工程
├── LICENSE
├── README.md
├── babel.config.js
├── build
│   └── index.js
├── jest.config.js
├── jsconfig.json
├── mock
│   ├── index.js
│   ├── mock-server.js
│   ├── table.js
│   ├── user.js
│   └── utils.js
├── package.json
├── postcss.config.js
├── public
│   ├── favicon.ico
│   └── index.html
├── src
│   ├── App.vue
│   ├── api
│   │   ├── article.js
│   │   ├── bark.js
│   │   ├── category.js
│   │   ├── crawler.js
│   │   ├── gzh.js
│   │   ├── help.js
│   │   ├── report.js
│   │   ├── reqData.js
│   │   ├── settings.js
│   │   ├── table.js
│   │   ├── task.js
│   │   ├── testApi.js
│   │   └── user.js
│   ├── assets
│   │   └── 404_images
│   │       ├── 404.png
│   │       ├── 404_cloud.png
│   │       └── img
│   │           ├── like.png
│   │           ├── luntan.png
│   │           └── zsxq.png
│   ├── components
│   │   ├── Breadcrumb
│   │   │   └── index.vue
│   │   ├── Hamburger
│   │   │   └── index.vue
│   │   ├── SvgIcon
│   │   │   └── index.vue
│   │   └── widget
│   │       ├── changeMode.vue
│   │       └── percentBar.vue
│   ├── data
│   │   ├── friend.js
│   │   ├── friend_map.js
│   │   └── group.js
│   ├── icons
│   │   ├── index.js
│   │   ├── svg
│   │   │   ├── dashboard.svg
│   │   │   ├── example.svg
│   │   │   ├── eye-open.svg
│   │   │   ├── eye.svg
│   │   │   ├── form.svg
│   │   │   ├── link.svg
│   │   │   ├── nested.svg
│   │   │   ├── password.svg
│   │   │   ├── table.svg
│   │   │   ├── tree.svg
│   │   │   └── user.svg
│   │   └── svgo.yml
│   ├── jslib
│   │   └── echarts.js
│   ├── layout
│   │   ├── components
│   │   │   ├── AppMain.vue
│   │   │   ├── Navbar.vue
│   │   │   ├── Sidebar
│   │   │   │   ├── FixiOSBug.js
│   │   │   │   ├── Item.vue
│   │   │   │   ├── Link.vue
│   │   │   │   ├── Logo.vue
│   │   │   │   ├── SidebarItem.vue
│   │   │   │   └── index.vue
│   │   │   └── index.js
│   │   ├── index.vue
│   │   └── mixin
│   │       └── ResizeHandler.js
│   ├── main.js
│   ├── permission.js
│   ├── router
│   │   └── index.js
│   ├── settings.js
│   ├── sio
│   │   ├── index.js
│   │   └── reqData.js
│   ├── store
│   │   ├── getters.js
│   │   ├── index.js
│   │   └── modules
│   │       ├── app.js
│   │       ├── settings.js
│   │       └── user.js
│   ├── styles
│   │   ├── element-ui.scss
│   │   ├── index.scss
│   │   ├── mixin.scss
│   │   ├── report.css
│   │   ├── sidebar.scss
│   │   ├── transition.scss
│   │   └── variables.scss
│   ├── utils
│   │   ├── auth.js
│   │   ├── data-process.js
│   │   ├── get-page-title.js
│   │   ├── index.js
│   │   ├── request.js
│   │   ├── time.js
│   │   └── validate.js
│   ├── views
│   │   ├── 404.vue
│   │   ├── analysis
│   │   │   └── all_reading_data.vue
│   │   ├── category
│   │   │   └── index.vue
│   │   ├── command
│   │   │   └── index.vue
│   │   ├── dashboard
│   │   │   ├── index.vue
│   │   │   └── updateLog.vue
│   │   ├── form
│   │   │   └── index.vue
│   │   ├── gzh
│   │   │   ├── crawler.vue
│   │   │   ├── crawler_pro
│   │   │   │   ├── args.vue
│   │   │   │   ├── control.vue
│   │   │   │   ├── index.vue
│   │   │   │   ├── new_task.vue
│   │   │   │   ├── status.vue
│   │   │   │   └── tasks.vue
│   │   │   └── finished.vue
│   │   ├── login
│   │   │   └── index.vue
│   │   ├── nested
│   │   │   ├── menu1
│   │   │   │   ├── index.vue
│   │   │   │   ├── menu1-1
│   │   │   │   │   └── index.vue
│   │   │   │   ├── menu1-2
│   │   │   │   │   ├── index.vue
│   │   │   │   │   ├── menu1-2-1
│   │   │   │   │   │   └── index.vue
│   │   │   │   │   └── menu1-2-2
│   │   │   │   │       └── index.vue
│   │   │   │   └── menu1-3
│   │   │   │       └── index.vue
│   │   │   └── menu2
│   │   │       └── index.vue
│   │   ├── report
│   │   │   ├── components
│   │   │   │   ├── fulltextSearch.vue
│   │   │   │   ├── messageBanner.vue
│   │   │   │   ├── rankTable.vue
│   │   │   │   └── trendLine.vue
│   │   │   └── index.vue
│   │   ├── settings
│   │   │   ├── category.vue
│   │   │   ├── crawler.vue
│   │   │   ├── daimusic.vue
│   │   │   ├── general.vue
│   │   │   └── upgradeNote.vue
│   │   ├── table
│   │   │   └── index.vue
│   │   ├── test
│   │   │   └── index.vue
│   │   ├── tree
│   │   │   └── index.vue
│   │   └── widget
│   │       └── category.vue
│   └── views7
│       ├── crawler
│       │   ├── cmp
│       │   │   ├── currentTask.vue
│       │   │   ├── historyTask.vue
│       │   │   ├── newTask.vue
│       │   │   ├── proxyControl.vue
│       │   │   ├── reqData.vue
│       │   │   ├── taskNotifation.vue
│       │   │   ├── taskStatus.vue
│       │   │   └── userControl.vue
│       │   └── index.vue
│       ├── gzhData
│       │   ├── cmp
│       │   │   ├── allArticles.vue
│       │   │   ├── allReadingData.vue
│       │   │   └── finishedGzh.vue
│       │   └── index.vue
│       ├── help
│       │   ├── cmp
│       │   │   ├── bark.vue
│       │   │   ├── doc.vue
│       │   │   ├── license.vue
│       │   │   └── upgradeNote.vue
│       │   └── index.vue
│       ├── report
│       │   ├── cmp
│       │   │   ├── numberCard
│       │   │   │   ├── cmp
│       │   │   │   │   ├── influenceInfo.vue
│       │   │   │   │   ├── locationInfo.vue
│       │   │   │   │   ├── quantityInfo.vue
│       │   │   │   │   └── timeInfo.vue
│       │   │   │   └── index.vue
│       │   │   ├── postCalender.vue
│       │   │   ├── readingData.vue
│       │   │   └── search
│       │   │       ├── cmp
│       │   │       │   ├── pageControl.vue
│       │   │       │   ├── searchArticleItem.vue
│       │   │       │   ├── searchBar.vue
│       │   │       │   └── statInfo.vue
│       │   │       └── index.vue
│       │   └── index.vue
│       ├── search
│       │   ├── cmp
│       │   │   ├── grafic.vue
│       │   │   ├── searchResult.vue
│       │   │   └── statistics.vue
│       │   └── index.vue
│       ├── theme
│       │   └── index.vue
│       └── widgets
│           ├── reqDataBox.vue
│           ├── tableNumberCell.vue
│           ├── tablePercentCell.vue
│           └── tableTagCell.vue
├── tests
│   └── unit
│       ├── components
│       │   ├── Breadcrumb.spec.js
│       │   ├── Hamburger.spec.js
│       │   └── SvgIcon.spec.js
│       └── utils
│           ├── formatTime.spec.js
│           ├── param2Obj.spec.js
│           ├── parseTime.spec.js
│           └── validate.spec.js
└── vue.config.js