name: wuling-overseas-dealer-expansion
这个目录是独立 skill 包,只放可复用文件:
SKILL.md:入口说明和任务路由。references/:搜索策略、字段规范、品牌/OEM 规则、AdsPower、飞书同步和建联风控说明。assets/:邮件模板、邮件主题、邮件图片、社交话术库、全新环境兜底用空白建联表模板、飞书同步配置示例。scripts/:采集、去重、Excel、邮件预览/发送、社交预览/执行脚本。references/artifact-policy.md: run artifact, backup, preview, send-log, and cleanup retention policy.references/encoding-and-excel-writeback.md: mandatory text encoding and Excel write-back rules to prevent repeated-question-mark text corruption.references/feishu-sync.md: WorkBuddy/Lark Sheets post-write sync rules for keeping the Feishu online spreadsheet aligned with the local workbook.references/dashboard.md: customer dashboard generation rules, KPI definitions, dashboard artifact locations, and optional Feishu metric-sync boundary.references/facebook-conversation-sync.md: matched Messenger collection, Chinese translation, five-level intent analysis, workbook write-back, and reply-dashboard rules.不要把真实客户表、JSON 预览、采集结果、发送日志、截图、缓存、__pycache__、临时文件或任何账号/SMTP 授权码放进 skill 包。唯一允许放进 assets/ 的 Excel 是空白模板 assets/blank_customer_outreach_workbook.xlsx。
| 任务 | 使用文件 | 状态 |
|---|---|---|
| Facebook 经销商搜索 | scripts/scraper/search_active_dealers.py |
已实现,默认预览 |
| Facebook 轻量搜索 | scripts/scraper/search_facebook.py |
已实现 |
| Facebook 单页采集 | scripts/scraper/scrape_single_page.py |
已实现 |
| LinkedIn 公司页搜索 | scripts/scraper/search_linkedin.py |
已实现,默认预览 |
| Google Maps 搜索和公开邮箱提取 | scripts/scraper/search_google_maps.py |
已实现,邮箱需 --deep-scrape |
| 当地汽车网站搜索 | scripts/scraper/search_auto_websites.py |
已实现,覆盖 OtoMoto、Wandaloo、Kerix、Kompass、Maroc Annuaire、Telecontact |
| 客户信息汇总大表 | scripts/common/build_customer_summary.py |
已实现,完成各平台查找后统一汇总/覆盖 客户信息汇总表 |
| 客户中台看板 | scripts/dashboard/build_dashboard.py |
已实现,读取 客户信息汇总表 生成 HTML 看板和指标 JSON,不写 Excel |
| 飞书云表格同步 | references/feishu-sync.md + WorkBuddy lark-sheets plugin |
写表后强制检查项目配置并同步 |
| TikTok 搜索 | scripts/scraper/search_tiktok.py |
占位,暂缓开发 |
| 邮件预览 | scripts/email_outreach/prepare_outreach_emails.py |
已实现 |
| 邮件发送 | scripts/email_outreach/send_outreach_emails.py |
已实现,必须人工确认 |
| 社交话术生成 | assets/social_outreach_library.md |
已实现,Facebook 主语言为英文 |
| Facebook 社交建联预览 | scripts/social/prepare_facebook_outreach.py |
已实现,输出中文判断 + 英文话术 JSON 预览 |
| Facebook Follow + Messenger 建联总控 | scripts/social/run_facebook_follow_dm.py |
已实现,输出整批聊天框预览;确认后批量执行;不断开 Playwright 连接,浏览器保持打开 |
| Facebook 社交建联执行 | scripts/social/send_facebook_outreach.py |
已实现,默认 dry-run;支持 --action follow_dm;真实执行必须 --confirm --batch-confirmed,不逐条确认 |
| Facebook 对话采集 | scripts/social/collect_facebook_conversations.py |
已实现,只读;首次全量、后续增量;始终保持浏览器打开 |
| Facebook 对话翻译/意向写回 | scripts/social/write_facebook_conversations.py + references/facebook-conversation-sync.md |
已实现,先聊天框预览,再显式写表 |
BYD Maroc、BMW Maroc、JAC Morocco、Changan Maroc、FOTON Maroc。客户属性 as the broad class and 客户类型 as the subtype. Classification must follow the five-attribute taxonomy. Main focus is 汽车渠道合作伙伴 and 平台与行业渠道; 批量采购与运营客户, 二手车转型候选, and 生态支持资源 remain supported for full segmentation. 主营业务 is only the business-description field.mailto: 或官网 Contact/About 页面中能追溯的邮箱,不猜测、不生成。Facebook 建联必须按半自动、低频、可审计的合规流程执行。优化目标是降低账号操作风险和骚扰风险,不允许写成规避官方风控、绕过验证、换指纹规避或模拟异常人类行为的方案。
Facebook Sheet 筛选 未联系、非 OEM 官方页、有主页链接的客户。scripts/social/prepare_facebook_outreach.py 生成预览,必须在聊天框展示整批 Markdown 预览,包含中文客户判断、英文私信话术、主页链接和风险提示。scripts/social/run_facebook_follow_dm.py 做总控流程:先生成并打印整批预览,再调用 AdsPower/Playwright dry-run 或确认执行。--confirm-send 真实执行;总控脚本会传入 --confirm --batch-confirmed。执行前必须展示本轮预计节奏、当天 Follow/DM 已用额度、剩余额度和停止规则。--write-workbook,才写回 Facebook Sheet 的建联状态和备注。scripts/common/build_customer_summary.py --write-summary 刷新 客户信息汇总表。禁止跳过预览直接真实发送。禁止把法语作为 Facebook 默认发送语言;中文只用于内部判断和复核,不发送给客户。
示例预览命令:
python scripts/social/prepare_facebook_outreach.py --excel "<建联表路径>" --sheet Facebook --sample 5 --output facebook_social_preview.json
示例总控预览命令:
python scripts/social/run_facebook_follow_dm.py --excel "<建联表路径>" --sheet Facebook --profile-id "<AdsPower配置ID>" --max-contacts 3 --review-only
示例总控节奏预览命令:
python scripts/social/run_facebook_follow_dm.py --excel "<建联表路径>" --sheet Facebook --profile-id "<AdsPower配置ID>" --max-contacts 3 --dry-run-schedule
示例总控 dry-run 命令:
python scripts/social/run_facebook_follow_dm.py --excel "<建联表路径>" --sheet Facebook --profile-id "<AdsPower配置ID>" --max-contacts 3 --use-open-page --risk-profile very_conservative
示例 dry-run 命令:
python scripts/social/send_facebook_outreach.py --preview facebook_social_preview.json --profile-id "<AdsPower配置ID>" --action follow_dm --keep-browser-open --no-write-workbook
示例真实执行命令:
python scripts/social/send_facebook_outreach.py --preview facebook_social_preview.json --profile-id "<AdsPower配置ID>" --action follow_dm --risk-profile very_conservative --daily-follow-limit 20 --daily-dm-limit 20 --session-max 3 --keep-browser-open --no-write-workbook --confirm --batch-confirmed
社交话术用于 Facebook 和 LinkedIn。Facebook 主语言为英文,输出结构为:中文内部判断 + 英文加好友话术 + 英文私信话术。话术目标是判断客户是否具备评估、采购、消化或分销一批五菱车型的能力。
首轮话术优先使用“真实客户信号 + 利润机会 + 首批小批量试单”切入:先引用 showroom、used-car stock、rental、fleet、importation、官网、WhatsApp、近期帖子等真实信号,再提出商业假设和低压力价值物。prepare_facebook_outreach.py 必须输出 recommended_message,并同时给出 direct_profit_hook、stock_gap_hook、soft_research_hook 三个备选版本,方便人工挑选。不要写成泛泛合作介绍。
禁止编造具体价格、MOQ、车型清单、利润率、库存数量、政府关系或未经确认的合作条件。
当用户要求查看 Facebook 回复、同步 Messenger 对话、翻译客户消息或判断下一步合作意向时,必须读取 references/facebook-conversation-sync.md。
collect_facebook_conversations.py 只读取建联表中可可靠匹配的客户线程;首次用 --initial-full,后续用 --incremental。write_facebook_conversations.py --write-workbook --refresh-summary --refresh-dashboard。Facebook对话记录;Facebook 客户行只更新最新中文摘要、合作意向、状态和下次跟进。All workbook rows and scraper outputs must use exactly one customer attribute and one matching customer type from the table below. Do not write combined attributes, multi-line categories, custom labels, or fallback values such as pending/unknown into the official workbook. Keep business descriptions in 主营业务; do not mix them into classification fields.
| Customer attribute | Allowed customer types |
|---|---|
汽车渠道合作伙伴 |
汽车进口商 ; 全国代理商 ; 全国分销商 ; 区域分销商 ; 多品牌经销商 ; 商用车渠道商 ; 中国品牌经销商 ; 新能源或小型车渠道商 |
批量采购与运营客户 |
汽车租赁公司 ; 长期租赁公司 ; 企业车队 ; 物流配送企业 ; 政府或机构采购方 |
二手车转型候选 |
连锁二手车企业 ; 实体二手车企业 ; 进口二手车企业 ; 新车与二手车综合企业 |
平台与行业渠道 |
汽车交易平台 ; 汽车协会 ; 商会 ; 车商联盟 ; 经销商资源引荐机构 |
生态支持资源 |
售后服务网络 ; 备件供应与仓储企业 ; 进口认证与上牌机构 ; 金融保险机构 ; 车辆物流企业 |
Rules:
客户属性 is the broad class; 客户类型 is the subtype. The pair must match the same row in the taxonomy table.汽车渠道合作伙伴 first, then 平台与行业渠道. The other three classes are still kept for complete segmentation and later operations.以下内容是人工确认/风险标记,不是客户分类。禁止写入 客户属性 或 客户类型,只能写入候选预览 JSON 的 risk_flags、备注 或人工复核预览中:
主体归属待确认:汽车渠道线索中,无法判断是独立公司,还是品牌官方主体、进口商直营网点或普通分店。新车业务待确认:汽车渠道线索中,无法判断主营新整车,还是二手车、维修、配件、轮胎等业务。平台与行业渠道主体待确认:平台与行业渠道线索中,无法确认是否为真实机构主体,还是普通个人页、内容号或非正式资源页。平台与行业渠道作用待确认:平台与行业渠道线索中,无法确认是否具备汽车行业资源、渠道引荐、媒体传播或行业活动组织作用。仅电话/WhatsApp待人工确认:线索已有目标价值信号,但只有电话或 WhatsApp,缺少官网、Facebook、LinkedIn、Google Maps 等可复核资料,需要人工联系确认主体和实际业务。详细信息待确认:当 AI 因登录限制、页面屏蔽、地区限制或网站无法访问,不能读取 Facebook、LinkedIn、官网等内容时填写。客户分类仍必须严格保持五大客户属性和表内细分客户类型;不要用上述风险标记作为兜底分类值。
人工复核不是低质线索兜底池。只有已经显示出渠道价值、但缺少一个关键确认点的客户,才标记为需人工复核。
输出人工复核名单时,不要输出通用复核规则;只列出那些已经值得推进、但需要人工确认一个关键点的客户。低价值或无关客户应写为跳过/低优先级,不要包装成“建议人工复核”。
人工复核必须先看客户是否有目标价值,再看是否缺少需人工确认的关键点。只有两部分同时成立,才能列为需人工复核。
第一部分:客户属性信号至少满足其一。
第二部分:人工复核条件至少满足其一。
不要把“只有电话/WhatsApp”单独作为人工复核理由。如果客户没有汽车渠道价值或平台行业价值,应跳过或标记低优先级,不列入人工复核名单。
批量采购与运营客户 / 汽车租赁公司。BYD Maroc、BMW Maroc 等品牌官方主体。排他协议及新增品牌权限待确认。评分准则写入候选预览的 score_reasons 和 risk_flags:
+3 实际新整车销售、showroom、库存、concessionnaire 或 véhicules neufs 信号。+3 进口、分销、代理、集团、réseau、dealer network 等渠道能力信号。+2 多品牌经营、multimarque、multi-brand 或多品牌 showroom 信号。+2 有可建联入口,例如电话、WhatsApp、邮箱、Facebook、LinkedIn、官网 Contact。+1 中国品牌、商用车、车队或摩洛哥本地相关信号;仅作为辅助,不单独构成汽车渠道合作伙伴。-10 品牌当地分公司、官方主页、进口商直营网点或普通品牌分店,推荐动作设为 skip_brand_branch。-6 纯维修、配件、轮胎、洗车、保险、诊断等非整车销售服务,推荐动作设为 skip_non_channel。-5 个人卖家或个人资料页,推荐动作设为 skip_non_channel。批量采购与运营客户 / 汽车租赁公司。各平台客户资料必须先写入各自的渠道 Sheet,例如 Facebook、LinkedIn、Google Maps、本地汽车网站、汽车网站精选线索。采集、浏览、深度补充和去重完成前,不要把新客户直接写入 客户信息汇总表。
完成一轮平台查找后,再运行 scripts/common/build_customer_summary.py 统一生成或覆盖 客户信息汇总表。总表是可重建结果,不是原始采集表;表头必须对齐重点客户参考表:公司姓名、国家、城市、客户类型、官网链接、联系人、职位、个人邮箱、联系人电话、Facebook主页链接、linkined主页链接、google map链接、公共电话/WhatsApp、公共邮箱、客户属性、建联状态、下次跟进、备注。重复客户在总表中合并为一行,电话、邮箱、联系人、平台链接、官网链接和备注作为补充资料去重追加;合并来源数量、客户来源和来源 Sheet 写入 备注,不再单独增加 重复来源数 列,避免列错位或把序号当次数。
默认只预览汇总统计,不保存工作簿:
python scripts/common/build_customer_summary.py --excel "<建联表路径>"
用户明确要求更新总表时,才写入:
python scripts/common/build_customer_summary.py --excel "<建联表路径>" --write-summary
当用户提到中台、看台、看板、客户统计、建联率、客户数量、渠道分布或邮件发送统计时,读取 references/dashboard.md,并使用 scripts/dashboard/build_dashboard.py 生成本地 HTML 看板和指标 JSON。
看板以 客户信息汇总表 为客户主数据,并在存在 Facebook对话记录 时读取它计算唯一客户回复率、五级意向分布、高意向客户和最近 30 天回复趋势。消息行不得计作客户行。看板不直接写入 Excel,不触发飞书同步,也不保存真实客户数据到 skill 包。
如果本轮刚完成渠道采集、邮件状态写回、社交状态写回或其他 Excel 写入,必须先运行 scripts/common/build_customer_summary.py --write-summary 刷新 客户信息汇总表,再生成看板。预览、dry-run、搜索未写表时,不强制刷新看板。
示例命令:
python scripts/dashboard/build_dashboard.py --excel "<建联表路径>" --run-id "<run_id>" --latest-dir "dashboards/latest"
飞书同步是所有写表流程写表后的强制后置步骤。每次本地 Excel 成功执行 --write-excel、--write-summary、--write-workbook、邮件状态写回或社交状态写回后,agent 必须读取 references/feishu-sync.md 并检查项目根目录 feishu_sync_config.json。
enabled=true,必须调用 WorkBuddy 的 lark-sheets 插件同步飞书电子表格,不再询问是否同步。客户信息汇总表;渠道 Sheet 只有在用户明确要求整本工作簿同步,或配置 sync_scope=all_configured_sheets 时同步。assets/feishu_sync_config.example.json;真实配置应放在项目根目录 feishu_sync_config.json。写表脚本必须按同一顺序解析建联表:
--excel 时,优先使用该路径。--excel 时,先在当前运行目录和上级目录查找项目建联表,例如 摩洛哥客户建联表-按渠道分类.xlsx 或带空格版本。~$、_backup_、backup_before、_with_、sent_、preview、candidate、filtered 等临时、备份、预览或过滤文件。assets/blank_customer_outreach_workbook.xlsx 复制一份到运行目录后再写入。该模板由当前正式表 摩洛哥客户建联表-按渠道分类.xlsx 生成,保留 Sheet、表头、列宽和基础格式,不包含真实客户数据。当前默认邮件模板面向 客户属性=汽车渠道合作伙伴,正式发送正文使用 assets/email_template.md,邮件主题使用 assets/email_subject.txt。同一模板也保存在 assets/email_templates/汽车渠道合作伙伴.md。客户属性=平台与行业渠道 使用 assets/email_templates/平台与行业渠道.md,邮件主题使用 assets/email_subjects/平台与行业渠道.txt,图片资源使用 assets/wuling-platform-industry-channel.png。后续按客户属性增加新模板时,应继续放入 assets/email_templates/,并在发送前明确选择对应客户属性模板。
发送前必须生成并展示最终预览。除非用户明确要求修改模板,否则不要改模板正文。邮件模板中的图片文件必须放在 assets/ 内。当前汽车渠道合作伙伴模板使用 assets/wuling-channel-margin-comparison.png,发送脚本会把 Markdown 图片转成 HTML 内嵌图片,并同时保留纯文本备用正文。
平台与行业渠道模板可使用 {{platform_resource_phrase}} 变量,根据客户主营业务和备注自动选择 automotive industry traffic、dealer members and industry resources、corporate customers and procurement resources、dealer and importer resources 或 automotive industry resources,禁止编造具体会员数量、流量规模或已确认项目资源。
邮件发送脚本必须把 Markdown **加粗**、列表和 mailto: / Website 链接转换成真实 HTML;纯文本备用正文必须去掉 Markdown 符号。邮件图片必须同时设置 width="300" 和内联 style="width:300px;max-width:300px;height:auto",避免邮箱客户端把图片放大。
凡是需要打开、连接、控制或读取浏览器页面的任务,必须使用 Playwright:
a[href]、链接可见文本、aria、按钮链接和页面正文;不得靠截图圈选、坐标点击或人工猜测链接位置作为默认采集逻辑。--risk-profile very_conservative,真实发送每轮最多 3 个客户;可用 --session-max 进一步降低本轮数量。profile_id 每日建联客户默认上限为 20;Follow 和 Messenger DM 均按 20 封顶,可通过 --daily-follow-limit 和 --daily-dm-limit 调低。单轮默认仍为 3 个客户,建议分多轮完成每日 20 个客户。logs/facebook_account_ledger_<profile_id>_<YYYYMMDD>.json 记录当天 Follow、DM、失败、风险提示、last_run_at 和 cooldown_until;超过额度或出现风险事件后,当天停止该账号继续建联。--dry-run-schedule 只输出本轮预计节奏、客户列表和额度,不打开 AdsPower、不点击、不发送、不写表。--confirm --batch-confirmed,才执行 Facebook 关注/私信;不再逐条确认,私信必须命中 Messenger 小窗或 Messenger 页面,禁止帖子留言。references/feishu-sync.md 检查项目根目录 feishu_sync_config.json。如果 enabled=true 且 WorkBuddy 已安装/授权 lark-sheets 插件,agent 必须自动同步飞书电子表格,不需要用户再次强调;预览、dry-run、review-only 和 schedule-only 不触发飞书同步。Facebook 客户采集在 --deep-scrape 阶段必须执行“Facebook 主页联络资料 -> About -> 公司官网 -> 官网公开页面”的补充流程:
主页/链接 继续保存 Facebook 主页,用于去重、私信和状态追踪。公司官网 后,进入官网首页、Contact、About、Nous contacter、A propos、Services、Vehicules、Occasion、Location 等公开页面,提取公开邮箱、电话和业务证据。主营业务 必须综合 Facebook 简介、About、近期帖子和官网正文判断;没有证据时写“汽车渠道线索,需人工确认”,不编造业务、价格、MOQ、库存或合作条件。备注 使用中文结构化摘要,格式围绕:来源线索、Facebook证据、官网证据、主营业务判断、批量采购能力判断、联系方式证据、风险/待确认项。专业词如 showroom、importation、fleet、location、vehicules neufs 可保留原文。runs/YYYYMMDD/<run_id>/ by default; do not scatter runtime files in the project root.backups/YYYYMMDD/ and reuse one backup for the same run/purpose.logs/. Do not write SMTP authorization codes to any artifact..tmp after tasks. Run cleanup in dry-run mode first and keep the latest 10 workbook backups plus 30 days of JSON/HTML/log artifacts by default.Chris Chen. Do not ask the user for a per-account sender name when preparing or sending email.{{sender_name}} only when the message needs the current social account/persona name. Different AdsPower/Facebook/LinkedIn accounts may use different sender names.{{customer_name}}. It must be filled from the workbook contact/customer/company name. If no contact person exists, use the customer/company name.[Name], [name], {{customer_name}}, or {{sender_name}}.{{sender_name}}; legacy email templates containing it should be updated to Chris Chen before use.