@acedatacloud/skills 2026.728.0 → 2026.728.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acedatacloud/skills",
3
- "version": "2026.728.0",
3
+ "version": "2026.728.1",
4
4
  "description": "Agent Skills for AceDataCloud AI services — music, image, video generation, LLM chat, web search. Compatible with Claude Code, GitHub Copilot, Gemini CLI, OpenAI Codex, and 30+ AI coding agents.",
5
5
  "keywords": [
6
6
  "agent-skills",
@@ -54,7 +54,7 @@ Stats come straight from Bilibili: `view` (阅读), `like` (点赞), `reply` (
54
54
  ```sh
55
55
  BILI="$SKILL_DIR/scripts/bilibili.py"; [ -f "$BILI" ] || BILI=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/bilibili.py' 2>/dev/null | head -1)
56
56
  python3 "$BILI" whoami
57
- # → {"mid": 91207595, "name": "...", "level": 4}
57
+ # → {"mid": 10000000, "name": "...", "level": 4}
58
58
  ```
59
59
 
60
60
  On a not-logged-in / auth error the cookie is expired — have the user reconnect
@@ -53,7 +53,7 @@ Stats come straight from CSDN: `view_count` (阅读), `digg_count` (点赞),
53
53
  ```sh
54
54
  CSDN="$SKILL_DIR/scripts/csdn.py"; [ -f "$CSDN" ] || CSDN=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/csdn.py' 2>/dev/null | head -1)
55
55
  python3 "$CSDN" whoami
56
- # → {"username": "...", "nickname": "...", "articles_total": 1597}
56
+ # → {"username": "...", "nickname": "...", "articles_total": 0}
57
57
  ```
58
58
 
59
59
  On a WAF 403 / auth error the cookie is expired — tell the user to reconnect at
@@ -63,15 +63,15 @@ python3 scripts/discord_user.py whoami
63
63
  # list the servers (guilds) the account is in
64
64
  python3 scripts/discord_user.py guilds
65
65
  # list text channels in a server
66
- python3 scripts/discord_user.py channels --guild 1133012399448928276
66
+ python3 scripts/discord_user.py channels --guild GUILD_ID
67
67
  # read recent messages in a channel
68
- python3 scripts/discord_user.py messages --channel 1133012400174534792 --limit 20
68
+ python3 scripts/discord_user.py messages --channel CHANNEL_ID --limit 20
69
69
  # send — dry-run first, then re-run with a trailing --confirm
70
- python3 scripts/discord_user.py send --channel 1133012400174534792 --text "hello"
71
- python3 scripts/discord_user.py send --channel 1133012400174534792 --text "hello" --confirm
70
+ python3 scripts/discord_user.py send --channel CHANNEL_ID --text "hello"
71
+ python3 scripts/discord_user.py send --channel CHANNEL_ID --text "hello" --confirm
72
72
  # reply to a specific message
73
73
  python3 scripts/discord_user.py reply \
74
- --channel 1133012400174534792 --message 987654321098765432 --text "on it" --confirm
74
+ --channel CHANNEL_ID --message MESSAGE_ID --text "on it" --confirm
75
75
  ```
76
76
 
77
77
  `--confirm` is honored ONLY as the final argument (one strip), so a message body
@@ -17,10 +17,10 @@ account access — NEVER echo or print it.
17
17
  Examples:
18
18
  python3 discord_user.py whoami
19
19
  python3 discord_user.py guilds
20
- python3 discord_user.py channels --guild 1133012399448928276
21
- python3 discord_user.py messages --channel 1133012400174534792 --limit 20
22
- python3 discord_user.py send --channel 1133012400174534792 --text "hello" --confirm
23
- python3 discord_user.py reply --channel 1133012400174534792 --message 987654321 --text "on it" --confirm
20
+ python3 discord_user.py channels --guild GUILD_ID
21
+ python3 discord_user.py messages --channel CHANNEL_ID --limit 20
22
+ python3 discord_user.py send --channel CHANNEL_ID --text "hello" --confirm
23
+ python3 discord_user.py reply --channel CHANNEL_ID --message MESSAGE_ID --text "on it" --confirm
24
24
  """
25
25
 
26
26
  from __future__ import annotations
@@ -383,7 +383,7 @@ BODY='Hi Alice,
383
383
  Just a quick test note from the AceDataCloud Gmail connector.
384
384
 
385
385
  Best,
386
- Qingcai'
386
+ YOUR_NAME'
387
387
 
388
388
  # Multi-line subject lines need MIME encoded-word for non-ASCII; ASCII is fine raw.
389
389
  RAW=$(printf 'To: %s\r\nSubject: %s\r\nContent-Type: text/plain; charset=UTF-8\r\nMIME-Version: 1.0\r\n\r\n%s' \
@@ -47,7 +47,7 @@ Stats come straight from 掘金: `view_count` (阅读), `digg_count` (点赞),
47
47
  ```sh
48
48
  JJ="$SKILL_DIR/scripts/juejin.py"; [ -f "$JJ" ] || JJ=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/juejin.py' 2>/dev/null | head -1)
49
49
  python3 "$JJ" whoami
50
- # → {"user_id": "...", "name": "...", "post_article_count": 336}
50
+ # → {"user_id": "...", "name": "...", "post_article_count": 0}
51
51
  ```
52
52
 
53
53
  On an auth error (`err_no` 401 / "请登录") the cookie is expired — have the user
@@ -64,7 +64,7 @@ curl -sS -X POST "$MASTODON_BASE_URL/api/v1/statuses" \
64
64
  Use the `id` from `verify_credentials`:
65
65
 
66
66
  ```bash
67
- ACCT_ID="14715" # from verify_credentials
67
+ ACCT_ID="ACCOUNT_ID" # from verify_credentials
68
68
  curl -sS "$MASTODON_BASE_URL/api/v1/accounts/$ACCT_ID/statuses?limit=20&exclude_replies=true&exclude_reblogs=true" \
69
69
  -H "Authorization: Bearer $MASTODON_ACCESS_TOKEN" \
70
70
  | jq '.[] | {id, url, boosts: .reblogs_count, favs: .favourites_count, replies: .replies_count, created_at}'
@@ -98,7 +98,7 @@ python3 $WX conversations --history --limit 20
98
98
  First list conversations, then use the `id` as `conversation_id`:
99
99
 
100
100
  ```bash
101
- python3 $WX messages "34642176898@chatroom" --limit 50 --order asc
101
+ python3 $WX messages "CONVERSATION_ID" --limit 50 --order asc
102
102
  ```
103
103
 
104
104
  ### Historical Messages
@@ -107,7 +107,7 @@ Read from Wisdom's decrypted WeChat local databases:
107
107
 
108
108
  ```bash
109
109
  python3 $WX history --limit 50
110
- python3 $WX history --talker "34642176898@chatroom" --limit 50
110
+ python3 $WX history --talker "CONVERSATION_ID" --limit 50
111
111
  python3 $WX history --limit 20 --offset 20
112
112
  ```
113
113
 
@@ -51,7 +51,7 @@ last argument** so a message/caption that merely contains "--confirm" can never
51
51
 
52
52
  ```sh
53
53
  python3 "$TG" whoami
54
- # → {"id": 8367450178, "username": "GermeyAce", "name": "Germey", "phone": "..."}
54
+ # → {"id": 100000000, "username": "<the connected handle>", "name": "<display name>", "phone": "..."}
55
55
  ```
56
56
 
57
57
  On an auth/session error the stored session is dead — tell the user to reconnect at
@@ -54,7 +54,7 @@ Stats come straight from 头条: `impression_count` (展现), `read_count` (阅
54
54
  ```sh
55
55
  TT="$SKILL_DIR/scripts/toutiao.py"; [ -f "$TT" ] || TT=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/toutiao.py' 2>/dev/null | head -1)
56
56
  python3 "$TT" whoami
57
- # → {"user_id": ..., "name": "...", "articles_total": 273}
57
+ # → {"user_id": ..., "name": "...", "articles_total": 0}
58
58
  ```
59
59
 
60
60
  On an auth error the cookie is expired — tell the user to reconnect at
package/skills/x/SKILL.md CHANGED
@@ -50,8 +50,8 @@ python3 "$X" whoami # confirm the shipped CLI can read the authenticate
50
50
  ## Read commands (run directly)
51
51
 
52
52
  ```sh
53
- python3 $X whoami --expect GermeyAce # verify this exact account
54
53
  python3 $X whoami # discover the authenticated account
54
+ python3 $X whoami --expect SCREEN_NAME # optional: assert a specific account
55
55
  python3 $X search --query "ai agents" --product Latest --limit 20 # Top | Latest | Media
56
56
  python3 $X search-users --query "openai" --limit 10
57
57
  python3 $X timeline --limit 20 # my home timeline
@@ -65,19 +65,22 @@ python3 $X trends --category trending --limit 20 # trending|for-you|
65
65
  ## Verify the connection first
66
66
 
67
67
  ```sh
68
- python3 $X whoami --expect GermeyAce
69
- # → {"id": "...", "screen_name": "GermeyAce", "identity_verified": true, ...}
68
+ python3 $X whoami
69
+ # → {"id": "...", "screen_name": "<the connected handle>", "identity_verified": true, ...}
70
70
  ```
71
71
 
72
72
  `whoami` reads the authenticated account's screen name from X account settings,
73
- then resolves its public profile. `--expect` compares that server-authenticated
74
- screen name with the required account before any write. This avoids X's
75
- Cloudflare-blocked `UserByRestId` endpoint without trusting a local identity
76
- cookie. Always use `--expect` when the user names the required account.
73
+ then resolves its public profile. This avoids X's Cloudflare-blocked
74
+ `UserByRestId` endpoint without trusting a local identity cookie.
75
+
76
+ `--expect <screen_name>` is optional: pass it only when the user explicitly names
77
+ the account they want to act as, and it will abort if the connected cookie
78
+ belongs to someone else. Do not invent an expected handle — plain `whoami` is
79
+ the default.
77
80
 
78
81
  On an actual auth error the cookie is expired — have the user reconnect at
79
82
  <https://auth.acedata.cloud/user/connections>. A Cloudflare block is different:
80
- reconnecting cookies does not fix it. Use `--expect` for identity checks; other
83
+ reconnecting cookies does not fix it. Use `whoami` for identity checks; other
81
84
  blocked endpoints need `X_PROXY` or the official X API. Do **not** loop-retry.
82
85
 
83
86
  ## Write commands — GATED (dry-run unless trailing `--confirm`)
@@ -19,7 +19,7 @@ breakage.
19
19
 
20
20
  Examples:
21
21
  python3 x.py whoami
22
- python3 x.py whoami --expect GermeyAce
22
+ python3 x.py whoami --expect SCREEN_NAME
23
23
  python3 x.py search --query "python" --product Latest --limit 20
24
24
  python3 x.py timeline --limit 20
25
25
  python3 x.py user-tweets --user elonmusk --type Tweets --limit 20
@@ -107,7 +107,7 @@ def cloudflare_block_message(error: Exception) -> str | None:
107
107
  ray = f" Ray ID: {ray_match.group(1)}." if ray_match else ""
108
108
  return (
109
109
  "X blocked this automated web-API request at Cloudflare; the login cookies may still be valid."
110
- f"{ray} For identity checks, use `whoami --expect <screen_name>`; for other blocked endpoints, "
110
+ f"{ray} For identity checks, use `whoami`; for other blocked endpoints, "
111
111
  "configure X_PROXY or use the official X API."
112
112
  )
113
113
 
@@ -43,8 +43,8 @@ python3 "$SKILL_DIR/scripts/yuque.py" whoami
43
43
 
44
44
  # List knowledge bases, then the documents in one.
45
45
  python3 "$SKILL_DIR/scripts/yuque.py" repos
46
- python3 "$SKILL_DIR/scripts/yuque.py" docs germey/blog --limit 20
47
- python3 "$SKILL_DIR/scripts/yuque.py" doc germey/blog DOC_ID
46
+ python3 "$SKILL_DIR/scripts/yuque.py" docs REPO_NAMESPACE --limit 20
47
+ python3 "$SKILL_DIR/scripts/yuque.py" doc REPO_NAMESPACE DOC_ID
48
48
  ```
49
49
 
50
50
  ## Create and update
@@ -55,18 +55,18 @@ by default and only publishes publicly with an explicit `--public`.
55
55
 
56
56
  ```bash
57
57
  # First call is always a dry run and does not load credentials or call the API.
58
- python3 "$SKILL_DIR/scripts/yuque.py" create germey/blog \
58
+ python3 "$SKILL_DIR/scripts/yuque.py" create REPO_NAMESPACE \
59
59
  --title "标题" --content-file /tmp/article.md
60
60
 
61
61
  # Create it privately after the user confirms.
62
- python3 "$SKILL_DIR/scripts/yuque.py" create germey/blog \
62
+ python3 "$SKILL_DIR/scripts/yuque.py" create REPO_NAMESPACE \
63
63
  --title "标题" --content-file /tmp/article.md --confirm
64
64
 
65
65
  # Public publishing additionally requires --public.
66
- python3 "$SKILL_DIR/scripts/yuque.py" create germey/blog \
66
+ python3 "$SKILL_DIR/scripts/yuque.py" create REPO_NAMESPACE \
67
67
  --title "标题" --content-file /tmp/article.md --public --confirm
68
68
 
69
- python3 "$SKILL_DIR/scripts/yuque.py" update germey/blog DOC_ID \
69
+ python3 "$SKILL_DIR/scripts/yuque.py" update REPO_NAMESPACE DOC_ID \
70
70
  --title "新标题" --content-file /tmp/article.md --public --confirm
71
71
  ```
72
72
 
@@ -81,7 +81,7 @@ first if the user only wants part of it changed.
81
81
  ## Delete
82
82
 
83
83
  ```bash
84
- python3 "$SKILL_DIR/scripts/yuque.py" delete germey/blog DOC_ID --confirm
84
+ python3 "$SKILL_DIR/scripts/yuque.py" delete REPO_NAMESPACE DOC_ID --confirm
85
85
  ```
86
86
 
87
87
  Use the real returned `doc_id` and URL. Do not retry a timed-out write
@@ -138,7 +138,7 @@ python3 "$BLOG" question <question-id> # a question's info + whether I answe
138
138
  ```sh
139
139
  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##')
140
140
  python3 "$ZDIR/scripts/blog.py" whoami
141
- # → {"id": "...", "name": "崔庆才丨静觅", "url_token": "Germey", ...}
141
+ # → {"id": "...", "name": "<the connected display name>", "url_token": "<the connected handle>", ...}
142
142
  ```
143
143
 
144
144
  On a `401`/`403` the cookie is expired — tell the user to reconnect at