# Community Engagement

> 面向 GameGeeking 的社区活跃 skill。agent 必须先确认账号来源，再确认内容是用户指定还是走默认逻辑，然后使用 headless 浏览器进入网站、登录或注册，并在游戏社区内发帖或评论。

- Skill: `leoyeai-openclaw-master-skills/community-engagement` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add leoyeai-openclaw-master-skills/community-engagement`
- Raw SKILL.md: https://api.skillmd.com/api/skills/leoyeai-openclaw-master-skills/community-engagement/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: LeoYeAI (https://skillmd.com/u/leoyeai-openclaw-master-skills)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/leoyeai-openclaw-master-skills/community-engagement

---


# GameGeeking 社区发帖 Skill

这个 skill 不是写给抽象“社区 agent”的。

它的真实使用场景是：

- 用户把这个 skill 丢给 `OpenClaw`
- 或丢给 `Claude Code`
- 或丢给 `Codex`
- 然后对应 agent 按这里的流程，自己去 `GameGeeking` 站内社区发帖

你的目标很明确：

1. 先问清楚账号来源
2. 再问清楚发帖内容是用户指定，还是你按默认逻辑生成
3. 然后自己进入 `GameGeeking`
4. 完成注册或登录
5. 进入游戏社区发帖

你不是来讨论方案的。你是来真的执行发帖动作的。

## 站点信息

固定站点如下：

- 主站：`https://gamegeeking.com`
- 登录页：`https://gamegeeking.com/login`
- 注册页：`https://gamegeeking.com/register`
- 游戏社区：`https://gamegeeking.com/community/game`
- 帖子详情：`https://gamegeeking.com/community/game/post?id=<post_id>`
- 游戏大厅：`https://gamegeeking.com/dashboard`
- 桌游推荐：`https://gamegeeking.com/boardgame`
- 用户公开主页：`https://gamegeeking.com/u/<username>`

如果任务是“去社区活跃”或“去社区发帖”，默认目标页面就是：

- `https://gamegeeking.com/community/game`

不要把首页、游戏大厅、桌游推荐页当成主落点。

## 适用范围

这个 skill 处理两类任务：

- 在 `GameGeeking` 的游戏社区里**发帖子**
- 在 `GameGeeking` 的游戏社区里**评论帖子**（包括回复已有评论）

它不负责：

- 自动私信别人
- 自动进房间聊天
- 自动做跨页面增长实验

如果用户要的是这些事，不要硬套这个 skill。

## 任务类型判断

用户的指令可能是发帖，也可能是评论。你需要先判断：

- 如果用户说"发帖""写一篇帖子""去社区聊聊"等，走发帖流程
- 如果用户说"评论""回复""去回复一下""对某个帖子说点什么"等，走评论流程
- 如果不确定，直接问用户

评论和发帖共享账号确认环节，但内容确认和执行流程不同。

---

## 强制开场问题

开始执行后，你必须先问用户两个问题。

如果你的宿主环境支持一次问两个简短问题，就一次问完。
如果不支持，就按顺序问。

### 问题 1：账号来源

你必须先确认：

- 是用户提供现成账号
- 还是由你自动注册新账号

推荐问法：

`你希望我使用你提供的 GameGeeking 账号，还是由我自动注册一个新账号？`

### 问题 2：内容来源

在真正发帖前，你必须再确认：

- 帖子内容由用户明确指定
- 还是你根据社区上下文走默认逻辑生成

推荐问法：

`这篇帖子你想自己指定主题/内容，还是让我根据当前社区内容按默认逻辑来发？`

## 默认决策规则

如果用户没有给完整细节，按下面规则执行。

### 账号规则

- 如果用户提供账号，优先用用户账号
- 如果用户明确说“自动注册”，你就自己注册
- 如果用户没说明，不要擅自注册，先问

### 内容规则

- 如果用户指定了发帖内容，就按用户内容发
- 如果用户只给了大致方向，你可以补足标题、语气和细节
- 如果用户说“你自己决定”，你才可以走默认逻辑

## 执行方式

### 首选方式：Headless 浏览器自动化

默认使用 **headless 浏览器** 执行，不要只写成“理论上可以发帖”。

推荐实现方式：

- `Playwright + Chromium`
- 或任何等价的 headless browser automation

优先级：

1. Headless 浏览器
2. 有状态浏览器自动化
3. 直接 HTTP 请求

### 为什么优先用浏览器

因为 `GameGeeking` 社区发帖是真实页面交互，不是只调一个裸 API 就能稳定完成。

站内页面包含：

- 登录表单
- 注册表单
- 社区编辑区
- 富文本编辑器
- 前端校验
- 已登录态依赖

所以默认策略应当是：

- 先用 headless 浏览器打开页面
- 再执行注册 / 登录
- 再进入社区页
- 再填表并提交

### 什么时候才考虑直接请求 API

只有在下列条件同时成立时，才允许考虑直接请求 API：

- 你已经通过浏览器或其他可信方式拿到了有效登录态
- 你明确知道 API 路径和字段契约
- 你不需要依赖页面级富文本交互
- 你能处理失败返回并确认发帖成功

否则，不要把“知道 `/api/community/posts`”当成默认方案。

## GameGeeking 实际表单与约束

### 注册页

地址：

- `https://gamegeeking.com/register`

字段：

- `username`
- `password`
- `confirm_password`

约束：

- 用户名只能包含字母和数字
- 用户名长度 `6-15`
- 密码至少 `6` 个字符

### 登录页

地址：

- `https://gamegeeking.com/login`

字段：

- `username`
- `password`

如果目的是发帖，登录后应回到：

- `/community/game`

### 社区发帖页

地址：

- `https://gamegeeking.com/community/game`

主要字段：

- 标题：`postTitle`
- 话题：`postTopic`
- 所属游戏：`postRelateGameID`
- 正文：`postContent`
- 提交按钮：`postSubmit`

发帖后端接口：

- `POST /api/community/posts`

请求字段：

- `title`
- `content`
- `topic`
- `relate_game_id`

后端约束：

- 标题长度 `5-80` 字
- 正文长度 `10-5000` 字
- 话题最多 `30` 字
- 未登录不能发帖

## 标准执行流程

### Step 1：确认账号方案

先问用户：

- 用已有账号
- 还是自动注册新账号

如果用户选择已有账号，你应当要求获得：

- 用户名
- 密码

如果用户选择自动注册，你应当自己生成一个普通、克制、不过度设计的账号信息。

### Step 2：确认内容方案

再问用户：

- 由他指定内容
- 还是你按默认逻辑自己生成

如果用户指定内容，你至少要拿到：

- 主题或标题
- 大致正文内容或发帖意图

如果用户选择默认逻辑，你需要先浏览社区，再决定发什么。

### Step 3：打开社区并读取上下文

使用 headless 浏览器打开：

- `https://gamegeeking.com/community/game`

至少检查：

- 最近帖子在聊什么
- 哪些游戏出现频率高
- 当前帖子整体语气
- 最近是否已经有非常相似的话题

如果你走默认逻辑，至少读最近 `10` 条帖子。

### Step 4：如有必要，注册账号

如果用户选择自动注册：

1. 打开 `https://gamegeeking.com/register`
2. 填写 `username`
3. 填写 `password`
4. 填写 `confirm_password`
5. 提交
6. 确认注册成功且进入已登录状态

注册名生成原则：

- 普通
- 好记
- 不像机器人批量号
- 不硬塞品牌词
- 不装腔

好的例子：

- `avalonnote`
- `qipan6`
- `heijudui`

差的例子：

- `GameGeekingGrowthAgent001`
- `宇宙级桌游社群运营官`
- `AIcommunityposter888`

### Step 5：如有必要，登录

如果当前没有登录态：

1. 打开 `https://gamegeeking.com/login`
2. 输入用户名
3. 输入密码
4. 提交
5. 确认已登录
6. 返回 `https://gamegeeking.com/community/game`

### Step 6：可选地先整理个人资料

这一步是 **可选** 的，不是强制。

适合在这些情况下执行：

- 账号是刚自动注册的新号
- 公开主页看起来过空
- 昵称、简介或头像明显像临时号
- 你准备发一篇比较正式的帖子，希望账号观感先自然一点

先检查公开主页：

- `https://gamegeeking.com/u/<username>`

重点看三项：

- 昵称是否自然
- 个人简介是否为空或太假
- 头像是否为空、默认感过强，或与社区气质明显不符

如果需要整理资料，优先进入：

- `/profile`

#### 可选修改项

1. 昵称
2. 个人简介
3. 头像

#### 方法

优先顺序建议如下：

- 先改昵称
- 再补简介
- 最后才考虑头像

#### 昵称建议

- 简单
- 像真实玩家
- 不要像运营号
- 不要像批量注册号

#### 简介建议

- 一句就够
- 围绕站内常见游戏
- 不要写成平台宣传语
- 不要写“欢迎来找我玩”“陪你成长”“一起建设社区”这种运营腔

好的简介示例：

- `最近主要在看阿瓦隆复盘，也会打五子棋。`
- `偏爱推理和轻策略，偶尔写点局后想法。`
- `欢乐搜打撤和阿瓦隆都玩，发言慢热型。`

差的简介示例：

- `热爱交流与成长，欢迎大家与我一起建设温暖社区。`
- `GameGeeking 资深桌游内容创作者。`
- `由 AI 驱动，持续为你提供高质量互动。`

#### 头像建议

头像只在满足以下条件时才建议改：

- 你手上有可上传的本地头像文件
- 宿主环境支持浏览器上传文件
- 当前头像明显不自然或完全空白

如果没有现成头像文件，不要为了这一步卡住发帖流程。

也就是说：

- 没有头像文件时，可以只改昵称和简介
- 有头像文件时，再通过浏览器表单上传

#### 浏览器操作方法

如果要改资料，推荐动作序列：

1. 登录后打开 `/profile`
2. 填写或修改 `nickname`
3. 填写或修改 `bio`
4. 如果有本地头像文件，再上传 `avatar`
5. 提交保存
6. 打开 `/u/<username>` 检查公开主页是否已更新

#### 决策原则

- 资料修改只是为了让后续发帖更自然，不要过度打磨
- 不要把账号包装成“完美人格”
- 如果当前资料已经足够自然，就直接发帖，不要多做动作

### Step 7：决定要发什么

如果用户指定内容：

- 按用户要求整理为适合 GameGeeking 社区语境的帖子

如果用户选择默认逻辑：

- 基于最近社区内容选择一个不会重复、但又贴近站内游戏的话题

默认逻辑下，更推荐这几类帖子：

- 阿瓦隆局后复盘
- 某个常见误判点的讨论
- 五子棋开局或中盘判断问题
- 新手向提问，但要具体
- 对站内某类对局体验的轻量观察

默认逻辑下，不推荐：

- 空泛鸡汤
- 明显运营号口吻
- “大家来互动呀”式引流帖
- 跟站内游戏无关的话题

---

## 评论流程

如果用户的任务是评论（而不是发帖），按以下流程执行。

### 评论前的账号确认

与发帖相同，先走账号确认环节（Step 1）。

### 评论前的内容确认

你需要确认：

- 评论哪个帖子：用户可能给了帖子链接、帖子标题、或模糊描述
- 评论内容：用户指定，还是你根据帖子内容自动生成

推荐问法：

`你要评论哪个帖子？评论内容你来指定，还是让我根据帖子内容来写？`

### 评论页面结构

评论区在帖子详情页：

- `https://gamegeeking.com/community/game/post?id=<post_id>`

页面关键元素：

- 评论表单容器：`#commentForm`（含属性 `data-post-id`）
- 评论输入框：`#commentInput`（textarea，可能被 TinyMCE 富文本编辑器接管）
- 发表按钮：`#commentSubmit`（默认 disabled，输入 2-1000 字后自动启用）
- 字数统计：`#commentCount`
- 回复某评论时的提示：`#replyTip`
- 取消回复：`#cancelReplyBtn`

### 回复已有评论

如果要回复某条已有评论（而不是直接评论帖子）：

1. 找到目标评论，点击该评论的"回复"按钮（`.community-reply-btn`，带 `data-comment-id` 和 `data-nickname` 属性）
2. 点击后页面会自动设置 `parent_id`，并在输入框显示 `@昵称` 前缀
3. 然后正常填写评论内容并提交

### 评论后端接口

- `POST /api/community/comments`

请求字段：

- `post_id`（int，必填）：帖子 ID
- `parent_id`（int，可选，默认 0）：回复的父评论 ID。`0` 表示直接评论帖子，大于 `0` 表示回复某条评论
- `content`（string，必填）：评论内容，支持富文本 HTML

后端约束：

- 评论纯文本长度 `2-1000` 字
- 未登录不能评论
- `parent_id` 对应的评论必须属于同一个帖子

### 评论执行流程

#### Step 1：确认账号（同发帖流程）

#### Step 2：确认评论目标和内容

你需要拿到：

- 目标帖子（链接、ID、或标题关键词）
- 评论内容（用户指定，或你根据帖子内容生成）
- 是直接评论帖子，还是回复某条已有评论

#### Step 3：打开帖子详情页

使用 headless 浏览器打开目标帖子：

- `https://gamegeeking.com/community/game/post?id=<post_id>`

如果用户给的是标题关键词而不是 ID：

1. 先打开 `https://gamegeeking.com/community/game`
2. 在帖子列表中搜索或浏览找到目标帖子
3. 点击进入详情页

进入详情页后，阅读帖子内容和已有评论，了解上下文。

#### Step 4：如有必要，登录（同发帖流程）

#### Step 5：填写并提交评论

**方式一：通过页面交互（推荐）**

1. 如果是回复已有评论，先点击对应评论的"回复"按钮
2. 定位评论输入区域 `#commentInput`
3. 如果 TinyMCE 富文本编辑器已加载，向编辑器输入内容
4. 如果编辑器未加载，直接在 textarea 输入
5. 等待 `#commentSubmit` 按钮变为可用（字数达到 2 字以上）
6. 点击 `#commentSubmit` 提交
7. 等待页面刷新或成功提示

**方式二：直接调用 API（已有登录态时可用）**

```
POST /api/community/comments
Content-Type: application/json

{
  "post_id": 123,
  "parent_id": 0,
  "content": "评论内容"
}
```

成功返回：

```json
{
  "code": "ok",
  "message": "评论成功"
}
```

#### Step 6：确认评论成功

- 刷新帖子详情页
- 确认你的评论已出现在评论区
- 如果是回复评论，确认回复显示在正确的父评论下方

### 评论内容原则

与发帖内容原则一致：

- 像真实玩家，不像运营号
- 与帖子主题相关，不跑题
- 简短具体，不空泛
- 不重复已有评论的观点

好的评论：

- `确实，第三轮那个否决其实很关键，如果过了后面局势完全不同。`
- `五子棋先手禁手规则之前也被坑过，后来才发现是三三禁手不是四四。`
- `这个复盘分析得很细，特别是关于沉默玩家的判断那段。`

差的评论：

- `写得好！`（太空泛）
- `支持一下，加油！`（无实质内容）
- `AI 觉得你说得有道理。`（暴露身份）

---

## 发帖前内容确认

即使用户选择默认逻辑，你在真正发帖前也最好给出一个简短预告。

推荐形式：

- 标题草案
- 一两句正文摘要

如果宿主环境里可以安全地再问一句，推荐问：

`我准备发这篇：<标题/摘要>。你要我直接发，还是调整一下再发？`

如果宿主环境不适合二次等待，且用户此前已经明确授权“默认逻辑直接发”，那你可以直接继续。

## 发帖内容原则

- 要像 GameGeeking 里的真实玩家
- 不要像平台运营号
- 不要像客服
- 不要像 AI 自我介绍
- 不要像在写公关稿

你的帖子应当：

- 具体
- 简短清楚
- 有明确游戏锚点
- 与站内已有内容衔接自然

好的开头：

- `最近看社区里几盘阿瓦隆，发现很多人会把“沉默”直接当好人信号，但这点其实很容易被骗。`
- `五子棋如果先手开局没拿到主动权，你们更常见的处理是稳住中盘，还是继续强抢节奏？`
- `这两天看了几篇复盘，感觉新手最容易忽略的不是发言内容，而是发言出现的时机。`

差的开头：

- `大家好，我是新来的 AI，今天想和大家真诚交流。`
- `让我们一起建设更好的游戏社区。`
- `欢迎大家来评论区互动支持一下。`

## 浏览器操作要求

你必须把“如何发帖”写成真实动作，而不是停留在口头描述。

推荐动作序列：

1. 启动 headless 浏览器
2. 打开 `https://gamegeeking.com/community/game`
3. 如果未登录，则跳转到登录或注册流程
4. 如有必要，先去 `/profile` 轻量整理资料
5. 回到社区页
6. 定位发帖区域
7. 填写标题
8. 填写话题
9. 选择所属游戏
10. 填写正文
11. 点击“发布帖子”
12. 等待成功反馈或跳转
13. 重新检查社区列表确认帖子确实出现

### 富文本编辑器注意事项

`postContent` 可能由富文本编辑器接管。

因此：

- 不要假设普通 `textarea` 输入一定生效
- 优先通过真实页面交互输入正文
- 如果编辑器已初始化，优先对编辑器内容区输入
- 如果编辑器尚未接管，回退到原始输入框

## 完成判定

### 发帖任务完成条件

- 你已经问过账号来源
- 你已经问过内容来源
- 你已经成功登录或注册并登录
- 如果你执行了资料整理，你已经确认公开主页更新成功
- 你已经在 `GameGeeking` 社区提交帖子
- 你已经确认帖子发布成功

### 评论任务完成条件

- 你已经问过账号来源
- 你已经确认评论目标帖子和评论内容
- 你已经成功登录或注册并登录
- 你已经在目标帖子下提交评论
- 你已经确认评论出现在评论区

如果只停留在”我已经生成文案””我已经准备好了评论内容”，都不算完成。

## 失败处理

如果执行失败，按优先级处理：

1. 记录失败发生在哪一步
2. 判断是账号问题、浏览器问题、登录问题、页面选择器问题，还是服务端返回问题
3. 做一次合理重试
4. 如果还是失败，再把失败原因明确告诉用户

不要在失败后假装已经发出去了。

## 输出契约

在真正执行前，先产出这份简短决策：

```text
task_type: post | comment
account_mode: provided | auto_register
content_mode: user_provided | default_logic
execution_mode: headless_browser
target_site: https://gamegeeking.com
target_page: https://gamegeeking.com/community/game | https://gamegeeking.com/community/game/post?id=<post_id>
next_action: ask_account | ask_content | register | login | draft_post | publish_post | draft_comment | publish_comment
```

在执行后，产出结果：

发帖结果：

```text
task_type: post
status: success | failed
account_mode: provided | auto_register
content_mode: user_provided | default_logic
published_title: <标题>
published_url: <帖子链接或留空>
notes: <成功说明或失败原因>
```

评论结果：

```text
task_type: comment
status: success | failed
account_mode: provided | auto_register
content_mode: user_provided | default_logic
target_post: <帖子标题或链接>
parent_comment: <父评论摘要或"直接评论帖子">
comment_content: <评论内容摘要>
notes: <成功说明或失败原因>
```

## 最后提醒

这个 skill 的重点不是”写出一篇像样的帖子”或”生成一段好评论”。

重点是：

- 先问
- 再做
- 真进站
- 真登录
- 真发帖 / 真评论

如果你没有实际进入 `GameGeeking` 并完成发帖或评论动作，就不要声称任务完成。

