• Главная
  • Карта сайта
Не найдено

Як Облако@mail.ru врятувало все * мої файли і що з цього вийшло


Одного разу я побачив цей банер і вирішив, що безкоштовний терабайт мені зовсім не завадить, тим більше, що мій архів фотографій і документів якраз лежав на терабайтний вінчестері. Зізнаюся, я дуже боявся ставити на комп'ютер програму з логотипом mail.ru, але прагнення до халяви пересилило. Я зареєструвався, отримав місце, встановив клієнт, налаштував його і забув.
А кілька місяців тому відбулося неминуче - мій жорсткий диск з архівом наказав довго жити. На щастя, на той час всі файли були скопійовані в хмару і нічого не загубилося.

Після покупки нового диска я заново встановив хмарний клієнт і став чекати, коли завантажить мої файли. Але через пару хвилин я побачив, що на диску нічого не з'явилося, а ось з Хмари файли стрімко віддаляються.
В кінці статті є UPD, UPD2, UPD3 і UPD4, в якому описані причини такої поведінки.
TL; DR: помилкова тривога, з файлами і синхронізацією все в порядку, а от для користувача інтерфейс і роботу тих. підтримки потрібно допрацьовувати.
Як з'ясувалося після спілкування з тех. підтримкою, це стандартна поведінка клієнта - яку б папку ви не згодували йому, він починає синхронізувати її в хмару, видаляючи звідти все, чого в папці немає.
Завантажити файли по WebDav теж неможливо:

Залишається тільки можливість завантажити файли через веб-інтерфейс. Файли там можна завантажувати по одному, а можна вибрати декілька файлів або папок і завантажити їх одним архівом, що досить зручно. Єдине обмеження - архів не може перевищувати 4 Гб.

Я спробував піти цим шляхом, але швидко зрозумів, що це дуже незручний варіант:
  • Обмеження в 4 гігабайти означає, що якщо у вас в хмарі знаходиться близько терабайта, доведеться качати як мінімум 250 архівів.
  • Кожен архів потрібно створювати вручну, вибираючи папки, вважаючи їх сумарний розмір і позначаючи ті, що вже завантажені.
  • Іноді архіви не відчиняються з невідомої причини.
  • Втрачається структура папок.

Файли мені все-таки потрібні, тому, я вирішив написати свій інструмент, а заодно вивчити що-небудь нове. Ну і отримати задоволення від виконання завдання, зрозуміло.
Насамперед потрібно зрозуміти, як отримати список папок і файлів. Спочатку я планував просто парсити сторінки, видирати з них інформацію про папках і файлах і будувати дерево. Але, відкривши вихідний код сторінки, я відразу ж побачив, що весь інтерфейс роботи з документами будується через javascript, що, якщо подумати, досить логічно.
Тому, у мене з'явилося два можливих варіанти вирішення: підключити
Selenium і все-таки будувати дерево з html або розібратися з внутрішнім API, яке використовується в скрипті.
Я вибрав другий шлях, як найрозумніший - навіщо щось парсити з використанням сторонніх інструментів, якщо вже є готове API?
На щастя, скрипт ні обфусцірован і навіть не стиснутий - мені були доступні вихідні імена змінних і функцій і коментарі розробників, це сильно полегшило завдання.
Після декількох хвилин вивчення я побачив, що всі доступні методи API описані в масиві:

Ось тому я і не витрачаю в своєму коді часу на красиве форматування - хто-небудь його обов'язково поламає.
Я розсудив, що для отримання списку папок і файлів в директорії потрібно викликати метод folder. Для цього потрібно відправити get-запит на адресу https://cloud.mail.ru/api/v2/folder.
Відкриваємо сторінку в браузері і бачимо таку відповідь:
{ "Body": "user", "time": 1457097026874, "status": 403}
Очевидно, потрібно авторизуватись на порталі. Авторизуйтесь, повторюю запит і бачу іншу помилку:
{ "Email": "[email protected]", "body": "token", "time": 1457097187300, "status": 403
Нічого дивного, для виконання запитів до API потрібно токен. У списку методів є два відповідних: tokens / csrf і tokens / download.
При запиті https://cloud.mail.ru/api/v2/tokens/download віддається точно така ж помилка токена, а значить нам потрібен саме csrf-токен.
Запитуємо його, додаємо в виклик методу folder параметр? Token = X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP і отримуємо нову помилку:
{ "Email": "[email protected]", "body": { "error": "invalid args"}, "time": 1457097695182, "status": 400}
Тут мені довелося знову читати вихідні, щоб з'ясувати які аргументи приймає цей метод. Виявилося, що потрібно вказати папку, вміст якої ми хочемо отримати в параметрі home.
Отже, у відповідь на запит по url https://cloud.mail.ru/api/v2/folder?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP&home=/ повертається ось такий об'єкт:
{ "Email": "[email protected]", "body": { "count": { "folders": 1, "files": 1}, "tree": "+363831373562653330303030", "name": "/ "," grev ": 17," size ": 978473730," sort ": {" order ":" asc "," type ":" name "}," kind ":" folder "," rev ": 9, "type": "folder", "home": "/", "list": [{ "count": { "folders": 1, "files": 3}, "tree": "+363831373562653330303030", "name ":" Фотографії "," grev ": 17," size ": 492119223," kind ":" folder "," rev ": 16," type ":" folder "," home ":" / Фотографії "}, { "mtime": 1456774311, "virus_scan": "pass", "name": "Полет.mp4", "size": 486354507, "hash": "C2AD142BDF1E4F9FD50E06026BCA578198BFC36E", "kind": "file", "type" : "file", "home": "/Полет.mp4"}]}, "time": 1457097848869, "status": 200}
Інформація про файли і директорії - те, що потрібно!
Працездатність API підтверджена, схема його роботи зрозуміла - можна приступати до написання програми. Я вирішив писати консольний додаток на php, оскільки добре знаю цю мову. Для цього завдання ідеально підходить компонент Console зі складу Symfony. Я вже писав консольні команди для Laravel , Які побудовані саме на цьому компоненті, але там рівень абстракції досить високий і безпосередньо з ним я не працював, тому вирішив, що настав час познайомитися ближче.
Не буду переповідати документацію, вона досить докладна і дуже проста. Нічого не знаючи про компоненті, за кілька годин я написав ось такі нехитрі інтерфейси:

Так виглядає додаток в процесі скачування файлів.

А ось так по завершенні: показується невелика табличка (максимум 100 рядків) з інформацією про завантажених файлах. Ніякої практичної користі вона не несе і зроблена виключно в освітніх цілях.
До складу консольного застосування може входити кілька команд, що викликаються наступним чином: php app.php command argument --option. Але для моїх цілей потрібна всього одна команда і я хотів би запускати скачування так: php app.php argument --option. Цього легко домогтися за допомогою інструкції з документації компонента.
Отже, консольний додаток готове, воно виводить інформацію з заздалегідь заготовлених фікстур і навіть покрито тестами . Саме час реалізувати безпосередньо отримання інформації про файлах і папках із хмари.
Тут я теж не став винаходити велосипед і скористався чудовою бібліотекою Guzzle . З її допомогою дуже зручно відправляти http запити, при цьому вона використовує інтерфейси PSR-7 .
При авторизації з головної сторінки mail.ru відправляється post-запит на адресу https://auth.mail.ru/cgi-bin/auth, що містить поля Login і Password.
Ось так виглядає метод авторизації в моєму додатку / ** * @throws InvalidCredentials * / private function auth () {$ expectedTitle = sprintf ( 'Вхідні -% s - Пошта Mail.Ru', $ this-> login); $ AuthResponse = $ this-> http-> post (static :: AUTH_DOMAIN. '/ Cgi-bin / auth', [ 'form_params' => [ 'Login' => $ this-> login, 'Password' => $ this-> password,]]); try {// http://php.net/manual/en/domdocument.loadhtml.php#95463 libxml_use_internal_errors (true); $ This-> dom-> loadHTML ($ authResponse-> getBody ()); $ ActualTitle = $ this-> dom-> getElementsByTagName ( 'title') -> item (0) -> textContent; } Catch (\ Exception $ e) {throw new InvalidCredentials; } If ($ actualTitle! == $ expectedTitle) {throw new InvalidCredentials; }}
Оскільки у відповідь на запит авторизації повертається кілька редиректів, які в підсумку призводять до поштової скриньки користувача, я вирішив просто перевіряти заголовок сторінки, щоб визначити чи успішно пройшла авторизація.
Перевірка проста настільки, що зараз вона провалюється якщо в поштовій скриньці є непрочитані листи - їх кількість виводиться в заголовку сторінки. Але я ящиком не користуюся, тому для моїх цілей цього достатньо.

Далі я спробував запросити csrf-токен, але з подивом отримав вже знайому помилку:
{ "Status": 403, "body": "user"}
Я зайнявся налагодженням запитів і побачив, що авторизація відбувається успішно, але, тим не менш, токен мені не віддавався. Дуже схоже на проблему з куками і дійсно, виявляється, в Guzzle вони по-замовчуванню вимкнені і їх потрібно включати руками .
Найпростіше це зробити один раз при ініціалізації клієнта:
$ Client = new \ GuzzleHttp \ Client ([ 'cookies' => true]);
Ще одним параметром ініціалізації є 'debug' => true, з ним налагодження запитів майже безболісна.
Налаштувавши куки, я знову спробував отримати токен і отримав у відповідь помилку авторизації, з якої до цього не стикався:
{ "Email": "[email protected]", "body": "nosdc", "time": 1457097187300, "status": 403}
Після читання початкових кодів та моніторингу процесу авторизації я побачив, що sdc - це ще одна кука, яка виходить окремим запитом при старті програми: https://auth.mail.ru/sdc?from=https://cloud.mail.ru/ home.
Я додав цей запит після запиту авторизації і нарешті зміг отримати токен. Ну а далі справа техніки - запитувати вміст кореневої папки і рекурсивно вміст її підпапок, і дерево готове.
Як виявилося, дерево в результаті навіть не знадобилося - кожен файл зберігає повний шлях від кореня, тому для скачування досить плоского списку.
Механізм скачування трохи хитрий: потрібно спочатку запитати рекомендований шард (щось схоже на https://cloclo28.datacloudmail.ru/get/) і тільки потім завантажувати файл.
З огляду на, що адреси Шардена відрізняються тільки цифрою, думаю, можна було б не морочитися і захардкодіть адреса, але якщо вже робити, то робити до кінця!
Для отримання масиву Шардена потрібно виконати метод dispatcher (https://cloud.mail.ru/api/v2/dispatcher?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP):
{ "Email": "[email protected]", "body": { "video": [{ "count": "3", "url": "https://cloclo22.datacloudmail.ru/video/" }], "view_direct": [{ "count": "250", "url": "http://cloclo18.cloud.mail.ru/docdl/"}], "weblink_view": [{ "count": "50", "url": "https://cloclo18.datacloudmail.ru/weblink/view/"}], "weblink_video": [{ "count": "3", "url": "https: // cloclo18.datacloudmail.ru/videowl/ "}]," weblink_get ": [{" count ": 1," url ":" https://cloclo27.cldmail.ru/2yoHNmAc9HVQzZU1hcyM/G "}]," weblink_thumbnails ": [{ "count": "50", "url": "https://cloclo3.datacloudmail.ru/weblink/thumb/"}], "auth": [{ "count": "500", "url" : "https://swa.mail.ru/cgi-bin/auth"}], "view": [{ "count": "250", "url": "https://cloclo2.datacloudmail.ru/ view / "}]," get ": [{" count ":" 100 "," url ":" https://cloclo27.datacloudmail.ru/get/ "}]," upload ": [{" count " : "25", "url": "https://cloclo22-upload.cloud.mail.ru/upload/"}], "thumbnails": [{ "count": "250", "url": "https : //cloclo3.cloud.mail.ru/thumb/ "}]}," time ": 1457101607726," status ": 200}
Нас цікавить масив, що зберігається в get.
Вибираємо випадковий елемент з масиву Шардена, додаємо до нього адресу файлу і посилання для скачування готова!
Для економії пам'яті можна відразу при створенні запиту вказати, куди Guzzle повинен записати відповідь, для цього використовується параметр sink .
Підсумковий код викладений на GitHub під ліцензією MIT, буду радий, якщо він комусь стане в нагоді.
Додаток далеко від ідеалу, його функціонал обмежений, в ньому абсолютно точно є баги і покриття тестами залишає бажати кращого, але воно на все 100% вирішило мою задачу, але ж саме це потрібно від MVP .
PS Хочу висловити-таки спасибі Mail.ru за те, що, по-перше, разом з хмарним клієнтом у мене жодного разу не встановився «Аміго», а по-друге, за те, що врятували мене від втрати всього домашнього архіву (навіть не впевнений, що з цього важливіше). Але все ж, від гріха подалі, я вирішив переїхати в хмару іншої компанії: 200 рублів на місяць - невелика плата за те, щоб мені не довелося повторювати цей атракціон ще раз.
* Все, що не встигло спочатку видалити.
UPD: Спілкування з тих. підтримкою.
[[[[У мене виникають проблеми з синхронізацією ..., інша проблема, Форма зворотного зв'язку]]]]

Добрий день.
Я замінив жорсткий диск, на якому була розташована папка хмари. Старий диск зламався, тому перенести дані з нього немає можливості. У веб-інтерфейсі всі мої дані на місці.
Коли я створив порожню папку на новому диску і налаштував її в додатку, при синхронізації почали віддалятися файли в хмарі.
Як мені налаштувати додаток на комп'ютері, щоб воно вважало основною копією веб, а не порожню папку - тобто початок б завантажувати файли на комп'ютер, а не видаляти їх в хмарі.
Пробував завантажувати файли через браузер, але це нереально - їх дуже багато.


[email protected] 29.12.15 Здравствуйте.
На жаль, відновити видалені одночасно і в Хмарі, і на ПК файли
не можна.
За замовчуванням між web-інтерфейсом і додатком на комп'ютері
здійснюється повна двостороння синхронізація - якщо ви видаляєте файл з
Хмари в web-інтерфейсі, то файл видаляється і в додатку, так само і
навпаки: видаляючи файл в додатку, ви видаляєте файл і в Хмарі.
Ви можете налаштувати вибіркову синхронізацію в ПК-клієнті Хмари. Для цього
клікніть на іконці Хмари (в системному треї) правою кнопкою миші і
перейдіть в розділ «Вибрати папки».
У вікні, зніміть галочки навпроти тих папок, синхронізацію для
яких ви хочете скасувати і натисніть «Вибрати».
Якщо раніше папка була синхронізована, то вона буде видалена з вашого
комп'ютера, але в web-інтерфейсі Хмари папка, а також все що містяться в
ній файли, збережуться.
Щоб знову включити синхронізацію для віддаленої раніше папки, клікніть на
іконку програми Хмари правою кнопкою миші, натисніть «Вибрати папки» і
встановіть галочку навпроти імені необхідної папки.
Ви також можете тимчасово відключити синхронізацію. Для цього клікніть на
іконку програми Хмари правою кнопкою миші і виберіть «Призупинити
синхронізацію ».
Детальніше про синхронізацію Ви можете прочитати в системі Допомоги
help.mail.ru/cloud_web/synch

Олексій Уколов 29.12.15

Можливо, я не зовсім явно позначив свою проблему, спробую перефразувати.
Всі мої файли на даний момент є в хмарі. Я купив новий HDD і хочу ці файли на нього завантажити. Але коли я створив на ньому порожню папку і вказав її в додатку, замість скачування файлів з хмари на комп'ютер, файли почали віддалятися з хмари.
Як мені запустити процес в зворотному напрямку - скачати все з хмари на комп'ютер, не використовуючи веб-інтерфейс.
Якщо це неможливо зробити через додаток, чи є якісь альтернативні інструменти? WebDav, як я розумію, ще не реалізований?


[email protected] 29.12.15

Добрий день.
На поточний момент дана функціональність відсутня.
Ваше зауваження передано розробникам.


UPD2: Проблема досі відтворюється, представники Облака@mail.ru кажуть, що це нетипова поведінка і проблема локальна, в коментарях є повідомлення, що синхронізація з порожньою папкою працює як треба.
Додав відеопрімер: youtu.be/dTF9UCdN2S8
Прошу вибачення за ВОТЕРМАРК і загальну якість, просто proof of concept.
UPD3: На ноутбук, де до цього хмарний клієнт ніколи не стояв, скачав останню версію з офіційного сайту, встановив, запустив. При виборі існуючої папки історія повторюється: файли замість скачування починають віддалятися. Спробував не створювати папку - аналогічно.
UPD4: Bulldozavr написав, що, схоже, це видаляються системні файли Thumbs.db і desktop.ini. Я запустив синхронізацію і не став її зупиняти - дійсно, періодично в статусі було видно такі файли (але через те, що ширина контекстного меню обмежена, а доступного файлу лога немає, користувачеві переконатися, що видаляються тільки ці файли неможливо).
Через пару хвилин всі системні файли, судячи з усього, пішли і почалося закачування з хмари на комп'ютер, як і повинно бути.
Вердикт такий: синхронізація працює нормально, хоч і лякає спочатку користувача видаленням файлів з хмари; тех. підтримка працює погано.
Ну а мій досвід написання консольних додатків на php вже нікуди не дінеться :)Я вибрав другий шлях, як найрозумніший - навіщо щось парсити з використанням сторонніх інструментів, якщо вже є готове API?
Ru/api/v2/folder?
Ru/sdc?
Ru/api/v2/dispatcher?
Якщо це неможливо зробити через додаток, чи є якісь альтернативні інструменти?
WebDav, як я розумію, ще не реалізований?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью