Найти тему
ovnoCod

Python. Автоматическое удаление неактивных друзей из ВК.

взято с https://yandex.ru/images
взято с https://yandex.ru/images

Сегодня напишем скрипт на Python. Который при запуске просмотрит всех ваших друзей, и те кто не посещал ВК например, месяц - удалит. Очень полезная ф-ия для тех, кто набил 10 000 друзей, и хочет мертвые странички отправить в подписчики.

Для начала нам нужен ваш токен, для работы с вк, токен необходим. Получить его можно так:

1) Открываете браузер, через который сидите в вк.

2) Заходите на vkhost.github.io

3) Нажимаете на VK Admin, после чего со всем соглашаетесь. И попадаете на пустую страничку.

4) Ваш токен сейчас находится в адресной строке, все что находится между access_token= и &expires_in является вашим токеном, сохраните его, я же вместо токена, для примера буду использовать: "Каляка-Маляка".

Теперь у нас есть все необходимое для работы, осталось открыть любой вами полюбившийся редактор кода и создать python файл. Я же буду использовать стандартную IDLE Python которая идет в коробке :)

Для начала импортируем библиотеку requect, для отправки запросов. Ну и назначим переменную token, которая будет в себе хранить наш токен виде строки.

Python vk.com
Python vk.com

Теперь создадим функцию, назовем ее frendsDel и принимать она будет аргументы:

ids - ваш id странички

token - токен который у нас выше

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

Python vk.com
Python vk.com

Для начала нам нужен список всех пользователе, для этого, если полазить в документации ВК, то мы найдем нужный метод: friends.get, который принимает много параметров, но нас интересую такие:

user_id - обязательный параметр, принимает ID человека, у которого хотим посмотреть список друзей. В данный момент будем использовать наш ID.

access_token - обязательный параметр, принимает наш токен.

v - обязательный параметр, принимает версию api вконтакта, которую мы будем использовать, на данный момент используем последнюю: 5.130

fields - дополнительный параметр, принимает поля, которые мы дополнительно хотим увидеть, на данный момент нас интересует поле: last_seen - последний сеанс.

Давайте это все напишем на Python:

Python vk.com
Python vk.com

Далее, используя библиотеку requests и методот get, отправим наши параметры, и получим список пользователей, однако список у нас придет в json формате. Нужно будет его обработать встроенным методом json.

Python vk.com
Python vk.com

Если сейчас глянуть что в себе содержит r, то мы увидим что там словарь, который содержит словарь, в котором список. Вот такая кутерьма, но давайте вырвем от туда список, и положим его в отдельную переменную, что бы было легче нам работать.

Python vk.com
Python vk.com

Все, теперь можно глянуть что хранится в r, и увидим список, там есть id, имя, фамилия и что нас более интересует, время последнего посещения, однако тут есть две проблемы.

Первая. Формат времени не понятен, и выглядит примерно так 1652745203.

Вторая, у некоторых пользователей нет данных о первом посещении.

Разберемся вначале со второй проблемой, а точнее разбираться не нужно, так как все решается автоматически. В вк, есть опция анонимности, т. е. точно не показывается когда пользователь был последний раз, пишется примерно: больше недели назад. Вот у таких пользователей, поле последнего сеанса, в нашем списке - отсутствует. Однако, в вк есть так же правило, что если пользователь отсутствует более трех месяцев, статус последнего посещения на страничке - пустой. Т. е. страничка практически мертвая, и да же если пользователь включил опцию анонимности, в наш список попадет дата его последнего сеанса, если она была более трех месяцев назад.

Первая проблема. Этот формат времени называется Unix время. И если вы собираетесь парсить и далее новости, данные с бирж, то столкнетесь с этим еще много раз, немного полезной теории.

Со временем появилось куча сервисов, и серваков, которые хотели синхронизироваться по времени с другими серваками... Или же отдавать свои данные, с указанием даты и времени, в едином поясе времени. Ведь ни для кого не секрет, что в мире, куча временных поясов... И можно было просто усвоиться, что можно использовать тот же временной пояс Нью Йорка, например... Но формат времени не удобен, для его обработки, нужно написать несколько лишних ф-ий, что займет кучу драгоценных миллисекунд.

Многие серверы используют Unix систему и там внедрили интересную методику. С 1 января 1970 00:00:00 начался посекундный отсчет. И вот например, 1652745203 - это кол-во секунд прошедшее с 1652745203.

Немного разобрались, теперь нужно понять что нам делать.

Для начала нам нужно получить текущее Unix время. Для этого используем модуль time

Python vk.com
Python vk.com

А далее все просто, код time.time() выдает нам текущее Unix время, однако вк нам выдает время в точности до секунд, а код выдает нам время в точности до наносекунд :) Т. е. мы получаем дробное число. Для этого с помощью метода int() преобразуем в обычное число. Ну и все это значение присвоим переменной t1.

Python vk.com
Python vk.com

Проблема решилась одной строкой кода :)

И так, самого начала нашей задачей было, удалить пользователей которые не посещали вк месяц. Т. е. 30 дней. Именно это значение принимает наша функция frendsDel параметром data. Хотя в итоге вместо 30, можете ставить любое кол-во дней. Но нам нужно сейчас выяснить, Unix время 30 дней назад, для этого, от текущего времени отнимем кол-во секунд 30 дней.

Python vk.com
Python vk.com

Т. е. от текущего времени мы отнимаем кол-во дней пропечатанные в переменной data, умноженное на 24 часа, умноженное на 60 минут, умноженное на 60 секунд и полученный результат мы отправляем опять же в переменную t1.

Теперь нам остается перебрать всех пользователей, узнать время когда они были в последний раз, сравнить это время с нашим полученным t1, и если оно будет меньше t1, то удалить пользователя -> отправить в подписчики.

Создадим цикл for, который будет перебирать поочередно наш список r, и полученные данные за один шаг, записывать в переменную i. В i у нас будет храниться словарь одного пользователя, в каждом шагу, по ключам этого словаря, мы сможем вытащить время последнего сеанса.

И так создаем цикл:

Python vk.com
Python vk.com

Далее новой переменной t2 присваиваем значения времени последнего сеанса, которое мы "вырываем" из словаря по ключам 'last_seen' 'time'.

Однако, наше значение хранится виде строки, по этому все это преобразуем в число с помощью метода int().

Python vk.com
Python vk.com

Теперь в t2 у нас хранится Unix время, последнего посещения вк пользователем, нужно его сравнить с нашим t1, и если t2 будет меньше, то пользователя удаляем. Для этого используем сравнение if.

Python vk.com
Python vk.com

Для удаления пользователя, нам нужно узнать его ID, он так же хранится в словаре i, с ключом 'id'. Присвоим ID пользователя новой переменной id1.

Python vk.com
Python vk.com

Теперь для удаления пользователя, нам опять же нужно связаться с ВК, используя метод friends.delete, отправив ему определенные параметры:

user_id - ID удаляемого пользователя

access_token - наш токен

v - версия API ВК используемая нами.

Python vk.com
Python vk.com

И отправляем эти параметры ВК.

Python vk.com
Python vk.com

И вроде все. Теперь наш код получает список пользователей, перебирает каждого пользователя по одному, и сравнивает, если этот пользователь был последний раз больше указанных нами дней, то удаляет его. Однако, если у вас много друзей, и вы его запустите, парочку друзей, наш код удалит, а потом выскочит ошибка.

А выскочит она все из-за тех пользователей, которые указали свое посещение вк - приватным. Т. е. при присвоении переменной t2 = int(i['last_seen']['time']) код просто не найдет ключей last_seen и time.

Решить это проблему можно многими способами. Опять же с помощью сравнения if. Но для разнообразия мы используем обработку ошибок, состоящую из трех блоков: try, except и else.

В блоке try мы пишем код, где ожидаем ошибку.

В блоке except мы пишем то, что должны сделать при ошибке

В блоке else, пишем то, что будем делать при отсутствии ошибки.

Python vk.com
Python vk.com

Думаю, при ошибке нужно вывести ссылку на пользователя, что бы при желании, вручную посмотреть на его страницу.

Для этого нужно опять же получить его ID, и подставить к vk.com/id

Примерно так:

Python vk.com
Python vk.com

Ну а в случае отсутствия ошибки, выполняем уже написанный код:

Python vk.com
Python vk.com

Ну и под конец запускаем нашу ф-ию:

Python vk.com
Python vk.com

Напомню ids - наш ID в ВК. Для примера написал 000001. Заметьте, что в кавычках, так как это строка. token - наш токен полученный вначале. data - количество дней. Если пользователь не присутствовал столько дней или больше, то удаляем из друзей.

Всем спасибо, писал долго, думаю заслуживаю лайка. И желательно подписки. Если есть вопросы - задавайте в коментах.