2016-03-30 4 views
0

Я пытаюсь получить весь адрес электронной почты абонентов из определенного списка (который имеет уникальный listid) в Mailchimp.с помощью python для извлечения всего адреса электронной почты подписчиков из определенного списка в mailchimp

Если я печатаю корпус, выход находится в формате json, как показано ниже.

Я пытаюсь преобразовать json в словарь.

После того, как он был преобразован в словарь, я хотел бы получить все email_address.

После получения всего адреса электронной почты я хотел бы зашифровать его с помощью md5.

Однако я столкнулся с ошибкой «TypeError: ожидаемая строка или буфер».

Я действительно новичок в python, попытаюсь решить проблему, но не смог. Спасибо, что посмотрел на мой вопрос.

/* My python code */ 

params = { 
    'apikey': 'xyz', 
    'listId': 'abc' } 

config = MailChimpConfig() 
endpoint = "https://us5.api.mailchimp.com/3.0/lists/'listId'/members? 
apikey='apikey'&status=subscribed" 

while True: 
    response = requests.get(endpoint, auth=('apikey', config.apikey), 
          params=params, verify=False) 
    try: 
    response.raise_for_status() 

    body = response.json 
    dict = json.loads(body) 
    print(dict.members[0].email_address) 
    break 
    except requests.exceptions.HTTPError as err: 
    print "Error: {} {}".format(str(response.status_code), err) 
    print json.dumps(response.json(), indent=4) 
    break 
    except ValueError: 
    print "Cannot decode json, got %s" % response.text 
    break 
    /* end of my python code */ 



/* If I print body, the output is in json format as below:*/ 

{ 
- members: [ 
    - { 
     id: "", 
     email_address: "[email protected]", 
     etc:"" 
    }, 
    - { 
     id: "", 
     email_address: "[email protected]", 
     etc:"" 
    } 

/* end of json format */ 
+0

* Рядом *: не пытайтесь se имена встроенных функций как переменных в вашей программе. 'dict' является заводской функцией для создания объектов словаря. Если вы кооптируете это имя, вы не сможете впоследствии вызвать 'dict()'. –

+0

Кроме того, эти '-' буквально присутствуют в тексте JSON? Если это так, я не думаю, что это действительно JSON. –

+0

Если вы используете v3 API, идентификатор абонента - это адрес md5 для адреса электронной почты. – TooMuchPete

ответ

1

Это не правильно:

body = response.json 
dict = json.loads(body) 

response.json не является объектом JSON или str, она является функцией. При вызове он возвращает объект Python, который представляет данные из JSON ответа.

Попробуйте это:

# UNTESTED 

# Interpret the JSON string: 
data = response.json() 

# Print one of the email addresses: 
print(data['members'][0]['email_address']) 

# Print all of the email addresses 
addresses = [x['email_address'] for x in data['members']] 
print(addresses) 

После того, как у вас есть список адресов, вы можете распечатать контрольную сумму MD5 каждый адрес Thusly:

# UNTESTED 
for address in addresses: 
    print(hashlib.md5(address.encode('utf-8')).hexdigest()) 

Если вы предпочли бы напечатать один MD5, который представляет все адреса:

# UNTESTED 
md5 = hashlib.md5() 
for address in sorted(addresses): 
    md5.update(address.encode('utf-8')) 
print(md5.hexdigest()) 
+0

Спасибо за ваше предложение. Я отредактировал его, но после компиляции у него есть TypeError: объект «instancemethod» не имеет атрибута «__getitem__» – user21

+0

Вы, кажется, пропустили мою основную точку: вы должны поставить круглые скобки после слова «json»: 'data = response.json () ' –

+0

Привет, Роб, спасибо! Я так счастлив, что адрес электронной почты был окончательно распечатан! У вас есть представление о том, как преобразовать его в md5 – user21