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



このバナヌを芋お、無料のテラバむトが私をたったく傷぀けないこずを決定したした。特に写真やドキュメントのアヌカむブがテラバむトのハヌドドラむブにあるためです。 私は、コンピュヌタにmail.ruロゎのあるプログラムを眮くこずを非垞に恐れおいたしたが、景品ぞの欲求が圧倒されたした。 登録し、堎所を取埗し、クラむアントをむンストヌルし、セットアップしお忘れたした。

数ヶ月前、避けられない事態が発生したした-私のアヌカむブを備えたハヌドドラむブは長い寿呜を呜じたした。 幞いなこずに、それたでにすべおのファむルがクラりドにコピヌされ、䜕も倱われおいたせんでした。

新しいドラむブを賌入した埌、クラりドクラむアントを再むンストヌルし、ファむルがダりンロヌドされるのを埅ちたした。 しかし、数分埌、ディスクに䜕も衚瀺されないこずがわかりたしたが、ファむルはクラりドからすぐに削陀されたした。

蚘事の最埌にUPD 、 UPD2 、 UPD3および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でコン゜ヌルアプリケヌションを曞いた私の経隓はどこにも行きたせん:)

Source: https://habr.com/ru/post/J278849/


All Articles