Как сохранить со стены в контакте. Программа для чистки вконтакте


2. Запускаем программу, вводим логин и пароль от любого вашего аккаунта вконтакте.

3. Зашли в программу. Нажимаем Медиа и Скачать.

5. Указываем ссылку на страницу пользователя или группу или публичную страницу, альбомы с которой хотите скачать. Я для примера указал: vk.com/club717898 В нем как раз есть 14 альбомов с фотками и мы хотим все фотки со всех 14-ти альбомов скачать.

7. Наблюдаем за процессом сохранения картинок.

8. В указанной папке смотрим наши картинки. Они там сохраняются по папкам — каждая папка = один альбом. В группе было 14 альбомов — получили 14 папок с фотками.

Сохраняет быстро и бесплатно. Хотя может это демка VkBot работает потом попросит денежку, не знаю. Стоит VkBot 400 руб в мес кажись.

Фразы, по которым нас находят: ?tag=vkontakte, как сохранить фото из вк на андроид, как сохранить фото из контакта на андроид, как скачать фото с вк на андроид, как скачать картинку с вк на андроид, как скачать фото из вк на андроид, как сохранять фото с вк на андроид, как сохранять фото из вк с андроида, как сохранить картинку на андроид, как сохранять картинки с вк на андроид, как сохранить картинку с вк на андроид, как сохранить картинку из вконтакте на андроид, как скачать картинки с вк на андроид, Как сохранять картинки в вк, как сохранить картинку с контакта на андроид, как сохранить картинку на стене вк, как сохранить пост в контакте, как сохранить фото из вконтакте на андроид, как скачать все картинки со стены вконтакте, скачать фото со стены вконтакте, скачать все картинки со стены вконтакте, как сохранить фото вк андроид, как скачать альбом вконтакте на андроид, как сохранить группу вконтакте, Как скачать все картинки с группы в вк, можно ли сохранить все данные с группы ВКонтакте, накрутка сохраненных картинок в вк, как скачать все картинки с группы в контакте, как скачать все фото с паблика в вк, как скачать альбом с вк на андроид, андроид скачать альбом вк андроид, как быстро сохранить картинки в вк, не сохраняются картинки из вконтакте андроид, как сохранить сразу все фото мз гпуппы в вк

Чтобы выгрузить все записи из группы Вконтакте или сохранить посты Вк вам нужно скачать Вкдог и воспользоваться следующей функцией.

Выгрузить все записи из группы вк и сохранить посты:

Граббер на комп.

С помощью этой функции вы можете скачать и сохранить все записи со стены Вк. Грабер может копировать фото вконтакте или сразу сохранить текст и фото (ссылку в вк).
Копировать можно в специальный XML файл (привязка текст+ ссылка на картинку в ВК);
Либо можно скачать фото в папку на комп, а текст сохранить в блокнот, если вам нужна такая возможность- пишите в нашу ТП.
В Вкдоге предусмотрен отдельный парсер текста постов со стены вк на ваш компьютер.

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

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

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

Программа для автоматического продвижения сообществ путем граббинга записей (постов) из одного сообщества ВКонтакте в другое. В данной программе предусмотрено огромное количество различных настроек и опций, что позволяет настроить программу под абсолютно любые нужды.

Граббер всей стены ВКонтакте:
Граббер всей стены ВКонтакте позволяет настроить копирование записей (постов) из одного сообщества ВКонтакте в другое с учётом различных опций и критериев.
Онлайн граббер ВКонтакте
Онлайн граббер ВКонтакте предназначен для копирования новых записей со стены другого сообщества ВКонтакте и предполагает наличие уже целого списка сообществ-источников.

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

Реклама ВКонтакте
Это метод пиара сообщества ВКонтакте, который основывается на публикации новой записи в другое указанное сообщество с указанием конкретных данных, например, со ссылкой на ваше сообщество. При этом, создание поста в группе-приёмнике осуществляется многократно, разделяясь лишь указанным интервалом времени. После публикации нового поста, предыдущий удаляется.
  • Постинг только в определенное время с возможностью указания времени начала и времени завершения (время задается в часах и минутах)
  • ; допускаются как свои, так и чужие сообщества
  • Указание интервала обновления, то есть интервала между повторной отправкой поста;
  • Возможность прикрепления к публикуемому посту картинки, выбираемой на компьютере
  • В случае создания новых постов можно указать: количество минут, через которое необходимо завершить постинг, и стоит ли удалить ли пост по завершении; а также количество минут, на протяжении которых не нужно публиковать посты в выбранное сообщество
Реклама репост ВКонтакте
Это метод пиара сообщества ВКонтакте, который основывается на репосте указанной записи в указанное сообщество. При этом, репост в группу-приёмник осуществляется многократно, разделяясь лишь указанным интервалом времени. Перед выполнением очередного репоста, предыдущий удаляется.


Вот полный список опций и настроек, которые можно указать и установить при настройке рекламщика под себя:
  • Указание ссылки на сообщество-приёмник
  • Указание интервала обновления, то есть интервала между повторной отправкой поста
  • Возможность выбора между созданием нового поста в группе-приёмнике или обновлением уже ранее созданного
  • в случае создания новых постов можно указать: количество минут, через которое необходимо завершить постинг, и стоит ли удалить ли пост по завершении; а также количество минут, на протяжении которых не нужно публиковать посты в выбранное сообщество
  • Указание ссылки на пост, который и будет репоститься в сообщество
  • Указание текста сообщения, прикрепляемого к посту; сюда можно вписывать как обычный текст, так и различные ссылки
Граббер на комп
Это функция для сохранения необходимого количества постов с некоторого сообщества ВКонтакте на свой компьютер. Все посты сохраняются в выбранную папку в файл формата xml. Очень полезная функция, если ваша цель – сбор и организация необходимой информационной базы для последующего постинга в ваше сообщество.

Вот полный список опций и настроек, которые можно указать и установить при настройке рекламщика под себя:

  • Граббинг только в определенное время с возможностью указания времени начала и времени завершения (время задается в часах и минутах)
  • Указание ссылки на сообщество-источник
  • Выбор папки на компьютере, в которую граббить посты
  • Указание номера поста для начала граббинга и номера поста, на котором граббинг необходимо закончить
  • Возможность граббинга рандомно, то есть не с соблюдением порядка номеров постов
  • Указание интервала между сохранениями постов в минутах
  • Условия выбора постов: выбирать посты только с минимальным количеством лайков, репостов и комментариев
Граббинг с предпросмотром
Это функция для граббинга постов из некоторого сообщества ВКонтакте в ваше промежуточное сообщество. Очень полезно при необходимости ручной премодерации постов. После, отредактировав и удалив ненужные посты можно запустить обычный граббинг постов из промежуточного сообщества в ваше сообщество-приёмник.

Вот полный список опций и настроек, которые можно указать и установить при настройке рекламщика под себя:

Реклама репост лист
Это метод пиара сообщества ВКонтакте, аналогичный методу «Реклама репост», но для работы со списком постов. Напомним, что этот метод основывается на репосте указанных записей в указанное сообщество. При этом, репосты в группу-приёмник осуществляются многократно, разделяясь лишь указанным интервалом времени. Перед выполнением очередного репоста, предыдущий удаляется. Характеризуется следующими опциями:
  • Репост только в определенное время с возможностью указания времени начала и времени завершения (время задается в часах и минутах)
  • Указание ссылки на сообщество-приёмник
  • Указание интервала обновления, то есть интервала между репостами
  • Указание ссылок на посты, которые будут репоститься
  • Указание текста сообщения, прикрепляемого к посту; сюда можно вписывать как обычный текст, так и различные ссылки
Граббер свежих постов из поиска
Метод продвижения, основывающийся на копировании из поиска по ключевым словам свежих постов в собственное сообщество ВКонтакте по заданному интервалу времени. Для настройки метода предусмотрен ряд следующих функций:
Дополнительные функции по работе с граббером
Для таких методов продвижения, как «Граббер всей стены », «Онлайн граббер », «Граббинг с предпросмотром » и «Граббер свежих постов из поиска » предусмотрен целый ряд дополнительных опций, с помощью которых можно наиболее детально настроить посты и отсеять недопустимый контент.


К таким опциям относятся:
  • Добавление текста к копируемым постам: в начало поста, в конец поста
  • Указание слов для замены в формате до::после
  • Указание стоп-слов для пропуска ненужных постов
  • Указание, грабить ли или не грабить хеш-теги из копируемых постов
  • Возможность подписывать копируемые посты гиперссылками на группу-источник или автора, предложившего пост в группу-источник; плюс возможность добавления своего текста к этой подписи
  • Указание, от кого грабить: всю стену, записи только от имени сообщества, записи только не от имени сообщества
  • Указание, грабить ли репосты или нет
  • Указание, грабить ли посты с видео: да, нет, вырезать видео из постов
  • Указание, грабить ли посты с аудио: грабить, вырезать все аудио, не грабить посты с аудио, не грабить посты без аудио
  • Указание, грабить ли посты с изображениями: грабить, вырезать все фото, не грабить посты с фото, не грабить посты без фото
  • Указание, грабить ли посты с текстом: грабить, вырезать текст, не грабить посты с текстом, не грабить посты без текста
  • Указание, грабить ли или не грабить посты со ссылками, а если грабить, стоит ли вырезать ссылки из копируемых постов
  • Публикация поста репостом
  • Указание, грабить ли посты с опросами; при этом сам опрос не копируется
  • Указание подписи автора или администратора, с аккаунта которого выполняется граббинг
  • Указание, стоит ли использовать водяной знак: да/нет; если да, то можно выбрать место его расположения (слева сверху, слева снизу, справа сверху, справа снизу); изображение водяного знака необходимо выбрать на своем компьютере
Некоторые преимущества и особенности программы VKDog:
  • Граббер записей (постов) из сообщества в сообщество ВКонтакте
  • Онлайн граббер новых записей (постов) из списка сообществ в сообщество ВКонтакте
  • Реклама ВКонтакте – постинг нужной записи (поста) в сообщество ВКонтакте многократно через указанный период времени
  • Реклама репостом ВКонтакте – репост нужной записи (поста) в сообщество ВКонтакте многократно через указанный период времени
  • Граббер на комп – сохранение записей (постов) из сообщества ВКонтакте на компьютер в файл формата xml
  • Граббер с предпросмотром – копирование записей (постов) из сообщества ВКонтакте в промежуточное сообщество для ручной премодерации
  • Реклама репост лист – репост списка нужных записей (постов) в сообщество ВКонтакте многократно через указанный период времени
  • Граббер свежих постов из поиска – копирование в своё сообщество только свежих записей (постов) из поиска ВКонтакте по ключевым словам
  • Проверка всех указанных аккаунтов ВКонтакте на валидность
  • Поддержка сервисов распознавания капчи Antigate.com и RuCaptcha.com
  • Возможность управления созданными заданиями: включить все или отключить все
  • Анализ списков стоп-слов и слов замены для анализа и обработки записей (постов) при публикации
  • Возможность установки названий для заданий для наибольшего удобства при работе с ними в большом количестве
  • Возможность принудительного сохранения всех настроек и введенных в программу данных
  • Ведение лога событий программы
  • Лёгкость использования
Описанный выше функционал описывает все возможности программы VKDog версии 4.0.9. Если вы знали функцию, которой в нашем списке нет, скорее всего она была убрана в версии 4.0.9.

Введение

Добрый день, давно я ничего не писал - много было причин. За это время накопилось достаточно большое количество материала и я постараюсь его сюда выставить как можно полнее. Сегодня я хочу рассказать о работе с API контакта через Python, а примером послужит - скачивание стены журнала Евгений Онегин. Глава 11 . Если вам лень читать как я всё это делал, а охота поскорее скачать свою стену, переходите сразу к разделу "Отчёт и тестирование".

Подготовка

Первое, что нужно сделать - скачать АПИ и зарегистрировать приложение , получив его идентификатор (если вам не охота регистрировать своё приложения и получать его идентификатор, то просто пропустите этот шаг - по умолчанию программа подставит мой идентификатор приложения) . АПИ доступно по этому адресу https://pypi.python.org/pypi/vkontakte .Там есть инструкция по установке. Если-же не получается по ней, то скачайте файлы, разархивируйте, в терминале выполните (Linux)

$ sudo python2 ./setup.py install $ python2 Python 2.7.5 (default, May 12 2013, 12:00:47) on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import vkontakte
После установки мы можем пользоваться функционалом этой библиотеки, однако с некоторых пор стало обязательным создание окна браузера, чтоб пользователь там ввёл свои логин и пароль, и только потом мы получили token_id для работы с API питона. Чтоб не лезть в эти дебри можно прикинуться окном броузера, фиктивно ввести туда валидные логин и пароль и получить свой законный токен. В этой статье рассказано более подробно про этот маленький хак. В результате статьи был создан класс авторизации, в который сообщается логин, пароль, идентификатор приложения, запрашиваемые права. Я немного подредактировал этот файл, так как он не работал. Скачать мой вариант можно .

Первые шаги

Для первого примера давайте сделаем простую авторизацию с неким запросом.

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import vk_auth import vkontakte def main(): (token,user_id) = vk_auth.auth("$EMAIL", "$PASSWD", "$ID_APP", "$SOPE") vk = vkontakte.API(token=token) print "Hello vk API , server time is ",vk.getServerTime() return 0 if __name__ == "__main__": main()
Ничего сложного - импортируем класс авторизации, импортируем библиотеку c API, получаем токен и идентификатор, используем АПИ-шные функции.

Пример

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

Техническое задание

Скрипт или набор скриптов для скачивания стены из социальной сети Вконтакте.
Входные данные:
  • Имя пользователя
  • Пароль
  • Идентификатор группы\паблика\страницы
  • Количество постов для скачивания
  • Начиная с какого сообщения скачивать
  • На сколько HTML блоков разбивать
Приложение должно скачать всю текстовую и графическую информацию со стены для удобного оффлайн просмотра. Если на стене есть видео или ссылки, то приложение должно сообщить их название и дать ссылку в интернет. Ещё приложение должно скачивать все комментарии к постам и оформлять их должным образом(аналогично постам) .

Реализация

Определимся с каркасом программы и входящими параметрами.
Набросаем пока такой код . Я использовал библиотеку OptionParser для парсинга параметров - она идёт из коробки и о-о-очень удобная. Следующий шаг - организация разбивки на тома. Чуть изменив старый код, мы получаем алгоритм, который разобьёт информацию на необходимое количество томов. Вот код . Далее необходимо использовать vk API и загружать посты из Контакта. Покурив документацию , я быстро нашел необходимую функцию . Апи контакта позволяет отправлять JSON запросы и получать JSON ответы. Используемой нами vkAPI инкапсулирует JSON запросы в список переменных. Не могу сказать, что это очень удобно, но я не нашел другого способа. Для запроса постов со стены определённой группы нам необходимо выполнить следующий код

Posts = vk.get("wall.get", owner_id=owner_id,offset=offset,count=count)
После выполнения этого кода в posts запишется count постов со смещением offset . Стоит обратить внимание, что на количество скачиваемых постов есть ограничение и, если я не ошибаюсь, оно равно 100. Я взял значение 50, как оптимальное количество скачиваемых постов за 1 итерацию цикла. В прошлом листинге я выделил 2 функции: скачивание постов get_posts () и форматирование в HTML posts_to_html() , и поставил на них заглушки. Теперь я заполняю get_posts() кодом, который привёл выше. В техническом задании ещё требовалось скачать все комментарии к коду. Я разделил функцию скачивания постов и оформления их в html, а значит скачивание комментариев должно производиться вместе со скачиванием постов и записываться в одну переменную. Благо, JSON - формат динамический и его несложно дополнить одним полем, в котором будут храниться комментарии.
В документации находим функцию скачивания комментариев и реализуем. Функцию скачивания поста с комментариями разобьём на 2 функции - скачивание поста и скачивание комментариев к нему. Получаем вот такой код:

Def get_comments(vk,owner_id,post_id,count): size = 50 comments = if(count0): post_id = posts[i]["id"] comments = get_comments(vk,owner_id,post_id,coments_count) posts[i]["comments"]["data"]=comments print len(comments),coments_count return posts
Теперь функция get_posts вернёт посты, в которых в поле comments.data будут храниться комментарии к ним.
На этом работа со скачиванием данных закончена.Необходимо ещё из этой всей канители сформировать красивые HTML странички. Скажу честно - для меня это самый адский труд. Но других путей нет - вперёд.

Формирование HTML страниц.

Для формирования я написал целый ряд шаблонов, в которые потом буду вставлять данные из JSON. Я не буду их всех здесь приводить. Просто дам ссылку на готовый проект. Функция, формирования HTML вышла огромная и некрасивая.Если будут люди - профи в HTML, буду им благодарен за более благоприятный дизайн, который более схож с Vk.

Скачивание Данных.

Одним из пунктов ТЗ был удобный локальный просмотр. В данный момент все ссылки на картинки и аудиозаписи - абсолютные (то есть ведут в интернет) а нужно чтоб они лежали рядом и при отсутствии интернета можно было и картинку посмотреть и музычку прослушать. Можно это сделать питоном через жуткую Караганду. Но я предпочёл вариант поэлегантней - wget . Эта стандартная линуксовская интрнето-качалка и она умеет скачивать web-страницу с информацией на ней.Чтобы скормить HTML-ки нужно ещё почитать man wget и найти несколько необходимых ключей.
Получился вот такой скрипт:

$wget -B -k -r -l0 --force-html -i name-*.html -P ./data

Одно только НО - wget скачает всю информацию, но не преобразует ссылки.Может, конечно, он это и умеет делать, но я не нашел как. Поэтому в питоне мы напишем преобразование от любого контактовского адреса хранения фото\аудио в ссылку на рядом лежащую папку {ИмяГруппы}_{НомерТома}data. Я умышленно разделил имя группы и номер тома, чтобы можно было переместить за собой только один том и не тащить за собой несчётное количество информации, которая не используется.

Def convert_lincs(txt,folder,recurce = 0): out = re.sub("http://",folder,txt) return out
Как видите, благодаря мощи регулярных выражений эту задачу мы решили в 1 строку.
Ещё я столкнулся с проблемой постоянно прерывающийся связи (у меня плохой интернет) и отказа со стороны Контакта из-за высокой частоты запросов. Эти 2 фактора периодически валили программу, поэтому я сделал отказоустойчивые обёртки для всех методов обращения в интернет, которые использовал. Получилось вот так:

Def wall_getComments(vk,owner_id,post_id,count,recurce = 0): if (recurce ==20): return try: com = vk.get("wall.getComments", owner_id=owner_id,post_id=post_id,count=count) except: time.sleep(1) print "Error wall_getComments try ",recurce com = wall_getComments(vk,owner_id,post_id,count,recurce = recurce+1) return com def wall_get(vk,owner_id,offset,count,recurce = 0): if (recurce ==20): return try: res = vk.get("wall.get", owner_id=owner_id,offset=offset,count=count) except: time.sleep(1) print "Error wall_get try ",recurce res = wall_get(vk,owner_id,offset,count,recurce = recurce +1) return res def users_get(vk,uids,fields,recurce = 0): if (recurce ==20): return try: res = vk.get("users.get",uids=uids,fields="photo") except: time.sleep(1) print "Error users_get try ",recurce res = users_get(vk,uids,fields,recurce = recurce +1) return res def groups_getById(vk,group_ids,recurce = 0): if (recurce ==20): return try: res = vk.get("groups.getById", group_ids=group_ids) except: time.sleep(1) print "Error groups_getById try ",recurce res = groups_getById(vk,group_ids,recurce = recurce +1) return res
При отказе сети или ошибке получения данных я жду полсекунды и повторяю попытку.

Отчёт и тестирование

Результат работы я публикую на Github . Так, что вы можете присоединиться к проекту, взять мои наработки, добавить свои, переделать под свои нужды и просто развивать проект.
И вот, наконец, тестирование. Обратите внимание на то, что я буду использовать Python2.X и не ругайтесь заранее, увидев что-то вроде этого при попытке запустить программу:

$ python ./WallCopy.py File "./WallCopy.py", line 40 print "%s Failure"%"wall_getComments" ^ SyntaxError: invalid syntax
Программа выдаёт справку на аглицком если запустить её с ключём -h. Для ленивых перевожу на русский:

  • -e EMAIL, --email=EMAIL Имеил для авторизации
  • -p PASSWD, --passwd=PASSWD Пароль для авторизации, если вы его не задали в явном виде, программа попросит вас ввести его вовремя выполнения.Конечно пароль будет невидим.
  • -i GID, --groupid=GID Идентификатор группы, стену которой необходимо скачать
  • -c COUNT, --count=COUNT - количество постов, которые необходимо скачать. Если не задано - выкачивает все записи со стены.
  • -f OFFSET, --offset=OFFSET - смещение, с которого необходимо начать скачивание, если не задано, то 0.
  • -s SPLIT_NUM, --split=SPLIT_NUM - количество блоков, на которые разбить скачанные посты, если не задано, то 1
  • -a APP_ID, --app_id=APP_ID - идентификатор приложения, которое вы получили зарегестрировавшись (если не указано, то используется мой идентификатор приложения)
  • -d DOWNLOAD, --download_all=DOWNLOAD - ключ, который определяет, следует ли загружать мультимедиа. Возможные значения:
    • 0 - Не загружать (по умолчанию)
    • 1 - загружать после того, как основная информация загрузится
Типичный пример использования:

python2 ./WallCopy.py -e EMAIL -i GROUP_ID

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

Расширенный пример использования:

python2 ./WallCopy.py -e EMAIL -p PASSWORD -i GROUP_ID -c 1000 -f 500 -s 8 -a APP_ID -d 1

При этом загрузится 1000 постов со смещением на 500 и разобьётся на 8 томов, и картинки с музыкой загрузятся на компьютер.

На данном этапе есть много вещей, которые программа не поддерживает, а хотелось бы:

  1. Загрузка только фото и игнорирование музыки;
  2. Более похожий дизайн на Vk;
  3. Превью Видео;
  4. Требование Linux (wget)
  5. Поддержка только Python 2.X
  6. Использование ООП
На этом, пожалуй, всё. Буду очень рад обратной связи и талантливых HTML верстальщиков для лучшего дизайна.

Я уже давно заметил, что данные в социальных сетях хранятся плохо. Например, сделанный вами репост окажется пустым, если автор оригинальной записи ее удалит. Недавние проблемы с аудиозаписями в vk стали последней каплей, и я решил сохранить локально все данные, которые могут представлять интерес на случай ядерной войны. Поискав готовые решения, я не нашел ничего, что бы устроило меня, поэтому за несколько дней был написан скрипт на Python.

Цели

Сохранить все, что можно: аудиозаписи, документы, стену. Со стены нужно утащить все приложения к постам, и комментарии со всеми приложениями тоже лишними не будут. Нужно это как минимум затем, чтобы сохранились все посты с музыкой и комментарии, где друзья отправляли хорошие треки или котиков. Сразу скажу, что в моих целях не было читабельного бэкапа дополнительной информации (лайки, время создания записи и прочее).

За дело!

Процесс создания подобного приложения уже не раз описан на хабре, поэтому повторять все подробности не стану, опишу шаги работы вкратце, а еще скажу пару слов о пролемах. Чтобы статья не была перегружена исходниками, в конце будет ссылка на github.
Соображения по ходу разработки
  • Прежде всего, потребуется завести себе id приложения . Важно, чтобы тип был standalone , иначе некоторые методы vk api будут недоступны.
  • Еще нужен id пользователя, данные которого будем сохранять. Свой найти можно на странице настроек
  • Чтобы приложение работало, нужно разрешение пользователя, а точнее, access token. Прямого неинтерактивного способа получить токен нет, можно парсить страницу авторизации, но проще - попросить пользователя нажать на кнопку в браузере и скопировать url. За это отвечает функция auth():
    url = "https://oauth.vk.com/oauth/authorize?" + \ "redirect_uri=https://oauth.vk.com/blank.html&response_type=token&" + \ "client_id=%s&scope=%s&display=wap" % (args.app_id, ",".join(args.access_rights)) print("Please open this url:\n\n\t{}\n".format(url)) raw_url = raw_input("Grant access to your acc and copy resulting URL here: ") res = re.search("access_token=(+)", raw_url, re.I)
  • У запросов vk api есть ограничение: не более пяти в секунду. Если обращаться к серверу слишком часто, он ответит ошибкой. Это достаточно удобно: по коду ошибки можно понять, что скрипт работает слишком быстро, подождать какое-то время и повторить запрос.
    if result == 6: # too many requests logging.debug("Too many requests per second, sleeping..") sleep(1) continue
  • Периодически сервер vk требует решить каптчу, подозревая, что клиент - бот. В общем-то, правильно подозревает. Чтобы процесс сохранения не прерывался, приходится просить пользователя перейти по ссылке на картинку, разгадать каптчу и вбить ответ. Это вынесено в функцию с незамысловатым именем captcha():
    print("They want you to solve CAPTCHA. Please open this URL, and type here a captcha solution:") print("\n\t{}\n".format(data)) solution = raw_input("Solution = ").strip() return data, solution
  • Ссылки, дополнительную информацию вроде количества лайков и ответы сервера в JSON будем писать в файлы, на всякий случай.
  • К некоторым аудиозаписям приложен текст песни, что тоже имеет смысл сохранять.
  • Имена файлов могут быть некорректны для файловой системы, поэтому приходится избавляться от некоторых символов. Готового «правильного» решения я не нашел, поэтому пришлось изобрести мини-велосипед:
    result = unicode(re.sub("[^+=\-()$!#%&,.\w\s]", "_", name, flags=re.UNICODE).strip())
  • Еще одна проблема с именами файлов: могут совпадать, например в случае с документами. Для этого к имени файла добавим (n), где n - первое число, дающее уникальное имя файла.
    #file might exist, so add (1) or (2) etc counter = 1 if exists(fname) and isfile(fname): name, ext = splitext(fname) fname = name + " ({})".format(counter) + ext while exists(fname) and isfile(fname): counter += 1 name, ext = splitext(fname) fname = name[:-4] + " ({})".format(counter) + ext
Продолжим
Код обращения к api взят из статьи хабраюзера dzhioev , и добавлена обработка ситуаций, описанных выше. Чтобы было, что сохранять (в случае с обработкой стены), надо сначала узнать количество постов:
#determine posts count (response, json_stuff) = call_api("wall.get", [("owner_id", args.id), ("count", 1), ("offset", 0)], args) count = response
Дальше запрашиваем каждый пост по отдельности и разбираем его
for x in xrange(args.wall_start, args.wall_end): (post, json_stuff) = call_api("wall.get", [("owner_id", args.id), ("count", 1), ("offset", x)], args) process_post(("wall post", x), post, post_parser, json_stuff)
Результат запроса - это набор данных в JSON, которые разбираются в стандартные для python"а структуры с помощью json.loads() из стандартной библиотеки. В итоге, имеем хэш-массив, в котором некоторые поля (ключ-значение) несут полезную нагрузку, а остальные нас не интересуют. Чтобы руками не писать, какое поле каким методом обрабатывать, воспользуемся мощью рефлексии: будем искать метод, имя которого совпадает с интересующим ключом.
for k in raw_data.keys(): try: f = getattr(self, k) keys.append(k) funcs.append(f) except AttributeError: logging.warning("Not implemented: {}".format(k)) logging.info("Saving: {} for {}".format(", ".join(keys), raw_data["id"])) for (f, k) in zip(funcs, keys): f(k, raw_data)
Парсим
Теперь нужно разбираться с полями ответа. Интересные - это attachments, text, comments. Attachments - это список приложений к посту (аудио, картинки, документы, заметки), надо уметь скачивать каждый тип. Определяемся, каким методом обрабатывать каждый attachment, аналогичным способом: по типу аттача ищем метод с подходящим именем. Вот пример «качалки» для аудио:
def dl_audio(self, data): aid = data["aid"] owner = data["owner_id"] request = "{}_{}".format(owner, aid) (audio_data, json_stuff) = call_api("audio.getById", [("audios", request), ], self.args) try: data = audio_data name = u"{artist} - {title}.mp3".format(**data) self.save_url(data["url"], name) except IndexError: # deleted:(logging.warning("Deleted track: {}".format(str(data))) return # store lyrics if any try: lid = data["lyrics_id"] except KeyError: return (lyrics_data, json_stuff) = call_api("audio.getLyrics", [("lyrics_id", lid), ], self.args) text = lyrics_data["text"].encode("utf-8") ...
К сожалению, изъятые по просьбе правообладателей аудиозаписи больше не доступны, для них возвращается пустой ответ.

А остальное?

Методы обработки картинок, текста, заметок, закачки документов и остальное - в github . Скажу только, что все аналогично приведенным примерам. Еще скрипт имеет аргументы командной строки, их описывать в статье смысла нет. Примеры и прочие подробности - в readme .
TODO
Я не стал делать сохранение фотоальбомов, потому что у меня там ничего важного не хранится, да и код kilonet из его статьи неплохо работает. Еще не сохраняются видеозаписи и заметки, мне это показалось не сильно нужным.
На последок
Код далек от идеала и не отличается отсутствием костылей, но выполняет поставленную задачу. Надеюсь, кому-то пригодится моя поделка, для сохранения своих записей/документов/музыки, или для обучения.
UPD 18.12.2016
Юзер hiwent говорит, что с 16.12.2016 года vk закрыли возможность использовать API для работы с аудиозаписями. В связи с этим, функционал скрипта, предусмотренный для сохранения аудиозаписей, не работает. В связи с этим можно попробовать «прикинуться» родным приложением vk, апример андроид-версией, или kate mobile. Для них возможность работать с аудиозаписями никуда не пропадет, хотя может быть методы отличаются.

Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: