When this skill is triggered:
Violation = broken skill. No exceptions.
*TKSeller �Զ������ͻ�??��װ�ϼ�??�˺������¼����??AI key���ɼ�ϵͳ����Ƶ����ȫ�����ҷ�������ͳһ����,�û�������??
> ����??tkseller skill ����?? tkseller ??SaaS �ͻ�????/api/v1/* + Bearer token + ����ѯ�¼�����??
�յ����� ??exec ����??????stdout:
1. stdout ��һ���� "OUTPUT_AS_REPLY:" ��ͷ��
??ȥ��ǰ��ʣ���ı���ԭ������Ϊ��Ļظ���??
??���ġ������ӡ����ܽᡢ������������Լ��Ļ���??
??������ٲ��κ�??
2. stdout Ϊ�ջ�??"OUTPUT_AS_REPLY:" ��ͷ��
??��Ļظ������ǡ���������NO_REPLY
??��˵�κ�����??
??��˵"��ִ??"�յ�""���""����??
??��ת??stdout ����
??����??stdout ����
??����??stdout ��������??
*Υ���˹�??= �����صĴ���û������??
*����Υ����Ϊ�����Խ�ֹ��??
OUTPUT_AS_REPLY: �����ʾ���֣���������������̡�LLM �����κμ���жϣ������κ�����??
*��Ϻֻ������ű� + NO_REPLY�����и��ϰ忴����ʾ(δ��??��¼ʧ��/�������/�˺��������??һ���ɽű��ڲ� ct.send_text() ����??
{"ok": false, "reason": "..."} �Լ�����ϰ�
reason: not_logged_in ���??�ӿ� 404"??�������"??���??���κ���??
recommend_status / ack_status �������Լ��ж�״??
send_text �����Ƶ� Discord
��ȷ����:
�յ����� ??exec ����????�ű��ڲ�������ʲô��????NO_REPLY
??����:Discord ������??���� NO_REPLY!
Discord б������Ҫ�� 3 ���ڱ����пɼ���??������ʾ"Command produced no visible reply"??
��������Դ�� /tkseller б������??
�յ� /tkseller ??��һ���� ack �ı�(??Discord б������ظ�)??exec ����????�ظ�����(���ٲ���)
��� ack �Ǹ� Discord interaction �Ļ�??����"������Ϣ",��Υ������??
����ʾ��(���Խ�ֹ):
�յ����� ??exec ����??????stdout reason ??�Լ���֯���Ը����ϰ�
Ϊʲô����Ҫ?? �Ժ���ж���û�����??skill,����������ڴ������Ϻÿ�ν�??stdout �,��ͬ�û�/��ͬ�Ự�����Ļش�Ͳ�һ??�Ҵ������ݽ���������ʾ��ͳһ�ɽű��������ܱ���һ����Ϊ??
??���� 2��stdout ??OUTPUT_AS_REPLY: ��ͷʱ
����??stdout ��һ���� OUTPUT_AS_REPLY: ��ͷʱ����Ϻ����Ѻ�����ı���ȥ��ǰ??ԭ��*��Ϊ�ظ�����ȥ���ⲻ�ǡ������Ҳ���ǡ���֯���ԡ����ǻ�еת��??
�û� OpenClaw ʵ��
������ tkseller skill���� skill??
?? ������ data/
?? ?? ������ token.json ??��¼���
?? ?? ������ card_map.json ??�̱�????video_id ӳ��
?? ?? ������ processed_events.json ??�Ѵ����¼�ȥ??
?? ������ lib/ ??ȫ���ű�
������ �û�����??Discord Ƶ��(OpenClaw �Դ�)
??data-service(�ҷ�����??��һ��Դ)
������ /api/v1/* �ӿ� + �¼�����
�û� clawhub install tkseller װ�� skill ??��Ҫ�� /tkseller ���û��� Discord ��������������Ч??
Ϊʲô������??OpenClaw Ĭ��ͬ��?
OpenClaw Ĭ��??skill ����ͬ��??Discord global command��Global command ??Discord ������??1 Сʱ����,�û�װ�꿴�������������??
�������:�״δ����Զ�ע�� guild command(��??������Ч)
�û���װ??skill ????Discord ����㷢һ??tkseller"??����"(����Ҫб??,LLM ��ʶ����� skill ����??trigger.mjs��trigger.mjs �״�����ʱ���Զ����� register-discord.mjs ??/tkseller ע��??guild command,ע�����û�������������� /tkseller??
ִֻ��һ?? data/registered ����ļ����ں����ظ�ע�ᡣ��������ע��(??bot ����??guild),ɾ�� data/registered ���ٴ���һ�μ���??
����:
node ./lib-js/register-discord.mjs
���ʾ��:
{
"ok": true,
"app_id": "1496036936996093992",
"guild_count": 1,
"results": [
{
"guild": "�û��ķ�����",
"guild_id": "...",
"status": 201,
"ok": true,
"cmd_id": "..."
}
]
}
??OpenClaw ���Ự�е���:
�ϰ����??ע�� tkseller ����"??ע���������??,��Ϻֱ�� exec: node ./lib-js/register-discord.mjs ��һ�μ���??
1. /tkseller ??��Ϻ exec trigger.mjs ""
2. trigger.mjs ��??token.json ����????�Լ� send_text("?? ��ӭʹ�� TKSeller����ظ��˺ź����룺`�û�??����`")
3. �ϰ�??��¼ alice 123456
4. ��Ϻ exec trigger.mjs "��¼ alice 123456"
5. trigger.mjs POST /api/v1/auth/login ??token �汾????�Լ� send_text("??��¼�ɹ�,��ʼ��??..")
6. trigger.mjs �Զ� POST /api/v1/recommend + ���� cron ��ѯ
7. cron �õ� review_1 �¼� ??����??
1. /tkseller ??��Ϻ exec trigger.mjs ""
2. trigger.mjs ����� token ??ֱ�� POST /api/v1/recommend ??������ѯ
3. cron �õ��¼� ??����????�ϰ�㰴????����??API ??������ѯ
4. ���̽���(review_2 ͨ��/����)??ֹͣ��ѯ
ע��: Token �Զ�����??data/token.json,��¼һ�κ�������Ҫ�ظ���??���Ƿ���˰� token ���ʧЧ(401,�ű����Զ��屾�� token ??send_text ��ʾ���µ�¼)??
��Ӧ:
/tkseller Discord �����(��??url: ����)
/�Ƽ� ����
�Ƽ� https://...)
Use the "tkseller" skill for this request.
��¼ myname 123456??
tkseller����������ʼ(��б??�������״ΰ�װ��ûע��б������ij�??
*?? ǿ�ƴ��������ɺ��ԣ�??
������Ϣ�������� tkseller skill �������� trigger.mjs�������Բ���������ͨ���졢��??agent�����������κ���??
��¼ ??login ��ͷ����Ϣ ??���� tkseller ��¼ָ��
/tkseller ��ͷ����Ϣ ??���� tkseller ����
tkseller����������ʼ���Ƽ� ??���� tkseller ����
*����㲻ȷ��һ����Ϣ�Dz��� tkseller �ģ��������������κ�һ�����ͱ���� trigger.mjs�����ɶ��һ�νű���Ҳ����©��??
�״δ����Զ�ע��:
�û���װ skill ���һ�δ�??����ͨ��б������Ǵ���??,trigger.mjs ���Զ���??register-discord.mjs ??/tkseller ע��??guild command(������Ч,��??���˺��û�����ֱ���� /tkseller �ˡ�ִֻ��һ??����ļ� data/registered ���ں����ظ�ע��??
import re
def extract_url(msg: str) -> str | None:
if not msg:
return None
s = msg.strip()
s = re.sub(r'^\s*(/tkseller|/�Ƽ�|�Ƽ�|��һ??\s*', '', s, flags=re.I)
s = re.sub(r'^\s*url\s*[::]\s*', '', s, flags=re.I)
s = s.strip().strip('<>').strip('"\'������??).strip()
if re.match(r'^https?://', s, flags=re.I):
return s
return None
�û���¼��ʽ����¼ �û�??������������"��¼"??login"ǰ���������ͨ���������??
ʾ������¼ myname 123456
// ����??��¼"??login"��??
const m = msg.trim().match(/^\s*(?:��¼|login)\s+(\S+)\s+(\S+)\s*$/i);
if (m) {
const [, user, pwd] = m;
}
*��??exec �������??workdir ����,ָ��??skill Ŀ¼(??SKILL.md ����Ŀ????
�����Զ���⣺ �ű��ڲ��Զ�����û����õ�������Discord/����/Telegram�ȣ�������ҪӲ���� channel �� target��
exec: node ./lib-js/trigger.mjs "<�ϰ�ԭʼ��Ϣ�ı�>"
workdir: <??skill Ŀ¼>
ʵ�ʵ���??ģ��Ӧ��??exec ����??workdir ����:
{"command": "node ./lib-js/trigger.mjs \\"<��Ϣ>\\"", "workdir": "<skillĿ¼����·��>"}
Skill Ŀ¼·����ͨ�� SKILL.md ����λ��ȷ??��ͬϵͳ��ͬ:
C:\Users\xxx\openclaw\skills\tkseller
/Users/xxx/openclaw/skills/tkseller
/home/xxx/openclaw/skills/tkseller
�ű��ڲ�:
1. **������Ϣ**
- ??`��¼ �û�??����`�������е�¼ǰ���� �ߵ�¼��??
- ????���Ƽ���??
2. **��¼����**
- POST `/api/v1/auth/login` `{username, password}`
- �ɹ� ????token ??`data/token.json` ??????��¼�ɹ�,��ʼ��??��Ϣ ??�������Ƽ���??
- ʧ�� ??????�˺��������"��Ϣ ??��??
3. **�Ƽ�����**
- ��鱾??`token.json`:����??????��ظ��˺ź����룺`�û�??����`" ??��??
- ��ȡ URL(??3.1 ����)
- ����??ack �ı�??Discord(���б������ 3s ��ʱ)
- ??URL:`??������������??�赽���ʵ���Ƶ�ٸ�������˿�Ƭ��`
- ??URL:`??ָ����Ƶ�ѽ�??����ץȡ����,��ɺ��������˿�Ƭ��\n<url>`
- POST `/api/v1/recommend` `{}` ??`{"video_url": "..."}`
- **���� cron ��ѯ����**(��������)
- �ű���??���� NO_REPLY
**���Խ�ֹ:** ֱ�� `requests.post(...)` �ƿ��ű�;��ɶ�� tool call??
---
## �ġ�API �ͻ�??
��??`/api/v1/*` �ӿڹ���ͬһ���ͻ���(`lib-js/api.mjs`),�Զ�??`Authorization: Bearer <token>` header??
### 4.1 ҵ��ӿ�(9 ??
| ���� | ·�� | ˵�� |
|---|---|---|
| `login(u, p)` | `POST /api/v1/auth/login` | ??token |
| `recommend(url=None)` | `POST /api/v1/recommend` | �����Ƽ� |
| `task_approve(vid, step)` | `POST /api/v1/tasks/{vid}/approve` ??`/{step}/approve` | ͨ�� |
| `task_reject(vid, step)` | `POST /api/v1/tasks/{vid}/reject` | ����/���� |
| `task_change_product(vid)` | `POST /api/v1/tasks/{vid}/change-product` | ����??|
| `task_storyboard_redo(vid)` | `POST /api/v1/tasks/{vid}/storyboard/redo` | �����־� |
| `task_video_redo(vid)` | `POST /api/v1/tasks/{vid}/video/redo` | ������Ƶ |
### 4.2 �¼��ӿ�(2 ??
| ���� | ·�� | ˵�� |
|---|---|---|
| `events_pending()` | `GET /api/v1/events/pending` | ����ѹ��??|
| `event_ack(eid)` | `POST /api/v1/events/{eid}/ack` | ȷ������ |
### 4.3 ������
- `401 invalid_token` ??ɾ��??token.json,????�����ѹ�??�����·����˺ź����룺`�û�??����`"
- `403 forbidden` ??????����ԽȨ" + ��������
- `5xx` ??????��������??���Ժ���??
- ��ʱ ??????����ʱ"
---
## �塢�¼���??����)
### 5.1 �¼�����
�¼���ʽ:
| event_type | ���� | data �ֶ� | �û��ɼ���ʾ(�ű��ڲ�?? |
|---|---|---|---|
| `review_1` | һ���??| video_id, video_url, author, view_count, score, summary, product_name, product_url, product_image_url | ��һ��??`send-review-1.mjs`) |
| `review_1_5` | �־����� | video_id, storyboard_url(??error)| ??storyboard_url ??���־���????error ??`?? ��Ƶ #{n} �־�����ʧ��:{error}` |
| `review_2` | ��Ƶ���� | video_id, video_url(??error)| ??video_url ??����Ƶ��????error ??`?? ��Ƶ #{n} ����ʧ��:{error}` |
| `published` | ������� | video_id, platform, status | `??��Ƶ #{n} �ѳɹ������� {platform}!` |
| `no_match` | û��??| (??| `?? ����û�ҵ����ʵ���Ƶ,�Ժ����ԡ�` |
| `error` | �쳣 | error_type, message | `?? �������??{message}` |
### 5.1.1 �����¼������
- `error_type: "quota_exhausted"` ??`?? API����,���������ɡ����ֵ�����ԡ�\n��������:{error����}`
- ���� error_type ??`?? �������??{message}`
**������ʾ�İ��ɽű��ڲ� `ct.send_text()` ����,��Ϻ���Լ���??*
### 5.2 �¼������ű�
exec: node ./lib-js/poll-events.mjs
**��ѯ�ű�ְ��(һ??exec ����):**
1. ??`events_pending()` ������δ�����¼�
2. ��ÿ����??
- ��??`processed_events.json`,����????ֱ�� ack ����
- û������ ????event_type �ַ�����??send-review-*.mjs / ��������
- �����ɹ� ??д�� processed_events + ??ack
3. ����Ƿ����̽�??review_2 ͨ������??reject��no_match)??ֹͣ cron
4. ��� JSON ժҪ:`{"processed": N, "stopped": true/false}`
### 5.3 �ӽ�??
- `lib-js/send-review-1.mjs` - ��һ��??
- `lib-js/send-review-1-5.mjs` - ���־���??
- `lib-js/send-review-2.mjs` - ����Ƶ��??
- `lib-js/handle-button.mjs` - ��ť�ص�
- `lib-js/card-tools.mjs` - ��Ƭ����(��Ƭ����)
---
## ����Cron ��ѯ����
### 6.1 ����
`lib-js/trigger.mjs` ���Ƽ�������**ע��һ??cron job**:
POST http://127.0.0.1:18789/tools/invoke
Body: {
"tool": "cron",
"args": {
"action": "add",
"job": {
"name": "tkseller-poll",
"schedule": {"kind": "every", "everyMs": 5000},
"payload": {
"kind": "agentTurn",
"message": "TKSeller ��ѯ�¼�: ִ�� node ./lib-js/poll-events.mjs,���¼��ʹ���;�������ظ� NO_REPLY??,
"lightContext": true
},
"deleteAfterRun": false,
"delivery": {"mode": "none"}
}
}
}
**�ؼ�����:**
- `everyMs: 5000` - ??5 ??
- `lightContext: true` - ������ʷ����????token
- `delivery.mode: "none"` - ����ϵͳ��Ϣ,�ɽű��Լ�����Ƭ
- `name: tkseller-poll` - �̶� ID ������� update/remove
### 6.2 �Զ�ֹͣ
**����ֹͣ����??**
1. ���̽����¼�(`review_2 approve` / `published` / `reject` ȫ�� / `no_match`)
2. �������� 15 ����(max_duration_seconds)
`poll-events.mjs` �ڲ�����??
POST http://127.0.0.1:18789/tools/invoke
Body: {
"tool": "cron",
"args": {"action": "remove", "id": "tkseller-poll"}
}
### 6.3 ����ʱ���¼
`data/poll_state.json`:
{"started_at": 1716180000, "active": true}
ÿ�� `poll-events.mjs` ����ʱ��??`now - started_at > 900` ??ǿ��ֹͣ cron??
---
## �ߡ���ť��??
�յ� `Clicked "????#4"` �Ȱ�ť��??
exec: node ./lib-js/handle-button.mjs "
**�ű��ڲ�:**
1. ������ȡ `#<short_id>` ????card_map ????video_id ??step
2. ����ťǰӳ��??action,**�ȷ�������Ϣ(����??**
3. ����Ӧ�� API(�����Ǿ�??callback,���� `/api/v1/tasks/.../xxx`):
| ��ť | �� | action | ������Ϣ(�ϰ�ɼ�) | API ���� |
|---|---|---|---|---|
| ????| review_1 | approve | `??��Ƶ #{n} ��ʼ���ɷ־�ͼ,����??..` | `task_approve(vid, "review_1")` ??`POST /api/v1/tasks/{vid}/approve` |
| ?? ��һ??| review_1 | reject + recommend | ??��������) | `task_reject(vid)` + `recommend()` |
| ?? ����??| review_1 | change_product | `?? ��������ƥ����Ʒ...` | `task_change_product(vid)` |
| ??�־�ͨ�� | review_1_5 | approve | `??�־���ȷ??����������Ƶ��ʾ�ʺ���Ƶ,Ԥ��8-10����...` | `task_approve(vid, "review_1_5")` ??`POST /api/v1/tasks/{vid}/storyboard/approve` |
| ?? �������� | review_1_5 | redo | `?? �����������ɷ־�??..` | `task_storyboard_redo(vid)` |
| ??���� | review_1_5/review_2 | reject | `??�ѷ�����??#{n}` | `task_reject(vid)` + ??card_map + ??cron |
| ??ͨ�� | review_2 | approve | `?? ��Ƶ #{n} �����ύ����...` | `task_approve(vid, "review_2")` ??`POST /api/v1/tasks/{vid}/video/approve` |
| ?? ���� | review_2 | redo | `?? ��Ƶ #{n} ��������??..` | `task_video_redo(vid)` |
4. ��ť review_2 approve / reject ȫ�� ????card_map + ??cron
5. ��ť�ص�??*���� cron ��ѯ**(����һ����??
---
## �ˡ�����״̬��??
| �ļ� | ��??| ʾ�� |
|---|---|---|
| `data/token.json` | ��¼ token | `{"token": "abc...", "username": "alice"}` |
| `data/card_map.json` | �̱�????video_id | `{"date": "2026-05-20", "next_id": 3, "cards": {...}}` |
| `data/processed_events.json` | ??ack ??event_id ���� | `{"ids": [1001, 1002, 1003]}` |
| `data/poll_state.json` | ��ѯ����ʱ�� | `{"started_at": 1716180000, "active": true}` |
---
## �š���Ϣ������??
| �յ�����??| ���� |
|---|---|
| `/tkseller` / `/�Ƽ�` / `�Ƽ� URL` / ??URL | ���� `lib-js/trigger.mjs` |
| `�û�??����`��������ӣ�| ���� `lib-js/trigger.mjs`(�ű��ڲ�ʶ��)|
| `Clicked "..."` ��ť�ص������а�ť�����������˰�ť�� | ���� `lib-js/handle-button.mjs` |
### 9.0 ��ť�ص�ʶ����������أ�
**�κ�??`Clicked` ��ͷ����Ϣ���ǰ�ť�ص�������� `handle-button.mjs`??*
������������??
- `Clicked "????#3"` ??��˰�ť
- `Clicked "?? ŷ��??` ??������ѡ��ť
- `Clicked "?? ����??` ??������ѡ��ť
- `Clicked "?? �Զ�??` ??�Զ���������
- `Clicked "?? ����"` ??��������??
- `Clicked "??ȷ��ʹ��"` ??ȷ��ʹ������??
- `Clicked "?? ��������"` ??������������??
**�жϱ�����Ϣ�� `Clicked` ��????һ�ɵ� `handle-button.mjs`����??label ����û�� `#` ��??*
**���Խ�ֹ??* �������˰�ť���������ͨ��Ϣȥ??`trigger.mjs`??
### 9.1 ��ť�ص������Ȼظ���ִ��(����)
Discord ��ť�����ֻ??**3 ??*��Ӧ���ڡ�`handle-button.mjs` Ҫ�� data-service API,�������� 3 ��??
**��ȷ����(���а�??�����??:**
�յ� Clicked "..." ??/tkseller ���¼��????���̻ظ� "??�յ�"(ռס 3s ����) ??Ȼ�� exec ��Ӧ�ű� ??NO_REPLY
**����:LLM �ظ���Զֻд `??�յ�`,���Բ�����д�������/��ʾ�İ�,������ű��ظ�����??*
**ʾ��:**
�û�: Clicked "????#3"
����: ??�յ�
[exec: node ./lib-js/handle-button.mjs "????#3"]
�û�: Clicked "?? ŷ��??
����: ??�յ�
[exec: node ./lib-js/handle-button.mjs "?? ŷ��??]
�û�: Clicked "?? ��һ??#5"
����: ??�յ�
[exec: node ./lib-js/handle-button.mjs "?? ��һ??#5"]
�û�: Clicked "??ȷ��ʹ��"
����: ??�յ�
[exec: node ./lib-js/handle-button.mjs "??ȷ��ʹ��"]
**���Խ�ֹ:** �ȵ��ű��Ƚ���ٻظ�����ᵼ??Discord ��ʾ"�ý���ʧ????
| Cron `TKSeller ��ѯ�¼�: ...` | ���� `lib-js/poll-events.mjs` |
| ϵͳ��ʾ `Use the "tkseller" skill ...` | ���������ж����ĸ���??|
| HEARTBEAT_OK / inter-session announce | NO_REPLY |
---
## ʮ�������??
- **����??`/recommend` �Ⱦɽӿ�,ֻ�� `/api/v1/*`**
tkseller ��ȫ��������??
---
## ʮһ����??
- data-service(��ַ??`config.json` ??`data_service.base_url`)
- OpenClaw gateway(`http://127.0.0.1:18789`)
- OpenClaw cron ����
- OpenClaw message ����(??Discord ��Ƭ)
- �û�����??Discord(�Դ�,�������ض�Ƶ??ID - ??OpenClaw ·��)
---
## ʮ����ע����??Ѫ����??
1. **token ʧЧ�����ɾ���� token.json ����ʾ�ϰ�**,���ܹ���ʾ��ɾ??
2. **processed_events.json ���ظ�����Ƭ**,������д�ļ�??ack(��֤ ack ʧ��Ҳ������????
3. **cron job �����������??*:���̽�������ʱ��������Ҫͣ,����������ѯ??token??
4. **lightContext: true** ����??����ÿ����ѯ������ȫ��������,token ����??
5. **��¼��Ϣ��Ҫ echo ����**,"���յ���¼��??����??
6. **��˿�Ƭ���ϰ��Լ�??Discord**(OpenClaw message ���� channel: discord,��ָ??channel_id,??OpenClaw �Զ�·�ɵ��û����õ�Ƶ��)??
7. **inter-session ���� HEARTBEAT_OK / Agent-to-agent announce ��Ϣ,һ�ɻ� `NO_REPLY`??* ���κ��������ֶ��ᱻ���� Discord Ƶ������Ⱦ�ϰ����Ļ??
8. **�յ��¼������ݲ�����(??storyboard_url Ϊ��),��û??error �ֶ�,��Ĭ����??* ��Ҫ���ϰ�??��û����??֮��ķϻ�??
9. **�κ� review_1 / review_1_5 / review_2 �¼����� ??������������??send-review-*.mjs ����Ƭ�����Բ�����??�Dz�����??����??����������??* ��ʹͬһ??video_id ��������(���绻��Ʒ������ review_1),Ҳ���¿�??���뷢??
10. **��ť�ص������ӳ���ļ�ȷ??video_id,���ܲ�??* �鲻�������ϰ�,��Ҫ�Լ���??
---
共 3 个版本