Administrator
发布于 2025-12-11 / 3 阅读
0
0

使用Python自动发布Halo博客文章

使用Python自动发布Halo博客文章

本文介绍如何使用Python脚本自动登录Halo博客并发布文章。

技术要点

  • CSRF Token:防止跨站请求伪造
  • RSA加密:密码使用RSA公钥加密
  • Session Cookie:维持登录状态

安装依赖

pip install requests pycryptodome

代码实现

1. 导入库

import requests
import re
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

BASE_URL = "http://127.0.0.1:8090"
USERNAME = "admin"
PASSWORD = "your_password"

2. 获取登录页面

session = requests.Session()
login_page = session.get(f"{BASE_URL}/login?authentication_required")

csrf_token = re.search(r'name="_csrf" value="([^"]+)"', login_page.text).group(1)
public_key = re.search(r'const publicKey = "([^"]+)"', login_page.text).group(1)

3. RSA加密密码

def encrypt_password(password, public_key_b64):
    pem = f"-----BEGIN PUBLIC KEY-----\n{public_key_b64}\n-----END PUBLIC KEY-----"
    rsa_key = RSA.import_key(pem)
    cipher = PKCS1_v1_5.new(rsa_key)
    encrypted = cipher.encrypt(password.encode())
    return base64.b64encode(encrypted).decode()

4. 登录

login_data = {
    "_csrf": csrf_token,
    "username": USERNAME,
    "password": encrypt_password(PASSWORD, public_key)
}
session.post(f"{BASE_URL}/login", data=login_data)
xsrf_token = session.cookies.get('XSRF-TOKEN', '')

5. 创建并发布文章

post_data = {
    "post": {
        "spec": {"title": "标题", "slug": "slug", "visible": "PUBLIC"},
        "apiVersion": "content.halo.run/v1alpha1",
        "kind": "Post",
        "metadata": {"name": "unique-name"}
    },
    "content": {"raw": "# 内容", "rawType": "markdown"}
}

response = session.post(
    f"{BASE_URL}/apis/api.console.halo.run/v1alpha1/posts",
    json=post_data,
    headers={"X-XSRF-TOKEN": xsrf_token}
)

# 发布
post_name = response.json()['metadata']['name']
session.put(f"{BASE_URL}/apis/api.console.halo.run/v1alpha1/posts/{post_name}/publish",
    headers={"X-XSRF-TOKEN": xsrf_token})

完整类封装

class HaloBlogPublisher:
    def __init__(self, base_url, username, password):
        self.base_url = base_url
        self.session = requests.Session()
        self.xsrf_token = ""

    def login(self):
        # 获取CSRF和公钥,加密密码,登录
        pass

    def publish(self, title, slug, content):
        # 创建并发布文章
        pass

应用场景

  1. 批量迁移文章
  2. 定时发布
  3. CI/CD集成

总结

通过Python脚本可以实现Halo博客自动化管理。


评论