По заголовку статьи я думаю уже все догадались о чем будет идти речь. Как известно официального API для облака mail.ru пока не существует, поэтому попробуем написать его сами. Речь конечно же будет идти о клиентской части, а не о серверной.
Что было использовано и что необходимо знать для его написания:
— Язык программирования C#
— Среда разработки Visual Studio
— Базовые знания POST и GET запросов
— Браузер
Собственно, на что все это будет упираться, наше API всего лишь будет повторять некоторые запросы браузера к серверу cloud.mail.ru. При совершении любой операции с файлами или папками на облаке, браузер будет отправлять http запросы к серверу, на что тот будет отвечать и выдавать нужный вам ответ.
Самый простой пример запроса на удаление файла или папки. Я буду использовать Chrome Браузер для отслеживания запросов, где:
— Выбираем файл или папку которую хотим удалить
— Нажимаем F12
— Переходим во вкладку Network
— Нажимаем «Удалить» на файле или папке которую мы выбрали
— Во вкладке Network мы видим запросы, среди которых видим запрос, который называется remove
Request URL:https://cloud.mail.ru/api/v2/file/remove Request Method:POST Status Code:200 OK Remote Address:217.69.139.7:443
Response Headers
Cache-Control:no-store, no-cache, must-revalidate Connection:close Content-Length:96 Content-Security-Policy-Report-Only:default-src *.cloud.mail.ru *.cloud.mail.ru *.datacloudmail.ru *.cldmail.ru *.mail.ru *.imgsmail.ru *.files.attachmail.ru *.mradx.net *.gemius.pl *.weborama.fr *.adriver.ru *.serving-sys.com featherservices.aviary.com d42hh4005hpu.cloudfront.net dme0ih8comzn4.cloudfront.net feather-client-files-aviary-prod-us-east-1.s3.amazonaws.com ; script-src 'unsafe-inline' 'unsafe-eval' *.cloud.mail.ru *.datacloudmail.ru *.cldmail.ru *.mail.ru *.imgsmail.ru *.files.attachmail.ru *.mradx.net *.yandex.ru *.odnoklassniki.ru odnoklassniki.ru *.ok.ru ok.ru *.scorecardresearch.com www.google-analytics.com featherservices.aviary.com d42hh4005hpu.cloudfront.net dme0ih8comzn4.cloudfront.net feather-client-files-aviary-prod-us-east-1.s3.amazonaws.com; img-src data: *; style-src 'unsafe-inline' *.mail.ru *.imgsmail.ru *.files.attachmail.ru *.mradx.net featherservices.aviary.com d42hh4005hpu.cloudfront.net dme0ih8comzn4.cloudfront.net feather-client-files-aviary-prod-us-east-1.s3.amazonaws.com; font-src data: cloud.mail.ru *.imgsmail.ru *.files.attachmail.ru *.mradx.net featherservices.aviary.com d42hh4005hpu.cloudfront.net dme0ih8comzn4.cloudfront.net feather-client-files-aviary-prod-us-east-1.s3.amazonaws.com; frame-src *.mail.ru *.datacloudmail.ru *.cldmail.ru docs.mail.ru *.officeapps.live.com *.mradx.net; object-src data: blob: https://*; report-uri https://cspreport.mail.ru/cloud/; Content-Type:application/json; charset=utf-8 Date:Sun, 10 Apr 2016 13:43:38 GMT Expires:Sat, 11 Apr 2015 13:43:38 GMT Pragma:no-cache Server:Tengine Strict-Transport-Security:max-age=15768000; includeSubDomains; preload X-Content-Type-Options:nosniff X-Frame-Options:SAMEORIGIN X-Host:clof8.i.mail.ru X-req-id:OljB4ucgKW X-server:api X-UA-Compatible:IE=Edge X-Upstream-Time:1460295818.308 X-XSS-Protection:1; mode=block; report=https://cspreport.mail.ru/xxssprotection
Request Headers
Accept:*/* Accept-Encoding:gzip, deflate Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Connection:keep-alive Content-Length:181 Content-Type:application/x-www-form-urlencoded; charset=UTF-8 Cookie:мои куки, выкладывать не стану Host:cloud.mail.ru Origin:https://cloud.mail.ru Referer:https://cloud.mail.ru/home/ User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36 X-Requested-With:XMLHttpRequest
Form Data
view URL encoded home:/rename folder test (1) api:2 build:hotfix-35-1.201604041616 x-page-id:DcpfqVgGGm email:erastmorgan@bk.ru x-email:erastmorgan@bk.ru token:9qFgR48wHY5Rxqot4Ei515TiQMYCsPxD
Этот же самый запрос нам необходимо повторить из нашего API. Для этого мы будет использовать HttpWebRequest и HttpWebResponse классы. Здесь запрос должен выглядеть точно также, как и составил наш браузер выше, исключением являются некоторые заголовки, которые не являются обязательными. Пример запроса на удаления файла или папки смотрите ниже.
/// <summary> /// Remove file or folder. /// </summary> /// <param name="name">File or folder name.</param> /// <param name="fullPath">Full file or folder name.</param> private void Remove(string name, string fullPath) { var removeRequest = Encoding.UTF8.GetBytes(string.Format("home={0}&api={1}&token={2}&email={3}&x-email={3}", fullPath, 2, this.Account.AuthToken, this.Account.LoginName)); var url = new Uri(string.Format("{0}/api/v2/file/remove", ConstSettings.CloudDomain)); var request = (HttpWebRequest)WebRequest.Create(url.OriginalString); request.Proxy = this.Account.Proxy; request.CookieContainer = this.Account.Cookies; request.Method = "POST"; request.ContentLength = removeRequest.LongLength; request.Referer = string.Format("{0}/home{1}", ConstSettings.CloudDomain, fullPath.Substring(0, fullPath.LastIndexOf(name))); request.Headers.Add("Origin", ConstSettings.CloudDomain); request.Host = url.Host; request.ContentType = ConstSettings.DefaultRequestType; request.Accept = "*/*"; request.UserAgent = ConstSettings.UserAgent; using (var s = request.GetRequestStream()) { s.Write(removeRequest, 0, removeRequest.Length); using (var response = (HttpWebResponse)request.GetResponse()) { if (response.StatusCode != HttpStatusCode.OK) { throw new Exception(); } } } }
Для любой другой операции в облаке mail.ru мы повторяем вышеуказанные действия, подставляя наши данные в место тех что вы словили из браузера.
Привожу список методов которые я написал в своем API:
— Create folder
— Copy file
— Copy folder
— Download file (Async operation)
— Upload file (Async operation)
— Get list of the files and folders
— Get public file link
— Get public folder link
— Get direct file link (operation on one session)
— Move file
— Move folder
— Rename file
— Rename folder
— Remove file
— Remove folder
API которое я написал вы можете скачать по ссылке. Отправляйте Pull Request если у вас есть время и вы хотите дополнить данное API новыми возможностями. Написано все это «на коленке», но главное работает и может быть свободно использовано в ваших проектах.
В будущем это API еще будет дополняться, к примеру я бы еще хотел добавить шифрование файлов и загрузку больших файлов (сейчас ограничение в 2GB), с таким условием что большой файл будет разбиваться на максимально возможные части при загрузке на облако, а при выгрузке обратно собирался.
ссылка на оригинал статьи https://habrahabr.ru/post/281360/
Добавить комментарий