Wie Cloud@mail.ru alle * meine Dateien gespeichert hat und was daraus wurde



Einmal sah ich dieses Banner und entschied, dass ein freies Terabyte mich überhaupt nicht verletzen würde, zumal mein Archiv mit Fotos und Dokumenten auf einer Terabyte-Festplatte lag. Ich gebe zu, ich hatte große Angst, ein Programm mit dem mail.ru-Logo auf meinem Computer zu platzieren, aber der Wunsch nach einem Werbegeschenk überwältigte mich. Ich habe mich registriert, einen Platz bekommen, einen Client installiert, eingerichtet und vergessen.

Vor ein paar Monaten passierte das Unvermeidliche - meine Festplatte mit dem Archiv bestellte ein langes Leben. Zum Glück waren bis dahin alle Dateien in die Cloud kopiert und nichts ging verloren.

Nach dem Kauf eines neuen Laufwerks habe ich den Cloud-Client neu installiert und darauf gewartet, dass meine Dateien heruntergeladen werden. Aber nach ein paar Minuten sah ich, dass nichts auf der Festplatte erschien, aber die Dateien wurden schnell aus der Cloud gelöscht.

Am Ende des Artikels steht UPD, UPD2 , UPD3 und UPD4 , in denen die Gründe für dieses Verhalten beschrieben werden.
TL; DR : Fehlalarm, bei Dateien und Synchronisation ist alles in Ordnung, aber die Benutzeroberfläche und die Arbeit von denen. Unterstützung muss weiterentwickelt werden.


Wie sich herausstellte, nachdem ich mit denen gesprochen hatte. Support, dies ist das Standardverhalten des Clients - unabhängig davon, welchen Ordner Sie ihm zuführen, beginnt er, ihn mit der Cloud zu synchronisieren, und löscht von dort aus alles, was sich nicht im Ordner befindet.

Das Herunterladen von Dateien über WebDav ist ebenfalls nicht möglich: Es



bleibt nur die Möglichkeit, Dateien über das Webinterface herunterzuladen. Dort können die Dateien einzeln heruntergeladen werden, oder Sie können mehrere Dateien oder Ordner auswählen und in einem Archiv herunterladen, was sehr praktisch ist. Die einzige Einschränkung besteht darin, dass das Archiv 4 GB nicht überschreiten darf.



Ich habe versucht, diesen Weg zu gehen, habe aber schnell gemerkt, dass dies eine sehr unpraktische Option ist:

  • Ein Limit von 4 Gigabyte bedeutet, dass Sie, wenn Sie ungefähr ein Terabyte in der Cloud haben, mindestens 250 Archive herunterladen müssen.
  • Jedes Archiv muss manuell erstellt werden, indem Ordner ausgewählt, deren Gesamtgröße gezählt und bereits heruntergeladene markiert werden.
  • Manchmal werden Archive nicht aus einem unbekannten Grund geöffnet.
  • Die Ordnerstruktur geht verloren.

Ich brauche die Dateien immer noch, deshalb habe ich beschlossen, mein Tool zu schreiben und gleichzeitig etwas Neues zu lernen. Genieße natürlich die Lösung des Problems.

Zunächst müssen Sie verstehen, wie Sie eine Liste von Ordnern und Dateien erhalten. Ursprünglich wollte ich nur die Seiten analysieren, Informationen zu Ordnern und Dateien daraus entfernen und einen Baum erstellen. Aber nachdem ich den Quellcode der Seite geöffnet hatte, sah ich sofort, dass die gesamte Benutzeroberfläche für die Arbeit mit Dokumenten über Javascript erstellt wurde, was, wenn Sie darüber nachdenken, sehr logisch ist.

Daher hatte ich zwei mögliche Lösungen:
Selenium verbinden und trotzdem einen Baum aus HTML erstellen oder die interne API herausfinden, die im Skript verwendet wird.

Ich habe den zweiten Weg als den vernünftigsten gewählt - warum etwas mit Tools von Drittanbietern analysieren, wenn Sie bereits eine vorgefertigte API haben?
Zum Glück war das Skript nicht verschleiert und auch nicht komprimiert - die ursprünglichen Namen der Variablen und Funktionen sowie die Kommentare der Entwickler standen mir zur Verfügung, was die Aufgabe erheblich erleichterte.

Nach einigen Minuten des Studiums stellte ich fest, dass alle verfügbaren API-Methoden in einem Array beschrieben sind:


Deshalb verbringe ich keine Zeit in meinem Code mit schönen Formatierungen - jemand wird sie definitiv brechen.

Um eine Liste der Ordner und Dateien in einem Verzeichnis zu erhalten, muss die Ordnermethode aufgerufen werden . Senden Sie dazu eine Get-Anfrage an die Adresse https://cloud.mail.ru/api/v2/folder.

Wir öffnen die Seite im Browser und sehen die folgende Antwort:

{"body":"user","time":1457097026874,"status":403}

Natürlich müssen Sie sich beim Portal anmelden. Loggen Sie sich ein, wiederholen Sie die Anfrage und sehen Sie einen weiteren Fehler:

{"email":"me@mail.ru","body":"token","time":1457097187300,"status":403

Es überrascht nicht, dass ein Token erforderlich ist, um API-Anforderungen auszuführen. In der Methodenliste gibt es zwei geeignete Methoden: tokens/csrfund tokens/download.

Auf Anforderung wird der https://cloud.mail.ru/api/v2/tokens/downloadexakt gleiche Token-Fehler zurückgegeben, dh wir benötigen genau das csrf-Token.

Wir fordern es an, fügen den Parameter zum Aufruf der Ordner- Methode hinzu ?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpPund erhalten einen neuen Fehler:

{"email":"me@mail.ru","body":{"error":"invalid args"},"time":1457097695182,"status":400}

Hier musste ich die Quelle noch einmal lesen, um herauszufinden, welche Argumente diese Methode benötigt. Es stellte sich heraus, dass wir den Ordner angeben müssen, dessen Inhalt wir im Parameter home erhalten möchten .

Als Antwort auf eine Anfrage per URL https://cloud.mail.ru/api/v2/folder?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP&home=/wird das folgende Objekt zurückgegeben:

{
    "email": "me@mail.ru",
    "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
}

Informationen zu Dateien und Verzeichnissen benötigen Sie!

Die Funktionalität der API wurde bestätigt, das Funktionsschema ist klar - Sie können mit dem Schreiben eines Programms beginnen. Ich habe beschlossen, eine Konsolenanwendung in PHP zu schreiben, da ich diese Sprache gut kenne. Die Console- Komponente von Symfony eignet sich ideal für diese Aufgabe . Ich habe bereits Konsolenbefehle für Laravel geschrieben , die nur auf dieser Komponente basieren, aber dort ist der Abstraktionsgrad ziemlich hoch, und ich habe nicht direkt damit gearbeitet. Deshalb entschied ich, dass es Zeit war, sich besser kennenzulernen.

Ich werde die Dokumentation nicht nacherzählen, sie ist sehr detailliert und sehr einfach. Ohne etwas über die Komponente zu wissen, schrieb ich in wenigen Stunden diese einfachen Oberflächen:


So sieht die Anwendung beim Herunterladen von Dateien aus.


Und so zum Schluss: Ein kleines Schild (maximal 100 Zeilen) mit Informationen zu den heruntergeladenen Dateien wird angezeigt. Es hat keinen praktischen Nutzen und wird ausschließlich zu Bildungszwecken hergestellt.

Die Struktur von einer Konsolenanwendung können mehrere enthalten Befehle , durch die folgenden Ursachen: php app.php command argument --option. Aber für meine Zwecke brauche ich nur ein Team , und ich möchte den Download starten , wie folgt: php app.php argument --option. Dies lässt sich leicht anhand der Anweisungen in der Komponentendokumentation erreichen.

Somit ist die Konsolenanwendung bereit, es zeigt die Informationen von vor Armaturen und sogar bedeckt die Tests . Es ist Zeit, Informationen über Dateien und Ordner direkt aus der Cloud zu erhalten.

Auch hier habe ich kein Fahrrad erfunden und die schöne Guzzle- Bibliothek genutzt . Die Verwendung ist sehr praktisch, um http-Anforderungen zu senden, während die PSR-7- Schnittstellen verwendet werden .

Nach der Autorisierung wird eine Post-Anfrage von der mail.ru-Hauptseite an eine Adresse gesendet, https://auth.mail.ru/cgi-bin/authdie die Felder Login und Passwort enthält .

So sieht die Autorisierungsmethode in meiner Bewerbung aus
/**
* @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;
    }
}

Da als Antwort auf die Autorisierungsanforderung mehrere Weiterleitungen zurückgegeben werden, die letztendlich zum Postfach des Benutzers führen, habe ich beschlossen, einfach den Seitentitel zu überprüfen, um festzustellen, ob die Autorisierung erfolgreich war.

Die Prüfung ist so einfach, dass sie jetzt fehlschlägt, wenn sich ungelesene Nachrichten in der Mailbox befinden. Ihre Nummer wird im Seitenkopf angezeigt. Aber ich benutze keine Box. Für meine Zwecke ist das genug.

Als nächstes habe ich versucht, ein csrf-Token anzufordern, aber mit Überraschung habe ich einen bekannten Fehler erhalten:

{"status":403,"body":"user"}

Ich habe mit dem Debuggen von Anfragen begonnen und festgestellt, dass die Autorisierung erfolgreich war, aber das Token wurde mir trotzdem nicht gegeben. Es ist dem Problem mit Cookies sehr ähnlich, und in der Tat stellt sich heraus, dass sie in Guzzle standardmäßig deaktiviert sind und von Hand aktiviert werden müssen .

Der einfachste Weg, dies zu tun, ist einmalig beim Initialisieren des Clients:

$client = new \GuzzleHttp\Client(['cookies' => true]);

Ein weiterer Initialisierungsparameter ist 'debug' => true , wodurch das Debuggen von Abfragen nahezu schmerzlos ist.

Nach dem Einrichten von Cookies habe ich erneut versucht, ein Token abzurufen, und als Antwort darauf einen Autorisierungsfehler erhalten, auf den ich zuvor noch nicht gestoßen war:

{"email":"me@mail.ru","body":"nosdc","time":1457097187300,"status":403}

Nachdem die Quelle zu lesen und den Autorisierungsprozess überwachen, sah ich , dass SDC - ist ein weiterer Cookie, der durch eine separate Anfrage erhalten wird , wenn die Anwendung gestartet wird : https://auth.mail.ru/sdc?from=https://cloud.mail.ru/home.

Ich habe diese Anfrage nach einer Autorisierungsanfrage hinzugefügt und konnte endlich einen Token bekommen. Nun, dann ist es eine technische Angelegenheit - den Inhalt des Stammordners und rekursiv den Inhalt seiner Unterordner anzufordern, und der Baum ist fertig.

Wie sich herausstellte, wurde der Baum am Ende nicht einmal benötigt - jede Datei speichert den vollständigen Pfad vom Stammverzeichnis, sodass eine flache Liste zum Herunterladen ausreicht.

Der Download-Mechanismus ist etwas knifflig: Zuerst müssen Sie den empfohlenen Shard anfordern (ähnlich wie https://cloclo28.datacloudmail.ru/get/) und erst dann die Datei herunterladen.

Angesichts der Tatsache, dass sich die Adressen von Shards nur in der Anzahl unterscheiden, denke ich, dass es möglich wäre, die Adresse nicht zu belästigen und hart zu codieren, aber wenn Sie dies tun, dann tun Sie es bis zum Ende!

Um ein Array von Shards zu erhalten, müssen Sie die Methode dispatcher ( https://cloud.mail.ru/api/v2/dispatcher?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP) ausführen :

{
    "email": "me@mail.ru",
	"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
}

Wir interessieren uns für das in get gespeicherte Array .

Wir wählen ein zufälliges Element aus dem Shard-Array aus, fügen die Dateianschrift hinzu und der Download-Link ist fertig!
Um Speicherplatz zu sparen, können Sie beim Erstellen einer Anfrage sofort angeben, wo Guzzle die Antwort schreiben soll, wobei der Parameter sink verwendet wird .

Der endgültige Code steht auf GitHub unter der MIT-Lizenz. Ich würde mich freuen, wenn er jemandem von Nutzen ist.

Die App ist bei weitem nicht ideal, seine Funktionalität beschränkt ist, gibt es auf jeden Fall hat Fehler und Testabdeckung ist schlecht, aber es ist zu 100% mein Problem gelöst, und das ist genau das, was der erforderlich ist MVP .

PS Ich möchte Mail.ru dafür danken, dass ich Amigo zum einen nie zusammen mit einem Cloud - Client installiert habe und zum anderen nicht das gesamte Heimarchiv verloren habe (auch nicht) nicht sicher, was davon wichtiger ist). Trotzdem entschloss ich mich, weg von der Sünde, in eine Wolke eines anderen Unternehmens zu ziehen: 200 Rubel im Monat - eine kleine Gebühr, damit ich diese Attraktion nicht noch einmal wiederholen musste.

* Alle, die keine Zeit hatten, zuerst zu entfernen.

UPD: Kommunikation mit denen. Unterstützung.

[[[[Ich habe Probleme mit der Synchronisation ..., ein anderes Problem, Feedback-Formular]]]
Guten Tag.
Ich habe die Festplatte ausgetauscht, auf der sich der Cloud-Ordner befand. Die alte Festplatte ist defekt, daher können keine Daten von ihr übertragen werden. In der Weboberfläche sind alle meine Daten vorhanden.
Als ich einen leeren Ordner auf einer neuen Festplatte erstellt und in der Anwendung konfiguriert habe, wurden die Dateien in der Cloud während der Synchronisierung gelöscht.
Wie kann ich die Anwendung auf dem Computer so konfigurieren, dass sie die Hauptkopie des Webs und nicht einen leeren Ordner berücksichtigt? Das heißt, ich würde Dateien auf meinen Computer herunterladen und sie nicht in der Cloud löschen.
Ich habe versucht, Dateien über einen Browser herunterzuladen, aber das ist unrealistisch - es gibt viele davon.


support@cloud.mail.ru 29.12.15
Guten Tag.

Leider ist
es nicht möglich, gleichzeitig in der Cloud und auf dem PC gelöschte Dateien wiederherzustellen .

Standardmäßig
wird eine vollständige bidirektionale Synchronisierung zwischen der Webschnittstelle und der Anwendung auf dem Computer durchgeführt. Wenn Sie eine Datei
in der Webschnittstelle aus der Cloud löschen , wird die Datei in der Anwendung gelöscht, und
umgekehrt: Wenn Sie die Datei in der Anwendung löschen, wird auch die Datei in der Cloud gelöscht .

Sie können die selektive Synchronisierung im Cloud PC-Client konfigurieren.
Klicken Sie dazu mit der rechten Maustaste auf das Cloud-Symbol (in der Taskleiste) und
gehen Sie zum Abschnitt "Ordner auswählen".
Deaktivieren Sie im folgenden Fenster die Kontrollkästchen neben den Ordnern, für
die Sie die Synchronisierung abbrechen möchten, und klicken Sie auf "Auswählen".
Wenn der Ordner zuvor synchronisiert wurde, wird er von Ihrem
Computer gelöscht , aber der Ordner sowie alle darin enthaltenen
Dateien werden in der Cloud-Weboberfläche gespeichert.
Um die Synchronisierung für einen zuvor gelöschten Ordner wieder zu aktivieren, klicken Sie mit der
rechten Maustaste auf das Cloud-Anwendungssymbol, klicken Sie auf „Ordner auswählen“ und aktivieren Sie das
Kontrollkästchen neben dem Namen des gewünschten Ordners.

Sie können die Synchronisierung auch vorübergehend deaktivieren. Klicken Sie dazu mit der
rechten Maustaste auf das Cloud-Anwendungssymbol und wählen Sie „
Synchronisierung anhalten“.

Weitere Informationen zur Synchronisierung finden Sie im Hilfesystem
help.mail.ru/cloud_web/synch


Alexey Ukolov 29.12.15
Vielleicht habe ich mein Problem nicht ganz klar umrissen, ich werde versuchen, es neu zu formulieren.

Alle meine Dateien befinden sich derzeit in der Cloud. Ich habe eine neue Festplatte gekauft und möchte diese Dateien darauf herunterladen. Aber als ich einen leeren Ordner darauf erstellte und in der Anwendung darauf hinwies, anstatt Dateien aus der Cloud auf den Computer herunterzuladen, wurden die Dateien aus der Cloud gelöscht.

Wie starte ich den Prozess in die entgegengesetzte Richtung? Lade alles von der Cloud auf den Computer herunter, ohne die Weboberfläche zu verwenden.

Wenn dies über die Anwendung nicht möglich ist, gibt es alternative Tools? WebDav ist meines Wissens noch nicht implementiert?


support@cloud.mail.ru 29.12.15
Guten Tag.

Im Moment fehlt diese Funktionalität.

Ihr Kommentar wird an die Entwickler weitergeleitet.


UPD2: Das Problem reproduziert sich immer noch. Vertreter von Cloud@mail.ru geben an, dass dies ein atypisches und lokales Verhalten ist. In den Kommentaren sind Meldungen enthalten, dass die Synchronisierung mit einem leeren Ordner ordnungsgemäß funktioniert.
Ein Videobeispiel wurde hinzugefügt : youtu.be/dTF9UCdN2S8
Ich entschuldige mich für die Wasserzeichen und die Gesamtqualität, nur ein Proof of Concept.

UPD3: Auf einem Laptop, auf dem der Cloud-Client noch nie gestanden hatte, wurde die neueste Version von der offiziellen Website heruntergeladen, installiert und gestartet. Wenn Sie einen vorhandenen Ordner auswählen, wird die Story wiederholt: Dateien werden gelöscht, anstatt sie herunterzuladen. Ich habe versucht, keinen Ordner anzulegen - ähnlich.

UPD4: Bulldozavr schrieb , dass es aussieht wie es Systemdateien entfernt Thumbs.db und desktop.ini. Ich habe die Synchronisation gestartet und nicht gestoppt - tatsächlich waren solche Dateien regelmäßig im Status sichtbar (aber da die Breite des Kontextmenüs begrenzt ist und keine Protokolldatei verfügbar ist, kann der Benutzer sicherstellen, dass nur diese Dateien gelöscht werden ).
Nach ein paar Minuten wurden anscheinend alle Systemdateien gelöscht und der Download von der Cloud auf den Computer begann, wie es sein sollte.
Das Urteil lautet wie folgt: Die Synchronisierung funktioniert einwandfrei, obwohl sie den Benutzer zunächst durch das Löschen von Dateien aus der Cloud erschreckt. diese. Support funktioniert nicht gut.
Nun, meine Erfahrung mit dem Schreiben von Konsolenanwendungen in PHP geht nirgendwo hin :)

Jetzt auch beliebt: