Всем привет!
Вчера мне понадобилось скачать все фотографии из диалога с одним человеком в vk.com. Фотографий было больше 1000 штук. Понятное дело, что ручками это все делать было бы утомительно и… Стыдно. Не для того программированием занимаюсь, чтобы такую грязную работу делать не автоматизированно. Поэтому было решено написать скрипт.
В качестве языка был выбран Python. Его удобно использовать для консоли, он довольно быстрый, есть модуль urllib, позволяющий «одним движением» скачивать картинки по ссылке. Но главная причина - это то, что я начал изучать его недавно. Решил дополнительно попрактиковаться.
Сам скрипт получился небольшой, но было бы интересно описать процесс создания. Буду стараться писать побольше комментариев в коде, чтобы те, кто не знает python, тоже смогли понять процесс. А от знатоков очень приветствуются советы и указания. Итак, приступим.
«Вконтакте» не предоставляет API конкретно для скачивания материалов из беседы, поэтому самое долгое время заняло изучение того, как устроена система подгрузки картинок из диалога в vk.com. Все картинки лежат у них, понятное дело, на сервере, и доступ к ним имеет любой, у кого есть ссылка на эту картинку. Таким образом, чтобы скачать все фотографии из диалога, нам надо получить все ссылки на картинки. Тыкаясь туда-сюда, было выяснено, что при нажатии на «Действия -> показать материалы из беседы» отправляется POST запрос на vk.com/wkview.php . Запрос содержит параметры:
16515wkview.js,wkview.css,page.js,page.css,page_help.css065900
Из всего этого нам интересны только ссылки, которые находятся внутри , а так же json на конце. Я был не до конца честен, говоря, что POST запрос принимает 4 параметра. Точнее, он принимает, но если его выполнить нам выдадутся только первые несколько фотографий. Так как vk.com имеет подгрузку контента по мере прокручивания страницы, то существует параметр offset, который отвечает за то, какую часть из всего множества фотографий нам подгрузить. В итоге параметры запроса выглядят вот так:
Кстати, а что насчет выполнения запросов? Как нам получить доступ к своей странице? Было выяснено, что доступ к странице может получить тот, у кого есть 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
Вот и все, вроде. Конечно, можно еще многое добавить: проверку на выполнен запрос или нет, проверку на корректность входящих данных, автоматическое вытаскивание
Весь рабочий код целиком лежит на
По тем или иным причинам у вас, как у пользователя социальной сети ВКонтакте, может возникнуть необходимость скачивания диалогов. В рамках статьи мы расскажем обо всех наиболее актуальных решениях этой задачи.
В случае полноценной версии сайта ВК скачивание диалога не должно вызвать у вас трудностей, так как каждый способ требует минимальное количество действий. Кроме того, каждая последующая инструкция может быть вами использована вне зависимости от разновидности браузера.
Каждый современный браузер позволяет вам не только просматривать содержимое страниц, но и сохранять его. При этом сохранению могут быть подвергнуты любые данные, включая переписки из социальной сети ВКонтакте.
С прочими нюансами вам лучше всего ознакомиться самостоятельно, а данный метод можно считать завершенным.
Процесс скачивания какого-либо конкретного диалога можно сильно упростить, воспользовавшись расширением . В отличие от описанного выше способа, данный подход позволит вам скачать лишь одну необходимую переписку, проигнорировав элементы оформления самого сайта ВКонтакте.
Можно выбрать как личный диалог с пользователем, так и беседу.
Если учитывать все упомянутые нюансы, у вас не должно возникнуть проблем ни с сохранением переписки, ни с ее последующим просмотром.
Всем привет!
Вчера мне понадобилось скачать все фотографии из диалога с одним человеком в vk.com. Фотографий было больше 1000 штук. Понятное дело, что ручками это все делать было бы утомительно и… Стыдно. Не для того программированием занимаюсь, чтобы такую грязную работу делать не автоматизированно. Поэтому было решено написать скрипт.
В качестве языка был выбран Python. Его удобно использовать для консоли, он довольно быстрый, есть модуль urllib, позволяющий «одним движением» скачивать картинки по ссылке. Но главная причина - это то, что я начал изучать его недавно. Решил дополнительно попрактиковаться.
Сам скрипт получился небольшой, но было бы интересно описать процесс создания. Буду стараться писать побольше комментариев в коде, чтобы те, кто не знает python, тоже смогли понять процесс. А от знатоков очень приветствуются советы и указания. Итак, приступим.
«Вконтакте» не предоставляет API конкретно для скачивания материалов из беседы, поэтому самое долгое время заняло изучение того, как устроена система подгрузки картинок из диалога в vk.com. Все картинки лежат у них, понятное дело, на сервере, и доступ к ним имеет любой, у кого есть ссылка на эту картинку. Таким образом, чтобы скачать все фотографии из диалога, нам надо получить все ссылки на картинки. Тыкаясь туда-сюда, было выяснено, что при нажатии на «Действия -> показать материалы из беседы» отправляется POST запрос на vk.com/wkview.php . Запрос содержит параметры:
16515wkview.js,wkview.css,page.js,page.css,page_help.css065900
Из всего этого нам интересны только ссылки, которые находятся внутри , а так же json на конце. Я был не до конца честен, говоря, что POST запрос принимает 4 параметра. Точнее, он принимает, но если его выполнить нам выдадутся только первые несколько фотографий. Так как vk.com имеет подгрузку контента по мере прокручивания страницы, то существует параметр offset, который отвечает за то, какую часть из всего множества фотографий нам подгрузить. В итоге параметры запроса выглядят вот так:
Кстати, а что насчет выполнения запросов? Как нам получить доступ к своей странице? Было выяснено, что доступ к странице может получить тот, у кого есть 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
Вот и все, вроде. Конечно, можно еще многое добавить: проверку на выполнен запрос или нет, проверку на корректность входящих данных, автоматическое вытаскивание
Весь рабочий код целиком лежит на
Всем привет!
Вчера мне понадобилось скачать все фотографии из диалога с одним человеком в 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
Из всего этого нам интересны только ссылки, которые находятся внутри , а так же json на конце. Я был не до конца честен, говоря, что POST запрос принимает 4 параметра. Точнее, он принимает, но если его выполнить нам выдадутся только первые несколько фотографий. Так как vk.com имеет подгрузку контента по мере прокручивания страницы, то существует параметр offset, который отвечает за то, какую часть из всего множества фотографий нам подгрузить. В итоге параметры запроса выглядят вот так:
Из всех параметров меняться будет меняться только 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
Вот и все, вроде. Конечно, можно еще многое добавить: проверку на выполнен запрос или нет, проверку на корректность входящих данных, автоматическое вытаскивание