zhihu について
zhihu は、知乎の検索・閲覧・投稿を行うスキルです。自分のアカウントの管理や知乎内外の情報収集に使え、検索とアカウント操作でスクリプトと認証情報を分けています。
主な機能
- 01知乎とウェブ全体の検索
- 02知乎のトレンド表示
- 03自分の記事・回答と統計の閲覧
- 04記事・回答の投稿と回答の編集
- 05投稿のプレビューと下書き保存
活用シーン
- 01知乎の質問・回答・記事の検索
- 02話題の確認
- 03自分の投稿と反応統計の確認
- 04記事や回答の下書き保存または公開
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ acedatacloud/ skills --skill zhihuインストール後、Claude Code で/zhihuを入力して読み込まれたか確認します。
同梱ファイルscripts/blog.pyscripts/search.py
詳細
zhihu — Zhihu で検索、閲覧、公開
認証レイヤーは 2 つ、スクリプトは 2 つです。
| スクリプト | 認証 | 機能 |
|---|---|---|
scripts/search.py | ZHIHU_DEVELOPER_TOKEN(Bearer) | Zhihu の検索、ウェブ検索、話題の取得 |
scripts/blog.py | ZHIHU_COOKIES(ログイン Cookie) | 自分の記事と回答の閲覧・編集 |
ブラウザーもサードパーティー依存関係も不要です。urllib のみを使用します。
コネクターは認証情報を環境変数として注入します。
ZHIHU_DEVELOPER_TOKEN— Zhihu Developer Platform のアクセスシークレット(Bearer トークン)。 検索とホットリストのクエリに使用します。シークレットです。絶対にエコーや出力をしないでください。ZHIHU_COOKIES—{name, value, domain, path, ...}形式の Cookie を含む JSON 配列。 ユーザー自身のコンテンツの閲覧・編集に使用します。シークレットです。絶対にエコーや出力をしないでください。
まずスクリプトの場所を特定します(すべての Bash ブロック)
コネクターは $SKILL_DIR にこのスキルのディレクトリーを設定するため、スクリプトは
$SKILL_DIR/scripts/ にあります。python3 $SKILL_DIR/scripts/… を直接ハードコードしないでください。
同じターンに複数のスキルが読み込まれている場合、$SKILL_DIR が
別のスキルを指していることがあり、その場合は No such file or directory で呼び出しが失敗します(Zhihu の実行が気付かれないまま完了しない最大の原因です)。すべての Bash ブロックの先頭で、パスを確実に解決してください。Bash の呼び出しごとに新しいシェルが起動するため、変数は引き継がれません。
# blog.py is unique to this skill, so it anchors zhihu's dir even if $SKILL_DIR is wrong.
ZDIR="$SKILL_DIR"; [ -f "$ZDIR/scripts/blog.py" ] || ZDIR=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/blog.py' 2>/dev/null | head -1 | sed 's#/scripts/blog.py##')
[ -f "$ZDIR/scripts/blog.py" ] || { echo "zhihu scripts not found (SKILL_DIR=$SKILL_DIR) — is the skill loaded?" >&2; exit 1; }
SEARCH="$ZDIR/scripts/search.py"; BLOG="$ZDIR/scripts/blog.py"
続いて、以下に示すように "$SEARCH" / "$BLOG" を使用してください(必ず引用符で囲みます)。
検索 CLI(search.py)
scripts/search.py — Zhihu とウェブを検索します。必要なのは
ZHIHU_DEVELOPER_TOKEN のみです(Cookie は不要です)。
# Resolve the scripts first (see "Locate the scripts first" above) — robust to $SKILL_DIR.
ZDIR="$SKILL_DIR"; [ -f "$ZDIR/scripts/blog.py" ] || ZDIR=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/blog.py' 2>/dev/null | head -1 | sed 's#/scripts/blog.py##')
SEARCH="$ZDIR/scripts/search.py"
# Search Zhihu content (站内搜索) — questions, answers, articles
python3 "$SEARCH" search "Python 爬虫"
python3 "$SEARCH" search "Python 爬虫" --count 5
# Search the entire web (全网搜索) — all indexed sites
python3 "$SEARCH" global "AI Agent"
python3 "$SEARCH" global "AI Agent" --count 15
# Filter by site or time
python3 "$SEARCH" global "React" --filter 'host=="github.com"'
python3 "$SEARCH" global "新闻" --filter 'publish_time>=1720000000'
python3 "$SEARCH" global "技术" --filter 'host=="github.com" AND publish_time>=1720000000'
python3 "$SEARCH" global "实时新闻" --db realtime
# Get Zhihu trending topics (热榜)
python3 "$SEARCH" hot
python3 "$SEARCH" hot --limit 10
検索コマンド
| 目的 | コマンド |
|---|---|
| Zhihu を検索(最大 10 件) | python3 "$SEARCH" search "<query>" --count N |
| ウェブ全体を検索(最大 20 件) | python3 "$SEARCH" global "<query>" --count N |
| サイトで絞り込み | --filter 'host=="example.com"' |
| 時間で絞り込み | --filter 'publish_time>=<unix_ts>' |
| リアルタイム/静的インデックスのみを検索 | --db realtime または --db static |
| Zhihu のトレンドトピック(最大 30 件) | python3 "$SEARCH" hot --limit N |
検索結果のフィールド
zhihu_search が返す値:title、type(Article/Answer)、content_id、url、 excerpt、vote_up(賛同)、comments、author、authority level、edit_time。
global_search は同じフィールドに加えて、has_more インジケーターを返します。url
には Zhihu のプラットフォームによる utm トラッキングパラメーターが含まれます。
hot_list が返す値:rank、title、url、summary、thumbnail。
global_search のフィルター構文
host=="example.com"— ドメインで絞り込み(注:host=="zhihu.com"は サポートされていません。代わりにsearchコマンドを使用してください)publish_time>=1720000000— 公開時刻で絞り込み(Unix 秒)- 論理演算子:
AND、OR(大文字で記述する必要があります) - グループ化には括弧を使用:
(host=="a.com" OR host=="b.com") AND publish_time>=T
ブログ CLI(blog.py)
このスキルには、自己完結型で標準ライブラリーのみを使用する
scripts/blog.py が含まれています。
ZHIHU_COOKIES(ログイン Cookie)が必要です。
# Resolve the scripts first (see "Locate the scripts first" above) — robust to $SKILL_DIR.
ZDIR="$SKILL_DIR"; [ -f "$ZDIR/scripts/blog.py" ] || ZDIR=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/blog.py' 2>/dev/null | head -1 | sed 's#/scripts/blog.py##')
BLOG="$ZDIR/scripts/blog.py"
# Read (run directly)
python3 "$BLOG" whoami # who is logged in
python3 "$BLOG" articles --limit 20 # my published articles + stats
python3 "$BLOG" article <article-id> # one article's details + stats
python3 "$BLOG" answers --limit 20 # my published answers + stats
python3 "$BLOG" answer <answer-id> # one answer's details + stats
python3 "$BLOG" question <question-id> # a question's info + whether I answered it
まず接続を確認します
ZDIR="$SKILL_DIR"; [ -f "$ZDIR/scripts/blog.py" ] || ZDIR=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/blog.py' 2>/dev/null | head -1 | sed 's#/scripts/blog.py##')
python3 "$ZDIR/scripts/blog.py" whoami
# → {"id": "...", "name": "<the connected display name>", "url_token": "<the connected handle>", ...}
401/403 が返された場合、Cookie の有効期限が切れています。ユーザーに
https://studio.acedata.cloud/console/connectors で再接続するよう伝えてください(ACE
拡張機能で Cookie を再取得します)。ループで再試行してはいけません。
レシピの確認
| 目的 | コマンド |
|---|---|
| 自分の情報を確認する | python3 "$BLOG" whoami |
| 最新の記事と投票数・コメント数を確認する | python3 "$BLOG" articles --limit 20 |
| 最新の回答といいね数・お気に入り数・コメント数を確認する | python3 "$BLOG" answers --limit 20 |
| 次のページ(任意の一覧) | --offset 20 を追加する |
| 特定の記事の統計情報を確認する | python3 "$BLOG" article <id> |
| 特定の回答の統計情報(賛成票を含む)を確認する | python3 "$BLOG" answer <id> |
| 質問の情報と自分の回答 ID(回答がある場合)を確認する | python3 "$BLOG" question <id> |
記事の統計情報:voteup_count(賛成票)、comment_count(コメント数)。Zhihu はこれらのエンドポイントで記事ごとの閲覧数を公開していません。
回答の統計情報に関する注意: answers の一覧エンドポイントは voteup_count(賛成票)を返しません。公開されるのは like_count(いいね数)、favorite_count(お気に入り数)、comment_count(コメント数)のみです。回答の正式な賛成票数を確認するには、answer <id> を呼び出してください(単一回答のエンドポイントは voteup_count を返します)。question <id> は already_answered と my_answer_id を報告するため、answer-question(新規)と edit-answer(更新)のどちらを使うか判断できます。
公開 — 要確認(末尾に --confirm がない場合はドライラン)
publish はユーザーの実際のアカウントに書き込みます。末尾に --confirm を付けない場合はドライランとなり、実行する内容を表示するだけで、変更は行いません。--confirm が有効になるのは最後の引数の場合のみなので、タイトルや本文に「--confirm」が含まれていても、誤って公開されることはありません。必ずドライランをユーザーに見せて、明示的な「はい」を得てから、最後に --confirm を付けて再実行してください。
# Content is HTML. For Markdown, convert to HTML first (e.g. `pandoc -f gfm -t html`).
python3 "$BLOG" publish --title "标题" --content-file article.html # dry-run
python3 "$BLOG" publish --title "标题" --content-file article.html --draft-only --confirm # save a private draft
python3 "$BLOG" publish --title "标题" --content-file article.html --confirm # PUBLIC, goes live
--draft-onlyを指定すると、非公開の下書きを保存した時点で停止します(安全です。公開されません)。--draft-onlyを指定しない場合、記事はユーザーの名前で一般公開されます。ユーザーが公開を明確に求めていない限り、デフォルトで--draft-onlyを指定してください。- 画像は自動でホストされます。 Zhihu は、
srcが独自 CDN 上にない<img>を削除するため、--confirmを指定すると CLI は外部画像(HTML の<img src>と Markdown の、およびdata:URI)をすべて Zhihu の画像サービスに再アップロードし、先に URL を書き換えます。すでに*.zhimg.com上にある画像はそのまま使用されます。結果にはimages: {found, rehosted, failed}が報告され、ドライランではimages_foundが報告されます。これをスキップするには--no-imagesを指定してください。これにより、通常の公開画像 URL を使った HTML/Markdown を CLI に渡しても、画像が保持されます。
質問への回答 — 要確認(末尾に --confirm がない場合はドライラン)
質問と回答に関する書き込みコマンドは 2 つあります。どちらも publish と同じ確認方式です。末尾に --confirm がない場合はドライランとなり、--confirm が有効になるのは最後の引数の場合のみです。必ずドライランを表示し、明示的な「はい」を得てから、最後に --confirm を付けて再実行してください。
# Content is HTML (same as articles). For Markdown, convert to HTML first.
# Post a NEW answer to a question
python3 "$BLOG" answer-question --question <qid> --content-file ans.html # dry-run
python3 "$BLOG" answer-question --question <qid> --content-file ans.html --draft-only --confirm # PRIVATE draft (safe)
python3 "$BLOG" answer-question --question <qid> --content-file ans.html --confirm # PUBLIC, goes live
# Edit an EXISTING answer (replaces its live, public content)
python3 "$BLOG" edit-answer --id <answer-id> --content-file ans.html # dry-run
python3 "$BLOG" edit-answer --id <answer-id> --content-file ans.html --confirm # overwrites live answer
- 質問ごとに回答できるのは 1 件だけです。 Zhihu では、ユーザーは質問ごとに 1 件だけ回答できます。すでに回答済みの場合、
answer-question --confirmはedit-answerを使うよう明示するエラーを返します。既存の回答 ID はanswersまたはquestion <qid>(my_answer_idを報告します)で確認してください。 - 新しい回答では
--draft-onlyを使うのが安全です。質問に対する非公開の下書きを保存します(公開されません)。ユーザーが Zhihu で内容を確認した後、--draft-onlyを指定せずに(--confirmを付けて)再実行すると公開されます。ユーザーがすぐに公開するよう明確に求めていない限り、この方法を優先してください。 edit-answerには非公開モードがありません。回答はすでに公開されているため、--confirmを付けて編集するとすぐに反映されます。--repost allowed|disallowedで変更しない限り、回答の現在の転載設定が維持されます。- 転載許可(
--repost allowed|disallowed):新しい回答ではデフォルトがdisallowed(転載を許可しない)です。編集では現在の設定が維持されます。 - 回答の画像も自動でホストされます。動作と
--no-imagesフラグはpublishと同じです。
注意事項 — ユーザーが驚く前に伝えてください
- これはユーザー本人の Zhihu アカウントです。 公開/回答/ 編集を行う前に確認してください。閲覧すると、本人の非公開の下書きも表示されます。
- Cookie の有効期限:Zhihu の Cookie は有効期間が短いです。
401/403が返された場合は、 studio.acedata.cloud/console/connectors で再接続してください。リトライを繰り返してはいけません。 - 利用規約:Cookie による自動操作は、ほとんどのプラットフォームの利用規約に違反します。これはユーザー自身が取得した Cookie を使って、本人のアカウントに対してのみ操作します。このリスクはユーザーが負うものとします。他人のコンテンツを大規模にスクレイピングする目的では、決して使用しないでください。
ZHIHU_COOKIESを表示してはいけません。アカウントへの完全なアクセス権が含まれています。- 対象範囲:Zhihu のみです。掘金/CSDN など、ほかの中国のプラットフォームには、それぞれ専用のコネクターを備えた個別のプラットフォーム向けスキル(例:
csdn、juejin)が用意されています。ここで--platformを切り替える方式ではありません。
出力を記録する
公開が成功し、公開済みの結果 URL を取得したら、組み込みの
publish_artifact ツールを 1 回だけ呼び出して、ユーザーがこの成果物を My Outputs で確認できるようにしてください。
publish_artifact(kind="article", channel="zhihu", title="<title>", url="<the REAL returned URL>", status="delivered")
実際に返された URL を使用してください。URL を捏造してはいけません。公開済みの項目ごとに、配信が確認された後に 1 回だけ呼び出してください。公開に失敗した場合は呼び出しを省略するか、status="failed" を使用してください。
_shared/artifacts.md を参照してください。