Cloud@mail.ruがすべてのファイルを保存した方法*私のファイルとその由来





このバナーを見て、無料のテラバイトが私をまったく傷つけないことを決定しました。特に写真やドキュメントのアーカイブがテラバイトのハードドライブにあるためです。 私は、コンピュータにmail.ruロゴのあるプログラムを置くことを非常に恐れていましたが、景品への欲求が圧倒されました。 登録し、場所を取得し、クライアントをインストールし、セットアップして忘れました。



数ヶ月前、避けられない事態が発生しました-私のアーカイブを備えたハードドライブは長い寿命を命じました。 幸いなことに、それまでにすべてのファイルがクラウドにコピーされ、何も失われていませんでした。



新しいドライブを購入した後、クラウドクライアントを再インストールし、ファイルがダウンロードされるのを待ちました。 しかし、数分後、ディスクに何も表示されないことがわかりましたが、ファイルはクラウドからすぐに削除されました。



記事の最後にUPDUPD2UPD3およびUPD4があり、この動作の理由を説明しています。

TL; DR :誤報、ファイルと同期がすべて正常ですが、ユーザーインターフェイスとそれらの作業。 サポートをさらに開発する必要があります。



それらと話した後に判明したように。 サポート、これはクライアントの標準的な動作です-どのフォルダーにフィードしても、彼はそれをクラウドに同期し始め、そこからフォルダーにないものをすべて削除します。



WebDavを介したファイルのダウンロードも不可能です。







残るのは、Webインターフェースを介してファイルをダウンロードする機能だけです。 そこにあるファイルは一度に1つずつダウンロードできますが、複数のファイルまたはフォルダーを選択して1つのアーカイブにダウンロードすることもでき、非常に便利です。 唯一の制限は、アーカイブが4GBを超えないことです。







私はこの方法を試してみましたが、これが非常に不便なオプションであることにすぐに気付きました。





私はまだファイルが必要なので、私は自分のツールを書くと同時に新しい何かを学ぶことにしました。 もちろん、問題の解決策を楽しんでください。



まず、フォルダーとファイルのリストを取得する方法を理解する必要があります。 最初は、ページを解析し、そこからフォルダとファイルに関する情報を切り取り、ツリーを構築するだけでした。 しかし、ページのソースコードを開くと、ドキュメントを操作するためのインターフェイス全体がjavascriptで構築されていることがすぐにわかりました。



したがって、次の2つの解決策がありました。

SeleniumでHTMLからツリーを構築するか、スクリプトで使用される内部APIを処理します。



最も合理的な方法として、2番目の方法を選択しました-既製のAPIを既に持っているのに、なぜサードパーティのツールを使用して何かを解析するのですか?

幸いなことに、スクリプトは難読化も圧縮もされていませんでした。変数と関数の元の名前と開発者のコ​​メントが入手できたため、作業が非常に容易になりました。



数分の学習の後、利用可能なすべてのAPIメソッドが配列で記述されていることがわかりました。





そのため、コード内で美しい書式設定に時間を費やさず、誰かが間違いなくそれを破ります。



ディレクトリ内のフォルダとファイルのリストを取得するには、 folderメソッドを呼び出す必要があると考えました。 これを行うには、アドレスhttps://cloud.mail.ru/api/v2/folder



get-requestを送信しhttps://cloud.mail.ru/api/v2/folder







ブラウザでページを開くと、次の答えが表示されます。



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





当然、ポータルにログインする必要があります。 ログインしてリクエストを繰り返し、別のエラーを確認します。



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





当然のことながら、APIリクエストを実行するにはトークンが必要です。 メソッドのリストには、 tokens/csrf



およびtokens/download



2つの適切なメソッドがありtokens/download







https://cloud.mail.ru/api/v2/tokens/download



要求されると、まったく同じトークンエラーが返されます。つまり、csrfトークンが必要です。



それを要求し、パラメーター?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP



フォルダーメソッドの呼び出しに追加し、新しいエラーを取得します。



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





ここで、このメソッドがどの引数を取るかを調べるために、ソースをもう一度読む必要がありました。 内容を取得するフォルダーをhomeパラメーターで指定する必要があることがわかりました。



そのため、URL https://cloud.mail.ru/api/v2/folder?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP&home=/



によるリクエストへの応答で、このオブジェクトが返されます。



 { "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 }
      
      





ファイルとディレクトリに関する情報が必要です!



APIの機能が確認され、その操作スキームは明確です-プログラムの作成を開始できます。 この言語をよく知っているので、コンソールアプリケーションをphpで作成することにしました。 Symfonyのコンソールコンポーネントは、このタスクに最適です。 Laravelのコンソールコマンドはすでに作成されていますが、これはこのコンポーネントに基づいて構築されていますが、抽象化のレベルが非常に高く、直接操作しなかったため、お互いをよりよく理解する時がきたと判断しました。



ドキュメントの再説明は行いません。非常に詳細で非常に簡単です。 コンポーネントについて何も知らずに、数時間でこれらの簡単なインターフェースを作成しました。





これは、ファイルをダウンロードするプロセスでアプリケーションがどのように見えるかです。





そして最後に:ダウンロードしたファイルに関する情報を含む小さなプレート(最大100行)が表示されます。 それは実用的な利益をもたらさず、もっぱら教育目的のために作られています。



コンソールアプリケーションには、 php app.php command argument --option



ように呼び出されるいくつかのコマンドが含まれる場合があります 。 しかし、私の目的のために必要なコマンドは1つだけphp app.php argument --option



php app.php argument --option



ようにダウンロードを開始したいと思います: php app.php argument --option



。 これは、コンポーネントのドキュメントの手順を使用して簡単に実現できます。



これで、コンソールアプリケーションの準備が整い、事前に準備されたフィクスチャからの情報が表示され、 テストで覆われています 。 クラウドからファイルとフォルダーに関する情報を直接受信する方法を実装します。



ここでは、自転車も発明せず、美しいガズルライブラリを活用しました。 PSR-7インターフェースを使用しながら、http要求を送信するのに非常に便利です。



承認されると、mail.ruメインページから、 ログインフィールドとパスワードフィールドを含むアドレスhttps://auth.mail.ru/cgi-bin/auth



ポストリクエストが送信されます。



これは、承認方法がアプリケーションでどのように見えるかです
 /** * @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"}
      
      





リクエストのデバッグを開始し、認証が成功したことを確認しましたが、それでもトークンは渡されませんでした。 これはCookieの問題と非常によく似ています。実際、Guzzleではデフォルトでオフになっているため、手動オンにする必要があります。



これを行う最も簡単な方法は、クライアントを初期化するときに1回です。



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





別の初期化パラメーターは'debug' => trueであり 、クエリのデバッグはほとんど問題ありません。



クッキーを設定した後、私は再びトークンを取得しようとしましたが、応答で認証エラーを受け取りました。



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





ソースコードを読んで承認プロセスを監視した後、 sdcはアプリケーションの起動時に別のリクエストによって取得される別のcookieであることがわかりました: https://auth.mail.ru/sdc?from=https://cloud.mail.ru/home



: https://auth.mail.ru/sdc?from=https://cloud.mail.ru/home



: https://auth.mail.ru/sdc?from=https://cloud.mail.ru/home







許可リクエストの後にこのリクエストを追加し、最終的にトークンを取得できました。 さて、それは技術的な問題です-ルートフォルダーの内容とそのサブフォルダーの内容を再帰的に要求することで、ツリーの準備が整います。



結局のところ、ツリーは最終的には不要でした。各ファイルにはルートからのフルパスが格納されるため、ダウンロードにはフラットリストで十分です。



ダウンロードのメカニズムには少し注意が必要です。最初に、推奨されるシャード( https://cloclo28.datacloudmail.ru/get/



似たもの)を要求してから、ファイルをダウンロードする必要があります。



シャードのアドレスが数だけ異なることを考えると、アドレスをわざわざハードコードしないことは可能だと思いますが、もしそうなら、最後までやりましょう!



シャードの配列を取得するには、 ディスパッチャーメソッド( https://cloud.mail.ru/api/v2/dispatcher?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP



)を実行する必要がありhttps://cloud.mail.ru/api/v2/dispatcher?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP







 { "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 }
      
      





getに格納されている配列に興味があります



シャードの配列からランダムな要素を選択し、それにファイルアドレスを追加すると、ダウンロードリンクの準備ができました!

メモリを節約するために、Guzzleが応答を書き込む必要がある要求を作成するときにすぐに示すことができます;このために、 sinkパラメーターが使用されます。



最終コードはMITライセンスの下でGitHubに投稿されています。誰かに役立つなら嬉しいです。



アプリケーションは理想からはほど遠い、機能が制限され、間違いなくバグがあり、テストカバレッジには多くの課題が残されていますが、私の問題を100%解決しました。これがまさにMVPに必要なものです。



PS Mail.ruに感謝します。第1に、クラウドクライアントにAmigoをインストールしたことがないという事実と、第2に、ホームアーカイブ全体が失われないようにするためですどちらが重要かわからない)。 しかし、それでも罪から離れて、私は別の会社のクラウドに移動することにしました。月に200ルーブル-このアトラクションをもう一度繰り返す必要がないように、少額の料金です。



*最初に削除する時間がなかったすべて。



UPD:それらとのコミュニケーション。 サポート。



[[[[同期に問題があります...、別の問題、フィードバックフォーム]]]]
こんにちは

クラウドフォルダーが配置されているハードドライブを交換しました。 古いディスクは破損しているため、そこからデータを転送する方法はありません。 Webインターフェースでは、すべてのデータが配置されています。

新しいディスクに空のフォルダーを作成し、アプリケーションで構成すると、同期中にクラウド内のファイルが削除され始めました。

空のフォルダーではなくウェブのメインコピーを考慮するようにコンピューターでアプリケーションを構成するにはどうすればよいですか?つまり、コンピューターにファイルのダウンロードを開始し、クラウドでは削除しません。

ブラウザからファイルをダウンロードしようとしましたが、これは現実的ではありません-多くのファイルがあります。





support@cloud.mail.ru 12/29/15
こんにちは。



残念ながら、クラウドとPCで同時に削除されたファイルを回復する

許可されていません。



デフォルトでは、Webインターフェースとコンピューター上のアプリケーションの間

完全な双方向同期が実行されます-ファイルを削除した場合

Webインターフェースの雲、ファイルもアプリケーションで削除されます

その逆:アプリケーション内のファイルを削除すると、クラウド内のファイルも削除されます。



Cloud PCクライアントで選択的な同期を構成できます。 このために

マウスの右ボタンでクラウドアイコン(システムトレイ内)をクリックし、

[フォルダの選択]セクションに移動します。

開いたウィンドウで、それらのフォルダーの反対側のボックスのチェックを外し、

キャンセルして[選択]をクリックします。

フォルダーが以前に同期されていた場合は、フォルダーから削除されます

コンピューター、ただし、WebベースのインターフェイスのCloudsフォルダー、および

彼女のファイルは保存されます。

以前に削除したフォルダーの同期を再度有効にするには、をクリックします

右マウスボタンでクラウドアプリケーションのアイコンをクリックし、[フォルダの選択]をクリックして、

必要なフォルダの名前の横にあるチェックボックスをオンにします。



一時的に同期を無効にすることもできます。 これを行うには、をクリックします

右マウスボタンでクラウドアプリケーションアイコンを選択し、[一時停止]を選択します

同期。」



ヘルプシステムで同期の詳細を読むことができます。

help.mail.ru/cloud_web/synch





Alexey Ukolov 12/29/15
おそらく、私は自分の問題を完全に明確に説明していなかったので、言い換えるつもりです。



すべてのファイルは現在クラウドにあります。 新しいHDDを購入し、これらのファイルをダウンロードしたい。 しかし、その上に空のフォルダーを作成し、アプリケーションでそれを示すと、クラウドからコンピューターにファイルをダウンロードする代わりに、クラウドからファイルが削除され始めました。



どうすれば反対方向にプロセスを開始できますか?Webインターフェースを使用せずにクラウドからコンピューターにすべてをダウンロードします。



これをアプリケーションで実行できない場合、代替ツールはありますか? 私が理解しているように、WebDavはまだ実装されていませんか?





support@cloud.mail.ru 12/29/15
こんにちは。



現時点では、この機能はありません。



あなたのコメントは開発者に渡されます。





UPD2:問題はまだ再現中です。Cloud@ mail.ruの代表者は、これは異常な動作であり、問​​題はローカルであると言います。コメントには、空のフォルダーとの同期が正常に機能するというメッセージがあります。

ビデオの例を追加しました: youtu.be/dTF9UCdN2S8

透かしと全体的な品質をおconceptび申し上げます。概念の証明にすぎません。



UPD3:クラウドクライアントがこれまで立っていなかったラップトップで、公式サイトから最新バージョンをダウンロードし、インストールして起動しました。 既存のフォルダーを選択すると、ストーリーが繰り返されます。ダウンロードする代わりにファイルが削除され始めます。 フォルダーを作成しないようにしました-同様に。



UPD4:Bulldozavrは、 Thumbs.dbおよびdesktop.iniシステムファイルが削除されているように見えると書いています。 私は同期を開始し、停止しませんでした-実際、定期的にそのようなファイルはステータスに表示されていました(ただし、コンテキストメニューの幅が制限されており、ログファイルが利用できないため、ユーザーはこれらのファイルのみが削除されていることを確認できます)。

数分後、すべてのシステムファイルが削除され、クラウドからコンピューターへのダウンロードが開始されたようです。

判定は次のとおりです。同期は正常に機能しますが、最初はクラウドからファイルを削除することでユーザーを怖がらせます。 それら。 サポートはうまくいきません。

さて、PHPでコンソールアプリケーションを書いた私の経験はどこにも行きません:)



All Articles