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

How to unsubscribe / delete list members using Mailchimp3 in Python?

我在 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": "user@somemail.com", "status": "subscribed"}

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

{"email_address": "user@somemail.com", "status": "unsubscribed"}

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

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

提前致谢!

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

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

其实是我使用了一些错误的函数,所以这里是固定的代码。我对批次的大小也有一些问题。最大批次大小为 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)