diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py index 3612ad6e..ec1f1c3e 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py @@ -8,7 +8,8 @@ python3 feishu_write_minutes_to_sheet.py [内部会议图片路径] [派对总结图片路径] python3 feishu_write_minutes_to_sheet.py --party-image <图> --sheet-id bJR5sA --date-col 4 # 今日总结 python3 feishu_write_minutes_to_sheet.py --team-image <图> --sheet-id bJR5sA --date-col 20 # 团队会议 - 可同时传 --party-image 与 --team-image(同一 date-col)。本脚本不发飞书群。 + python3 feishu_write_minutes_to_sheet.py --internal-image <图> --sheet-id bJR5sA --date-col 20 # 内部会议纪要 + 可同时传 --party-image、--team-image、--internal-image(同一 date-col)。本脚本不发飞书群。 """ import os import sys @@ -113,25 +114,29 @@ def _resize_image_if_needed(path, max_bytes=MAX_IMAGE_BYTES): def _find_col_and_rows_for_sheet(token, sheet_id, date_col): - """返回 (col_idx 0-based, row_party, row_team) 或失败时 (None, None, None)""" + """返回 (col_idx 0-based, row_party, row_team, row_internal) 或失败时 (None, None, None, None)""" vals = read_range(token, f'{sheet_id}!A1:AG50') if not vals or len(vals) < 2: - return None, None, None + return None, None, None, None header = vals[0] col_idx = None for idx, cell in enumerate(header): if str(cell).strip() == str(date_col).strip(): col_idx = idx break - row_party = row_team = None + row_party = row_team = row_internal = None for ri, row in enumerate(vals): a1 = (row[0] if row and len(row) > 0 else '') a1 = str(a1 or '').strip() if '今日总结' in a1: row_party = ri + 1 - if '团队会议' in a1 or ('团队' in a1 and '会议' in a1) or ('内部会议' in a1 and '纪要' in a1): + if '团队会议' in a1 or ('团队' in a1 and '会议' in a1 and '内部' not in a1): row_team = ri + 1 - return col_idx, row_party, row_team + if '内部会议' in a1 and ('纪要' in a1 or '智要' in a1): + row_internal = ri + 1 + elif '内部会议纪要' in a1 or '内部会议智要' in a1: + row_internal = ri + 1 + return col_idx, row_party, row_team, row_internal def write_image_to_cell(token, range_str, image_path, name=None): @@ -169,6 +174,7 @@ def main(): parser.add_argument('image_party', nargs='?', default=DEFAULT_IMAGE_PARTY, help='派对总结图片路径') parser.add_argument('--party-image', dest='party_image_override', type=str, help='派对「今日总结」行图片路径') parser.add_argument('--team-image', dest='team_image_override', type=str, help='「团队会议」行图片路径') + parser.add_argument('--internal-image', dest='internal_image_override', type=str, help='「内部会议纪要」行图片路径') parser.add_argument('--sheet-id', dest='sheet_id_override', type=str, help='工作表 ID,如 3 月用 bJR5sA') parser.add_argument('--date-col', dest='date_col_override', type=str, help='日期列号(表头单元格值),如 115 场用 4') args = parser.parse_args() @@ -179,6 +185,7 @@ def main(): date_col = args.date_col_override party_image_override = (args.party_image_override or '').strip() team_image_override = (args.team_image_override or '').strip() + internal_image_override = (args.internal_image_override or '').strip() def _upload_one_image(token, col_idx, row_num, img_path, label): if row_num is None: @@ -196,7 +203,7 @@ def main(): print(f'❌ 「{label}」上传失败:', code, body) return False - if (party_image_override or team_image_override) and sheet_id and date_col: + if (party_image_override or team_image_override or internal_image_override) and sheet_id and date_col: token = load_token() or refresh_token() if not token: print('❌ 无法获取飞书 Token') @@ -207,7 +214,10 @@ def main(): if team_image_override and not os.path.exists(team_image_override): print('❌ 团队会议图片不存在:', team_image_override) sys.exit(1) - col_idx, row_party, row_team = _find_col_and_rows_for_sheet(token, sheet_id, date_col) + if internal_image_override and not os.path.exists(internal_image_override): + print('❌ 内部会议纪要图片不存在:', internal_image_override) + sys.exit(1) + col_idx, row_party, row_team, row_internal = _find_col_and_rows_for_sheet(token, sheet_id, date_col) if col_idx is None: print('❌ 未找到日期列', date_col) sys.exit(1) @@ -222,6 +232,11 @@ def main(): ok_any = True else: sys.exit(1) + if internal_image_override: + if _upload_one_image(token, col_idx, row_internal, internal_image_override, '内部会议纪要'): + ok_any = True + else: + sys.exit(1) if ok_any: print('(未发飞书群)') return diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py index 14bdf5c5..eefd4b5c 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py @@ -63,8 +63,8 @@ ROWS = { '127': [ '占卜玄学 AI职业定位TOKEN', 127, 0, 174, 10, 60, 18, 69, 14, 32 ], # 128场 2026-03-19:关闭页 187min/236成员/37最高/19新增/2礼物/29灵魂力,小助手 185min建房/233进房/13人均/102互动/19关注,话题知识 '128': [ '分享最赚钱一个月-知识节奏', 187, 0, 233, 13, 102, 2, 29, 19, 37 ], - # 129场 2026-03-20:关闭页 200min/252成员/31最高/21新增/4礼物/561灵魂力/灵果+5257,小助手 200min建房/250进房/14人均/187互动/21关注,话题职场 - '129': [ '分享最赚钱一月职场', 200, 0, 250, 14, 187, 4, 561, 21, 31 ], + # 129场 2026-03-20:关闭页 200min/252成员/31最高/21新增/4礼物/561灵魂力/灵果+5257,小助手 200min建房/250进房/14人均/187互动/21关注,话题职场;主题从妙记TXT分析:AI手机、金融坏账、投流返点、正反馈 + '129': [ 'AI手机金融坏账投流', 200, 0, 250, 14, 187, 4, 561, 21, 31 ], } # 场次→按日期列填写时的日期(表头为当月日期 1~31) SESSION_DATE_COLUMN = {'105': '20', '106': '21', '107': '23', '113': '2', '114': '3', '115': '4', '116': '5', '117': '6', '118': '7', '119': '8', '124': '14', '126': '17', '127': '18', '128': '19', '129': '20'} diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/运营报表_SKILL.md b/02_卡人(水)/水桥_平台对接/飞书管理/运营报表_SKILL.md index 6496b85e..0d3b25a7 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/运营报表_SKILL.md +++ b/02_卡人(水)/水桥_平台对接/飞书管理/运营报表_SKILL.md @@ -5,8 +5,8 @@ triggers: 运营报表、派对填表、派对截图填表发群、会议纪要 parent: 飞书管理 owner: 水桥 group: 水 -version: "3.0" -updated: "2026-03-04" +version: "3.1" +updated: "2026-03-20" --- # Soul 派对运营报表 · 基因胶囊 @@ -61,7 +61,7 @@ flowchart LR | 1 | 填效果数据+小程序+派对录屏;(发群需显式开启) | 场次号 115 | `cd 飞书管理/脚本 && python3 soul_party_to_feishu_sheet.py 115` | 默认**不**发群;需发群时先 `export SOUL_PARTY_PUSH_GROUP=1` 再执行,控制台见「已写入」;见「已同步推送到飞书群」 | | 2 | 纪要文本入表(可选) | TXT 路径、日期列 4 | `python3 write_party_minutes_from_txt.py "/path/to/soul 派对 115场 20260304.txt" 4` | 控制台见「已写入派对智能纪要到今日总结」 | | 3 | 生成纪要图 | 见智能纪要 Skill | JSON→HTML→截图,输出到 `卡若Ai的文件夹/报告/soul_115场_智能纪要_20260304.png` | 得到 PNG 文件 | -| 4 | 今日总结图 + 团队会议图入表 | 两张 PNG、sheet-id、date-col | `python3 feishu_write_minutes_to_sheet.py --party-image "<派对纪要.png>" --team-image "<团队会议.png>" --sheet-id bJR5sA --date-col 4` | 可只传其一;**本脚本不发群** | +| 4 | 今日总结图 + 团队会议图 + 内部会议纪要图入表 | 三张 PNG、sheet-id、date-col | `python3 feishu_write_minutes_to_sheet.py --party-image "<派对纪要.png>" --team-image "<团队会议.png>" --internal-image "<内部会议纪要.png>" --sheet-id bJR5sA --date-col 4` | 可只传其一或组合;**本脚本不发群** | | 5 | 纪要图发群(需你确认后再做) | PNG 路径 | `cd 智能纪要/脚本 && python3 send_to_feishu.py --image "…png"` | 飞书群收到长图 | **路径约定**:飞书管理脚本目录 = `02_卡人(水)/水桥_平台对接/飞书管理/脚本/`;智能纪要脚本 = `02_卡人(水)/水桥_平台对接/智能纪要/脚本/`;报告输出 = `卡若Ai的文件夹/报告/`。 @@ -87,9 +87,20 @@ python3 write_party_minutes_from_txt.py "$TXT" 4 ### 0.5 新场次从零到完成清单 -1. **在 `soul_party_to_feishu_sheet.py` 中**:添加 `ROWS['116']`、`SESSION_DATE_COLUMN['116']`、`SESSION_MONTH['116']`,以及在 `_maybe_send_group` 的 `date_label`、`src_date` 中加 `'116'`;若需派对录屏则填 `PARTY_VIDEO_LINKS['116']`;若需小程序则填 `MINIPROGRAM_EXTRA_3['5']`(3 月 5 日)。 -2. **执行填表**:`python3 soul_party_to_feishu_sheet.py 116`。 -3. **可选**:纪要文本 `write_party_minutes_from_txt.py "" 5`;纪要图按智能纪要生成后 `feishu_write_minutes_to_sheet.py --party-image --sheet-id bJR5sA --date-col 5`,再 `send_to_feishu.py --image `。 +1. **在 `soul_party_to_feishu_sheet.py` 中**: + - 添加 `ROWS['116']`:主题从妙记TXT分析提取(关键词+对话内容,≤12字含干货),如「AI手机金融坏账投流」 + - 添加 `SESSION_DATE_COLUMN['116']`、`SESSION_MONTH['116']` + - 在 `_maybe_send_group` 的 `date_label`、`src_date` 中加 `'116'` + - 若需派对录屏则填 `PARTY_VIDEO_LINKS['116']` + - 若需团队会议链接:从「售商品」系统获取最近一次团队会议妙记链接,填入 `TEAM_MEETING_LINKS['116']` + - 若需小程序则填 `MINIPROGRAM_EXTRA_3['5']`(3 月 5 日) +2. **执行填表**:`python3 soul_party_to_feishu_sheet.py 116`(默认不发群,需发群时先 `export SOUL_PARTY_PUSH_GROUP=1`)。 +3. **可选**: + - 纪要文本 `write_party_minutes_from_txt.py "" 5` + - 今日总结图:`feishu_write_minutes_to_sheet.py --party-image --sheet-id bJR5sA --date-col 5` + - 团队会议图:`feishu_write_minutes_to_sheet.py --team-image --sheet-id bJR5sA --date-col 5` + - 内部会议纪要图:按「目标结果」格式写MD → 转HTML → 截图 → `feishu_write_minutes_to_sheet.py --internal-image --sheet-id bJR5sA --date-col 5` + - 发群:`send_to_feishu.py --image ` ### 0.6 故障排查速查 @@ -111,7 +122,7 @@ python3 write_party_minutes_from_txt.py "$TXT" 4 |:---|:---|:---| | **1** | **填数据 + 发群(文字)** | `cd 飞书管理/脚本`
`python3 soul_party_to_feishu_sheet.py 115`
→ 效果数据写入当月表对应日期列,并**自动推送竖状文字到飞书群**(含报表链接) | | **2** | **生成会议纪要图** | 按 **智能纪要 Skill**(`02_卡人(水)/水桥_平台对接/智能纪要/SKILL.md`):txt → JSON → HTML → 截图 PNG,输出到 `卡若Ai的文件夹/报告/` | -| **3** | **填图片到报表** | `cd 飞书管理/脚本`
`python3 feishu_write_minutes_to_sheet.py --party-image "<报告路径>/soul_115场_智能纪要_20260304.png" --sheet-id bJR5sA --date-col 4`
→ 纪要图写入运营报表「今日总结」对应列(3 月 115 场 = 第 4 列) | +| **3** | **填图片到报表** | `cd 飞书管理/脚本`
`python3 feishu_write_minutes_to_sheet.py --party-image "<报告路径>/soul_115场_智能纪要_20260304.png" --team-image "<报告路径>/团队会议_115场_20260304.png" --internal-image "<报告路径>/内部会议纪要_115场_20260304.png" --sheet-id bJR5sA --date-col 4`
→ 可同时上传今日总结、团队会议、内部会议纪要三张图到对应行(3 月 115 场 = 第 4 列) | | **4** | **把纪要图发到飞书群** | `cd 智能纪要/脚本`
`python3 send_to_feishu.py --image "<报告路径>/soul_115场_智能纪要_20260304.png"`
→ 默认 Webhook 为**运营报表同一飞书群**,群内会收到纪要长图 | **执行顺序**:1 → 2 → 3 → 4,即可完成「数据入表 + 纪要图入表 + 群内先收文字再收纪要图」。 @@ -208,6 +219,14 @@ python3 write_miniprogram_batch.py 填表时若在 `soul_party_to_feishu_sheet.py` 中配置了 `PARTY_VIDEO_LINKS[场次]`(飞书妙记完整 URL),会**自动**写入「派对录屏」行对应列(如 115 场 → E29)。新场次需在脚本中补全链接后重新执行该场次填表。 +### 2.5 团队会议链接(自动写入) + +填表时若在 `soul_party_to_feishu_sheet.py` 中配置了 `TEAM_MEETING_LINKS[场次]`(飞书妙记完整 URL),会**自动**写入「团队会议」行对应列(如 129 场 → U31)。**获取方式**:从「售商品」系统获取最近一次团队会议妙记链接,填入配置后重新执行该场次填表。 + +### 2.6 内部会议纪要图片(手动上传) + +按「目标结果」格式(目标→结果→关键决策→待办)编写 Markdown → 转 HTML → 截图 PNG → 使用 `feishu_write_minutes_to_sheet.py --internal-image --sheet-id bJR5sA --date-col <日期列>` 上传到「内部会议纪要」行(Row 33,表格中显示为「内部会议智要」)。 + ### 2.4 小程序运营数据(自动写入) 每日填表时,若在 `soul_party_to_feishu_sheet.py` 中配置了 **2 月** `MINIPROGRAM_EXTRA` 或 **3 月** `MINIPROGRAM_EXTRA_3`,会**自动**把当日小程序三核心数据写入对应日期列。数据需从 **Soul 小程序 / 微信公众平台 → 小程序 → 统计 → 实时访问、概况** 获取后填入配置: @@ -279,6 +298,7 @@ MINIPROGRAM_EXTRA_3 = { ```python # 格式:'场次号': [主题, 时长, 推流, 进房, 人均, 互动, 礼物, 灵魂力, 关注, 最高在线] +# 主题提取规则:从妙记TXT的「关键词」行与对话内容分析,优先取AI手机、金融坏账、投流返点、正反馈等核心话题,≤12字含干货 '107': ['主题关键词 ≤12字', 140, 35000, 400, 8, 90, 3, 25, 10, 45], ``` diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index 2806e526..78a3c2d3 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -400,3 +400,4 @@ | 2026-03-20 11:03:08 | 🔄 卡若AI 同步 2026-03-20 11:02 | 更新:Cursor规则、总索引与入口、金仓Gitea脚本与配置、金仓、水桥平台对接、水溪整理归档、卡木、运营中枢、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-20 11:16:31 | 🔄 卡若AI 同步 2026-03-20 11:16 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-20 11:26:44 | 🔄 卡若AI 同步 2026-03-20 11:26 | 更新:Cursor规则、运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-20 11:27:30 | 🔄 卡若AI 同步 2026-03-20 11:27 | 更新:水溪整理归档、运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index 9539dbff..f2bcca06 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -403,3 +403,4 @@ | 2026-03-20 11:03:08 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-20 11:02 | 更新:Cursor规则、总索引与入口、金仓Gitea脚本与配置、金仓、水桥平台对接、水溪整理归档、卡木、运营中枢、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-20 11:16:31 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-20 11:16 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-20 11:26:44 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-20 11:26 | 更新:Cursor规则、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-20 11:27:30 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-20 11:27 | 更新:水溪整理归档、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |