Робимо дамп фотографій із діалогу

Опис процесу розробки скрипта, який виконує роботу, яку програмісту соромно робити вручну

Експериментальна функція:

Просимо звернути увагу на те, що текст за посиланням і тут може не збігатися.

Вчора мені знадобилося скачати всі фотографії з діалогу з однією людиною у vk.com. Фотографій було понад 1000 штук. Зрозуміло, що ручками це все робити було б стомливо і... Соромно. Не для того займаюся програмуванням, щоб таку

роботу виконувати не автоматизовано. Тож було вирішено написати скрипт.

Як мову було обрано Python. Його зручно використовувати для консолі, він досить швидкий, є модуль urllib, що дозволяє одним рухом завантажувати картинки за посиланням. Але головна причина — те, що я почав вивчати його нещодавно. Вирішив додатково попрактикуватись.

. Запит містить параметри:

Виконавши такий запит, ми отримаємо у відповідь щось на кшталт цього:

Тут я замінив посилання на , тому що вже говорив, що картинки vk лежать у відкритому доступі і отримати їх може будь-хто, хто знає посилання.

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

З усіх параметрів буде змінюватися тільки offset. Його ми витягує з того самого json'a наприкінці відповіді. Щоразу при виконанні запиту offset всередині json'а буде збільшуватися,показуючи, яке «зміщення» треба зробити наступного разу. Таким чином, нам треба буде робити запити до тих пір, поки у нас offset буде менше count.

До речі, а щодо виконання запитів? Як отримати доступ до своєї сторінки? Було з'ясовано, що доступ до сторінки може отримати той, хто має cookie під назвою remixsid. Таким чином, нам треба підставити цю куку в функцію, яка виконує запит і все вийде. Безпечно? Не зовсім, кидатися куками — це не є добре, але я не знайшов іншого варіанта. Якщо хтось знає, будь ласка, напишіть.

Загальний алгоритм начебто зрозумілий: зробити запит, витягти посилання, записати їх у файл, перевірити-

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

Створимо окрему папку для фотографій:

Відмінно, починаємо виконання запитів:

Тепер починаємо парсинг відповіді. Витягуємо все через регулярні вирази. Спочатку витягаємо json і встановлюємо наступний offset:

Тепер потрібно отримати всі посилання з тегів src. Діємо тим же способом, але використовуємо метод findall, який повертає масив всіх рядків, які збіглися з регулярним:

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

А для нашого випадку:

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