基于GitHub-action的友链朋友圈api本地化方案


水一发友链朋友圈api本地化的水文吧,虽然之前提到了但是不是很清晰呢,所以我决定重新写一篇水一下。

关于友链朋友圈

你是否经常烦恼于友链过多但没有时间浏览?那么友链朋友圈将解决这一痛点。你可以随时获取友链网站的更新内容,并了解友链的活跃情况。——引自冰老师博客

具体来说其功能就是一个订阅作用可以快速知道你的友链的博友是否更新水文(dog),十分的有用只要你的友链网站具有rss或者atom就可以啦。

本站友链朋友圈预览:点击

后端部署见:友链朋友圈食用说明书

immmmm版本的前端使用见:Hi,My Friends

另外友链朋友圈公共api库也正在收集网站感兴趣的可以去找贰猹提交信息收录

正文

本文并不介绍如何部署友链朋友圈,可以参见上文地址部署使用,使用本方案可能需要的前提是博客采用GitHub-action进行集成化部署(而非使用hexo d进行推送的)如何实现action部署可以参见店长的文章,当然你可以试试看我的文章 。当然即使你没有我也可以方法可以帮到你。

先说为什么要将api本地化吧,现有的友链朋友圈api是部署在vercel上的十分的方便速度也还可以,本地化有什么好处呢?主要是如下两点:

1.请求速度更快,加载速度更快。
2.稳定性更好vercel有时会抽风打不开的,需要科学上网,其次自jsd凉了以后越发觉得不能过于依赖这种免费平台

本文仅介绍思路方法不一具体某一主题为例,因为每个主题的渲染方式都不同,不如介绍思路所有人都可以用。

首先是如何保存api,友链朋友圈前端向vercel api请求的其实就是一个json文件我们只需要把这个json文件保存下来,到时候直接在本地请求即可,那么如何保存呢,只需要部署api的py脚本稍微改动一下即可以下是改动的index.py

# -*- codeing = utf-8 -*-
# @Author : noionion
# @Software : PyCharm

import leancloud
from http.server import BaseHTTPRequestHandler
import json
import datetime
import os

from leancloud import user

def getdata():
    list = ['title','created','updated','link','author','avatar']
    # Verify key
    leancloud.init('o5HENmVOPT63YNzu6Izgj2AT-MdYXbMMI', 'S29FOU6cgybmLLBDHqLzzuVt')

    # Declare class
    Friendspoor = leancloud.Object.extend('friend_poor')

    # Create an alias for the query
    query = Friendspoor.query

    # Select the sort methods
    query.descending('time')

    # Limit the number of queries
    query.limit(1000)

    # Choose class
    query.select('title','time','updated','link','author','headimg','createdAt')

    # Execute the query, returning result
    query_list = query.find()

    Friendlist = leancloud.Object.extend('friend_list')
    query_userinfo = Friendlist.query
    query_userinfo.limit(1000)
    query_userinfo.select('frindname','friendlink','firendimg','error')
    query_list_user = query_userinfo.find()


    # Result to arr
    api_json = {}
    friends_num = len(query_list_user)
    active_num = len(set([item.get('author') for item in query_list]))
    error_num = len([friend for friend in query_list_user if friend.get('error') == 'true'])
    article_num = len(query_list)
    last_updated_time = max([item.get('createdAt').strftime('%Y-%m-%d %H:%M:%S') for item in query_list])

    api_json['statistical_data'] = {
        'friends_num': friends_num,
        'active_num': active_num,
        'error_num': error_num,
        'article_num': article_num,
        'last_updated_time': last_updated_time
    }

    article_data = []
    for item in query_list:
        itemlist = {}
        for elem in list:
            if elem == 'created':
                itemlist[elem] = item.get('time')
            elif elem == 'avatar':
                itemlist[elem] = item.get('headimg')
            else:
                itemlist[elem] = item.get(elem)
        article_data.append(itemlist)
    api_json['article_data'] = article_data

    return api_json

class handler(BaseHTTPRequestHandler):
    def do_GET(self):
        data = getdata()
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        self.wfile.write(json.dumps(data, ensure_ascii=False).encode())
        return
with open("api.json","w",encoding='utf-8') as f:
    json.dump(getdata(), f)

这个脚本实际上就是将leancloud里的数据转化为json。只是加上这一小段内容相较于原脚本其实保存到本地文件中。

with open("api.json","w",encoding='utf-8') as f:
    json.dump(getdata(), f)

其次要解决的一大问题是跨域,至于跨域具体是什么可以参见此文

Q: 如何解决跨域问题呢?

A:我们只需要保证请求json文件和发出请求的js文件位于同一目录下即可。

由于各个主题的渲染方式不同这里只说你最终生成网页之后的目录

fcircle
    └──index.html
    └── fcircle-lmm.js //请求json的js
    └── fcircle-lmm.css
    └── api
        └──index.py //获取保存json数据脚本
        └──api.json//请求的json
        └──requirements.txt

你可以根据不同的主题的渲染方式只有完成最终生成出来是这种结构即可。

你可能会遇到的问题:

Q:api.json或者fcircle-lmm.js被渲染导致报错,只需要在站点_config.yml文件中添加配置跳过渲染即可如下:

skip_render:
  - 'fcircle/fcircle-lmm.js'
  - 'fcircle/api/**'

我想你不会忘了将js中的apiurl: ‘https://friendcircle-api-fx7ykk2ye-lmm214.vercel.app/api'改为apiurl: ‘/fcircle/api/api.json’

接下来如何实现自动更新这个api.json这里就需要用到action了

如果你已经配置action的话就可以使用如下yml配置工作流,注意根据你的自身情况进行修改。

# 当有改动推送到master分支时,启动Action
name: 获取友链api

on:
  push:
    branches:
      - main #2020年10月后github新建仓库默认分支改为main,注意更改
  release:
    types:
      - published
  schedule:
    - cron: '    0 * * * *'
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: 检查分支
        uses: actions/checkout@v2
        with:
          ref: main #2020年10月后github新建仓库默认分支改为main,注意更改
      - name: Set up Python #安装python
        uses: actions/setup-python@v1
        with:
          python-version: 3.8
      - name: 获取数据
        run: |
          cd /home/runner/work/hexo/hexo/source/fcircle #切换目录
          pip3 install -r requirements.txt #安装依赖
          cd /home/runner/work/hexo/hexo/source/fcircle/api
          python index.py #执行脚本
          cd /home/runner/work/hexo/hexo
          git config --global user.name "brqs" #改为你的githuib用户名
          git config --global user.email "3447851674@qq.com" #改为你自己的github绑定邮箱
          git add .
          git commit -m "github action update"
          git push origin main
          git pull --rebase origin main
          git push origin main

每天十二点会自动执行一次获取api的更新,这个更新可以不必过频繁,一是为了节约私库action的使用配额二是大家也不会一天很多篇文章吧。

可能遇到的问题本地git上传时会报错,这是远程代码仓库和本地内容不一致导致的只需要执行git pull --rebase origin main即可。

如果没有配置action或者不想使用action是不是就不行了呢,其实没有影响只要你自己本地有python运行环境安装好依赖即可,可以通过各种方法定时或手动执行脚本即可这里可以给出一个没有配置action的sh脚本提供参考

cd /你存放index.py的目录 
python index.py
cd /你站点的根目录
hexo cl
hexo g 
hexo d

至于如何让这个sh脚本定时自动执行应该有很多办法,可以使用windows自带的计划任务程序试试不再详细展开。

当然如果你愿意当然也可以手动更新发布,但还是推荐使用action,对本文不严谨之处敬请多多包涵。

参考资料


文章作者: 不染轻裳
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 不染轻裳 !
评论
 上一篇

阅读全文

辛丑小纪·21-22
辛丑小纪·21-22 辛丑小纪·21-22
我才不会承认是因为我一直犯鸽子病才把2021年年终总结拖成辛丑年总结。 关于年终总结其实每年都会写,2020年年终总结写完之后由于种种原因只能躺在草稿箱吃灰。但这一篇辛丑年总结必然会是公开的。 真的感觉时间的流速越来越快了,似乎一眨眼一
2022-01-31
下一篇 

阅读全文

辛丑小寒·元初归家
辛丑小寒·元初归家 辛丑小寒·元初归家
辛丑小寒·元初归家 如前文所言,我的大英估计是悬了,游离在挂科边缘。。。当然到目前为止还没有查到任何一门课的成绩,但你自己心里能没点数吗? 关于期末考试首先说说期末考试吧,由于学校为了避免因疫情导致学生留校无法回家所以决定提前一周开
2022-01-07
  目录