Как сохранить диалог вконтакте.

Всем привет!

Вчера мне понадобилось скачать все фотографии из диалога с одним человеком в vk.com. Фотографий было больше 1000 штук. Понятное дело, что ручками это все делать было бы утомительно и… Стыдно. Не для того программированием занимаюсь, чтобы такую

Грязную

работу делать не автоматизированно. Поэтому было решено написать скрипт.

В качестве языка был выбран Python. Его удобно использовать для консоли, он довольно быстрый, есть модуль urllib, позволяющий «одним движением» скачивать картинки по ссылке. Но главная причина - это то, что я начал изучать его недавно. Решил дополнительно попрактиковаться.

Сам скрипт получился небольшой, но было бы интересно описать процесс создания. Буду стараться писать побольше комментариев в коде, чтобы те, кто не знает python, тоже смогли понять процесс. А от знатоков очень приветствуются советы и указания. Итак, приступим.

«Вконтакте» не предоставляет API конкретно для скачивания материалов из беседы, поэтому самое долгое время заняло изучение того, как устроена система подгрузки картинок из диалога в vk.com. Все картинки лежат у них, понятное дело, на сервере, и доступ к ним имеет любой, у кого есть ссылка на эту картинку. Таким образом, чтобы скачать все фотографии из диалога, нам надо получить все ссылки на картинки. Тыкаясь туда-сюда, было выяснено, что при нажатии на «Действия -> показать материалы из беседы» отправляется POST запрос на

vk.com/wkview.php

Запрос содержит параметры:

В этом запросе dialog_id - это значение параметра «sel» в адресной строке, когда мы заходим в диалог.

Выполнив такой запрос, мы получим в ответ что-то вроде вот этого:

16515wkview.js,wkview.css,page.js,page.css,page_help.css065900

Фотографии в переписке с ЮЗЕР_НЭЙМ
... (и еще много ссылок с картинками)
Список пуст.
{"count":"23318","offset":3330,"type":"history","commonClass":"wk_history_content wk_history_photo_content","wkRaw":"history_photo","canEdit":false,"lang":}WkView.historyInit();

Из всего этого нам интересны только ссылки, которые находятся внутри , а так же json на конце. Я был не до конца честен, говоря, что POST запрос принимает 4 параметра. Точнее, он принимает, но если его выполнить нам выдадутся только первые несколько фотографий. Так как vk.com имеет подгрузку контента по мере прокручивания страницы, то существует параметр offset, который отвечает за то, какую часть из всего множества фотографий нам подгрузить. В итоге параметры запроса выглядят вот так:

  • act:show
  • loc:im
  • w:history_photo
  • offset: offset
  • part: 1

Из всех параметров меняться будет меняться только offset. Его мы вытаскивает из того самого json"a на конце ответа. Каждый раз при выполнении запроса offset внутри json"а будет увеличиваться, показывая, какое «смещение» надо сделать в следующий раз. Таким образом, нам надо будет делать запросы до тех пор, пока у нас offset будет меньше count.

Кстати, а что насчет выполнения запросов? Как нам получить доступ к своей странице? Было выяснено, что доступ к странице может получить тот, у кого есть cookie под названием remixsid. Таким образом нам надо подставить эту куку в функцию, которая выполняет запрос и все получится. Безопасно? Не совсем, швыряться куками - это не есть хорошо, но я не нашел другого варианта. Если кто-то знает, напишите пожалуйста.

Общий алгоритм вроде понятен: сделать запрос, вытащить ссылки, записать их в файл, проверить-

новый offset>count?-, если нет, то присвоить offset новое значение и выполнить запрос с ним, если да, то выйти из цикла. Затем пройтись по всем ссылкам в файле и скачать картинки лежащие по их адресу. Начинаем писать код.

# coding=utf-8 import requests # для выполнения запросов import re # для парсинга по регулярным выражениям import sys # для обработки аргументов командной строки import os # для создания папок с фотографиями import urllib # для скачивания картинок import json # для обработки json # argv = remixsid_cookie # argv = dialog_id # argv = person_name

Аргументы у нас будут передаваться через терминал (remixsid, dialog_id и название папки):

Remixsid_cookie = sys.argv # Словарь запроса RequestData = { "act": "show", "al": 1, "loc":"im", "w": "history" + sys.argv + "_photo", "offset" : 0, "part" : 1 } request_href = "http://vk.com/wkview.php" # Установим первоначальные offset и count. Count изменится при первом запросе bound = {"count" : 10000, "offset" : 0}

Создадим отдельную папку для фотографий:

Try: os.mkdir("drop_" + sys.argv) # Пытаемся создать папку except OSError: print "Проблемы с созданием папки "drop_" + sys.argv + """ if(os.path.exists("drop_" + sys.argv)): os.chdir("drop_" + sys.argv) # Переходим в эту папку else: print "Не удалось создать папку\n" exit()

Отлично, начинаем выполнение запросов:

Test = open("links", "w") while(bound["offset"] < bound["count"]): RequestData["offset"] = bound["offset"] content = requests.post(request_href, cookies={"remixsid": remixsid_cookie}, params=RequestData).text # Этой командой мы выполняем post запрос с параметрами params и передавая куки. .text возвращает ответ запроса в виде текста. Все просто.

Теперь начинаем парсинг ответа. Извлекаем все через регулярные выражения. Сначала извлекаем json и устанавливаем следующий offset:

#ищем первое совпадение по регулярному выражению json_data_offset = re.compile("\{"count":.+?,"offset":.+?\}").search(content) # .search возвращает специальный объект. У него есть метод span(), который возвращает кортеж с индексами начала и конца найденной подстроки bound = json.loads(content) # декодируем json bound["count"] = int(bound["count"]) #count отдается в виде строки bound["offset"] = int(bound["offset"]) # на случай, если в будущем тоже будет отдаваться в виде строки. В принципе это написано ради "на всякий случай"

Links = re.compile("src="http://.+?"").findall(content)

Теперь запишем все в файл:

For st in links: test.write(st + "\n") # пишем то, что внутри src="..." test.close()

С этим все. Осталось только пройтись по файлу и скачать все по ссылкам. Это делается с помощью модуля urllib, вот так:

А для нашего случая:

Test = open("links", "r") file_num = 0 for href in test: # берем строку из файла которая является ссылкой, и так до конца файла urllib.urlretrieve(href, str(file_num)) # в качестве имени файла просто используем его порядковый номер file_num += 1 print "Скачано " + str(file_num) + " файлов\n" test.close()

Готово! Но, так как использовать это мы будем из командной строки, давайте еще напишем небольшую документацию (--help), а так же вывод об ошибке, если аргументов командной строки меньше, чем нужно. Добавим в начало:

If(sys.argv == "--help"): print """ Usage: python main.py is a string parameter "sel" in address line which you see when open a dialog """ exit() else: if(len(sys.argv) < 4): print """ Invalid number of arguments. Use parameter --help to know more """ exit()

Вот и все, вроде. Конечно, можно еще многое добавить: проверку на выполнен запрос или нет, проверку на корректность входящих данных, автоматическое вытаскивание (например, первых 10), но мне просто хотелось описать основные моменты. В итоге те самые 1000 фотографий, которые мне были нужны, были скачаны. Заняло это где-то 2 минуты. Никаких ограничений на запросы, как так понял, vk.com не ставит, хотя могу предположить, что на такой маленький для него трафик он даже не реагирует.

Хорошо, если опыт и интуиция сами подскажут, как действовать и в какую папку сохранить изображение. А если нет? Тогда лучше обратиться к знающим людям – друзьям, коллегам или близким родственникам. Скорее всего, они сумеют не только сделать это, но и научить вас, ведь ничего сложного в процедуре нет – пара нехитрых манипуляций.

Однако если вы читаете эту статью, то обязательно сможете скачать фотографию с ВКонтакте без посторонней помощи. А если в вашем компьютере или ноутбуке еще установлено приложение SaveFrom.net – помощник скачивания, то получится сохранять без проблем не только один снимок за другим поочередно, а целый фотоальбом всего одним кликом.

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

Итак, вы вошли в сеть теперь собираетесь скачать фотографию. Для этого:

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

Для этого:

  • выберите на рабочем столе иконку с названием «Мой компьютер» и кликните по ней;
  • найдите слева в углу папку «Загрузки» и откройте ее, щелкнув по ней;
  • поищите загруженный файл и мышкой перенесите на рабочий стол.

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

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

Установив SaveFrom.net помощник, можно легко и бесплатно скачать понравившийся фотоальбом любимых сообществ или определенных пользователей целиком в компьютер напрямую с любой страницы ВКонтакте. Только после установки программки не забудьте включить расширение в используемом браузере.

  • войти в свой профиль и найти в колонке слева «Фотографии», «Мои альбомы», выбрать нужный среди них, а затем скачать его, кликнув по высветившейся над эскизами снимков соответствующей кнопке;
  • если нужны интересные фотоматериалы какого-то сообщества, то заходим на его страницу, справа внизу выбираем «Фотоальбомы», затем кликаем левой кнопкой мыши на «скачать фотоальбом».

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

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

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

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

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

За загрузку каждых 200 фотографий нужно оплатить 1 кредит ценностью в 5 рублей. Купить их можно банковской картой или электронными деньгами. Приятно то, что первый вход на сайт предоставляет стартовый кредит, которого достаточно для загрузки около двух тысяч фотографий.

Если вышеназванные варианты не устроили, предлагаем вашему вниманию еще один бесплатный способ, позволяющий скачивать любые файлы в максимальном количестве – это установка программы VKMusic 4. Практически это аналог SaveFrom.net помощника, но с другим интерфейсом и некоторой разницей в функциях. Кому-то он кажется более удобным, поэтому на всякий случай расскажем о том, как с его помощью можно скачать фотоальбом.

Прежде всего, понадобится адрес странички, где он расположен. Его необходимо обязательно скопировать. Затем:

  • в главном меню VKMusic найти пункт «ВКонтакте» и кликнуть по нему;
  • в открывшемся окошке выбрать «скачать фотоальбом с контакта»;
  • в диалоговом окне для ввода параметров вставить в поле скопированную ссылку;
  • во втором поле указать папку для сохранения;
  • нажать на кнопку «скачать фотоальбом».

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

Кроме перечисленных трех способов, действует сервер «загрузка альбомов из вконтакте». Этот сайт позволит получить до 1000 изображений одним кликом. При этом нет необходимости загружать какую-либо программку, достаточно лишь выйти на нужную страницу и ввести в поле скопированную предварительно ссылку на альбом. Нажмите на кнопку «Поехали» и в результате загружается Zip-архив с альбомом и нужными снимками на ваш компьютер.

Четвертый способ

Если вы не хотите ничего устанавливать, никаких программ и расширений, а так же не собираетесь давать посторонним сайтам доступ к своему аккаунту Вконтакте, но все же хотите скачать много, а то и все, фотографии из альбомов ВК, вам поможет специальный сервиспарсер фото Вконтакте — с ним легко можно скачивать любое количество фотографий из альбомов ВК или стен, а, главное, не только из своего аккаунта, но и из любых сообществ и стен любых пользователей ВК, не делая никакой «авторизации» своим аккаунтом Вконтакте!

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

Всем привет!

Вчера мне понадобилось скачать все фотографии из диалога с одним человеком в vk.com. Фотографий было больше 1000 штук. Понятное дело, что ручками это все делать было бы утомительно и… Стыдно. Не для того программированием занимаюсь, чтобы такую грязную работу делать не автоматизированно. Поэтому было решено написать скрипт.

В качестве языка был выбран Python. Его удобно использовать для консоли, он довольно быстрый, есть модуль urllib, позволяющий «одним движением» скачивать картинки по ссылке. Но главная причина - это то, что я начал изучать его недавно. Решил дополнительно попрактиковаться.

Сам скрипт получился небольшой, но было бы интересно описать процесс создания. Буду стараться писать побольше комментариев в коде, чтобы те, кто не знает python, тоже смогли понять процесс. А от знатоков очень приветствуются советы и указания. Итак, приступим.

«Вконтакте» не предоставляет API конкретно для скачивания материалов из беседы, поэтому самое долгое время заняло изучение того, как устроена система подгрузки картинок из диалога в vk.com. Все картинки лежат у них, понятное дело, на сервере, и доступ к ним имеет любой, у кого есть ссылка на эту картинку. Таким образом, чтобы скачать все фотографии из диалога, нам надо получить все ссылки на картинки. Тыкаясь туда-сюда, было выяснено, что при нажатии на «Действия -> показать материалы из беседы» отправляется POST запрос на vk.com/wkview.php . Запрос содержит параметры:

  • act:show
  • loc:im
  • w:history_photo
В этом запросе dialog_id - это значение параметра «sel» в адресной строке, когда мы заходим в диалог.
Выполнив такой запрос, мы получим в ответ что-то вроде вот этого:

16515wkview.js,wkview.css,page.js,page.css,page_help.css065900

Фотографии в переписке с ЮЗЕР_НЭЙМ
... (и еще много ссылок с картинками)
Список пуст.
{"count":"23318","offset":3330,"type":"history","commonClass":"wk_history_content wk_history_photo_content","wkRaw":"history_photo","canEdit":false,"lang":}WkView.historyInit();
Здесь я заменил ссылки на <некая ссылка>, так как уже говорил, что картинки vk лежат в открытом доступе и получить их может любой, кто знает ссылку.

Из всего этого нам интересны только ссылки, которые находятся внутри , а так же json на конце. Я был не до конца честен, говоря, что POST запрос принимает 4 параметра. Точнее, он принимает, но если его выполнить нам выдадутся только первые несколько фотографий. Так как vk.com имеет подгрузку контента по мере прокручивания страницы, то существует параметр offset, который отвечает за то, какую часть из всего множества фотографий нам подгрузить. В итоге параметры запроса выглядят вот так:

  • act:show
  • loc:im
  • w:history_photo
  • offset: offset
  • part: 1
Из всех параметров меняться будет меняться только offset. Его мы вытаскивает из того самого json"a на конце ответа. Каждый раз при выполнении запроса offset внутри json"а будет увеличиваться, показывая, какое «смещение» надо сделать в следующий раз. Таким образом, нам надо будет делать запросы до тех пор, пока у нас offset будет меньше count.

Кстати, а что насчет выполнения запросов? Как нам получить доступ к своей странице? Было выяснено, что доступ к странице может получить тот, у кого есть cookie под названием remixsid. Таким образом нам надо подставить эту куку в функцию, которая выполняет запрос и все получится. Безопасно? Не совсем, швыряться куками - это не есть хорошо, но я не нашел другого варианта. Если кто-то знает, напишите пожалуйста.

Общий алгоритм вроде понятен: сделать запрос, вытащить ссылки, записать их в файл, проверить-
новый offset>count?-, если нет, то присвоить offset новое значение и выполнить запрос с ним, если да, то выйти из цикла. Затем пройтись по всем ссылкам в файле и скачать картинки лежащие по их адресу. Начинаем писать код.

# coding=utf-8 import requests # для выполнения запросов import re # для парсинга по регулярным выражениям import sys # для обработки аргументов командной строки import os # для создания папок с фотографиями import urllib # для скачивания картинок import json # для обработки json # argv = remixsid_cookie # argv = dialog_id # argv = person_name
Аргументы у нас будут передаваться через терминал (remixsid, dialog_id и название папки):

Remixsid_cookie = sys.argv # Словарь запроса RequestData = { "act": "show", "al": 1, "loc":"im", "w": "history" + sys.argv + "_photo", "offset" : 0, "part" : 1 } request_href = "http://vk.com/wkview.php" # Установим первоначальные offset и count. Count изменится при первом запросе bound = {"count" : 10000, "offset" : 0}
Создадим отдельную папку для фотографий:

Try: os.mkdir("drop_" + sys.argv) # Пытаемся создать папку except OSError: print "Проблемы с созданием папки "drop_" + sys.argv + """ if(os.path.exists("drop_" + sys.argv)): os.chdir("drop_" + sys.argv) # Переходим в эту папку else: print "Не удалось создать папку\n" exit()
Отлично, начинаем выполнение запросов:

Test = open("links", "w") while(bound["offset"] < bound["count"]): RequestData["offset"] = bound["offset"] content = requests.post(request_href, cookies={"remixsid": remixsid_cookie}, params=RequestData).text # Этой командой мы выполняем post запрос с параметрами params и передавая куки. .text возвращает ответ запроса в виде текста. Все просто.
Теперь начинаем парсинг ответа. Извлекаем все через регулярные выражения. Сначала извлекаем json и устанавливаем следующий offset:

#ищем первое совпадение по регулярному выражению json_data_offset = re.compile("\{"count":.+?,"offset":.+?\}").search(content) # .search возвращает специальный объект. У него есть метод span(), который возвращает кортеж с индексами начала и конца найденной подстроки bound = json.loads(content) # декодируем json bound["count"] = int(bound["count"]) #count отдается в виде строки bound["offset"] = int(bound["offset"]) # на случай, если в будущем тоже будет отдаваться в виде строки. В принципе это написано ради "на всякий случай"
Теперь надо извлечь все ссылки из тегов src. Действуем тем же способом, но используем метод findall, который возвращает массив всех строк, которые совпали с регуляркой:

Links = re.compile("src="http://.+?"").findall(content)
Теперь запишем все в файл:

For st in links: test.write(st + "\n") # пишем то, что внутри src="..." test.close()
С этим все. Осталось только пройтись по файлу и скачать все по ссылкам. Это делается с помощью модуля urllib, вот так:

Test = open("links", "r") file_num = 0 for href in test: # берем строку из файла которая является ссылкой, и так до конца файла urllib.urlretrieve(href, str(file_num)) # в качестве имени файла просто используем его порядковый номер file_num += 1 print "Скачано " + str(file_num) + " файлов\n" test.close()
Готово! Но, так как использовать это мы будем из командной строки, давайте еще напишем небольшую документацию (--help), а так же вывод об ошибке, если аргументов командной строки меньше, чем нужно. Добавим в начало:

If(sys.argv == "--help"): print """ Usage: python main.py is a string parameter "sel" in address line which you see when open a dialog """ exit() else: if(len(sys.argv) < 4): print """ Invalid number of arguments. Use parameter --help to know more """ exit()
Вот и все, вроде. Конечно, можно еще многое добавить: проверку на выполнен запрос или нет, проверку на корректность входящих данных, автоматическое вытаскивание (например, первых 10), но мне просто хотелось описать основные моменты. В итоге те самые 1000 фотографий, которые мне были нужны, были скачаны. Заняло это где-то 2 минуты. Никаких ограничений на запросы, как так понял, vk.com не ставит, хотя могу предположить, что на такой маленький для него трафик он даже не реагирует.

Весь рабочий код целиком лежит на

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

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

Способ 1: Скачивание страницы

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

  1. Находясь на сайте ВКонтакте, перейдите к разделу «Сообщения» и откройте сохраняемый диалог.
  2. Так как сохранению будут подвергнуты только заранее загруженные данные, вам нужно пролистать переписку до самого верха.
  3. Выполнив это, кликните правой кнопкой мыши в любом месте окна, за исключением области видеороликов или изображений. После этого из списка выберите пункт «Сохранить как…» или же воспользуйтесь сочетанием клавиш «Ctrl+S» .
  4. Укажите место сохранения конечного файла на вашем компьютере. Но учтите, что скачано будет несколько файлов, включая все изображения и документы с исходным кодом.
  5. Время загрузки может существенно отличаться, исходя из количества данных. Однако сами файлы, за исключением основного HTML-документа, будут попросту скопированы в ранее указанное место из кэша браузера.
  6. Для просмотра скачанного диалога перейдите к выбранной папке и запустите файл «Диалоги» . При этом в качестве программы следует использовать любой удобный веб-браузер.
  7. На представленной странице будут отображены все сообщения из переписки, имеющие базовое оформление сайта ВКонтакте. Но даже при сохраненном дизайне большинство элементов, например, поиск, работать не будет.
  8. Вы также можете получить доступ напрямую к изображениям и некоторым другим данным, посетив папку «Диалоги_files» в той же директории, где расположен HTML-документ.

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

Способ 2: VkOpt

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

  1. Откройте страницу загрузки расширения VkOpt и установите его.
  2. Переключитесь на страницу «Сообщения» и перейдите к нужной переписке.

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

  3. В рамках диалога наведите курсор мыши на значок «…» , расположенный в правой части панели инструментов.
  4. Здесь нужно выбрать пункт «Сохранить переписку» .
  5. Выберите один из представленных форматов:
    • .html – позволяет с удобством просматривать переписку в браузере;
    • .txt – позволяет читать диалог в любом текстовом редакторе.
  6. На скачивание может потребоваться довольно много времени, от нескольких секунд до десятков минут. Зависит это напрямую от количества данных в рамках переписки.
  7. После скачивания откройте файл, чтобы просмотреть письма из диалога. Тут заметьте, что помимо самих писем расширение VkOpt автоматически выводит статистику.
  8. Сами сообщения будут содержать лишь текстовое наполнение и смайлики из стандартного набора, если таковые использовались.
  9. Любые изображения, включая стикеры и подарки, расширение делает ссылками. После перехода по такой ссылке файл откроется на новой вкладке, сохранив размеры превью.

Если учитывать все упомянутые нюансы, у вас не должно возникнуть проблем ни с сохранением переписки, ни с ее последующим просмотром.