рдЬрд╝рд┐рдк рдЖрд░реНрдХрд╛рдЗрд╡ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рднрд╛рдЧ 3 - рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ

рд▓реЗрдЦ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдЬрд╝рд┐рдк рд╕рдВрдЧреНрд░рд╣ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рднрд╛рдЧ 2 - рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдФрд░ рд╕рдВрдкреАрдбрд╝рди ред

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ, рдореИрдВ рдлрд┐рд░ рд╕реЗ PHP рдореЗрдВ рдЕрдкрд░рдВрдкрд░рд╛рдЧрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЬрд╝рд┐рдк рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рджреЛ рд▓реЗрдЦ рдкрдврд╝реЗрдВ: рдЬрд╝рд┐рдк рд╕рдВрдЧреНрд░рд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ? рдПрдХ рдЬрд╝рд┐рдк рд╕рдВрдЧреНрд░рд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рднрд╛рдЧ 2 - рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдФрд░ рд╕рдВрдкреАрдбрд╝рди

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ PHP рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдХрд┐рд╕реА рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдорд╛рдирдХ рдЬрд╝рд┐рдк рд╕рд╣рд┐рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА, рдФрд░ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ред рдЖрдЬ рдореИрдВ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рд╣рдо рдПрдХ рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдпрд╛ рдЕрдирдкреИрдХ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд╕реНрд╡реАрд░ рджрд┐рдЦрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪрд┐рддреНрд░ рд▓рд┐рдпрд╛ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдХрд┐рд╕реА рдиреЗ рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд╣реЗрдб рдХреЛ рд░рджреНрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА)ред

рдЦрд╛рдирд╛ рдкрдХрд╛рдиреЗ


рдореЗрд░реА рдПрдХ рдкрд╛рд▓рддреВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ STDIN рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП json рдореЗрдВ рд▓рд┐рдВрдХ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╕рдВрдЧреНрд░рд╣ рдХреЛ STDOUT рдореЗрдВ рджреЗрддрд╛ рд╣реИ, рдФрд░ STDERR рдореЗрдВ рдПрдХ рд╕рд░рдгреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде json (рдмреЗрд╢рдХ, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдпрд╣ рдореВрд▓ PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдмрд╕ рд╕рдВрд░рдЪрдирд╛ рдкрдврд╝реЗрдВ - рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛)ред

рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдХреБрдЫ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдореИрдВ рдиреАрдЪреЗ рдЙрджреНрдзреГрдд рдХрд░рддрд╛ рд╣реВрдВ:

zip.php
<?php $buffer = ''; while (!feof(STDIN)) { $buffer .= fread(STDIN, 4096); } $photos = json_decode($buffer, true, 512, JSON_THROW_ON_ERROR); $skeleton = ['files' => []]; $written = 0; [$written, $skeleton] = writeZip($written, $skeleton, $photos); $CDFH_Offset = $written; foreach ($skeleton['files'] as $index => $info) { $written += fwrite(STDOUT, $info['CDFH']); $skeleton['files'][$index]['CDFH'] = base64_encode($info['CDFH']); } $skeleton['EOCD'] = pack('LSSSSLLS', 0x06054b50, 0, 0, $records = count($skeleton['files']), $records, $written - $CDFH_Offset, $CDFH_Offset, 0); $written += fwrite(STDOUT, $skeleton['EOCD']); $skeleton['EOCD'] = base64_encode($skeleton['EOCD']); fwrite(STDERR, json_encode($skeleton)); function writeZip($written, $skeleton, $files) { $c = curl_init(); curl_setopt_array($c, [ CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 50, CURLOPT_FOLLOWLOCATION => true, ]); foreach ($files as $index => $url) { $fileName = $index . '.jpg'; for ($i = 0; $i < 1; $i++ ) { try { curl_setopt($c, CURLOPT_URL, $url); [$content, $code, $contentLength] = [ curl_exec($c), (int) curl_getinfo($c, CURLINFO_HTTP_CODE), (int) curl_getinfo($c, CURLINFO_CONTENT_LENGTH_DOWNLOAD) ]; if ($code !== 200) { throw new \Exception("[{$index}] " . 'Photo download error (' . $code . '): ' . curl_error($c)); } if (strlen($content) !== $contentLength) { var_dump(strlen($content), $contentLength); throw new \Exception("[{$index}] " . 'Different content-length'); } if ((false === $imageSize = @getimagesizefromstring($content)) || $imageSize[0] < 1 || $imageSize[1] < 1) { throw new \Exception("[{$index}] " . 'Broken image'); } [$width, $height] = $imageSize; $t = null; break; } catch (\Throwable $t) {} } if ($t !== null) { throw new \Exception('Error: ' . $index . ' > ' . $url, 0, $t); } $fileInfo = [ 'versionToExtract' => 10, 'generalPurposeBitFlag' => 0, 'compressionMethod' => 0, 'modificationTime' => 28021, 'modificationDate' => 20072, 'crc32' => hexdec(hash('crc32b', $content)), 'compressedSize' => $size = strlen($content), 'uncompressedSize' => $size, 'filenameLength' => strlen($fileName), 'extraFieldLength' => 0, ]; $LFH_Offset = $written; $skeleton['files'][$index] = [ 'LFH' => pack('LSSSSSLLLSSa*', 0x04034b50, ...array_values($fileInfo + ['filename' => $fileName])), 'CDFH' => pack('LSSSSSSLLLSSSSSLLa*', 0x02014b50, 798, ...array_values($fileInfo + [ 'fileCommentLength' => 0, 'diskNumber' => 0, 'internalFileAttributes' => 0, 'externalFileAttributes' => 2176057344, 'localFileHeaderOffset' => $LFH_Offset, 'filename' => $fileName, ])), 'width' => $width, 'height' => $height, ]; $written += fwrite(STDOUT, $skeleton['files'][$index]['LFH']); $written += fwrite(STDOUT, $content); $skeleton['files'][$index]['LFH'] = base64_encode($skeleton['files'][$index]['LFH']); } curl_close($c); return [$written, $skeleton]; } 

рдЪрд▓реЛ рдЗрд╕реЗ рдХрд╣реАрдВ рдмрдЪрд╛рдПрдВ, zip.php рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдВрдХ рдХреА рддреИрдпрд╛рд░ рд╕реВрдЪреА рд╣реИ, рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ ~ 18mb рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рддреНрд░ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдХреБрд▓ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЖрдХрд╛рд░ 20mb рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рдореИрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХреНрдпреЛрдВ) - https://gist.githubusercentent.com /userqq/d0ca3aba6b6762c9ce5bc3ace92a9f9e/raw/70f446eb98f1ba6838ad3c19c3346cba371fd263/photos.json

рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓реЗрдВрдЧреЗ:

 $ curl -s \ https://gist.githubusercontent.com/userqq/d0ca3aba6b6762c9ce5bc3ace92a9f9e/raw/70f446eb98f1ba6838ad3c19c3346cba371fd263/photos.json \ | php zip.php \ 2> structure.json \ 1> photos.zip 

рдЬрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд▓реЗрддреА рд╣реИ , рддреЛ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдореЗрдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП- рдлреЛрдЯреЛ.рдЬрд┐рдк , рдореИрдВ рдЗрд╕реЗ рдХрдорд╛рдВрдб рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ:

 $ unzip -tq photos.zip 

рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░.рдЬрд╕рди , рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдореМрдЬреВрдж рд╣рд░ рдЪреАрдЬ рдХреЗ рдмреЗрд╕ 64 рдХреЗ рд╕рд╛рде рдЬреЛрдВрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рд╕рднреА рдПрд▓рдПрдлрдПрдЪ рдФрд░ рд╕реАрдбреАрдПрдлрдПрдЪ рд╕рдВрд░рдЪрдирд╛рдУрдВ, рд╕рд╛рде рд╣реА рдИрдУрд╕реАрдбреАред рдореБрдЭреЗ рдЕрднреА рддрдХ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдИрдУрд╕реАрдбреА рдХрд╛ рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрд▓рдПрдлрдПрдЪ рдСрдлрд╕реЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдбреЗрдЯрд╛ рд▓рдВрдмрд╛рдИ рд╕реАрдбреАрдПрдлрдПрдЪ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╣реИред рдЗрд╕рд▓рд┐рдП, LFH рдХреА рд▓рдВрдмрд╛рдИ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛ рдФрд░ рдХрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреА рдлрд╛рдЗрд▓ рдХреЛ рдХреБрдЫ рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ - рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ 20mb рд╕реАрдорд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛ред

@BotFather рдХреЗ рд╕рд╛рде рдмреЙрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрдкрдиреЗ рдмреЙрдЯ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рдЕрдкрдиреЗ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд┐рдЦреЗрдВ, https://api.telegram.org/bot рдкрд░рд┐рдХрд▓реНрдкрдирд╛TOKENтЦ║тЦ║/getUpdates рдореЗрдВ рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рджреЗрдЦреЗрдВ , рдЬрд╣рд╛рдВ рд╕реЗ рдореИрд╕реЗрдЬ рдЕрд▓рдЧ рдХрд░реЗрдВред рд╕рдВрдкрддреНрддрд┐ рд╕реЗ .id = рдпрд╣ рдЖрдкрдХреЗ рдЪреИрдЯ рдмреЙрдЯ рдХреА рдЖрдИрдбреА рд╣реИред

рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рд╣рдорд╛рд░реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдкрдиреЗ рд╕рд╛рде рднрд░реЗрдВ:

 $ curl -F document=@"photos.zip" "https://api.telegram.org/bot{{TOKEN}}/sendDocument?chat_id={{CHAT ID}}" > stored.json 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ json files - structure.json рдФрд░ store.json рд╣реИрдВ ред

рдФрд░ рдЕрдЧрд░ рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛, рддреЛ рд╕рдВрдЧреНрд░рд╣реАрдд.рдЬреЗрд╕рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдареАрдХ рдХреЗ рдмрд░рд╛рдмрд░ рдареАрдХ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд╕рд╛рде json рд╣реЛрдЧрд╛, рдФрд░ result.document.file_id, рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк


рдЕрдм рдЬрдм рд╕рдм рдХреБрдЫ рдЖрдЦрд┐рд░рдХрд╛рд░ рддреИрдпрд╛рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЪрд▓реЛ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВ:

 <?php define('TOKEN', ''); //    $structure = json_decode(file_get_contents('structure.json'), true, 512, JSON_THROW_ON_ERROR); $stored = json_decode(file_get_contents('stored.json'), true, 512, JSON_THROW_ON_ERROR); $selectedFile = $structure['files'][array_rand($structure['files'])]; $LFH = base64_decode($selectedFile['LFH']); $CDFH = base64_decode($selectedFile['CDFH']); $fileLength = unpack('Llen', substr($CDFH, 24, 4))['len']; $fileStart = unpack('Lpos', substr($CDFH, 42, 4))['pos'] + strlen($LFH); $fileEnd = $fileStart + $fileLength; $response = json_decode(file_get_contents('https://api.telegram.org/bot' . TOKEN . '/getFile?' . http_build_query([ 'file_id' => $stored['result']['document']['file_id'] ])), true, 512, JSON_THROW_ON_ERROR); header('Content-Type: image/jpeg'); readfile('https://api.telegram.org/file/bot' . TOKEN . '/' . $response['result']['file_path'], false, stream_context_create([ 'http' => ['header' => "Range: bytes={$fileStart}-{$fileEnd}"] ])); 

рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рд╣рдо рдЙрд╕ рд╕реВрдЪреА рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣реИ, LFH рдХреА рд╢реБрд░реБрдЖрдд рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ, рдЗрд╕рдореЗрдВ LFH рдХреА рд▓рдВрдмрд╛рдИ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдбреЗрдЯрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдЗрд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХреА рд▓рдВрдмрд╛рдИ рдЬреЛрдбрд╝рдХрд░, рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдЕрдВрдд рдХреА рд╕реНрдерд┐рддрд┐ рдорд┐рд▓рддреА рд╣реИред

рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрддрд╛ рд╕реНрд╡рдпрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ (рдпрд╣ рдПрдХ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИ) рдФрд░ рдлрд┐рд░ рдпрд╣ рд╣реЗрдбрд┐рдВрдЧ Range: bytes=<->-<-> рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ Range: bytes=<->-<->

(рдорд╛рдирдХрд░ рд╕рд░реНрд╡рд░ рд░реЗрдВрдЬ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ)

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░, рд╣рдо рдЕрдкрдиреЗ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЫрд╡рд┐ рдХреА рд╕рд╛рдордЧреНрд░реА рджреЗрдЦреЗрдВрдЧреЗред

рдирд╣реАрдВ, рдареАрдХ рд╣реИ, рдпрд╣ рдЧрдВрднреАрд░ рдирд╣реАрдВ рд╣реИ ...


рдпрд╣ рдмрд┐рдирд╛ рдХрд╣реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ GetFile рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд▓рд┐рдВрдХ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдШрдВрдЯреЗ рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣реЗрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЪрд▓реЛ рдереЛрдбрд╝рд╛ рдХрдард┐рди рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ - рдпрд╣ рд╕рдм amphp рдкрд░ рдЪрд▓рд╛рдПрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рд▓реЛрдЧ рдиреЛрдб.рдЬреЗрдПрд╕ рдкрд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рд╡рд┐рддрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХреНрдпрд╛ рд░реЛрдХрддрд╛ рд╣реИ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ)? рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдВ рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВред

рд╣рдореЗрдВ 3 рдкреИрдХреЗрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

  • amphp / http-server - рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЬрд┐рд╕ рд╕рд░реНрд╡рд░ рдкрд░ рд╣рдо рдлрд╛рдЗрд▓реЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ
  • amphp / artax - http-client рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ , рд╕рд╛рде рд╣реА рдХреИрд╢ рдореЗрдВ рдлрд╛рдЗрд▓ рдХрд╛ рд╕реАрдзрд╛ рд▓рд┐рдВрдХ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред
  • amphp / рд╕рдорд╛рдирд╛рдВрддрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рд▓реЗрдХрд┐рди рдбрд░реЛ рдордд, рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ SharedMemoryParcel рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ im-memory рдХреИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд░рдЦрддреЗ рд╣реИрдВ:

 $ composer require amphp/http-server amphp/artax amphp/parallel 

рдФрд░ рдпрд╣ рд▓рд┐рдЦреЗрдВ

рд▓рд┐рдкрд┐
 <?php define('TOKEN', ''); //    use Amp\Artax\DefaultClient; use Amp\Artax\Request as ArtaxRequest; use Amp\Http\Server\RequestHandler\CallableRequestHandler; use Amp\Http\Server\Server as HttpServer; use Amp\Http\Server\Request; use Amp\Http\Server\Response; use Amp\Http\Status; use Amp\Parallel\Sync\SharedMemoryParcel; use Amp\Socket; use Psr\Log\NullLogger; require 'vendor/autoload.php'; Amp\Loop::run(function () { $structure = json_decode(file_get_contents('structure.json'), true, 512, JSON_THROW_ON_ERROR); $stored = json_decode(file_get_contents('stored.json'), true, 512, JSON_THROW_ON_ERROR); $parcel = SharedMemoryParcel::create($id = bin2hex(random_bytes(10)), []); $client = new DefaultClient(); $handler = function (Request $request) use ($parcel, $client, $structure, $stored) { $cached = yield $parcel->synchronized(function (array $value) use ($client, $stored) { if (!isset($value['file_path']) || $value['expires'] <= time()) { $response = yield $client->request('https://api.telegram.org/bot' . TOKEN . '/getFile?' . http_build_query([ 'file_id' => $stored['result']['document']['file_id'] ])); $json = json_decode(yield $response->getBody(), true, 512, JSON_THROW_ON_ERROR); $value = ['file_path' => $json['result']['file_path'], 'expires' => time() + 55 * 60]; } return $value; }); $selectedFile = $structure['files'][array_rand($structure['files'])]; $LFH = base64_decode($selectedFile['LFH']); $CDFH = base64_decode($selectedFile['CDFH']); $fileLength = unpack('Llen', substr($CDFH, 24, 4))['len']; $fileStart = unpack('Lpos', substr($CDFH, 42, 4))['pos'] + strlen($LFH); $fileEnd = $fileStart + $fileLength; $request = (new ArtaxRequest('https://api.telegram.org/file/bot' . TOKEN . '/' . $cached['file_path'])) ->withHeader('Range', "bytes={$fileStart}-{$fileEnd}"); $response = yield $client->request($request); if (!in_array($response->getStatus(), [200, 206])) { return new Response(Status::SERVICE_UNAVAILABLE, ['content-type' => 'text/plain'], "Service Unavailable."); } return new Response(Status::OK, ['content-type' => 'image/jpeg'], $response->getBody()); }; $server = new HttpServer([Socket\listen("0.0.0.0:10051")], new CallableRequestHandler($handler), new NullLogger); yield $server->start(); Amp\Loop::onSignal(SIGINT, function (string $watcherId) use ($server) { Amp\Loop::cancel($watcherId); yield $server->stop(); }); }); 

рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рдПрдХ рдХреИрд╢ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо 55 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдХреИрд╢ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХрдИ рдмрд╛рд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЦреИрд░, рдпрд╣ рд╕рдм PHP-FPM (рдпрд╛, рднрдЧрд╡рд╛рди рдирд╛ рдХрд░реЗ, PHP-CGI) рдХреЗ рд╕рд╛рде рд░реАрдбрдлрд╝рд╛рдЗрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк amphp рдЙрджрд╛рд╣рд░рдг рдкреВрд▓ - SharedMemoryParcel рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреИрд╢ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ / рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдлреВрдЯ рдЬрд╛рдПрдЧрд╛ред рдЦреИрд░, рдпрд╛, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрд╡рд╕реНрде рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ, рддреЛ рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ рдФрд░ рдиреЗрдЧреНрдиреЗрдХреНрд╕ ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд┐рдЪрд╛рд░ рдирдП рд╕реЗ рджреВрд░ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рджрд╛рдврд╝реА рд╡рд╛рд▓реЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рднреА DownloadMaster рдиреЗ рдЖрдкрдХреЛ рдкреВрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛ рдЬрд╝рд┐рдк рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣ рдЕрдиреБрд░реЛрдз рдХреА рдЧрддрд┐ рдХреЛ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдЖ рд╕рдХрддрд╛ рд╣реИ? рдЗрдирдХреЛрдб рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓рд╛рдЦреЛрдВ рдЫреЛрдЯреА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХрд▓ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдлрд╕реЗрдЯ рдХреЛ рдЬрд╛рдирддреЗ рд╣реБрдП, рдЙрдиреНрд╣реЗрдВ рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╛ рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред 20 рдЧреНрд░рд╛рдо рдХреЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ, рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдШреВрдо рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ, рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред

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


All Articles