Как IDM узнает размеры файлов на Google Диске?

Я работаю над менеджером загрузок в С#, интегрированном в Chrome. Когда я пытаюсь загрузить с диска Google, ответ не возвращает Content-Length, и это означает -1 (неизвестно). Но IDM получает правильный размер, и я не мог понять, как это сделать. Кто знает, помогите!

Файл по этому адресу: https://drive.google.com/uc?export=download&confirm=-wOm&id=1gC_fEKIlv9oaLQUAKH4GvRvAIqhDgAbz

Заголовки ответа:

X-GUploader-UploadID = AAANsUmzer2D7sJF5ROkgKYHrAfB994uetArTRtS2O1-2rcomguwXU2nVQ20nghtQbf4KHWoxVN8XQGlPSS_hj3hw1A
Access-Control-Allow-Origin = *
Access-Control-Allow-Credentials = false
Access-Control-Allow-Headers = Accept, Accept-Language, Authorization, Cache-Control, Content-Disposition, Content-Encoding, Content-Language, Content-Length, Content-MD5, Content-Range, Content-Type, Date, GData-Version, google-cloud-resource-prefix, x-goog-request-params, Host, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, Origin, OriginToken, Pragma, Range, Slug, Transfer-Encoding, hotrod-board-name, hotrod-chrome-cpu-model, hotrod-chrome-processors, Want-Digest, x-chrome-connected, X-ClientDetails, X-Client-Version, X-Firebase-Locale, X-Goog-Firebase-Installations-Auth, X-Firebase-Client, X-Firebase-Client-Log-Type, X-GData-Client, X-GData-Key, X-GoogApps-Allowed-Domains, X-Goog-AdX-Buyer-Impersonation, X-Goog-Api-Client, X-Goog-AuthUser, x-goog-ext-124712974-jspb, x-goog-ext-251363160-jspb, x-goog-ext-259736195-jspb, X-Goog-PageId, X-Goog-Encode-Response-If-Executable, X-Goog-Correlation-Id, X-Goog-Request-Info, X-Goog-Request-Reason, X-Goog-Experiments, x-goog-iam-authority-selector, x-goog-iam-authorization-token, X-Goog-Spatula, X-Goog-Travel-Bgr, X-Goog-Travel-Settings, X-Goog-Upload-Command, X-Goog-Upload-Content-Disposition, X-Goog-Upload-Content-Length, X-Goog-Upload-Content-Type, X-Goog-Upload-File-Name, X-Goog-Upload-Header-Content-Encoding, X-Goog-Upload-Header-Content-Length, X-Goog-Upload-Header-Content-Type, X-Goog-Upload-Header-Transfer-Encoding, X-Goog-Upload-Offset, X-Goog-Upload-Protocol, x-goog-user-project, X-Goog-Visitor-Id, X-Goog-FieldMask, X-Google-Project-Override, X-Goog-Api-Key, X-HTTP-Method-Override, X-JavaScript-User-Agent, X-Pan-Versionid, X-Proxied-User-IP, X-Origin, X-Referer, X-Requested-With, X-Stadia-Client-Context, X-Upload-Content-Length, X-Upload-Content-Type, X-Use-HTTP-Status-Code-Override, X-Ios-Bundle-Identifier, X-Android-Package, X-Ariane-Xsrf-Token, X-YouTube-VVT, X-YouTube-Page-CL, X-YouTube-Page-Timestamp, X-Compass-Routing-Destination, X-Goog-Meeting-Botguardid, X-Goog-Meeting-ClientInfo, X-Goog-Meeting-ClientVersion, X-Goog-Meeting-Debugid, X-Goog-Meeting-RtcClient, X-Goog-Meeting-Token, X-Goog-Meeting-StartSource, X-Client-Data, X-Sfdc-Authorization, MIME-Version, Content-Transfer-Encoding, X-Earth-Engine-App-ID-Token, X-Earth-Engine-Computation-Profile, X-Earth-Engine-Computation-Profiling, X-Play-Console-Experiments-Override, X-Play-Console-Session-Id, x-alkali-account-key, x-alkali-application-key, x-alkali-auth-apps-namespace, x-alkali-auth-entities-namespace, x-alkali-auth-entity, x-alkali-client-locale, EES-S7E-MODE, cast-device-capabilities
Access-Control-Allow-Methods = GET,OPTIONS
Content-Disposition = attachment;filename="[saglamindir.net]VirtualBox-6.1.2.rar";filename*=UTF-8''%5Bsaglamindir.net%5DVirtualBox-6.1.2.rar
X-Goog-Hash = crc32c=C7PP8g==
Transfer-Encoding = chunked
Alt-Svc = h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
Connection = close
Cache-Control = private, max-age=0
Content-Type = application/rar
Date = Sat, 08 Aug 2020 21:16:02 GMT
Expires = Sat, 08 Aug 2020 21:16:02 GMT
Server = UploadServer

введите здесь описание изображения


person Ali Tor    schedule 08.08.2020    source источник


Ответы (1)


Вы не разместили свой код для проверки проблемы. Тем не менее, вы должны учитывать две вещи в запросах Google Диска. Сначала вы должны использовать API Google для обработки запросов. Это означает, что вам нужно будет иметь аутентифицированные запросы через протоколы OAuth2.

Если вы используете их NuGets, то вы можете просто использовать DriveService, чтобы получить размер файла.

var file = service.Files.Get(fileId).Execute();
var size = file.FileSize;

если вы используете HttpWebRequest или HttpClient (с соответствующими заголовками и аутентифицированным запросом), ваш ответ будет закодирован GZip (проверьте Transfer-Encoding), поэтому длина тела вашего ответа всегда будет меньше фактической длины в байтах. Вам нужно будет расшифровать его, чтобы получить правильную длину. (Проверьте HttpWebRequest.AutomaticDecompression ИЛИ HttpClientHandler.AutomaticDecompression< /а>

вы можете применить декомпрессию следующим образом:

HttpWebRequest

var request = (HttpWebRequest) WebRequest.Create(fileUrl);
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
// your code

HttpClient

var handler = new HttpClientHandler()
{
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};        
var client = new HttpClient(handler);
// your code
person iSR5    schedule 15.08.2020
comment
Привет, я не смог найти метод Execute в API. Какой API содержит этот метод? - person Ali Tor; 18.08.2020
comment
@AliTor внутри DriveService вам нужно сослаться на Google.Apis.Drive.v2 (v2 или v3, они есть у обоих). - person iSR5; 18.08.2020