news 2026/9/10 4:37:25

cli-anything-mailchimp 实战:用 CLI-Anything 将 Mailchimp Marketing API v3.0 封装为 Agent 原生命令行接口

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cli-anything-mailchimp 实战:用 CLI-Anything 将 Mailchimp Marketing API v3.0 封装为 Agent 原生命令行接口

cli-anything-mailchimp 实战:用 CLI-Anything 将 Mailchimp Marketing API v3.0 封装为 Agent 原生命令行接口

【免费下载链接】CLI-Anything"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything

这篇指南以 mailchimp 子模块的 README 为主体,结合其架构文档与源码,系统讲解如何安装、认证、运行cli-anything-mailchimp,覆盖 30 个资源组的 303 个命令、JSON 输出与 jq 组合、交互式 REPL 以及底层 HTTP 客户端实现。读完你将能够在 Shell 脚本或 Agent 工作流中直接管理 Mailchimp 的受众(lists)、邮件营销活动(campaigns)、报告(reports)、自动化(automations)与电商数据。

一、工具定位:把整个 Marketing API 变成 CLI 命令

cli-anything-mailchimp是构建在 CLI-Anything 框架之上的 Python CLI harness,目标是让 Mailchimp Marketing API v3.0全面 "Agent-native"——即每个 Swagger 端点都暴露为一个带类型检查的 Click 命令,并提供 JSON 输出与 REPL 模式,让大模型 Agent 无需编写 SDK 代码即可操作账号。

在 架构文档 MAILCHIMP.md 中给出的口径是:303 个命令、横跨 30 个资源组,覆盖完整 Marketing API 表面。包内技能文件 SKILL.md 的 frontmatter 同步声明了该能力范围。源码侧同样可验证:单元测试 test_core.py 中test_all_groups_importable断言len(ALL_GROUPS) == 30,且每个资源组都必须注册至少一个命令。

它能够完成的核心业务动作包括:

  • 受众(Audiences/Lists):创建、更新、删除列表;添加/更新/归档成员;管理合并字段(merge fields)、分组(segments)、标签(tags)与 webhooks;
  • 营销活动(Campaigns):创建、排期、立即发送、暂停、复制并分析邮件活动;
  • 报告(Reports):打开率、点击率、退订、邮件活动、地域分布等投放分析;
  • 自动化(Automations):创建与管理自动化邮件工作流;
  • 电商(E-commerce):店铺、订单、顾客、商品、购物车与促销码;
  • 以及模板(templates)、文件管理器(file-manager)、落地页(landing-pages)、短信活动(sms-campaigns)、调查(surveys)等其余全部 Marketing API 资源。

二、安装与前置条件

2.1 环境要求

  • Python3.10+。该版本约束同时写入了包元数据 setup.py(python_requires=">=3.10")与 SKILL.md 的 Prerequisites 一节。
  • 运行时依赖:click>=8.0requests>=2.28prompt-toolkit>=3.0(见 setup.py 的install_requires)。

2.2 安装命令

在仓库内以开发模式安装(对应文档给出的本地开发方式):

cd mailchimp/agent-harness && pip install -e .

安装完成后,setup.pyentry_points会注册可执行命令cli-anything-mailchimp,其入口指向 mailchimp_cli.py 的main()。若需从 CLI-Anything 托管仓库的mailchimp/agent-harness子目录以pip install git+...方式安装,参见 MAILCHIMP.md 的安装说明。

2.3 认证:环境变量是唯一配置来源

本工具遵循 CLI-Anything 的惯例——不读取任何配置文件,只认环境变量。认证只需设置一个变量:

export MAILCHIMP_API_KEY=<your-api-key>-<datacenter>

注意 API Key 必须带数据中心后缀,例如abc123-us8xyz-eu2。带后缀的原因在于 Mailchimp 的 API 域名是按数据中心路由的(https://<dc>.api.mailchimp.com/3.0),缺少后缀的 Key 无法确定请求发往哪个机房。

三、快速上手:五条命令走完核心链路

安装并导出 Key 后,即可直接执行:

cli-anything-mailchimp ping # 健康检查,确认 API 连通性 cli-anything-mailchimp --json lists list # 以 JSON 列出所有受众 cli-anything-mailchimp --json campaigns list --count 10 # 列出前 10 个活动 cli-anything-mailchimp # 不带参数进入交互式 REPL

其中ping命中GET /ping,连通成功后返回{"health_status": "Everything's Chimpy!"}root list则用于拉取账号基本信息。--json是根级全局开关,作用于任意子命令。

值得注意的一个命令层级细节是:ping这类单端点资源组被生成为 Click group,并在未显式给出子命令时自动调用其内部list命令(见 ping.py),因此cli-anything-mailchimp ping无需追加list即可执行健康检查——单元测试test_ping_group_invokes_health_check_without_list_subcommand专门锁定了这一行为。

四、命令全景:资源组与命令层级

从架构文档 MAILCHIMP.md 可以还原完整命令层级(操作数为文档口径):

cli-anything-mailchimp [--json] [--version] │ ├── ping # GET /ping —— 健康检查 ├── root # GET / —— 账号信息 ├── lists # 66 个操作(受众、成员、合并字段、分组、标签、webhooks) ├── campaigns # 22 个操作(发送、排期、暂停、复制等) ├── reports # 22 个操作(已发送活动的分析) ├── automations # 18 个操作(工作流与自动化邮件) ├── ecommerce # 60 个操作(店铺、订单、商品、购物车、促销码) ├── templates / template-folders / campaign-folders ├── file-manager # 11 个操作(文件与文件夹) ├── reporting # 12 个操作(Facebook/落地页报告) ├── landing-pages / sms-campaigns / surveys ├── audiences / contacts / customer-journeys / facebook-ads ├── batches / batch-webhooks ├── connected-sites / verified-domains / authorized-apps ├── conversations / activity-feed / account-exports └── search-campaigns / search-members

这 30 个资源组模块存放在 commands/ 目录,由 __init__.py 汇总为ALL_GROUPS,再由根 CLI 统一注册(mailchimp_cli.py 中for _group in ALL_GROUPS: cli.add_command(_group))。

4.1 Root

命令说明
cli-anything-mailchimp ping健康检查,确认 API 连通性
cli-anything-mailchimp root list获取账号信息
cli-anything-mailchimp --json <cmd>以 JSON 输出任意命令结果
cli-anything-mailchimp启动交互式 REPL

4.2 Lists(受众)

命令说明
lists list列出所有受众
lists get <LIST_ID>获取受众信息
lists create --data '<json>'创建受众
lists update <LIST_ID> --data '<json>'更新受众
lists delete <LIST_ID>删除受众
lists list-lists-id-members <LIST_ID>列出受众成员
lists get-lists-id-members-id <LIST_ID> <SUBSCRIBER_HASH>按 MD5 哈希获取成员
lists create-lists-id-members <LIST_ID> --data '<json>'添加成员
lists list-lists-id-merge-fields <LIST_ID>列出合并字段
lists create-lists-id-merge-fields <LIST_ID> --data '<json>'添加合并字段
lists list-lists-id-segments <LIST_ID>列出分组
lists list-list-member-tags <LIST_ID> <SUBSCRIBER_HASH>列出成员标签
lists create-list-member-tags <LIST_ID> <SUBSCRIBER_HASH> --data '<json>'添加/移除成员标签
lists list-lists-id-webhooks <LIST_ID>列出 webhooks
lists create-lists-id-webhooks <LIST_ID> --data '<json>'添加 webhook

从源码可见,生成命令同时完整保留了 API 的查询参数。以 lists.py 中lists list为例,它支持--fields--exclude-fields--count--offset--before-date-created--since-date-created--sort-field--sort-dir--has-ecommerce-store等开关,其中count默认值为 10、最大值为 1000,offset默认值为 0——这些取值约束直接源自 Mailchimp Swagger 规范的参数描述。每个命令还统一带有--extra-params(JSON 对象),用于透传未建模成独立开关的额外查询参数。

4.3 Campaigns

命令说明
campaigns list列出活动
campaigns get <CAMPAIGN_ID>获取活动信息
campaigns create --data '<json>'创建活动
campaigns update <CAMPAIGN_ID> --data '<json>'更新活动设置
campaigns delete <CAMPAIGN_ID>删除活动
campaigns send <CAMPAIGN_ID>立即发送活动
campaigns schedule <CAMPAIGN_ID> --data '<json>'排期发送
campaigns cancel-send <CAMPAIGN_ID>取消已排期的发送
campaigns pause <CAMPAIGN_ID>暂停 RSS 活动
campaigns resume <CAMPAIGN_ID>恢复 RSS 活动
campaigns replicate <CAMPAIGN_ID>复制活动
campaigns list-content <CAMPAIGN_ID>获取活动内容
campaigns list-send-checklist <CAMPAIGN_ID>发送前检查清单

4.4 Reports(投放报告)

命令说明
reports list列出所有活动报告
reports get <CAMPAIGN_ID>获取活动汇总报告
reports list-email-activity <CAMPAIGN_ID>逐订阅者打开/点击行为
reports list-click-details <CAMPAIGN_ID>链接点击明细
reports list-open-details <CAMPAIGN_ID>逐订阅者打开记录
reports list-unsubscribed <CAMPAIGN_ID>退订名单
reports list-locations <CAMPAIGN_ID>地域分布
reports list-domain-performance <CAMPAIGN_ID>分域名统计

4.5 Automations(自动化工作流)

命令说明
automations list列出自动化
automations get <WORKFLOW_ID>获取自动化信息
automations create --data '<json>'创建自动化
automations pause <WORKFLOW_ID>暂停自动化
automations start <WORKFLOW_ID>启动自动化
automations archive <WORKFLOW_ID>归档自动化
automations list-emails <WORKFLOW_ID>列出自动化邮件

4.6 E-commerce(电商数据)

命令说明
ecommerce list-ecommerce-stores列出店铺
ecommerce get <STORE_ID>获取店铺信息
ecommerce create --data '<json>'添加店铺
ecommerce list-ecommerce-stores-id-orders <STORE_ID>列出订单
ecommerce list-ecommerce-stores-id-products <STORE_ID>列出商品
ecommerce list-ecommerce-stores-id-customers <STORE_ID>列出顾客
ecommerce list-ecommerce-stores-id-carts <STORE_ID>列出购物车
ecommerce list-ecommerce-stores-id-promocodes <PROMO_RULE_ID> <STORE_ID>列出促销码

4.7 其余资源组速览

资源组说明
templates邮件模板(增删改查)
template-folders模板文件夹
campaign-folders活动文件夹
file-manager文件管理器中的文件与文件夹
landing-pages落地页(列出、创建、发布、取消发布)
sms-campaigns短信活动
surveys调查(列出、获取、发布)
reportingFacebook 广告与落地页报告
search-campaigns按查询词搜索活动
search-members跨全部受众搜索成员
batches批量 API 操作
batch-webhooks批量操作 webhooks
verified-domains发件域名验证
authorized-appsOAuth 已授权应用
connected-sites关联站点集成
conversations收件箱会话
activity-feed账号活动流
account-exports账号数据导出

补充说明:上表中很多“长命令”是生成器从 Swagger 路径自动命名的(如list-lists-id-members对应GET /lists/{list_id}/members),同时不少模块还维护了面向人的短别名(如create-memberslist-contentlist-send-checklist)。测试 test_core.py 中通过test_campaign_shortcut_aliases_match_generated_commandstest_report_shortcut_aliases_match_generated_commandstest_create_members_alias_matches_generated_command等用例,逐一断言了别名与实际 HTTP 路径的一致性。

五、设计决策与源码佐证

架构文档 MAILCHIMP.md 记录了六条核心设计决策,均能在源码中找到对应实现:

  1. 基于 Spec 的代码生成:303 个命令由 _codegen/generate.py 从 Mailchimp 公开的 Swagger 2.0 规范自动生成,生成产物直接入库。这样终端用户在拿到包后即可快速使用--help,无需现场下载规范。生成代码均带有“Auto-generated… Do not edit manually”的头部注释(见 lists.py 与 ping.py)。测试中还专门守护了生成质量:test_no_builtin_shadowing_in_function_names用 AST 检查生成函数不会遮蔽 Python 内建名。

  2. 仅环境变量认证:没有配置文件,MAILCHIMP_API_KEY是唯一事实来源。客户端在缺 Key 时抛出MailchimpAuthError(client.py),get_client()负责向 stderr 打印错误并以退出码 1 结束。

  3. 原样复制的repl_skin.py:REPL 皮肤按 CLI-Anything 贡献规则从cli-anything-plugin/repl_skin.py无修改复制,位于 utils/repl_skin.py。

  4. 路径参数作为位置参数:Mailchimp 路径中的{list_id}{campaign_id}等变量被生成为必填的位置 Click 参数,令命令保持简洁(例如campaigns get <CAMPAIGN_ID>)。

  5. 请求体统一走--dataJSON:POST/PATCH/PUT 的请求体以--data '{"key":"value"}'传入,避免为每个字段生成几十个 flag;这对 Agent 尤其友好——可以直接构造 JSON payload。每个生成命令还支持--extra-params(必须为 JSON 对象)来补充查询参数。

  6. Subscriber hash 工具cli_anything.mailchimp.core.client.subscriber_hash(email)实现了 Mailchimp 用于标识成员的 MD5 计算(先strip()去除首尾空白、再小写化邮箱后做 MD5),与 Node.js 参考实现保持一致。

六、输出策略:JSON、人类可读与错误信封

所有命令共享根级--json开关。在源码层面,mailchimp_cli.py 读取该开关后写入 output.py 的模块级标志USE_JSON,随后每个命令经_out()统一输出。

# 以 JSON 列出所有受众 cli-anything-mailchimp --json lists list # 以 JSON 获取某活动报告 cli-anything-mailchimp --json reports get abc123def # 管道给 jq —— 请使用 Mailchimp 原生字段名 cli-anything-mailchimp --json lists list | jq '.lists[].name' cli-anything-mailchimp --json campaigns list | jq '.campaigns[].id'

6.1 JSON 信封形态

命令输出的是Mailchimp API 原生响应结构(而非二次包装),因此字段名与 API 文档一致:

// 集合类端点 —— 键与资源名一致(lists、campaigns、members 等) {"lists": [...], "total_items": 42, "_links": [...]} {"campaigns": [...], "total_items": 10, "_links": [...]} // 单资源 GET / POST / PATCH {"id": "abc123", "name": "My List", ...} // DELETE {"ok": true, "message": "Deleted."} // 错误 {"ok": false, "message": "Resource Not Found: ...", "data": {...}}

各形态在 output.py 中均有对应实现:_out()USE_JSON=True时打印美化 JSON;_out_ok()用于变更类操作,输出{"ok": true, "message": ...}_out_err()将 HTTP 状态、titledetail与原始错误体(Mailchimp Problem Detail)打包为{"ok": false, ...}并写入 stderr、以非零码退出。其中 DELETE 的{"ok": true}由 client.py 的delete()统一返回。

人类可读模式下,单对象输出紧凑的键值对,集合输出带注解的列表,错误使用彩色前缀、成功使用前缀。

6.2 分页与全量拉取

集合命令直接暴露 Mailchimp 原生的countoffset查询参数,但CLI 默认不会自动翻页拉取全部数据——单次返回一页,其余数据由调用方按需翻页。若需要在脚本里做多页迭代,可借助 pagination.py 提供的分页器原语:paginate(client, path, result_key)以生成器逐页产出全部条目,collect(client, path, result_key)则返回(items, total_items)元组。测试覆盖了单页、多页、空结果以及“恰好一页满时不多拉第二次空页”的边界(test_exact_page_boundary_no_extra_fetch)。

七、常用 Agent 模式

技能文件 SKILL.md 整理了一组开箱即用的“Agent 模式”,全部是命令 + jq的组合:

# 获取账号健康状态 cli-anything-mailchimp --json ping | jq '.health_status' # 列出所有受众 ID 与名称 cli-anything-mailchimp --json lists list | jq '.lists[] | {id, name}' # 找出某受众中所有已订阅成员 cli-anything-mailchimp --json lists list-lists-id-members <list_id> --status subscribed | jq '.members[].email_address' # 创建活动并抓取其发送前检查清单 cli-anything-mailchimp --json campaigns create --data '{"type":"regular","settings":{"subject_line":"Hello","from_name":"Me","reply_to":"me@example.com"}}' | jq '.id' cli-anything-mailchimp --json campaigns list-send-checklist <campaign_id> | jq '.items[] | select(.result == false)' # 获取某已发送活动的退订名单 cli-anything-mailchimp --json reports list-unsubscribed <campaign_id> | jq '.unsubscribes[].email_address' # 向受众添加成员(subscriber hash = 小写邮箱的 MD5) cli-anything-mailchimp --json lists create-members <list_id> --data '{"email_address":"user@example.com","status":"subscribed"}' # 跨全部受众搜索某成员 cli-anything-mailchimp --json search-members list --query "user@example.com" | jq '.exact_matches.members[]'

注意--data必须是可以被json.loads成功解析的合法 JSON;若传入{bad这类非法字符串,Click 会以退出码 2 报出Invalid value for --data ... valid JSON,而不会打印堆栈(test_invalid_data_json_reports_click_error用例验证了这一行为)。

八、交互式 REPL

不带任何参数运行cli-anything-mailchimp即进入 REPL。根 CLI 的invoke_without_command=True会拦截空调用并转发给_start_repl()(见 mailchimp_cli.py);REPL 通过prompt_toolkit读取输入、用shlex分词后,以standalone_mode=False复用同一个 Click CLI 执行,因此 REPL 内语法与命令行完全一致。help/?会列出所有资源组的一行简介,quit/exit/q或 Ctrl-C/Ctrl-D 退出:

◆ cli-anything · Mailchimp v0.1.0 Type help for commands, quit to exit ◆ mailchimp ❯ ping ✓ {"health_status": "Everything's Chimpy!"} ◆ mailchimp ❯ --json lists list {"lists": [...], "total_items": 3, "_links": [...]} ◆ mailchimp ❯ quit

九、HTTP 客户端底层原理

核心客户端实现在 core/client.py,值得关注以下几个机制:

  • 数据中心自动推导_server_prefix()从 API Key 后缀(-之后的最后一段)提取dc(如us8),缺失连字符时抛出带提示的ValueError。测试TestServerPrefix验证了abc123-us8 → us8xyz-eu2 → eu2的推导,以及无后缀 Key 会抛错。
  • 基础 URL 拼接:请求基址为https://<dc>.api.mailchimp.com/3.0,超时统一为 30 秒。
  • 认证方式:HTTP Basic Auth,用户名为任意字符串anystring,密码即 API Key(client._session.auth = ("anystring", key));请求头携带User-Agent: cli-anything-mailchimp/0.1.0。测试test_auth_header断言了该元组形态。
  • 错误建模:非 2xx 响应会被_raise()解析为MailchimpError(status, title, detail, raw)——优先取 JSON 中的title/detail,解析失败则退回 HTTP reason 与前 200 字符响应体。测试test_get_error_raises构造 404 响应并断言异常携带的statustitle
  • 动词映射get/post/patch/put/delete分别对应 HTTP 方法;post对 204 No Content 返回{}delete统一返回{"ok": True}

十、注意事项与常见坑

技能文档与源码共同确认了以下关键约束,接入时务必留意:

  • Subscriber hash:Mailchimp 以“小写化邮箱的 MD5”作为成员标识。可用内置工具函数或以下一行命令计算:

    python -c "import hashlib; email='email@example.com'; print(hashlib.md5(email.strip().lower().encode()).hexdigest())"

    实现位于 client.py,其正确性由测试TestSubscriberHash守护(对test@example.com输出已知 MD5 值55502f40dc8b7c769880b10874abc9d0,且先去除首尾空白、再小写化)。

  • 请求体:所有 POST/PATCH/PUT 命令都接受--data '<json>',各端点的字段 schema 以 Mailchimp API 端点文档为准。

  • 数据中心后缀MAILCHIMP_API_KEY必须包含-us8-eu2这类后缀,CLI 会自动从中解析机房前缀,无需手工配置 base URL。

  • 速率限制:Marketing API 限制为 10 个并发连接外加账号级滚动限额;批量写入场景应使用batches资源组走 Batch API,而不是并发发起大量单条请求。

  • 分页默认值:集合命令的count默认 10、最大 1000,CLI 不自动翻页,需要全量数据时请显式翻页或使用分页工具。

十一、质量保障:测试布局

仓库为该 harness 提供了两级测试,分别位于 tests/:

  • 单元测试 test_core.py:无需 API Key 即可运行。覆盖客户端地址推导与认证、subscriber_hash归一化、缺 Key 时报错退出、基于responses库 mock 的 GET/POST/DELETE 与错误处理、分页边界、输出模块的 JSON 模式,以及大批“生成代码回归”用例(30 个资源组可导入、命令必须带--extra-params、别名与真实 HTTP 路径一致、非法 JSON 报 Click 错误而非 Traceback 等)。
  • 端到端测试 test_full_e2e.py:包含 9 个真实链路用例,以是否设置MAILCHIMP_API_KEY为门槛决定是否执行。

若你希望进一步深入命令细节,可直接阅读随包分发的完整命令参考 skills/SKILL.md(也随包安装,见 setup.py 的package_data),或查看某资源组生成源码,如 lists.py、campaigns.py。结合本文的架构说明与命令表格,你可以把cli-anything-mailchimp无缝嵌入到 Shell 脚本、CI 管道或 Agent 工具调用中,以统一的命令行界面驱动 Mailchimp 的营销自动化能力。

【免费下载链接】CLI-Anything"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 4:36:29

Happy-LLM 教程导读:从零开始构建大模型的学习路线与实践指南

Happy-LLM 教程导读&#xff1a;从零开始构建大模型的学习路线与实践指南 【免费下载链接】happy-llm &#x1f4da; 从零开始构建大模型 项目地址: https://gitcode.com/GitHub_Trending/ha/happy-llm 本篇文章是 Datawhale 开源项目 Happy-LLM&#xff08;仓库路径 doc…

作者头像 李华
网站建设 2026/9/10 4:36:18

WavLM 全栈语音预训练模型解析与 Transformers 实战指南

WavLM 全栈语音预训练模型解析与 Transformers 实战指南 【免费下载链接】transformers &#x1f917; Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and …

作者头像 李华
网站建设 2026/9/10 4:35:56

SpringBoot+Spark打造汽车销售推荐系统:从协同过滤到冷启动实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 4:35:24

TradingAgents-CN 任务执行控制与数据同步功能增强实战解析

TradingAgents-CN 任务执行控制与数据同步功能增强实战解析 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 日期: 2025-11-07 作者: TradingAgen…

作者头像 李华
网站建设 2026/9/10 4:34:35

TT马达驱动入门:STM32电机控制的地基三问与硬件闭环实践

1. 为什么TT马达是STM32入门电机控制的“第一块砖”你拆开过玩具车、智能小车套件或者学生实训板吗&#xff1f;十有八九&#xff0c;里面躺着两颗黄铜色、带塑料齿轮箱、直径约13mm的小圆柱——这就是TT马达。它不是工业伺服&#xff0c;不是无刷航模电机&#xff0c;更不是48…

作者头像 李华