Search
Write a publication
Pull to refresh

Поздравление друзей Вконтакте — простое сочетание Python + vk API

Новогодняя суматоха и праздники интересовали меня меньше, чем стремление к тому, чтобы узнать что-нибудь новенькое. В один из предновогодних вечеров, я, сидя за чашечкой чая на кухне, вспоминал предыдущие новогодние дни. «Каждый раз пишу друзьям, а может сейчас отдать эту работу программе и пойти отмечать?», — подумал я и тут же сел за изучения API разных социальных сетей.

О том, как я боролся с мелкими трудностями и о подробных моих раздумьях я расскажу дальше.

Изучив несколько статей на Хабре и пересмотрев всю документацию разных социальных сетей, я решил, что Вконтакте API в связке с Python будут очень гармоничны. Почему? Во-первых, все запросы, вышеупомянутого API, возвращают ответ в виде json, с которым в Python очень удобно работать. Во-вторых, отправка запросов совершается куда проще, чем в других языках программирования. Ну и напоследок, так как Python является не строго типизированным, на нём относительно просто писать, не требующие больших нужд программки.

Итак, приступим. Для работы, нам понадобятся несколько библиотек:

import json # для парсинга ответов на запросы API
import requests # для отправки самих запросов
import random # для выбора случайного поздравления из списка
import time # для создания задержки (об этом позже)

Далее, я получил, так называемый, access_token. Подробно о его получении описано на сайте API. Он нужен для некоторых методов API, требующих авторизацию приложения. Кстати о приложении: на Хабре уже упоминалось о том, как создать клиентское приложение для работы ваших standalone проектов, поэтому писать об этом я не стал. После получения токена, приступим к запросам. Первое, что нам понадобится, это получить список наших друзей. Делается это с помощью отправки запроса friends.get, в полях метода я указал что мне также необходимо вернуть и пол друзей, об этом чуть позже.

allFriends = json.loads(requests.get('https://api.vk.com/method/friends.get?user_id=&order=name&offset=0&fields=sex&name_case=nom&access_token={0}&v=5.42&lang={1}'.format(access_token,'ru')).text)['response']['items']

Так как запрос вернет ответ в формате json, прочитаем его с помощью метода loads. Получив словарь, перейдем к типу list, написав ['response']['items'] перед тем, как присвоить данные.

Затем, я подумал, что может у кого-то в друзьях найдутся люди, которым ничего не хочется отправлять и я решил написать, так называемый, «черный список». Пусть у меня будет список, где будут перечислены id игнорируемых людей.

blackList = [1,45,34343]

Уберем их из нашего основного списка друзей — «allFriends».

i = 0
for next in allFriends:
    for black in blackList:
        if next['id'] == black:
            page.pop(i)
    i = i + 1

Далее, создадим список поздравлений, я не стал прикреплять все поздравления, но их может быть сколько угодно.

mystr = [u'С новым 2016 годом']

Ну и наконец пройдемся по нашему списку друзей и приступим к отправке сообщений:

for next in allFriends:

    # Тут, как я говорил раннее, будем учитывать пол друга, отправляя разные наборы смайлов соответственно.
    # Поле "sex" - имеет значение 1 если пол женский, 2 - мужской
    if next['sex']==1:
        x = u'& # 12 8150; & # 12 8139;' # Необходимо убрать пробелы
    else:
        x = u'& # 12 7867; & # 12 7867;'

    # Финальная строка будет иметь примерно следующий вид:
    # Имя, С новым 2016 годом 💖 💋
    # При отправке, коды смайлов конвертируются в картинки
    # А поздравление выбирается из списка случайным образов с помощью метода choice

    fistr = (u'{0}, {1} {2}\n'.format(next['first_name'],random.choice(mystr), x))

    # Затем создаем url для отправки сообщения через метод messages.send, состоящий из id человека из 
    # очередного элемента списка друзей, access_token`а и самого сообщения.
    # Очень важно, поместить поле access_token перед message, иначе будет ошибка связанная с неверным access_token
    # Это происходит из-за того, что в нашей строке поздравления есть пробелы.
    url = (u'https://api.vk.com/method/messages.send?user_id={0}&access_token={1}&message={2}&v=5.42'.format(next['id'], access_token, fistr))
    
    # Метод messages.send вернет id отправленного сообщения либо ошибку в формате json, поэтому 
    # выведем на экран результат запроса.
    print json.loads(requests.get(url).text)

    # Также можно выводить отладочную информацию
    #print fistr

    # Пишем задержку между итерациями цикла, потому что vk API ограничивает количество запросов до 3 в секунду
    time.sleep(1)

После того, как все сообщения будут отправлены, мы узнаем об этом, увидев слово sent.

print 'sent'
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.