使用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
应用场景
- 批量迁移文章
- 定时发布
- CI/CD集成
总结
通过Python脚本可以实现Halo博客自动化管理。