From c2cce1e82e7c3481edff8f16fb14dacbea167a57 Mon Sep 17 00:00:00 2001 From: karuo Date: Fri, 20 Mar 2026 11:16:26 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=84=20=E5=8D=A1=E8=8B=A5AI=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=202026-03-20=2011:16=20|=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=9A=E6=B0=B4=E6=A1=A5=E5=B9=B3=E5=8F=B0=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E3=80=81=E8=BF=90=E8=90=A5=E4=B8=AD=E6=9E=A2=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E5=8F=B0=20|=20=E6=8E=92=E9=99=A4=20>20MB:=2011=20=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../智能纪要/output/soul_129场_20260320_meeting.json | 75 +++++++++++++ .../飞书管理/脚本/feishu_write_minutes_to_sheet.py | 100 ++++++++++++------ .../飞书管理/脚本/soul_party_to_feishu_sheet.py | 4 + .../水桥_平台对接/飞书管理/运营报表_SKILL.md | 6 +- _Soul运营技能包导出/README.txt | 6 +- .../build_soul_skill_bundle.py | 14 ++- 运营中枢/工作台/gitea_push_log.md | 1 + 运营中枢/工作台/代码管理.md | 1 + 8 files changed, 166 insertions(+), 41 deletions(-) create mode 100644 02_卡人(水)/水桥_平台对接/智能纪要/output/soul_129场_20260320_meeting.json diff --git a/02_卡人(水)/水桥_平台对接/智能纪要/output/soul_129场_20260320_meeting.json b/02_卡人(水)/水桥_平台对接/智能纪要/output/soul_129场_20260320_meeting.json new file mode 100644 index 00000000..a1c5caf8 --- /dev/null +++ b/02_卡人(水)/水桥_平台对接/智能纪要/output/soul_129场_20260320_meeting.json @@ -0,0 +1,75 @@ +{ + "title": "3月20日|最赚钱一月·职场闭环·金融坏账心态·投流返点·正反馈坚持", + "subtitle": "Soul派对第129场", + "date": "2026-03-20", + "time": "06:30", + "duration": "约3小时20分(妙记)", + "participants_count": "250+", + "location": "Soul派对早场", + + "speakers": [ + {"name": "卡若(房主)", "role": "主持人", "topics": "AI手机与微信生态·金融过桥骗局·坏账率心态·漫剧投流·天乐老吴返点逻辑·派对正反馈·129场复盘"}, + {"name": "连麦伙伴", "role": "运动/视频号垂类", "topics": "视频号运动博主·刻意练习·小程序分发一块钱的正反馈"} + ], + + "modules": [ + { + "title": "AI 手机 × 微信:云端控制与定价区间", + "color": "blue", + "items": [ + {"title": "产品方向", "points": ["豆包手机迭代:注册/解封/聊天自动化,点赞评论转发+朋友圈分析", "与服务端联动远程控机,偏 B 端与高客单", "意向价位带:约 7k~2 万(未定),对算力与稳定性要求高"]}, + {"title": "合作观察", "points": ["技术公司老板洽淡合作,销售能力强", "市面完全闭环产品仍少,窗口期在能力与合规"]} + ] + }, + { + "title": "金融助贷「过桥」骗局:一栋楼薅七家", + "color": "red", + "items": [ + {"title": "套路拆解", "points": ["用已过户/抵押物业包装成「过桥」借款人,绕开银行尽调", "同一标的向多家助贷各借约等额本金,本案约 170 万×7 家", "证件齐全、带看物业 → 很难当场识破权属已转移"]}, + {"title": "房主结论", "points": ["定性骗本金,已走举报/诉讼", "做金融必有坏账率,心态上按 5%~10% 年化的不良来预留", "审核再老也会中招,只能靠流程与交叉验证减损"]} + ] + }, + { + "title": "漫剧、投流与「看不见的钱」", + "color": "purple", + "items": [ + {"title": "漫剧模型", "points": ["批量生产测品,ROI 可行就拉满投流,平台规则收紧后换下一波", "金主不缺钱,缺可放大项目"]}, + {"title": "天乐老吴类 IP", "points": ["卖课可见收入≠全部利润:千川/巨量返点、代投、人群包加价", "大品牌品宣可「亏着投曝光」,代运营+返点组合才是现金牛"]} + ] + }, + { + "title": "腾讯私域:小程序与资金沉淀成本", + "color": "teal", + "items": [ + {"title": "规则变化", "points": ["客服入口收紧、收款与运营户隔离、预充值分润", "公户缴税+手续费+账期,现金流压力上升"]}, + {"title": "策略", "points": ["仍得在腾讯体系内做生意,但要把税与沉淀算进模型", "垂直号先做透一个平台,别多线耗散"]} + ] + }, + { + "title": "正反馈:为什么能连开 129 场", + "color": "green", + "items": [ + {"title": "房主心法", "points": ["正反馈不一定是钱:心情、省钱、链接对人、阶段里程碑都算", "派对里「甩链接赚一两块」是最小闭环,背后才是会员/沙龙/项目", "小程序短时间到 800+ 人访问,说明简单动作重复+链路设计有效"]}, + {"title": "对创作者", "points": ["运动/学习类内容:先定变现闭环再扩内容,否则易空转", "能「迭代」比只会「循环执行」稀缺"]} + ] + } + ], + + "highlights": [ + {"title": "一栋楼骗七家助贷", "time": "开场段", "content": "用无真实所有权的物业重复「过桥借款」,专薅非银助贷不经银行审批的漏洞。", "insight": "风控要假设「证件齐全也可能是叙事」,交叉查权属与多家征信。", "color": "red"}, + {"title": "坏账率与心态", "time": "中段", "content": "房主以年尺度看 170 万损失,仍在可控不良区间内;负责人 12 年经验也会踩坑。", "insight": "做金融=接受概率损失,用制度减频率,用储备金减击穿。", "color": "orange"}, + {"title": "投流返点才是大头", "time": "中后段", "content": "头部 IP 背后往往是代投返点、人群包与品牌品宣预算,而不是课程零售价。", "insight": "看生意要拆「表面 SKU」和「现金流结构」。", "color": "purple"}, + {"title": "129 场的本质", "time": "末段", "content": "房主自述:能坚持是因为多层正反馈,不是单一收入。", "insight": "运营 Soul 房=设计最小正反馈单元,再叠长期产品。", "color": "green"} + ], + + "takeaways": [ + {"title": "风险", "color": "red", "points": ["助贷过桥:权属穿透+同业信息共享", "灰产:短周期高回报默认不可持续"]}, + {"title": "增长", "color": "green", "points": ["正反馈设计:从一块钱分润到会员沙龙", "垂直平台 all in,3~6 个月试一个主战场"]}, + {"title": "本场数据(表内口径)", "color": "blue", "points": ["约 200 分钟·250 进房·人均 14 分·187 互动·21 关注·峰值 31"]} + ], + + "actions": [ + {"content": "有 AI 硬件/私域合作可上麦或私信房主;派对主题覆盖 AI+创业+认知。", "note": "每天早场连麦;小程序「卡若创业派对」"}, + {"content": "做投流或漫剧:先算平台规则半衰期,再定测品节奏与资金回撤线。", "note": "返点与代运营合同单独审"} + ] +} diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py index de7193e0..3612ad6e 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py @@ -6,7 +6,9 @@ 不发飞书群。 用法: python3 feishu_write_minutes_to_sheet.py [内部会议图片路径] [派对总结图片路径] - python3 feishu_write_minutes_to_sheet.py --party-image <图片路径> --sheet-id bJR5sA --date-col 4 # 3月115场 + 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)。本脚本不发飞书群。 """ import os import sys @@ -110,6 +112,28 @@ def _resize_image_if_needed(path, max_bytes=MAX_IMAGE_BYTES): return data +def _find_col_and_rows_for_sheet(token, sheet_id, date_col): + """返回 (col_idx 0-based, row_party, row_team) 或失败时 (None, None, None)""" + vals = read_range(token, f'{sheet_id}!A1:AG50') + if not vals or len(vals) < 2: + return 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 + 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): + row_team = ri + 1 + return col_idx, row_party, row_team + + def write_image_to_cell(token, range_str, image_path, name=None): """ 飞书 v2 写入图片到单元格:POST .../values_image,body 为 JSON,image 为整数数组(字节流)。 @@ -143,7 +167,8 @@ def main(): parser = argparse.ArgumentParser(description='上传会议/派对纪要图片到飞书运营报表') parser.add_argument('image_internal', nargs='?', default=DEFAULT_IMAGE_INTERNAL, help='内部会议图片路径') 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('--party-image', dest='party_image_override', type=str, help='派对「今日总结」行图片路径') + parser.add_argument('--team-image', dest='team_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() @@ -153,47 +178,52 @@ def main(): sheet_id = args.sheet_id_override or SHEET_ID date_col = args.date_col_override party_image_override = (args.party_image_override or '').strip() + team_image_override = (args.team_image_override or '').strip() - if party_image_override and sheet_id and date_col: - # 单次上传:派对图片 → 指定 sheet 的「今日总结」行、指定日期列 + def _upload_one_image(token, col_idx, row_num, img_path, label): + if row_num is None: + print(f'❌ 未找到「{label}」行') + return False + range_cell = f'{sheet_id}!{_col_letter(col_idx)}{row_num}:{_col_letter(col_idx)}{row_num}' + code, body = write_image_to_cell(token, range_cell, img_path, name=os.path.basename(img_path)) + if code == 401 or body.get('code') in (99991677, 99991663): + t2 = refresh_token() + if t2: + code, body = write_image_to_cell(t2, range_cell, img_path, name=os.path.basename(img_path)) + if code == 200 and body.get('code') in (0, None): + print(f'✅ 已上传图片到「{label}」→ 日期列 {date_col}({sheet_id})') + return True + print(f'❌ 「{label}」上传失败:', code, body) + return False + + if (party_image_override or team_image_override) and sheet_id and date_col: token = load_token() or refresh_token() if not token: print('❌ 无法获取飞书 Token') sys.exit(1) - if not os.path.exists(party_image_override): - print('❌ 图片不存在:', party_image_override) + if party_image_override and not os.path.exists(party_image_override): + print('❌ 派对图片不存在:', party_image_override) sys.exit(1) - vals = read_range(token, f'{sheet_id}!A1:AG50') - if not vals or len(vals) < 2: - print('❌ 读取表格失败') + if team_image_override and not os.path.exists(team_image_override): + print('❌ 团队会议图片不存在:', team_image_override) sys.exit(1) - 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 = 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 - break - if col_idx is None or row_party is None: - print('❌ 未找到日期列', date_col, '或「今日总结」行') - sys.exit(1) - range_cell = f'{sheet_id}!{_col_letter(col_idx)}{row_party}:{_col_letter(col_idx)}{row_party}' - code, body = write_image_to_cell(token, range_cell, party_image_override, name=os.path.basename(party_image_override)) - if code == 401 or body.get('code') in (99991677, 99991663): - token = refresh_token() - if token: - code, body = write_image_to_cell(token, range_cell, party_image_override, name=os.path.basename(party_image_override)) - if code == 200 and body.get('code') in (0, None): - print(f'✅ 已上传派对智能纪要图片到「今日总结」→ {date_col} 列({sheet_id})') - else: - print('❌ 上传失败:', code, body) + col_idx, row_party, row_team = _find_col_and_rows_for_sheet(token, sheet_id, date_col) + if col_idx is None: + print('❌ 未找到日期列', date_col) sys.exit(1) + ok_any = False + if party_image_override: + if _upload_one_image(token, col_idx, row_party, party_image_override, '今日总结'): + ok_any = True + else: + sys.exit(1) + if team_image_override: + if _upload_one_image(token, col_idx, row_team, team_image_override, '团队会议'): + ok_any = True + else: + sys.exit(1) + if ok_any: + print('(未发飞书群)') return token = load_token() or refresh_token() diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py index 39c74f13..14bdf5c5 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py @@ -453,6 +453,10 @@ def main(): LABELS_GROUP = ['主题', '时长(分钟)', 'Soul推流人数', '进房人数', '人均时长(分钟)', '互动数量', '礼物', '灵魂力', '增加关注', '最高在线'] def _maybe_send_group(sess, raw_vals): + # 飞书群推送改为显式开启,避免未确认就发群:export SOUL_PARTY_PUSH_GROUP=1 + if os.environ.get('SOUL_PARTY_PUSH_GROUP', '').strip() != '1': + print('⏭️ 已跳过飞书群推送(需 export SOUL_PARTY_PUSH_GROUP=1 后重跑本脚本才会推送运营数据到群)') + return if sess not in ('105', '106', '107', '113', '114', '115', '116', '117', '118', '119', '124', '126', '127', '128', '129'): return date_label = {'105': '2月20日', '106': '2月21日', '107': '2月23日', '113': '3月2日', '114': '3月3日', '115': '3月4日', '116': '3月5日', '117': '3月6日', '118': '3月7日', '119': '3月8日', '124': '3月14日', '126': '3月17日', '127': '3月18日', '128': '3月19日', '129': '3月20日'}.get(sess, sess + '场') diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/运营报表_SKILL.md b/02_卡人(水)/水桥_平台对接/飞书管理/运营报表_SKILL.md index 81c99e67..6496b85e 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/运营报表_SKILL.md +++ b/02_卡人(水)/水桥_平台对接/飞书管理/运营报表_SKILL.md @@ -58,11 +58,11 @@ flowchart LR | 步 | 动作 | 输入 | 命令 | 输出/校验 | |:---|:---|:---|:---|:---| -| 1 | 填效果数据+小程序+派对录屏+发群 | 场次号 115 | `cd 飞书管理/脚本 && python3 soul_party_to_feishu_sheet.py 115` | 控制台见「已写入」「已同步推送到飞书群」「已写入派对录屏链接」 | +| 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 "卡若Ai的文件夹/报告/soul_115场_智能纪要_20260304.png" --sheet-id bJR5sA --date-col 4` | 控制台见「已上传派对智能纪要图片」 | -| 5 | 纪要图发群 | PNG 路径 | `cd 智能纪要/脚本 && python3 send_to_feishu.py --image "卡若Ai的文件夹/报告/soul_115场_智能纪要_20260304.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` | 可只传其一;**本脚本不发群** | +| 5 | 纪要图发群(需你确认后再做) | PNG 路径 | `cd 智能纪要/脚本 && python3 send_to_feishu.py --image "…png"` | 飞书群收到长图 | **路径约定**:飞书管理脚本目录 = `02_卡人(水)/水桥_平台对接/飞书管理/脚本/`;智能纪要脚本 = `02_卡人(水)/水桥_平台对接/智能纪要/脚本/`;报告输出 = `卡若Ai的文件夹/报告/`。 diff --git a/_Soul运营技能包导出/README.txt b/_Soul运营技能包导出/README.txt index 48cdce85..3e6e3870 100644 --- a/_Soul运营技能包导出/README.txt +++ b/_Soul运营技能包导出/README.txt @@ -1 +1,5 @@ -placeholder +Soul 运营全链路技能包:请在本机终端运行永平项目中的打包脚本,会在「下载」生成 zip。 + + python3 "/Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平/scripts/pack_soul_operation_skills.py" + +详细说明:一场soul的创业实验-永平/scripts/README_Soul运营技能包.md diff --git a/_Soul运营技能包导出/build_soul_skill_bundle.py b/_Soul运营技能包导出/build_soul_skill_bundle.py index fb0b22a9..eae63e21 100644 --- a/_Soul运营技能包导出/build_soul_skill_bundle.py +++ b/_Soul运营技能包导出/build_soul_skill_bundle.py @@ -1,6 +1,15 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -"""打包 Soul 运营全链路:SKILL + 脚本 + Cursor 入口,供复制到另一台电脑。""" +""" +【已迁移】请改用永平项目内脚本(会输出 zip 到「下载」): + + python3 "/Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平/scripts/pack_soul_operation_skills.py" + +说明见同仓库:scripts/README_Soul运营技能包.md +--- +以下为旧版备份逻辑(与 pack_soul_operation_skills.py 等价,可自行删除本文件)。 +打包 Soul 运营全链路:SKILL + 脚本 + Cursor 入口,供复制到另一台电脑。 +""" from __future__ import annotations import os @@ -20,9 +29,10 @@ WORK_ROOT = KARUO_AI / "_Soul运营技能包导出" / BUNDLE_NAME def ignore_common(dir_name: str, names: list[str]) -> set[str]: + skip = {"__pycache__", ".browser_state", "chromium_data", ".DS_Store"} ignored = set() for n in names: - if n == "__pycache__" or n.endswith(".pyc") or n == ".DS_Store": + if n in skip or n.endswith(".pyc"): ignored.add(n) return ignored diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index f821e701..38e8594f 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -397,3 +397,4 @@ | 2026-03-19 13:29:07 | 🔄 卡若AI 同步 2026-03-19 13:29 | 更新:Cursor规则、金仓、卡人、水桥平台对接、火炬、总索引与入口、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-19 13:29:38 | 🔄 卡若AI 同步 2026-03-19 13:29 | 更新:水桥平台对接、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-19 13:43:52 | 🔄 卡若AI 同步 2026-03-19 13:43 | 更新:金仓、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-20 11:03:08 | 🔄 卡若AI 同步 2026-03-20 11:02 | 更新:Cursor规则、总索引与入口、金仓Gitea脚本与配置、金仓、水桥平台对接、水溪整理归档、卡木、运营中枢、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index 236fff32..28386a9c 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -400,3 +400,4 @@ | 2026-03-19 13:29:07 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-19 13:29 | 更新:Cursor规则、金仓、卡人、水桥平台对接、火炬、总索引与入口、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-19 13:29:38 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-19 13:29 | 更新:水桥平台对接、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-19 13:43:52 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-19 13:43 | 更新:金仓、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 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) |