Новогодняя суматоха и праздники интересовали меня меньше, чем стремление к тому, чтобы узнать что-нибудь новенькое. В один из предновогодних вечеров, я, сидя за чашечкой чая на кухне, вспоминал предыдущие новогодние дни. «Каждый раз пишу друзьям, а может сейчас отдать эту работу программе и пойти отмечать?», — подумал я и тут же сел за изучения API разных социальных сетей.
О том, как я боролся с мелкими трудностями и о подробных моих раздумьях я расскажу дальше.
Изучив несколько статей на Хабре и пересмотрев всю документацию разных социальных сетей, я решил, что Вконтакте API в связке с Python будут очень гармоничны. Почему? Во-первых, все запросы, вышеупомянутого API, возвращают ответ в виде json, с которым в Python очень удобно работать. Во-вторых, отправка запросов совершается куда проще, чем в других языках программирования. Ну и напоследок, так как Python является не строго типизированным, на нём относительно просто писать, не требующие больших нужд программки.
Итак, приступим. Для работы, нам понадобятся несколько библиотек:
Далее, я получил, так называемый, access_token. Подробно о его получении описано на сайте API. Он нужен для некоторых методов API, требующих авторизацию приложения. Кстати о приложении: на Хабре уже упоминалось о том, как создать клиентское приложение для работы ваших standalone проектов, поэтому писать об этом я не стал. После получения токена, приступим к запросам. Первое, что нам понадобится, это получить список наших друзей. Делается это с помощью отправки запроса friends.get, в полях метода я указал что мне также необходимо вернуть и пол друзей, об этом чуть позже.
Так как запрос вернет ответ в формате json, прочитаем его с помощью метода loads. Получив словарь, перейдем к типу list, написав ['response']['items'] перед тем, как присвоить данные.
Затем, я подумал, что может у кого-то в друзьях найдутся люди, которым ничего не хочется отправлять и я решил написать, так называемый, «черный список». Пусть у меня будет список, где будут перечислены id игнорируемых людей.
Уберем их из нашего основного списка друзей — «allFriends».
Далее, создадим список поздравлений, я не стал прикреплять все поздравления, но их может быть сколько угодно.
Ну и наконец пройдемся по нашему списку друзей и приступим к отправке сообщений:
После того, как все сообщения будут отправлены, мы узнаем об этом, увидев слово sent.
О том, как я боролся с мелкими трудностями и о подробных моих раздумьях я расскажу дальше.
Изучив несколько статей на Хабре и пересмотрев всю документацию разных социальных сетей, я решил, что Вконтакте 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'