Я уже давно заметил, что данные в социальных сетях хранятся плохо. Например, сделанный вами репост окажется пустым, если автор оригинальной записи ее удалит. Недавние проблемы с аудиозаписями в 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» + «client_id=%sdisplay=wap» % (args.app_id, «,».join(args.access_rights)) print(«Please open this url:nnt<>n».format(url)) raw_url = raw_input(«Grant access to your acc and copy resulting URL here: «) res = re.search(‘access_token=([0-9A-Fa-f]+)’, raw_url, re.I)
if result[u’error’][u’error_code’] == 6: # too many requests logging.debug(«Too many requests per second, sleeping..») sleep(1) continue
print(«They want you to solve CAPTCHA. Please open this URL, and type here a captcha solution:») print(«nt<>n».format(data[u’error’][u’captcha_img’])) solution = raw_input(«Solution python»>result = unicode(re.sub(‘[^+=-()$!#% (<>)».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[0]
Дальше запрашиваем каждый пост по отдельности и разбираем его
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[0] name = u» — .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. Для них возможность работать с аудиозаписями никуда не пропадет, хотя может быть методы отличаются.
Источник: habr.com
Как в контакте добавить на стену картинку из группы?
Первый вариант: нажимаете на картинку правой кнопкой мыши и выбираете «Сохранить как», загружаете к себе на ПК, а потом публикуете у себя на стене.
Второй вариант: нажимаете на громкоговоритель и выбираете «Поделиться» и пункт «Друзья и подписчики». По желанию добавляете свой комментарий и запись с группы копируется у вас на стене.
автор вопроса выбрал этот ответ лучшим
комментировать
в избранное ссылка отблагодарить
владс андро вич [764K]
6 лет назад
На сайте ВКонтакте для добавления на свою стену картинку из группы,активировать вкладку — Мне нравится. В след за этим, жмите на — Рассказать друзьям. После чего, операция по сути, буде завершена окончательно.
комментировать
в избранное ссылка отблагодарить
-Irink a- [280K]
4 года назад
Сохранить картинку с группы в социальной сети ВКонтакте не сложно.
На мобильном телефоне процесс сохранения будет выглядеть так.
Выбираем картинку, нажимаем и удерживаем её, после чего картинка откроется на весь экран, а сверху вы увидите троеточие. Нажимаем на троеточие, далее во волывающем окне выберем нужную нам функцию сохранения.
Но компьютере процесс сохранения картинки аналогичный, только нажимаем на выбранную картинку левой кнопкой мыши, при выборе будет предоставлено больше возможностей для работы с картинкой.
комментировать
в избранное ссылка отблагодарить
azick [52.1K]
6 лет назад
Сделать это довольно легко, причем в любой социальной сети, а не только в Вконтакте. Для этого вам нужно всего лишь нажать на клавишу «Поделиться» ( в виде громкоговорителя), выбрать пункт «Друзья и подписчики» и после этого пост (картинка, видео, музыка, текст) появится на вашей стенке вашего аккаунта.
комментировать
в избранное ссылка отблагодарить
6 лет назад
В принципе тут нет ничего сложного. Когда нашли на стене, или же в альбомах какого-либо из сообществ понравившееся изображение то нажимаете на него правой кнопкой мышки и внизу увидите «поделиться» и там выбираете «друзья и подписчики» и жмете на кнопку «поделиться фотографией». Но это только в том случае сработает если группа открытая. Если закрытая или частная, то поделиться можно только в личных сообщениях с кем-то из друзей, а на стену не отправится. В таком случае можно скачать фотографию себе на рабочий стол и прикрепить ее на стену или не скачивая сохранить себе и тоже прикрепить на стену.
Источник: www.bolshoyvopros.ru
как сохранить картинку себе на стену?
Ответы
Гвоздём прибей
Похожие вопросы
Картинку на стену можно добавить посредством одного из приложений Вконтакте. Также нажимаете пункт «прикрепить», выбираете нужное приложение, и затем в самом приложении все делается автоматически – выбираете картинку, нажимаете «разместить», или «отправить».
Также вы можете нажать пункт «прикрепить», выбрать пункт «фотографию», затем у вас появится окошко, в котором вы сможете выбрать фотографию из ваших альбомов на сайте, или же нажать пункт «загрузить фотографию» и выбрать фото с вашего компьютера. Затем, когда фотография загрузилась, попросту нажимаете пункт «отправить».
Целая папка.
Первые три ответа «фтопку»
Для того, чтобы вытащить из ворда оригинальное изображение, надо этот документ сохранить как HTML-документ. И в подпапке названия файла будут искомые изображения именно в том виде, в котором они запихивались изначально в документ.
нажимаеь print screen
потом в paint — paste (ctrl+v)
и сохраняй
нарисуй ему картинку, вырази на ней свои чувства. поверь — это более эффективный метод)
а если понравившийся текст с картинкой хочешь поставить на свою стену, то жмешь лайк и сверку будет табличка -рассказать друзьям
Источник: irc.lv