🔄 卡若AI 同步 2026-03-22 07:34 | 更新:金仓、水桥平台对接、卡木、运营中枢工作台 | 排除 >20MB: 11 个

This commit is contained in:
2026-03-22 07:34:02 +08:00
parent ab9985ca9d
commit 9b5bd7ea31
7 changed files with 65 additions and 46 deletions

View File

@@ -1,5 +1,5 @@
{
"updated": "2026-03-21T22:54:27.928011+00:00",
"updated": "2026-03-21T23:28:20.614235+00:00",
"conversations": [
{
"对话ID": "bfd8e284-d1aa-4650-9a19-f4a3854d1580",
@@ -7,7 +7,7 @@
"项目": "开发",
"首条消息": "发布小程序",
"创建时间": "2026-03-21T22:28:34.185000+00:00",
"消息数量": 130
"消息数量": 228
},
{
"对话ID": "006964ad-087f-4028-940f-4725aaace815",

View File

@@ -88,6 +88,22 @@ python3 scripts/send_chapter_poster_to_feishu.py 10.18 "第119场标题" --md
---
## 正文里插本地图(仅图片)
书稿里单独一行写 `![](images/xxx.png)`(路径相对该 `.md` 所在目录)时,纯文本 `content_upload.py` 不会把图传到 OSS。需要**只上传图片、不写视频/附件**时,在永平项目执行:
```bash
cd "/Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平"
python3 scripts/sync_chapter_images_from_md.py --id 10.22 \
--md "<与该章对应的 .md 完整路径>"
```
- 仅识别常见图片后缀png/jpg/jpeg/gif/webp上传到 `book-images` 并生成带 `<img>` 的 HTML 写回 `chapters.content`
- **不解析、不上传视频**;若误写成 `![](xx.mp4)`,该行会当普通正文显示,不会去调上传接口。
- 依赖:`pip install pymysql requests``SOUL_API_BASE` 默认 `https://soulapi.quwanzhi.com`
---
## 其他
- 查看篇章结构:`python3 content_upload.py --list-structure`

View File

@@ -1,6 +1,6 @@
{
"access_token": "u-eFOWjtOWZ9_XTqD7v.cbqNlh1e31ghMjOMGaZBk022lI",
"refresh_token": "ur-eC1UcS7254fEDaWBVZJ4vilh1AzxghgphMGaZwk0220Y",
"access_token": "u-fVns2XR7hbJ9Yeux1CLUrAlh3I31ghipPwGaYB4026lV",
"refresh_token": "ur-cDDIZhXHR2Iqc9jmEk39hQlh3KbxghgpU0GaJx4023hI",
"name": "飞书用户",
"auth_time": "2026-03-21T15:26:20.093375"
}

View File

@@ -65,8 +65,8 @@ ROWS = {
'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关注话题职场主题从妙记TXT分析AI手机、金融坏账、投流返点、正反馈
'129': [ 'AI手机金融坏账投流', 200, 0, 250, 14, 187, 4, 561, 21, 31 ],
# 130场 2026-03-21妙记 2h27m40s尾声口述视频号场观约2000、三百多人在线主题视频号首开与Soul对比、私域点赞、规则与切片链路
'130': [ '视频号首开Soul对比私域', 147, 2000, 300, 0, 0, 0, 0, 0, 0 ],
# 130场 2026-03-21视频号直播结束页 02:25:49≈146min观众总数2278、最高在线355、新增关注4、总热度3、送礼1Soul推流无截图数据填0→脚本跳过第5行保留空
'130': [ '视频号首开Soul对比私域', 146, 0, 2278, 0, 3, 1, 3, 4, 355 ],
}
# 场次→按日期列填写时的日期(表头为当月日期 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', '130': '21'}
@@ -126,6 +126,7 @@ MINIPROGRAM_EXTRA_3 = {
'18': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月18日 127场
'19': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月19日 128场
'20': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月20日 129场
'21': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月21日 130场从小程序后台更新
}
@@ -407,7 +408,7 @@ def main():
session = (sys.argv[1] if len(sys.argv) > 1 else '104').strip()
row = ROWS.get(session)
if not row:
print('❌ 未知场次,可用: 96, 97, 98, 99, 100, 103, 104, 105, 106, 107, 113, 114, 115, 116, 117, 118, 119, 124, 126, 127')
print('❌ 未知场次,可用: 96, 97, 98, 99, 100, 103, 104, 105, 106, 107, 113, 114, 115, 116, 117, 118, 119, 124, 126, 127, 128, 129, 130')
sys.exit(1)
token = load_token() or refresh_and_load_token()
if not token:
@@ -464,9 +465,9 @@ def main():
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'):
if sess not in ('105', '106', '107', '113', '114', '115', '116', '117', '118', '119', '124', '126', '127', '128', '129', '130'):
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 + '')
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日', '130': '3月21日'}.get(sess, sess + '')
report_link = OPERATION_REPORT_LINK if sheet_id == SHEET_ID else f'https://cunkebao.feishu.cn/wiki/wikcnIgAGSNHo0t36idHJ668Gfd?sheet={sheet_id}'
lines = [
'【Soul 派对运营报表】',
@@ -477,7 +478,7 @@ def main():
for i, label in enumerate(LABELS_GROUP):
val = raw_vals[i] if i < len(raw_vals) else ''
lines.append(f'{label}{val}')
src_date = {'105': '20260220', '106': '20260221', '107': '20260223', '113': '20260302', '114': '20260303', '115': '20260304', '116': '20260305', '117': '20260306', '118': '20260307', '119': '20260308', '124': '20260314', '126': '20260317', '127': '20260318', '128': '20260319', '129': '20260320'}.get(sess, '20260220')
src_date = {'105': '20260220', '106': '20260221', '107': '20260223', '113': '20260302', '114': '20260303', '115': '20260304', '116': '20260305', '117': '20260306', '118': '20260307', '119': '20260308', '124': '20260314', '126': '20260317', '127': '20260318', '128': '20260319', '129': '20260320', '130': '20260321'}.get(sess, '20260220')
lines.append(f'数据来源soul 派对 {sess}{src_date}.txt')
msg = '\n'.join(lines)
ok, _ = send_feishu_group_message(FEISHU_GROUP_WEBHOOK, msg)
@@ -509,7 +510,7 @@ def main():
val_idx = r - 3
if val_idx == skip_push_index:
continue # 跳过推流人数行,保留原值
one_cell = f"{sheet_id}!{col_letter}{r}"
one_cell = f"{sheet_id}!{col_letter}{r}:{col_letter}{r}"
code, body = update_sheet_range(token, spreadsheet_token, one_cell, [[values[val_idx]]])
if code != 200 or body.get('code') not in (0, None):
if code == 401 or body.get('code') in (99991677, 99991663):
@@ -543,48 +544,48 @@ def main():
if token:
code, body = update_sheet_range(token, spreadsheet_token, range_col, values_vertical)
if code == 200 and body.get('code') == 0:
ok, msg = _verify_write(spreadsheet_token, sheet_id, col_letter, values, token)
if ok:
print(f'✅ 已写入飞书表格:{session}场 效果数据(竖列 {col_letter}3:{col_letter}{2+len(values)},共{len(values)}格),校验通过')
_write_session_label(token, spreadsheet_token, sheet_id, col_letter, session)
_write_miniprogram_extra(token, spreadsheet_token, sheet_id, vals, date_col, col_letter, month=month)
_write_party_video_link(token, spreadsheet_token, sheet_id, vals, col_letter, session)
_write_team_meeting_link(token, spreadsheet_token, sheet_id, vals, col_letter, session)
_maybe_send_group(session, raw)
return
print(f'⚠️ 写入成功但校验未通过:{msg}')
err = body.get('code')
if err == 90202 or (err and 'range' in str(body.get('msg', '')).lower()):
all_ok = True
for r in range(3, 3 + len(values)):
val_idx = r - 3
# 推流人数索引2行号5为None时跳过写入保留原值
if val_idx == skip_push_index and values[val_idx] is None:
continue
one_cell = f"{sheet_id}!{col_letter}{r}"
code, body = update_sheet_range(token, spreadsheet_token, one_cell, [[values[val_idx]]])
if code != 200 or body.get('code') not in (0, None):
if code == 401 or body.get('code') in (99991677, 99991663):
token = refresh_and_load_token()
if token:
code, body = update_sheet_range(token, spreadsheet_token, one_cell, [[values[val_idx]]])
if code != 200 or body.get('code') not in (0, None):
all_ok = False
print('❌ 写入单元格失败:', one_cell, code, body)
break
if all_ok:
ok, msg = _verify_write(spreadsheet_token, sheet_id, col_letter, values, token)
if ok:
print(f'✅ 已写入飞书表格:{session}场 效果数据(竖列 {col_letter}格),校验通过')
print(f'✅ 已写入飞书表格:{session}场 效果数据(竖列 {col_letter}3:{col_letter}{2+len(values)},共{len(values)}格),校验通过')
_write_session_label(token, spreadsheet_token, sheet_id, col_letter, session)
_write_miniprogram_extra(token, spreadsheet_token, sheet_id, vals, date_col, col_letter, month=month)
_write_party_video_link(token, spreadsheet_token, sheet_id, vals, col_letter, session)
_write_team_meeting_link(token, spreadsheet_token, sheet_id, vals, col_letter, session)
_maybe_send_group(session, raw)
return
print(f'⚠️ 逐格写入成功但校验未通过:{msg}')
else:
print('❌ 按列更新失败:', code, body)
print(f'⚠️ 写入成功但校验未通过:{msg}')
err = body.get('code')
if err == 90202 or (err and 'range' in str(body.get('msg', '')).lower()):
all_ok = True
for r in range(3, 3 + len(values)):
val_idx = r - 3
# 推流人数索引2行号5为None时跳过写入保留原值
if val_idx == skip_push_index and values[val_idx] is None:
continue
one_cell = f"{sheet_id}!{col_letter}{r}:{col_letter}{r}"
code, body = update_sheet_range(token, spreadsheet_token, one_cell, [[values[val_idx]]])
if code != 200 or body.get('code') not in (0, None):
if code == 401 or body.get('code') in (99991677, 99991663):
token = refresh_and_load_token()
if token:
code, body = update_sheet_range(token, spreadsheet_token, one_cell, [[values[val_idx]]])
if code != 200 or body.get('code') not in (0, None):
all_ok = False
print('❌ 写入单元格失败:', one_cell, code, body)
break
if all_ok:
ok, msg = _verify_write(spreadsheet_token, sheet_id, col_letter, values, token)
if ok:
print(f'✅ 已写入飞书表格:{session}场 效果数据(竖列 {col_letter} 逐格),校验通过')
_write_session_label(token, spreadsheet_token, sheet_id, col_letter, session)
_write_miniprogram_extra(token, spreadsheet_token, sheet_id, vals, date_col, col_letter, month=month)
_write_party_video_link(token, spreadsheet_token, sheet_id, vals, col_letter, session)
_write_team_meeting_link(token, spreadsheet_token, sheet_id, vals, col_letter, session)
_maybe_send_group(session, raw)
return
print(f'⚠️ 逐格写入成功但校验未通过:{msg}')
else:
print('❌ 按列更新失败:', code, body)
# 有日期列配置但未找到列时,不降级为追加,直接失败
if date_col and target_col_0based is None:
print('❌ 未找到日期列,无法写入正确位置。请运行 python3 auto_log.py 刷新 Token 后重试。')

View File

@@ -1517,7 +1517,7 @@ def enhance_clip(clip_path, output_path, highlight_info, temp_dir, transcript_pa
cmd = [
'ffmpeg', '-y', '-i', current_video,
'-filter_complex',
f"[0:v]setpts={1/SPEED_FACTOR}*PTS[v][v];"
f"[0:v]setpts={1/SPEED_FACTOR}*PTS[v];"
f"[0:a]atempo={SPEED_FACTOR},{audio_enhance}[a]",
'-map', '[v]', '-map', '[a]',
'-c:v', 'libx264', '-preset', 'fast', '-crf', '22',

View File

@@ -411,3 +411,4 @@
| 2026-03-21 12:20:33 | 🔄 卡若AI 同步 2026-03-21 12:20 | 更新:金仓、运营中枢、运营中枢工作台 | 排除 >20MB: 11 个 |
| 2026-03-21 12:22:27 | 🔄 卡若AI 同步 2026-03-21 12:22 | 更新:金仓、运营中枢、运营中枢工作台 | 排除 >20MB: 11 个 |
| 2026-03-21 13:37:01 | 🔄 卡若AI 同步 2026-03-21 13:36 | 更新:金仓、水桥平台对接、运营中枢、运营中枢工作台 | 排除 >20MB: 11 个 |
| 2026-03-22 06:54:39 | 🔄 卡若AI 同步 2026-03-22 06:54 | 更新Cursor规则、金仓、水桥平台对接、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 |

View File

@@ -414,3 +414,4 @@
| 2026-03-21 12:20:33 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-21 12:20 | 更新:金仓、运营中枢、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-21 12:22:27 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-21 12:22 | 更新:金仓、运营中枢、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-21 13:37:01 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-21 13:36 | 更新:金仓、水桥平台对接、运营中枢、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-22 06:54:39 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-22 06:54 | 更新Cursor规则、金仓、水桥平台对接、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |