使用 Python 向 mailchimp API 发送 POST 请求

Send POST request to mailchimp API with Python

我正在尝试向 mailchimp api 发送 POST 请求以将新成员添加到列表中,但我一直收到错误提示 api 键是失踪。当我发送 get 请求时,我将密钥包含在 URL 中并且它正常工作。

从 Mailchimp 文档看来 api 键应该是请求的一部分,而参数(email_address 和状态)应该是 body 的一部分,但我不'了解如何使用请求来做到这一点。 (我知道 Python 有一个 mailchimp 模块,但我有一些自定义的事情要做,我想解决这个问题)

这是 POST 我要开始的:

import requests
url="https://us15.api.mailchimp.com/3.0/lists/xxxxx/members/"

header ={"Authorization":"apikey xxxxx",
"email_address":"test@gmail.com",
"status":"subscribed"}

r=requests.post(url,header)
print r.text

我得到的错误是:{"type":"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/","title":"API Key Missing","status":401,"detail":"Your request did not include an API key.","instance":""}

我也尝试将此请求放在 Postman 中,您可以轻松地将 header 和 body 分开,但它给出了相同的响应。

我也尝试过使用 Mailchimp3 包,但这给了我一个错误的请求。我使用的代码如下:

from mailchimp3 import MailChimp

client = MailChimp('edgar@mymailserver.nl', '{}-{}'.format('xxxxxxxxxxxxxxxxxxxxxxx','us15'))

client.lists.members.create('2be23de2cc', {'email_address': 'john.doe@example.com','status': 'subscribed'})

但是,我收到以下错误:requests.exceptions.HTTPError:400 客户端错误:url 的错误请求:https://us15.api.mailchimp.com/3.0/lists/2be23de2cc/members

你为什么不试试这个包呢? https://github.com/charlesthk/python-mailchimp

您可以通过以下方式做到这一点:

from mailchimp3 import MailChimp
client = MailChimp('my_user', '{}-{}'.format(access_token, data_center))
client.lists.members.create('my_list_id', {'email_address': 'test@gmail.com', 'status': 'subscribed'})

测试时,请不要使用假邮件进行测试,因为 Mailchimp 有一种全局禁止列表来忽略垃圾邮件发送者使用的电子邮件。在这种情况下,它将 return HTTP 400。

忽略代码中的拼写错误 header ={"Authorization","apikey xxxxx",,您不会发送凭据或 header 中的数据。您首先需要进行身份验证,然后将订阅者信息作为 POST 有效载荷发送,如下所示:

import pprint
import requests

username = 'foo'
apikey = 'sekret-key-goes-here'
url = "https://us15.api.mailchimp.com/3.0/lists/xxxxx/members/"

post_params = {'email_address': 'foo@example.com', 'status': 'subscribed'}

r = requests.post(url, auth=(username, apikey), json=post_params)
r.raise_for_status()

results = r.json()
pprint.pprint(results)