Сегодня напишем скрипт на Python. Который при запуске просмотрит всех ваших друзей, и те кто не посещал ВК например, месяц - удалит. Очень полезная ф-ия для тех, кто набил 10 000 друзей, и хочет мертвые странички отправить в подписчики.
Для начала нам нужен ваш токен, для работы с вк, токен необходим. Получить его можно так:
1) Открываете браузер, через который сидите в вк.
2) Заходите на vkhost.github.io
3) Нажимаете на VK Admin, после чего со всем соглашаетесь. И попадаете на пустую страничку.
4) Ваш токен сейчас находится в адресной строке, все что находится между access_token= и &expires_in является вашим токеном, сохраните его, я же вместо токена, для примера буду использовать: "Каляка-Маляка".
Теперь у нас есть все необходимое для работы, осталось открыть любой вами полюбившийся редактор кода и создать python файл. Я же буду использовать стандартную IDLE Python которая идет в коробке :)
Для начала импортируем библиотеку requect, для отправки запросов. Ну и назначим переменную token, которая будет в себе хранить наш токен виде строки.
Теперь создадим функцию, назовем ее frendsDel и принимать она будет аргументы:
ids - ваш id странички
token - токен который у нас выше
data - время в днях, сколько пользователь не был на страничке, что бы его удалить.
Для начала нам нужен список всех пользователе, для этого, если полазить в документации ВК, то мы найдем нужный метод: friends.get, который принимает много параметров, но нас интересую такие:
user_id - обязательный параметр, принимает ID человека, у которого хотим посмотреть список друзей. В данный момент будем использовать наш ID.
access_token - обязательный параметр, принимает наш токен.
v - обязательный параметр, принимает версию api вконтакта, которую мы будем использовать, на данный момент используем последнюю: 5.130
fields - дополнительный параметр, принимает поля, которые мы дополнительно хотим увидеть, на данный момент нас интересует поле: last_seen - последний сеанс.
Давайте это все напишем на Python:
Далее, используя библиотеку requests и методот get, отправим наши параметры, и получим список пользователей, однако список у нас придет в json формате. Нужно будет его обработать встроенным методом json.
Если сейчас глянуть что в себе содержит r, то мы увидим что там словарь, который содержит словарь, в котором список. Вот такая кутерьма, но давайте вырвем от туда список, и положим его в отдельную переменную, что бы было легче нам работать.
Все, теперь можно глянуть что хранится в r, и увидим список, там есть id, имя, фамилия и что нас более интересует, время последнего посещения, однако тут есть две проблемы.
Первая. Формат времени не понятен, и выглядит примерно так 1652745203.
Вторая, у некоторых пользователей нет данных о первом посещении.
Разберемся вначале со второй проблемой, а точнее разбираться не нужно, так как все решается автоматически. В вк, есть опция анонимности, т. е. точно не показывается когда пользователь был последний раз, пишется примерно: больше недели назад. Вот у таких пользователей, поле последнего сеанса, в нашем списке - отсутствует. Однако, в вк есть так же правило, что если пользователь отсутствует более трех месяцев, статус последнего посещения на страничке - пустой. Т. е. страничка практически мертвая, и да же если пользователь включил опцию анонимности, в наш список попадет дата его последнего сеанса, если она была более трех месяцев назад.
Первая проблема. Этот формат времени называется Unix время. И если вы собираетесь парсить и далее новости, данные с бирж, то столкнетесь с этим еще много раз, немного полезной теории.
Со временем появилось куча сервисов, и серваков, которые хотели синхронизироваться по времени с другими серваками... Или же отдавать свои данные, с указанием даты и времени, в едином поясе времени. Ведь ни для кого не секрет, что в мире, куча временных поясов... И можно было просто усвоиться, что можно использовать тот же временной пояс Нью Йорка, например... Но формат времени не удобен, для его обработки, нужно написать несколько лишних ф-ий, что займет кучу драгоценных миллисекунд.
Многие серверы используют Unix систему и там внедрили интересную методику. С 1 января 1970 00:00:00 начался посекундный отсчет. И вот например, 1652745203 - это кол-во секунд прошедшее с 1652745203.
Немного разобрались, теперь нужно понять что нам делать.
Для начала нам нужно получить текущее Unix время. Для этого используем модуль time
А далее все просто, код time.time() выдает нам текущее Unix время, однако вк нам выдает время в точности до секунд, а код выдает нам время в точности до наносекунд :) Т. е. мы получаем дробное число. Для этого с помощью метода int() преобразуем в обычное число. Ну и все это значение присвоим переменной t1.
Проблема решилась одной строкой кода :)
И так, самого начала нашей задачей было, удалить пользователей которые не посещали вк месяц. Т. е. 30 дней. Именно это значение принимает наша функция frendsDel параметром data. Хотя в итоге вместо 30, можете ставить любое кол-во дней. Но нам нужно сейчас выяснить, Unix время 30 дней назад, для этого, от текущего времени отнимем кол-во секунд 30 дней.
Т. е. от текущего времени мы отнимаем кол-во дней пропечатанные в переменной data, умноженное на 24 часа, умноженное на 60 минут, умноженное на 60 секунд и полученный результат мы отправляем опять же в переменную t1.
Теперь нам остается перебрать всех пользователей, узнать время когда они были в последний раз, сравнить это время с нашим полученным t1, и если оно будет меньше t1, то удалить пользователя -> отправить в подписчики.
Создадим цикл for, который будет перебирать поочередно наш список r, и полученные данные за один шаг, записывать в переменную i. В i у нас будет храниться словарь одного пользователя, в каждом шагу, по ключам этого словаря, мы сможем вытащить время последнего сеанса.
И так создаем цикл:
Далее новой переменной t2 присваиваем значения времени последнего сеанса, которое мы "вырываем" из словаря по ключам 'last_seen' 'time'.
Однако, наше значение хранится виде строки, по этому все это преобразуем в число с помощью метода int().
Теперь в t2 у нас хранится Unix время, последнего посещения вк пользователем, нужно его сравнить с нашим t1, и если t2 будет меньше, то пользователя удаляем. Для этого используем сравнение if.
Для удаления пользователя, нам нужно узнать его ID, он так же хранится в словаре i, с ключом 'id'. Присвоим ID пользователя новой переменной id1.
Теперь для удаления пользователя, нам опять же нужно связаться с ВК, используя метод friends.delete, отправив ему определенные параметры:
user_id - ID удаляемого пользователя
access_token - наш токен
v - версия API ВК используемая нами.
И отправляем эти параметры ВК.
И вроде все. Теперь наш код получает список пользователей, перебирает каждого пользователя по одному, и сравнивает, если этот пользователь был последний раз больше указанных нами дней, то удаляет его. Однако, если у вас много друзей, и вы его запустите, парочку друзей, наш код удалит, а потом выскочит ошибка.
А выскочит она все из-за тех пользователей, которые указали свое посещение вк - приватным. Т. е. при присвоении переменной t2 = int(i['last_seen']['time']) код просто не найдет ключей last_seen и time.
Решить это проблему можно многими способами. Опять же с помощью сравнения if. Но для разнообразия мы используем обработку ошибок, состоящую из трех блоков: try, except и else.
В блоке try мы пишем код, где ожидаем ошибку.
В блоке except мы пишем то, что должны сделать при ошибке
В блоке else, пишем то, что будем делать при отсутствии ошибки.
Думаю, при ошибке нужно вывести ссылку на пользователя, что бы при желании, вручную посмотреть на его страницу.
Для этого нужно опять же получить его ID, и подставить к vk.com/id
Примерно так:
Ну а в случае отсутствия ошибки, выполняем уже написанный код:
Ну и под конец запускаем нашу ф-ию:
Напомню ids - наш ID в ВК. Для примера написал 000001. Заметьте, что в кавычках, так как это строка. token - наш токен полученный вначале. data - количество дней. Если пользователь не присутствовал столько дней или больше, то удаляем из друзей.
Всем спасибо, писал долго, думаю заслуживаю лайка. И желательно подписки. Если есть вопросы - задавайте в коментах.