本教程已过期。部署请查看官方仓库文档链接:https://fcircle-doc.js.cool/

在经过了两个大版本更新后,友链朋友圈迈入了3.0时代。而原先的说明书一直停留在1.15,适用范围也仅仅到1.19。 于是,新的说明书来了!(注,后端版本 < 3.0 beta2 的用户请更换后端,1.0、2.0用户更新均需重新部署api和前端,leancloud部分已做兼容无须变动)

更新记录(现版本4.0)

3.0

release 3.0 版本:
① 支持butterfly、volantis、matery、sakura、fluid主题的友链获取
② 支持小康友链及 volantis 主题友链,即部署于 gitee 上的 issuse 友链获取
③ 支持 butterfly、volantis、matery、sakura、fluid主题的最新文章获取
④ 去除sitemap,新增目前最通用的atom和rss规则
⑤ 拥有友链屏蔽、关键词屏蔽、等自定义 yaml 的配置项
⑥ 代码重构并规范化,便于二次开发
⑦ 可以支持更新时间和创建时间排序
⑧ 未适配的hexo主题和非hexo用户也可使用(使用方法见说明书)

bug修复
① 重复爬取同一文章问题
② 非bf主题爬取报错
③ sitemap重新置后(不通用)
④ hexo-theme-sakura主题两种时间格式引发错误
⑤ 屏蔽链接修复


3.1

可以爬取typecho类型的博客


4.0

代码基于scrapy重构,提速大约4倍
优化文章去重规则
可以爬取wordpress类型博客
新增nexmoe、Yun、stun主题爬取策略
额外友链页获取,在配置项选择开启
过期文章时间可配置
新增失败重爬配置项

更新方法

保留配置项(setting.py文件,其余直接从主仓库拉取即可(配置文件一样可能会修改,对比更新配置文件))

无须更改您的数据库及其api。

P.s. 本说明书较为详细冗长,如果有相关平台使用经验的朋友也跳着阅读。

如果有服务器的用户可以考虑自行构建api到服务器上,详见二次开发说明。

效果展示:https://noionion.top/friendcircle/


目录导览

后端部署及基本配置

涉及平台较多,但实际操作难度低。部署需要有一定耐心(但我们这里不提供解决github和vercel(可能)被墙的问题方法,如果被墙可以参考:vercel / github

  • leancloud数据库搭建
  • github爬虫仓库部署及配置项说明
  • vercel无服务器API部署
前端部署
  • hexo插件安装版
  • CDN引入版
二次开发说明
  • 主题爬虫和另外两种规则的函数命名标准及传参标准
  • 加入新爬取数据并推送到数据库的修改说明
  • api数据说明
  • 相关平台文档链接

后端部署及基本配置

友链朋友圈的后端运行由3部分组成,涉及2个仓库、3个平台,难免感觉有些繁琐。

后端运行步骤为:

gh action爬虫抓取友链文章并作基本处理,推送至leancloud → vercel获取leancloud数据后进行二次处理后生成api

而前端只需要再对api返回的json数据做一次排序即可

leancloud数据库搭建

前往leancloud 国际版官网(推荐国际版)注册账号并登录。

前往控制台新建应用,应用名称无限制

创建应用

进入应用中,点击 设置 -> 应用凭证,记录AppIDAppKet即可。(之后两步部署均会使用到)

找到AppID和AppKey

github爬虫仓库部署及配置项说明

这步会稍微长一些,但希望认真看完。

仓库部署

fork友链朋友圈的项目仓库https://github.com/Rock-Candy-Tea/hexo-circle-of-friends

fork仓库

点击fork后的仓库的 Settings -> Secrets -> New repository secret

配置变量 1

Name 分别以 APPID、APPKEY、LINK 创建环境变量。
Value 分别 填入刚刚保存 Leancloud 的应用 ID(AppID)和应用密钥(AppKey)以及你的友链链接(例如https://noionion.top/link/)

配置变量 2

配置变量 3

② 启用友链朋友圈的github action

点击fork后的仓库的 Actions -> I understand my workflows, go ahead and enable them

启用action 1

之后点击 update-friends-posts 并启用workflow

启用action 2

之后点击仓库star来完成第一次程序运行,不出意外的话结果如下图

启用action 3

这时你应该能在leancloud上看到上传的数据啦(除非你不是已经适配的主题,在配置项中会有相应解决办法)

数据上传成功

此后在每天的8,12,17,22点各会有两次自动更新爬取。

配置项说明

编辑仓库中的/hexo_circle_of_friends/setting.py文件,需要用户自行编辑的仅如下几项。

对于非已适配主题的hexo用户(无github和gitee友链)非hexo用户,请将友链自行按格式添加到CONFIG_FRIENDS_LINKS['list']中并启用它。(这是目前通用化的一种方式,如果是hexo用户希望适配自己的主题,请提交issue)

"""
功能 设置
"""
# leancloud post data outdate_clean
# 过期文章清除(天)
OUTDATE_CLEAN = 60


# get links from settings
SETTINGS_FRIENDS_LINKS={
"enable": False, # 是否启用配置项友链 True/False(此项用于针对还未适配的主题用户)
"list":[
# 格式:["name", "link", "avatar"],除最后一行外每行后面加",","[]"不可省略
# link的结尾最好加上'/'
# 例如:
["贰猹の小窝", "https://noionion.top/", "https://pub-noionion.oss-cn-hangzhou.aliyuncs.com/head.jpg"],
["akilar", "https://akilar.top/link/", "https://akilar.top/images/headimage.png"]
]
}


# get links from gitee
# get links from gitee
GITEE_FRIENDS_LINKS={
"enable": False, # True 开启gitee issue兼容
"type": "normal", # volantis用户请在这里填写 volantis
"owner": "ccknbc", # 填写你的gitee用户名
"repo": "blogroll", # 填写你的gitee仓库名
"state": "open" # 填写抓取的issue状态(open/closed)
}


# get links from github
GITHUB_FRIENDS_LINKS = {
"enable": False, # True 开启github issue兼容
"type": "normal", # volantis用户请在这里填写 volantis
"owner": "ccknbc-actions", # 填写你的github用户名
"repo": "blogroll", # 填写你的github仓库名
"state": "open" # 填写抓取的issue状态(open/closed)
}

# retry allowed
# 爬取url失败是否重试
RETRY_ENABLED=False

# block site list
# 添加屏蔽站点
BLOCK_SITE=[
# "https://example.com/",
# "https://example.com/",
]

# 除了在github配置的友链页面,支持添加更多友链页面,同时爬取
# 但是数据保存在一起
EXTRA_FRIENPAGE_LINK = [
# "https://noionion.top/",
# "https://kaleb.top/link/",
]
vercel无服务器API部署

前往vercel官网,直接用github创建账号并用手机号绑定(其实前端直接调用leancloud的数据也可以获取信息,但会暴露你的AppID和AppKey,所以套一层vercel作为api较为安全)

点击New Project新建项目

创建api 1

点击Import Third-Party Git Repository,输入https://github.com/Rock-Candy-Tea/hexo-friendcircle-api

创建api 2

创建api 3

然后点击github,输入仓库名(无限制),生成api仓库。(此步骤会在github生成一个api仓库(不用理它,但也不要删除))

创建api 4

创建api 5

下一步骤Create a Team跳过(Skip)即可,等它构建完后点击Go to Dashboard即可

创建api 6

点击项目 Settings -> Environment Variables,在如图框中输入密钥,Name 分别以 LEANCLOUD_ID、LEANCLOUD_KEY 创建环境变量。
Value 分别填入刚刚保存 Leancloud 的应用 ID(AppID)和应用密钥(AppKey)。

配置变量 1

配置变量 2

回到项目首页,点击View Build Logs后在Visit左侧的选择框中点击Redeploy即可

构建api 1

构建api 2

构建api 3

回到上一页,点击visit后在网址后面加上/api访问api,如https://hexo-friendcircle3-api.vercel.app/api,出现数据即为部署成功

而前端要用到的,就只有api地址了


前端部署

这里为了方便用户安装,我们做了相关的hexo前端插件简化部署过程。

同时为了服务非hexo用户也能使用友链朋友圈,我们也给了CDN引入的方案。

hexo插件安装版
CDN引入版

引入内容到你想添加的地方(md文件/html文件)(注意替换api地址等变量):

<!-- fontawesome图标的依赖,主题自带的不用加这行 -->
<link rel="stylesheet" href="https://cdn1.tianli0.top/npm/@fortawesome/fontawesome-free/css/all.min.css">

<!-- 友链朋友圈样式 -->
<link rel="stylesheet" href="https://cdn1.tianli0.top/gh/Rock-Candy-Tea/hexo-friendcircle-demo@main/css/akilar-SAO.css">

<!-- 挂载友链朋友圈的容器 -->
<div id="fcircleContainer"></div>

<!-- 全局引入友链朋友圈配置项 -->
<script>
// 全局变量声明区域
var fdata = {
apiurl: 'https://hexo-friendcircle-api.vercel.app/api',
initnumber: 20, //【可选】页面初始化展示文章数量
stepnumber: 10,//【可选】每次加载增加的篇数
error_img: '/image/404.gif' //【可选】头像加载失败时默认显示的头像
}
//存入本地存储
localStorage.setItem("fdatalist",JSON.stringify(fdata))
</script>

<!-- 全局引入抓取方法 -->
<script defer src="https://cdn1.tianli0.top/gh/Rock-Candy-Tea/hexo-friendcircle-demo@main/js/fetch.js"></script>
<!-- 局部引入页面元素生成方法 -->
<script async src="https://cdn1.tianli0.top/gh/Rock-Candy-Tea/hexo-friendcircle-demo@main/js/fcircle.js" charset="utf-8"></script> <!-- js -->

更多的css可以查看https://github.com/Rock-Candy-Tea/hexo-friendcircle-demo


二次开发说明

对于一些想自己手动DIY的用户,我们也尽可能详尽的做一些源码说明,方便大家快速开发

目前来讲有下面几类DIY:(有好的DIY也可以请求PR,我们会根据需求选择是否采纳合并)

  • 想收到好友的博客最新文章更新但没有相应规则(希望增加主题策略)
  • 想在友链朋友圈看到文章描述(新增爬取信息,这个得从后端爬虫、api改到前端)
  • 想有服务器部署的(api或者数据库丢到自己的服务器上)

等等,我们大致给出以下几个说明讲解:

主题爬虫和另外两种规则的函数命名标准及传参标准(此条过期,加紧重写中——咕咕咕咕咕)
主题规则标准

请在theme文件夹处增添以主题名命名的.py文件,文件中至少包含以下两个函数:

友链爬取函数 get_friendlink(friendpage_link, friend_poor)

传入友链页面地址friendpage和友链列表friend_poor两个参数,无需返回值。

对于爬取到的友链地址user_info中应带有如下几个值(有序):namelinkimg/avatar。格式如:user_info = [name, link, img]

然后将其放入列表frieng_poor中:friend_poor.append(user_info)


最新文章爬取函数 get_last_post(user_info,post_poor)

传入友链信息列表uesr_info(格式如上)和文章列表post_poor两个参数,需返回值error,标记是否错误

对于爬取到的文章信息post_info中应带有如下键值对:
?

post_info = {
'title': ,
'time': ,
'updated': , # 这项建议直接使用time
'link': ,
'name': ,
'img': ,
'rule': {themename}
}

然后将其放入列表post_poor中:post_poor.append(post_info)
具体可以参考已有的主题规则函数


注意函数名,变量名保持一致,否则主函数将无法正确运行

主函数部分只需导入对应的文件和增添对象即可,修改部分如下所示:

(示例即为当前版本适配)

# component
from theme import butterfly,matery,volantis,sakura,fluid

# theme fit massage
themes = [
butterfly,
matery,
volantis,
sakura,
fluid
]
其他规则标准

可参考/handlers/coreLink.py文件下的atom_get、rss2_get函数进行,传参与主题爬虫的get_last_post参数相同。命名相对无限制,只需在主函数run.py添加相应的引入如

from handlers.coreLink import atom_get
from handlers.coreLink import rss2_get

getpost函数处合适位置仿照其他规则加入代码即可。

加入新爬取数据并推送到数据库的修改说明(此条过期,加紧重写中——咕咕咕咕咕)

若有需要加入新的爬取信息键值对,则需相应修改所有已有规则(包括主题规则和其它规则)的返回值,即:

post_info = {
'title': ,
'time': ,
'updated': , # 这项建议直接使用time
'link': ,
'name': ,
'img': ,
'rule': {themename}
}

并相应修改/handlers/coreDatas.pyleancloud_push函数,在:

friendpoor.set('title', item['title'])
friendpoor.set('time', item['time'])
friendpoor.set('updated', item['updated'])
friendpoor.set('link', item['link'])
friendpoor.set('author', item['name'])
friendpoor.set('headimg', item['img'])
friendpoor.set('rule', item['rule'])
friendpoor.save()

处新增相应关联即可。

api数据说明

API预览: https://hexo-friendcircle3-api.vercel.app/api

截取部分json,对json数据的说明如下

{
"statistical_data": { //统计信息
"friends_num": "当前友链数",
"active_num": "活跃友链数(即数据库中的文章的作者数)",
"error_num": "爬取错误数(即数据库中的友链error数)",
"article_num": "库存文章总数",
"last_updated_time": "最近更新时间(即数据库中文章最大的createAt值(时间)"
//今日更新由前端计算获得
},
"article_data": [ //文章数据
{
"title": "文章标题",
"created": "发布时间",
"updated": "更新时间",
"link": "文章链接地址",
"author": "友链名",
"avatar": "友链头像"
}
]
}
相关平台文档链接

想看开发吐槽的话可以访问个人哔哔:友链朋友圈开发二三事友链朋友圈 3.0 前端开发方案记录

如有更多需要进行补充的或者说明书哪里没看懂的或者部署出问题的可以于下方评论区留言。