#!/bin/bash # 知乎自动发布脚本 # 用法: ./publish_to_zhihu.sh # 示例: ./publish_to_zhihu.sh content/drafts/001-optimized.md content/publishing/images set -e # 配置 PROJECT_ROOT="/root/openclaw-workspace/projects/yu-zhi-ran" SESSION_STATE="/root/.openclaw/sessions/zhihu-state.json" ZHIHU_CREATOR_URL="https://www.zhihu.com/creator" # 参数检查 if [ $# -ne 2 ]; then echo "用法: $0 " echo "示例: $0 content/drafts/001-optimized.md content/publishing/images" exit 1 fi MARKDOWN_FILE="$1" IMAGES_DIR="$2" if [ ! -f "$MARKDOWN_FILE" ]; then echo "错误: Markdown文件不存在: $MARKDOWN_FILE" exit 1 fi if [ ! -d "$IMAGES_DIR" ]; then echo "错误: 图片目录不存在: $IMAGES_DIR" exit 1 fi echo "==========================================" echo "知乎自动发布脚本" echo "==========================================" echo "Markdown: $MARKDOWN_FILE" echo "图片目录: $IMAGES_DIR" echo "会话状态: $SESSION_STATE" echo "" # 1. 加载登录状态 echo "步骤1: 加载知乎登录状态..." agent-browser state load "$SESSION_STATE" # 2. 打开创作中心 echo "步骤2: 打开知乎创作中心..." agent-browser open "$ZHIHU_CREATOR_URL" agent-browser wait --load networkidle # 3. 检查是否遇到安全验证 echo "步骤3: 检查页面状态..." CURRENT_URL=$(agent-browser get url) if echo "$CURRENT_URL" | grep -q "unhuman"; then echo "⚠️ 检测到安全验证页面!" echo "请在浏览器中手动完成验证,然后重新运行脚本。" echo "当前URL: $CURRENT_URL" echo "" echo "提示:如果经常触发验证,可以考虑:" echo " - 降低自动化频率" echo " - 使用更稳定的网络环境" echo " - 手动完成一次验证后,重新保存session状态" exit 2 fi # 4. 获取页面快照,识别元素 echo "步骤4: 分析页面结构..." SNAPSHOT_FILE="/tmp/zhihu_creator_$(date +%s).json" agent-browser snapshot -i --json > "$SNAPSHOT_FILE" # 5. 解析快照,查找按钮 echo "步骤5: 定位'新建文章'按钮..." # 尝试多种定位策略 NEW_ARTICLE_REF=$(jq -r '.data.refs | to_entries[] | select(.value.name|test("新建|写文章|创作|new article|write";"i")) | .key' "$SNAPSHOT_FILE" | head -1) if [ -z "$NEW_ARTICLE_REF" ] || [ "$NEW_ARTICLE_REF" = "null" ]; then echo "❌ 未找到'新建文章'按钮,可能需要手动操作" echo "快照文件: $SNAPSHOT_FILE" echo "请检查页面结构,更新脚本定位逻辑" exit 3 fi echo "找到按钮引用: $NEW_ARTICLE_REF" # 6. 点击新建文章 echo "步骤6: 点击新建文章..." agent-browser click "@$NEW_ARTICLE_REF" agent-browser wait --load networkidle sleep 2 # 7. 解析文章编辑页面 echo "步骤7: 分析文章编辑页面..." EDIT_SNAPSHOT="/tmp/zhihu_edit_$(date +%s).json" agent-browser snapshot -i --json > "$EDIT_SNAPSHOT" # 8. 提取标题输入框 TITLE_REF=$(jq -r '.data.refs | to_entries[] | select(.value.role=="textbox" and (.value.name|test("标题|title";"i"))) | .key' "$EDIT_SNAPSHOT" | head -1) if [ -z "$TITLE_REF" ] || [ "$TITLE_REF" = "null" ]; then echo "⚠️ 未找到标题输入框,尝试使用语义查找..." # 使用语义查找 TITLE_REF=$(jq -r '.data.refs | to_entries[] | select(.value.role=="textbox") | .key' "$EDIT_SNAPSHOT" | head -1) fi # 9. 提取正文编辑器(通常是contenteditable或textarea) CONTENT_REF=$(jq -r '.data.refs | to_entries[] | select(.value.role|in(["textbox","generic"];."name"|test("内容|content|正文|editor";"i"))) | .key' "$EDIT_SNAPSHOT" | head -1) echo "定位结果:" echo " 标题输入框: ${TITLE_REF:-未找到}" echo " 正文编辑器: ${CONTENT_REF:-未找到}" # 10. 准备文章内容 echo "步骤8: 准备文章内容..." # 提取标题(第一行#后面的内容) ARTICLE_TITLE=$(head -1 "$MARKDOWN_FILE" | sed 's/^# //') echo "文章标题: $ARTICLE_TITLE" # 提取正文(去掉标题和参考文献部分) ARTICLE_BODY=$(sed '1d;$d' "$MARKDOWN_FILE") # 11. 填写标题 if [ -n "$TITLE_REF" ] && [ "$TITLE_REF" != "null" ]; then echo "填写标题..." agent-browser fill "@$TITLE_REF" "$ARTICLE_TITLE" sleep 1 else echo "⚠️ 跳过标题填写(需手动)" fi # 12. 填写正文 if [ -n "$CONTENT_REF" ] && [ "$CONTENT_REF" != "null" ]; then echo "填写正文(Markdown格式)..." agent-browser fill "@$CONTENT_REF" "$ARTICLE_BODY" sleep 2 else echo "⚠️ 跳过正文填写(需手动)" fi # 13. 上传封面图 echo "步骤9: 处理封面图..." COVER_IMG="$IMAGES_DIR/05-封面图.png" if [ -f "$COVER_IMG" ]; then echo "找到封面图: $COVER_IMG" # 查找封面上传按钮 COVER_REF=$(jq -r '.data.refs | to_entries[] | select(.value.name|test("封面|cover|图片|image";"i")) | .key' "$EDIT_SNAPSHOT" | head -1) if [ -n "$COVER_REF" ] && [ "$COVER_REF" != "null" ]; then echo "上传封面图..." agent-browser upload "@$COVER_REF" "$COVER_IMG" sleep 2 else echo "⚠️ 未找到封面上传按钮,需手动上传" fi else echo "⚠️ 未找到封面图文件" fi # 14. 标签和分类(可选,暂时跳过) echo "步骤10: 标签和分类(需手动设置)" # 15. 保存草稿 echo "步骤11: 保存草稿..." # 查找保存按钮 SAVE_REF=$(jq -r '.data.refs | to_entries[] | select(.value.name|test("保存|save|草稿|draft";"i")) | .key' "$EDIT_SNAPSHOT" | head -1) if [ -n "$SAVE_REF" ] && [ "$SAVE_REF" != "null" ]; then echo "点击保存草稿..." agent-browser click "@$SAVE_REF" agent-browser wait --load networkidle sleep 2 echo "✅ 草稿已保存" else echo "⚠️ 未找到保存按钮,需手动保存" fi # 16. 截图确认 echo "步骤12: 截图确认..." SCREENSHOT="$PROJECT_ROOT/content/published/$(date +%Y-%m-%d)-$(echo $ARTICLE_TITLE | tr -d '/*?\|"<>')/screenshot.png" mkdir -p "$(dirname "$SCREENSHOT")" agent-browser screenshot "$SCREENSHOT" echo "截图保存至: $SCREENSHOT" # 17. 记录发布信息 echo "步骤13: 记录元数据..." METADATA_FILE="$PROJECT_ROOT/content/published/$(date +%Y-%m-%d)-$(echo $ARTICLE_TITLE | tr -d '/*?\|"<>')/metadata.json" cat > "$METADATA_FILE" <