ArtiPub 一款开源的一文多发平台

背景

很多优秀的程序员和技术人员喜欢写技术文章和技术博客,通过这样的方式分享传播知识和经验,扩大自己的知名度和影响力,吸引粉丝关注,甚至有些技术博主还通过写文章来获取广告收入,还通过这种方法获得了出版书的机会以及工作机会。因此,写技术文章是一件非常值得投入的事情,帮助了自己,也让大众受益。但是,写技术文章通常也很耗时,特别是一些优质文章,不仅需要旁征博引、构思文章结构、照顾读者受众,还需要做很多前期工作,例如搭建环境、写 Demo 代码、测试代码等等。一篇优质技术文章通常需要 3-6 个小时来完成,可花了很多时间来写文章,最终发布出来的文章得不到很多人的关注是一件相当令人沮丧的事情。因此,优质文章值得获取关注和传播,让更多的技术工作者通过阅读文章获取知识获益。每个技术博主都有自己喜欢的技术媒体平台,例如简书、知乎、掘金、CSDN、微信公众号等等。很多技术博主也喜欢将文章发布在不同的平台上,寻求最大的关注度,同时也防止自己辛辛苦苦写的文章被别人复制粘贴盗版过去。然而,在多个平台上发文是一件麻烦的事情:博主需要同时登陆多个媒体平台,将自己的文章复制一个一个粘贴过去;更麻烦的是,有些平台只支持 Markdown,有些平台只支持富文本,博主需要在这两者之间来回转换,这增加了工作量。一文多发平台 ArtiPub 就解决了这样的问题,下面将介绍开源的一文多发平台 ArtiPub。

ArtiPub 简介

ArtiPub(Article Publisher 的简称,意为” 文章发布者”)是一款开源的一文多发平台,可以帮助文章作者将编写好的文章自动发布到简书、掘金、SegmentFault、CSDN、知乎、开源中国等技术媒体平台,传播优质知识,获取最大的曝光度。ArtiPub 安装简单,提供了多种安装方式(Docker、NPM、源码),可以一键安装使用,安装一般只要 5 分钟。ArtiPub 目前支持文章编辑、文章发布、数据统计的功能,后期会加入存量文章导入、数据分析的功能。此外,ArtiPub 日后还会接入更多媒体渠道,真正做到让文章随处可阅。用户使用 ArtiPub 也很简单,只需要在浏览器上打开 ArtiPub 的 Web 界面,将文章以 Markdown 的形式输入到编辑器,然后点击一键发布,等待不到 1 分钟,文章就自动同步到各大技术媒体平台了。此外,文章的阅读、点赞、评论数据还将周期性的被同步回来,让作者可以近实时看到文章的传播情况。

ArtiPub 与其他平台比较

市面上已经存在一文多发的商业平台了,为何还要创建 ArtiPub 呢?或许其他一文多发平台也是一个替代方案,但它们要求用户将自己的账户信息,例如 Cookie 或账号密码上传到对方服务器,这很不安全,一旦平台发生问题,自己的账户信息会遭到泄漏。虽然一般的平台不会恶意操作用户的账户,但如果出现误操作或者黑客攻击,用户的账户信息将遭到泄漏,平台上的财产也可能遭到损坏。ArtiPub 不要求用户上传账户信息,所有账户信息全部保存在用户自己的数据库里,因此规避了这个安全风险。另外,由于 ArtiPub 是基于 JS 开源的,JS 源码也比较易于理解,可扩展性很强,用户如果有其他平台的接入需求,完全可以通过更改源码来实现自己的需求,不用等待平台更新。官方的开发组也将持续开发 ArtiPub,将其打造得更实用和易用。

ArtiPub 原理简介

ArtiPub 的底层原理并不复杂,简单来说就是利用了爬虫技术将文章发布到各大平台。ArtiPub 的爬虫是用了 Google 开源的自动化测试工具 Puppeteer,这个工具不仅可以获取需要有 ajax 动态内容的数据,还可以来做一些模拟操作,作用类似于 Selenium,但更强大。如何进行登陆操作呢?其实 ArtiPub 是通过 Chrome 插件获取了用户登陆信息(Cookie),将 Cookie 注入到由 Puppeteer 操作的 Chromium 浏览器中,然后浏览器就可以正常登陆网站进行发文操作了。Cookie 是保存在用户自己搭建的 MongoDB 数据库里,不对外暴露,因此很安全。 ArtiPub 的架构示意图如下:

artipub-process

架构原理简介如下:

  • 后端(Backend)是整个架构的中枢,负责给前端交换数据、储存读取数据库、控制爬虫、收集 Cookie 等
  • Chrome 插件(Chrome Extension)只负责从网站(Sites)获取 Cookie
  • 爬虫(Spiders)被后端控制,负责在网站上发布文章和抓取数据
  • 数据库(MongoDB)负责储存数据(Cookie)
  • 前端(Frontend)是一个 React 应用,基于 Ant Design Pro 改造而来

ArtiPub 支持的平台

  • 掘金
  • SegmentFault
  • CSDN
  • 简书
  • 知乎
  • 开源中国
  • 今日头条
  • 博客园
  • 微博
  • 百度百家号
  • 51CTO
  • 开发者头条
  • 微信公众号

Docker 安装 ArtiPub

软件依赖软件版本
Docker18.03
Docker Compose1.24.1

通过 Docker,可以免去手动安装 MongoDB 的步骤,这是最推荐的安装方式。使用 Docker 安装 ArtiPub 前,请确保已安装好 Docker 以及 Docker Compose。在项目目录下创建 docker-compose.yml 文件,输入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: '3.3'

services:
app:
image: "tikazyq/artipub:latest"
container_name: "artipub-server"
environment:
MONGO_HOST: "mongo"
ARTIPUB_API_ADDRESS: "http://localhost:3000" # 后端服务的API地址,如果后端服务不是安装在本机,请修改为协议 + 服务器 IP 地址 + 端口号(默认端口为 3000)
ports:
- "8000:8000" # 前端服务
- "3000:3000" # 后端服务
depends_on:
- mongo
mongo:
image: mongo:latest
container_name: "artipub-mongo"
restart: always
ports:
- "27017:27017"

由于 ArtiPub 采用了前后端分离的架构,前端使用 Nginx 作为 Web 服务器,如果需要对 Nginx 进行配置(例如配置跨域),此时可以使用数据卷来挂载 Nginx 的配置文件到 ArtiPub 的容器内,ArtiPub 的 Nginx 配置文件路径为:/etc/nginx/conf.d/artipub.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3.3'

services:
app:
image: "tikazyq/artipub:latest"
container_name: "artipub-server"
environment:
MONGO_HOST: "mongo"
ARTIPUB_API_ADDRESS: "http://localhost:3000"
ports:
- "8000:8000"
- "3000:3000"
depends_on:
- mongo
mongo:
image: mongo:latest
container_name: "artipub-mongo"
restart: always
ports:
- "27017:27017"
volumes:
- '/usr/local/docker-volumes/artipub/artipub.conf:/etc/nginx/conf.d/artipub.conf'

创建并启动 ArtiPub 的容器,启动完成后在浏览器中访问 http://127.0.0.1:8000,可以看到 Web 管理界面:

1
2
3
4
5
# 后台启动
# docker-compose up -d

# 查看输出的日志信息
# docker logs artipub-server --tail 100 -f

MongoDB 数据库管理命令:

1
2
3
4
5
6
7
8
9
10
11
# 登录MongoDB
# docker exec -it artipub-mongo mongo

# 显示所有数据库
> show dbs

# 切换数据库
> use artipub

# 查看数据库的所有集合
> show collections

NPM 包安装 ArtiPub

软件依赖软件版本
NodeJS8.12+
MongoDB3.6+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 提示:通过 NPM 包安装 ArtiPub,需要提前手动安装好 MongoDB

# 安装
# npm install -g artipub

# 或者指定镜像源来安装,加快下载速度
# npm install -g artipub --registry=https://registry.npm.taobao.org

# 启动
# artipub start

# 默认会使用 "127.0.0.1:27017/artipub" 作为MongoDB的数据库链接,使用如下命令可以配置数据库信息等
# artipub -h

# 成功启动后,在浏览器中访问 `http://127.0.0.1:8000`,可以看到 Web 管理界面

源码安装 ArtiPub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 提示:通过源码安装 ArtiPub,需要提前手动安装好 MongoDB

# 克隆源码
# git clone https://github.com/crawlab-team/artipub

# 进入源码目录
# cd artipub

# 安装
# npm install

# 配置数据库
# vim ./config.js

# 配置后端服务的API地址
# vim ./src/config/config.ts # 将 apiEndpoint 改成对应的 IP 地址 + 端口。

# 启动前端服务
# npm run start:frontend

# 启动后端服务
# npm run start:backend

# 成功启动后,在浏览器中访问 `http://127.0.0.1:8000`,可以看到 Web 管理界面

ArtiPub 登录助手使用

ArtiPub 需要依赖登录助手(Chrome 浏览器插件)来获取用户在各个平台的账号信息,因此需要手动安装登录助手插件。ArtiPub 成功启动后,通过 http://127.0.0.1:8000 访问 Web 管理界面,点击页面上的 “登录助手” 菜单项,然后按照以下步骤安装插件:

  • 点击” 下载登陆助手”,保存文件名为 artipub-helper.zip
  • 在 Chrome 浏览器中输入 chrome://extensions,并开启开发者模式(点击右上角)
  • 将下载的登陆助手文件 artipub-helper.zip 拖入浏览器中,浏览器将自动安装插件(如果不能拖拽,请刷新页面后重试)
  • 在使用登陆助手之前,请确保各个平台的账号已经处于登陆状态
  • 浏览器右上角点击安装好的插件图标,点击” 一键获取登陆信息”,插件将获取所有平台的 Cookie
  • 注意:如果 ArtiPub 的后端服务没有部署在本机,请点击浏览器右上角的登录助手里的” 扳手” 按钮,输入后端服务的 IP 地址 + 端口号(默认 3000),然后再获取登陆信息
  • 到” 平台管理” 页面,点击” 更新 Cookie 状态”(需要大约 1 分钟),然后查看 “Cookie 状态”,确保其为” 已导入” 状态
  • 到” 文章管理” 页面,点击” 发布”,选择登陆方式为 “Cookie”,然后发布文章

平台管理界面

artipub-platform

文章管理界面

artipub-article.png

文章发布界面

artipub-article-publish

文章编辑界面

artipub-article-edit.png