
后端云原生【免费下载链接】botoFor the latest version of boto, see https://github.com/boto/boto3 -- Python interface to Amazon Web Services项目地址https://gitcode.com/gh_mirrors/bo/boto点击查看免费下载本指南以 boto 仓库中 MWSMarketplace Web Service相关文档与实现为核心系统讲解boto.mws模块的架构设计、连接管理、声明式 XML 响应解析、异常模型与分页迭代等核心能力并结合源码与单元测试给出可直接运行的实战用法。读完本文你将掌握如何用MWSConnection调用 Feeds、Reports、Orders、Products、Inbound/Outbound、OffAmazonPayments 等 13 个 API 分区如何利用iter_call/iter_response自动翻页以及如何理解 MWS 响应对象内部的_result结构与声明式类型系统。模块概览boto.mws 由哪些部分组成boto 仓库中的 MWS 支持位于 boto/mws 目录主要由四个文件构成文件职责init.py包声明主要承载版权与许可信息模块逻辑集中在其余文件connection.py定义核心类MWSConnection实现全部 API 调用、装饰器工厂与请求发送exception.py定义ResponseErrorFactory及错误响应类型ResponseError、RetriableResponseError等response.py声明式 XML 响应解析框架ResponseElement、Element、ElementList、MemberList、SimpleList、ResponseFactory及大量具体结果类对应 API 文档页 docs/source/ref/mws.rst 通过 Sphinx 的automodule指令将boto.mws、boto.mws.connection、boto.mws.exception、boto.mws.response四个模块的公开成员:members:与:undoc-members:自动提取为参考手册因此本文所讲的每个类与方法都能在该文档页及其源码中找到对应定义。建立 MWS 连接MWSConnection 的初始化与关键参数构造参数与身份字段MWSConnection继承自 boto 的AWSQueryConnection见 connection.py构造时默认hostmws.amazonservices.com并重点处理两个身份参数Merchant从关键字参数中弹出作为商家标识SellerId从关键字参数中弹出若未显式传入则回退为Merchant的值。两个字段互为兜底self.Merchant kw.pop(Merchant, None) or kw.get(SellerId)self.SellerId同理。构造示例from boto.mws.connection import MWSConnection mws MWSConnection( aws_access_key_idAKIA..., aws_secret_access_keyyour-secret-key, MerchantYOUR_MERCHANT_ID, # 或传 SellerId debug0, )此外还支持两个特殊关键字sandboxTrue开启沙箱模式。_sandboxify方法会在请求路径的倒数第二个路径段追加_Sandbox后缀见 connection.py用于向 Amazon 沙箱环境发起调用避免产生真实业务影响factory_scopes[...]向响应工厂追加自定义查找作用域用于扩展默认的解析器注册表见_setup_factoriesconnection.py。MWSConnection还声明了_required_auth_capability()返回[mws]表明该连接使用 MWS 专用签名认证能力。API 分区与版本、路径映射MWS 服务按业务域划分成多个独立的 API 分区每个分区有独立的 API 版本、请求路径以及“卖家标识参数名”。这一映射集中在api_version_path字典中connection.py分区名API 版本卖家标识参数请求路径Feeds2009-01-01Merchant/Reports2009-01-01Merchant/Orders2013-09-01SellerId/Orders/2013-09-01Products2011-10-01SellerId/Products/2011-10-01Sellers2011-07-01SellerId/Sellers/2011-07-01Inbound2010-10-01SellerId/FulfillmentInboundShipment/2010-10-01Outbound2010-10-01SellerId/FulfillmentOutboundShipment/2010-10-01Inventory2010-10-01SellerId/FulfillmentInventory/2010-10-01Recommendations2013-04-01SellerId/Recommendations/2013-04-01CustomerInfo2014-03-01SellerId/CustomerInformation/2014-03-01CartInfo2014-03-01SellerId/CartInformation/2014-03-01Subscriptions2013-07-01SellerId/Subscriptions/2013-07-01OffAmazonPayments2013-01-01SellerId/OffAmazonPayments/2013-01-01每次 API 调用通过api_action装饰器读取该映射自动填充Action与Version参数并把Merchant/SellerId值写入对应字段见 connection.py。若构造连接时既未传Merchant也未传SellerId调用时会抛出KeyError并提示“Set the MWSConnection.{attribute} attribute?”。装饰器体系参数校验、列表展平与请求构造的底层机制boto.mws最鲜明的实现特色是使用装饰器栈对每个 API 方法做参数规范。所有装饰器都通过add_attrs_from把action、response、section、quota、restore、version等属性透传到包装函数上并维护__wrapped__链见 connection.py单元测试 tests/unit/mws/test_connection.py 的test_decorator_order正是遍历api_call_map校验装饰器顺序。参数约束装饰器requires(*groups)要求必须同时提供某组参数支持多组“或”语义例如submit_feed要求FeedTypeconnection.pyget_report要求ReportIdlist_orders则叠加了多层约束exclusive(*groups)多组参数至多只能命中一组防止同时传入互斥条件dependent(field, *groups)当某字段出现时必须伴随指定参数组之一requires_some_of(*fields)要求至少提供其中一个字段。这些装饰器在参数不满足时统一抛出KeyError并在__doc__中追加“Required: ... / Either: ...”说明开发者可通过help()查看约束。请求构造装饰器structured_lists(*fields)把 Python 列表转换成 MWS 的重复参数格式。例如字段MarketplaceIdList.Id会被展开为MarketplaceIdList.Id.1、MarketplaceIdList.Id.2……connection.py这正是submit_feed与request_report支持多站点上传的原因structured_objects(*fields, membersFalse)将ResponseElement、字典、可迭代对象等“结构化对象”拍平为带前缀的请求参数由destructure_object递归处理connection.py布尔值转小写字符串、字符串直接赋值、可迭代对象按member.1/member.2编号。test_destructure_object在 tests/unit/mws/test_connection.py 中给出了完整的输入/输出对照boolean_arguments(*fields)把 Python 布尔参数转为 MWS 需要的true/false小写字符串http_body(field)用于需要上传正文的调用如submit_feed从参数中取出FeedContent与content_type自动计算Content-MD5摘要并放入请求头connection.py。配额声明每个 API 调用在api_action中声明了quota与restore恢复速率单位每秒如 Feeds 分区submit_feed的quota15, restore120Orders 分区list_orders的quota6, restore60Inbound/Outbound 分区多为quota30, restore0.5。api_call_map同时记录每个 Action 与对应方法名的映射connection.py供method_for反向查询。API 调用速查13 个分区的核心方法MWSConnection将 100 余个 API 操作组织为同名方法按分区归纳如下完整定义见 connection.pyFeeds商品数据上传版本 2009-01-01submit_feed(FeedType, FeedContent, MarketplaceIdList, content_type, PurgeAndReplaceFalse)上传数据 Feed需要 FeedContent 正文与 content_type自动附加 Content-MD5get_feed_submission_list(...)查询近 90 天提交的 Feed 列表get_feed_submission_list_by_next_token(NextToken)基于 NextToken 翻页get_feed_submission_count(...)统计 Feed 提交数量cancel_feed_submissions(...)取消一个或多个 Feed 提交get_feed_submission_result(FeedSubmissionId)获取 Feed 处理报告。Reports报表版本 2009-01-01request_report(ReportType, MarketplaceIdList, ReportOptions...)创建报表请求get_report_request_list / get_report_request_count / cancel_report_requests管理报表请求get_report_list / get_report_count / get_report(ReportId)查询并下载报表manage_report_schedule(ReportType, Schedule)创建/更新/删除报表调度get_report_schedule_list / get_report_schedule_count查询调度计划update_report_acknowledgements(ReportIdList, Acknowledged)更新报表确认状态。Orders订单版本 2013-09-01list_orders(MarketplaceId, CreatedAfter 或 LastUpdatedAfter, ...)按时间窗查询订单方法内部对BuyerEmail、SellerOrderId、时间字段等做了大量互斥校验connection.pylist_orders_by_next_token(NextToken)订单翻页get_order(AmazonOrderId)按订单号查询list_order_items(AmazonOrderId) / list_order_items_by_next_token查询订单商品明细。Products商品版本 2011-10-01list_matching_products(MarketplaceId, Query)按关键词搜索商品get_matching_product(ASINList) / get_matching_product_for_id(IdType, IdList)按 ASIN 或 ID 批量取商品get_competitive_pricing_for_sku / _for_asin获取竞争定价get_lowest_offer_listings_for_sku / _for_asin获取最低报价get_my_price_for_sku / _for_asin获取自有报价get_product_categories_for_sku / _for_asin获取商品类目。Fulfillment入库/出库/库存Inboundcreate_inbound_shipment_plan、create_inbound_shipment、update_inbound_shipment、list_inbound_shipments、list_inbound_shipment_items及对应*_by_next_tokenOutboundget_fulfillment_preview(Address, Items)、create_fulfillment_order(...)、get_fulfillment_order(SellerFulfillmentOrderId)、list_all_fulfillment_orders、cancel_fulfillment_order、get_package_tracking_details(PackageNumber)Inventorylist_inventory_supply(SellerSkus 或 QueryStartDateTime)。其余分区Sellerslist_marketplace_participations获取可销售站点与参与信息Recommendationsget_last_updated_time_for_recommendations、list_recommendationsCustomerInfolist_customers、get_customers_for_customer_idCartInfolist_carts、get_cartsSubscriptionsregister_destination、create_subscription、get_subscription、update_subscription、delete_subscription、list_subscriptions、send_test_notification_to_destination等OffAmazonPaymentsset_order_reference_details、confirm_order_reference、cancel_order_reference、close_order_reference、authorize、capture、refund、get_authorization_details、get_capture_details、get_refund_details等支付全流程操作。服务状态检查每个分区都提供get_xxx_service_status()配额2, restore300。注意get_service_status是一个“提示型”方法connection.py直接调用会抛出AttributeError并在异常消息中列出所有可用分区名提示应调用get_(section)_service_status()。集成测试 tests/integration/mws/test.py 中验证了get_inbound_service_status的返回状态值属于(GREEN, GREEN_I, YELLOW, RED)之一。方法名双向解析与自动分页method_for、iter_call、iter_response方法名解析method_for(name)connection.py接受 CamelCase如ListOrders或下划线小写如list_orders两种风格的方法名通过api_call_map返回真正的调用方法。它是自动分页机制的基础设施。自动分页MWS 对大数据量结果采用NextTokenHasNext的分页协议。iter_call(call, *args, **kw)与iter_response(response)将其封装为生成器connection.py# 方式一按调用名自动翻页 for page in mws.iter_call(list_orders, MarketplaceId..., CreatedAfter...): result page._result for order in result.Orders.Order: print(order.AmazonOrderId) # 方式二拿到首个响应后自动翻页 first mws.get_feed_submission_list() for page in mws.iter_response(first): for info in page._result.FeedSubmissionInfo: print(info.FeedSubmissionId, info.FeedType, info.FeedProcessingStatus)iter_response的判定逻辑为只要当前响应_result.HasNext true就调用method_for(response._action ByNextToken)获取下一页并以NextToken继续请求。因此所有支持翻页的操作Orders、Reports、Feeds、Inbound、Products 等都可以复用同一套迭代代码。该机制依赖响应对象的_action属性_action由响应类名去掉Response后缀得到见 response.py。声明式响应解析ResponseElement、Element 与成员列表MWS 的 XML 响应结构复杂含命名空间、嵌套元素、重复成员boto.mws.response用一套“声明式”框架把 XML 直接映射成 Python 对象这也是docs/source/ref/mws.rst中boto.mws.response一节所展示的主要内容。核心类型ResponseElement(dict)所有响应对象的基类本身是 dict 子类属性既可obj.Attr访问也可obj[Attr]访问。startElement/endElement由 SAX 解析驱动response.pyElement声明一个单值子元素在start时实例化_hint类teardown时把值写回父对象SimpleList收集一组标量文本end时 append 到列表ElementList收集一组同名元素对象每个元素都实例化_hintMemberList解析 MWS 特有的member.../member包裹结构response.py可嵌套声明支持空列表与缺失列表ComplexType(dict)带Value属性的复合类型容器。声明方式非常直观例如 Feeds 分区的响应类class FeedSubmissionInfo(ResponseElement): pass class SubmitFeedResult(ResponseElement): FeedSubmissionInfo Element(FeedSubmissionInfo) class GetFeedSubmissionListResult(ResponseElement): FeedSubmissionInfo ElementList(FeedSubmissionInfo)响应工厂与 JIT 动态类型ResponseFactoryresponse.py负责“Action → 响应类”的寻址find_element(action, Response, Response)先在注册的作用域默认是boto.mws.response模块中查找{Action}Response类若不存在则回退到{Action}Result基类并自动为响应类装配{Action}Result的ElementByNextToken后缀的操作会先尝试匹配去掉ByNextToken的响应类再通过element_factory动态生成子类保证xxxResult结构一致若仍找不到用element_factory生成 JIT 动态类类名形如JIT_...在__repr__中会显示为^{name}^。单元测试 tests/unit/mws/test_response.py 用 9 组测试覆盖了嵌套元素、MemberList、ElementList、SimpleList、空/缺失列表等全部解析分支是理解该框架最好的示例。复杂类型金额、重量与尺寸针对跨境电商场景响应框架内置了专门的数值类型均在 response.pyComplexAmount/ComplexMoney货币类型Amount/Value字段自动转Decimal__repr__输出如USD 19.99可直接float()转换ComplexWeight重量类型含Value与UnitComplexDimensions/Dimension包装尺寸支持 Height/Length/Width/Weight 四维__repr__输出如8.50in x 5.00in x 1.00in这些类型在FulfillmentPreview、Price、OrderItem、Product等类中大量复用例如订单类Order的OrderTotal Element(ComplexMoney)response.py。响应对象的访问模式所有响应对象均可通过_result属性直达业务结果_result即{Action}Result属性response.pyresp mws.list_matching_products(MarketplaceIdATVPDKIKX0DER, Queryboto) for product in resp._result.Products.Product: print(product.Identifiers.MarketplaceASIN.ASIN) print(product.AttributeSets.ItemAttributes[0].Title)注意 Products 分区的商品对象声明了_namespace ns2response.pystrip_namespace装饰器会在 SAX 回调前剥掉命名空间前缀response.py这也是boto.mws.response能正确处理跨命名空间响应的关键。错误处理模型ResponseError 与可重试错误boto.mws.exception定义了 MWS 专属的异常体系exception.pyResponseErrorFactory__call__(status, reason, body)先构造BotoServerError再用find_element(server.error_code, , ResponseError)按错误码在异常模块中查找对应异常类找不到则回退到ResponseErrorResponseError(BotoServerError)通用响应错误基类带retry标志默认False__str__会拼出“异常名 reason (Retriable) 标记 错误信息”RetriableResponseError(ResponseError)retry True代表可重试错误具体错误类型InvalidParameterValue参数值无效、InvalidParameter参数无效、InvalidAddress地址无效等。请求侧的处理位于_post_requestconnection.py任何BotoServerError如鉴权失败、限流都会经_response_error_factory转换为 MWS 异常类型后抛出若响应体为空或 HTTP 状态码非 200同样抛出对应的响应错误若响应头携带Content-MD5还会校验响应体摘要是否一致防止传输损坏。沙箱测试与集成验证单元测试tests/unit/mws/test_response.py覆盖响应解析的全部数据结构分支嵌套元素、成员列表、空/缺失列表、简单列表等并演示了如何用ResponseFactory(scopes[...])注入自定义作用域进行局部解析测试tests/unit/mws/test_connection.py验证destructure_object的输入输出转换、装饰器顺序约束以及基于GetFeedSubmissionListResponse模拟 XML 的解析流程。集成测试tests/integration/mws/test.py 需要环境变量MWS_MERCHANT指向真实的 Merchant/SellerId 才能启用未设置时会打印提示并跳过测试验证内容包括get_feed_submission_list、get_inbound_service_status状态值、list_marketplace_participations获取站点 ID、get_product_categories_for_asin的类目 ID 断言、list_matching_products搜索等。集成测试中的用法如response.GetServiceStatusResult.Status、response._result.Self正是上文响应访问模式的真实写照。总结什么时候该用 boto.mwsboto.mws是 boto 中对 Amazon MWS 的完整封装覆盖从商品数据上传Feeds、报表Reports、订单Orders、商品检索Products、仓储履约Fulfillment到支付OffAmazonPayments的全链路。相比直接拼接 MWS 的 REST 请求它提供用requires/exclusive/structured_lists等装饰器在调用前完成参数校验与格式化避免手写重复的请求参数组装用声明式响应类自动把嵌套 XML含命名空间与member包裹解析为可点属性访问的 Python 对象并通过ResponseFactory自动匹配Action对应的结果类型用iter_call/iter_response统一处理NextToken分页用ResponseErrorFactory将服务端错误码映射为带retry语义的异常类型。需要注意的是Amazon 已于 2023 年 3 月停止 MWS 服务并迁移至 SP-API本模块的 API 版本与参数以当前仓库源码为准适用于历史 MWS 对接场景或作为理解 MWS 协议及 boto 声明式 XML 框架的参考实现。若需编写基于本模块的代码请以 boto/mws/connection.py 中的方法签名与文档字符串为最终依据并可通过 docs/source/ref/mws.rst 生成的 API 参考页查阅每个类与方法的完整签名。赞分享后端云原生【免费下载链接】botoFor the latest version of boto, see https://github.com/boto/boto3 -- Python interface to Amazon Web Services项目地址https://gitcode.com/gh_mirrors/bo/boto点击查看免费下载相关推荐Dopamine 指标采集体系metrics 模块完全指南Collector、CollectorDispatcher 与三大内置收集器Dopamine 指标采集体系metrics 模块完全指南Collector、CollectorDispatcher 与三大内置收集器 Dopamine后端云原生Mesop Web Components 实战指南用 Python 封装任意 JavaScript 能力Mesop Web Components 实战指南用 Python 封装任意 JavaScript 能力 Mesop 提供了一套基于 Web Componen前端后端Web框架boto.mturk 模块全解析基于 boto 的 Amazon Mechanical Turk 请求方RequesterAPI 开发指南boto.mturk 模块全解析基于 boto 的 Amazon Mechanical Turk 请求方RequesterAPI 开发指南 导读 本文基于后端云原生上一篇B站直播录制与AI自动成片bilive 完整上手指南下一篇OpenClaw 多智能体实战指南创建专属 Writer 命名智能体为你的 Claw 组建写作团队创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考