CJ.Blog


使用Hugo/Gogs/Typora/Python打造友好的写作环境

Hugo创建站点 #

这方面内容参考Hugo官方中文文档,这里就不做多赘述。

使用Gogs钩子自动生成博客静态内容 #

当我在使用hugo时首先就想到了一个问题,我每次修改博客内容还需要手动git commit,然后去服务器git pull,再用hugo生成静态内容?

这也太麻烦了,可以说是不可接受的,那么Gogs有web钩子功能,那么在Gogs接收到提交时自动去服务器拉代码生成静态内容呢?

不用犹豫,用FastApi来做非常合适,这是Python代码 #

@app.post("/PullBlogContent")
async def PullBlogContent():
    process = subprocess.run("git pull", shell=True, cwd="/opt/hugo-blog", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    subprocess.run("../hugo clean", shell=True, cwd="/opt/hugo-blog", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    subprocess.run("../hugo", shell=True, cwd="/opt/hugo-blog", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    output = process.stdout
    errors = process.stderr
    return f'[ {output} ]: {errors}'

Gogs配置Web钩子 #

image-20240710111344432

这个方法能够帮我完成自动更新博客内容,那么我在我电脑上修改了博客内容我也不想提交,最好是能有个很简单的操作来完成内容提交。

Typora使用导出命令行实现Git自动提交 #

首先进去偏好设置->导出,添加导出命令:

cd C:\Users\chaoj\OneDrive\文\博\hugo-blog && git add . && git commit -m "%date:~0,4%-%date:~5,2%-%date:~8,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%" && git push -u origin master

绝对地址就可以,自动提交代码到服务器,选择导出路径选择不选择导出路径,导出后查看结果,就可以了,记得要在服务器配置记住git密码。

还有个麻烦事,上传图片 #

看到网上很多都在用Pic啥的,我用不好,而且也怀疑那些图床的访问速度和数据安全问题,于是还是老一套,自己写上传文件的Api,使用的还是那个Python文件。

Python全部代码 #

import os.path
import subprocess

import uvicorn
from fastapi import FastAPI, UploadFile
from fastapi.params import File
from starlette.responses import PlainTextResponse

app = FastAPI()

DOMAIN = "https://cybersicko.net/images/"


# 运行Linux命令
def run_linux_command(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    exit_code = process.wait()

    # 打印输出和退出码
    print(f'命令输出: {stdout.decode()}')
    print(f'退出码: {exit_code}')
    return f'[ {exit_code} ]: {stdout.decode()}'


@app.post("/PullBlogContent")
async def PullBlogContent():
    process = subprocess.run("git pull", shell=True, cwd="/opt/hugo-blog", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    subprocess.run("../hugo clean", shell=True, cwd="/opt/hugo-blog", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    subprocess.run("../hugo", shell=True, cwd="/opt/hugo-blog", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    output = process.stdout
    errors = process.stderr
    return f'[ {output} ]: {errors}'


@app.post("/UploadFile")
async def create_upload_file(file: UploadFile = File):
    contents = await file.read()
    filename = file.filename

    # 这里可以添加你的处理逻辑,例如保存文件到磁盘等
    # 保存文件到磁盘的例子:
    upload_path = "/media/uploads/"
    if not os.path.exists(upload_path):
        os.makedirs(upload_path)
    with open(f"/media/uploads/{filename}", "wb") as buffer:
        buffer.write(contents)
    return PlainTextResponse(DOMAIN + filename)


if __name__ == '__main__':
    config = uvicorn.Config(app, host='0.0.0.0', port=xxx)
    server = uvicorn.Server(config)
    server.run()

非常的简单,就是将文件写入到/media/uploads/目录,返回域名+图片地址,然后用Nginx做静态映射,就完成啦。

Typora配置图片上传 #

image-20240710110258984

先将插入的图片复制到指定博客静态目录做备份,然后再上传服务设定中配置上传,使用自定义命令,命令内容是执行一个bat批处理。

命令内容:

C:\Users\chaoj\OneDrive\文\博\hugo-blog\uploader.bat

批处理内容:

@echo off
@chcp 65001 >nul & cmd /d/s/c
set JAVA_INTERFACE_URL=xxx/UploadFile
set image=%1
curl -X POST -F "file=@%image%" %JAVA_INTERFACE_URL%

然后测试一下:

image-20240710110545984

搞定,接下来在Typora中就可以插入图片直接上传到服务器了。

流程 #

Typora打开Content文件夹,开始修改内容,然后用导出命令提交,提交后自动更新。