如何在Python中使用Mailchimp3取消订阅/删除列表成员?

问题描述 投票:0回答:2

我在Python中使用mailchimp3。我设法使用此功能批量插入用户:

client = MailChimp(USERNAME, APIKEY)
def fill_list(list_id, subscribers_data):
    data = {'operations': create_subscriptions_data(list_id, subscribers_data)}
    client.batches.create(data)

def create_subscriptions_data(list_id, users_data):
    return [{'method': 'PUT',
             'path': 'lists/{}/members/{}'.format(list_id, str(md5(user['email_address'].encode('utf-8')))),
             'body': json.dumps(user)} for user in users_data]

这是一个用户字典的样子:

{"email_address": "[email protected]", "status": "subscribed"}

然后我想使用类似的方法来取消订阅用户列表。为了实现这一目标,我尝试使用相同的逻辑,只是为了更改用户对象。现在,我使用了这个用户格式:

{"email_address": "[email protected]", "status": "unsubscribed"}

它不会更新订阅状态。当我手动删除所有用户(使用网络界面)并尝试相同的命令时,我成功创建了“状态”:“取消订阅”的用户。我想知道为什么这种方法不能改变状态?我也尝试使用 POST 而不是 PUT,但它不起作用。知道可能是什么问题吗?

我使用了这个参考文献https://devs.mailchimp.com/blog/batch-operations-and-put-in-api-v3-0/它提到这种方法也应该适用于更新。

提前谢谢您!

python mailchimp-api-v3.0
2个回答
4
投票

取消订阅已订阅用户的唯一方法是使用列表 ID 和列表成员电子邮件地址小写版本的 MD5 哈希进行更新。

client.lists.members.update(
    'LIST_ID', 'MD5 HASH', {"status": "unsubscribed"}
)

1
投票

实际上,我使用了一些错误的函数,所以这里是修复的代码。我对批次的大小也遇到了一些问题。最大批量大小为 500,因此我将数据拆分为多个批次。 这是如何完成插入的简单代码:

client = MailChimp(USERNAME, APIKEY)

def _update_list(list_id: str, members_data: list):
    client.lists.update_members(list_id, {'members': members_data, 'update_existing': True})

members_data 中的每个成员都有这样的数据:

mailchimp_user = {
        'email_address': user.email,
        'status': user.subscription_status,
        'merge_fields': {
            'FNAME': user.first_name,
            'LNAME': user.last_name
        },
        'interests': {}
    }

最重要的功能来了:

def fill_in_multiple_batches(list_id, mailchimp_members):
    step_size = 400

    for i in range(0, len(mailchimp_members), step_size):
        batch_start_idx = i
        batch_end_idx = min(i + step_size, len(mailchimp_members))
        this_batch_of_members = mailchimp_members[batch_start_idx:batch_end_idx]

        client.lists.update_members(list_id, {'members': members_data, 'update_existing': True})

之后,在脚本的主体部分:

if __name__ == '__main__':
    fill_in_multiple_batches('your_list_id', your_data_list)
© www.soinside.com 2019 - 2024. All rights reserved.