Google App Script, Mikrotik, Telegram рдФрд░ VPNBook рдиреЗ рдПрдХ рдЪреМрдХрдбрд╝реА рдмрдЬрд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛

рдЖрдЬ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ: рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдЖрдк Google Apps рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдФрд░ рдХрд╣рд╛рдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реАрдкреАрдПрдирдмреБрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рди рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдорд┐рдХрд░реЛрдЯрд┐рдХ рджреНрд╡рд╛рд░рд╛ рдиреАрдбреЛ-рдХреБрд░реНрд▓ред рдПрдХ рдЬрдЧрд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо, рддрд╛рдХрд┐ рджреВрд╕рд░реЗ рдореЗрдВ рди рд╣реЛ, рдЖрддреНрдо-рдкрд░реНрдпрд╡реЗрдХреНрд╖рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рднрд╛рдЧ 1. рд╢реАрд░реНрд╖рдХрд╣реАрди


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

рддрдм рд╕реЗ, рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдкрд╛рдиреА рдмрд╣ рдЧрдпрд╛ рд╣реИ, рд░реВрд╕ рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡реАрдкреАрдПрдирдмреБрдХ рд╕рд╛рдЗрдЯ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реАрдкреАрдПрди рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ, рдЬреЛ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реИрдВред рдХрд┐рд╕реА рдкрд╛рда рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдХреА PNG рдЫрд╡рд┐ рдХреЛ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PHP рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдм рдЙрд╕ рд╕рд░реНрд╡рд░ рдкрд░ рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХрд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╣реЛрдХрд░ рдирд╣реАрдВ рдЧреБрдЬрд░рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, Google Apps Script (GAS) рд╕реЗрд╡рд╛ script.google.com рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд╣рд░реА рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкрд░ PHP рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЗрд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рд╡реЗрдм рдРрдк (рд╡реЗрдм тАЛтАЛрдПрдкреНрд▓рд┐рдХреЗрд╢рди) рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА GAS рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ред рдореИрдВ рдирд┐рд╖реНрдкрд╛рджрди рдиреАрддрд┐ рдФрд░ рдЬреАрдПрдПрд╕ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛ рд╡рд╣ рдПрдХ рдирд┐рд╢реБрд▓реНрдХ Google рдЦрд╛рддреЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрднреА рддрдХ рдкреИрд╕реЗ рдирд╣реАрдВ рдорд╛рдВрдЧрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ Google Apps рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рд╣реИред GAS рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднрд╛рд╖рд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЖрдк рддреГрддреАрдп-рдкрдХреНрд╖ рдЬреЗрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдмрд┐рдирд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдЬреАрдПрдПрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдореЗрд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдереАрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рдкрдбрд╝реАред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдкреАрдПрдирдЬреА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╡реЗрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡реАрдкреАрдПрдирдмреБрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдЫрд╡рд┐ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╡рд╛рд▓реА рдереА (рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдкреАрдПрдирдЬреА рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рджреЗ рдЬрд┐рд╕рдиреЗ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ред рддрд╛рд▓рд╛ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрд╛рдиреЗ рдХрд╛ рдРрд╕рд╛ рддрд░реАрдХрд╛ред рдпрд╣рд╛рдВ рдЬреАрдПрдПрд╕ рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рддрд┐рдмрдВрдз рдорд┐рд▓рд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ MIME рдЫрд╡рд┐ / png рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкрд╛рда рдкреНрд░рд╛рд░реВрдк, JSON, TEXT, XML, рдЖрджрд┐ред рд▓реЗрдХрд┐рди рдЗрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдерд╛ред рдЖрдк PNG рдХреЛ рдмреЗрд╕ 64 рдкрд░ рдПрдиреНрдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рдорд╛рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП techslides.com/image-proxy-with-google-app-scripts ред рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ред рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рдЫрд╡рд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдФрд░ рдХреЗрд╡рд▓ рдмреЗрд╕ 64 рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдирд╛ рдерд╛ред рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ doGet рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИ - рдПрдХ GET рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИред

function doGet() { var response = UrlFetchApp.fetch('https://www.vpnbook.com/password.php'); var b64 = Utilities.base64Encode(response.getContent()); //var data = 'data:'+type+';base64,'+b64; return ContentService.createTextOutput(b64); } 

рдЙрджрд╛рд╣рд░рдг рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдЙрдЯрдкреБрдЯ:

 iVBORw0KGgoAAAANSUhEUgAAAGQAAAANAQMAAABl11mFAAAABlBMVEX29vZMTExY89ZbAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAVUlEQVQImWNgIBrwSzCw/2ZgOADhSc5gYJCG8wxQedLdCcYFNXcgPHOZsxuSZxx7BuFZzsjdcJi34TBU5Y3cjc3IvM3McJ7kjNxtzDwwffwSIB7UTACt/h52C5DFqQAAAABJRU5ErkJggg== 

рдЗрд╕рдХреЗ рдмрд╛рдж PHP рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд░рд┐рд╕реЛрд░реНрд╕ рд▓реЙрдХрд┐рдВрдЧ рд╡рд╛рд▓реЗ рдЬрд╝реЛрди рдХреЗ рдЕрдВрджрд░ рд╕рд░реНрд╡рд░ рдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ CURL рдХреЙрд▓ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдмрджрд▓рд╛рд╡ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред рдЖрдкрдХреЛ CURL рдХреЛ HTTP / 1.1 302 рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, GAS, рд╡реЗрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрддреЗ рд╕реЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЕрд╕реНрдерд╛рдпреА рдкрддреЗ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ:

 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

рдФрд░ рдмреЗрд╕64 рдбрд┐рдХреЛрдбрд┐рдВрдЧ:

 $imgOCR = imagecreatefromstring(base64_decode($output)); 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реА
 <?php //   $wchar = 9; $hchar = 13; $strDict = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 '; $imgDict = imagecreatetruecolor(2 + strlen($strDict)* $wchar, $hchar); $bg = imagecolorallocate($imgDict, 0xF6, 0xF6, 0xF6); $textcolor = imagecolorallocate($imgDict, 0x4C, 0x4C, 0x4C); imagefill($imgDict, 0, 0, $bg); imagestring($imgDict, 5, 2, 0, $strDict, $textcolor); //  cURL $ch = curl_init(); //  url,      //curl_setopt($ch, CURLOPT_URL, 'https://www.vpnbook.com/password.php'); curl_setopt($ch, CURLOPT_URL, 'https://script.google.com/macros/s/AKfycbwYPfaZobtjbFv0mSYI8U4NIXPh1Sft_DkGH8QKgg/exec'); //  ,      string curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); // also, this seems wise considering output is image. //   $output = curl_exec($ch); //  cURL curl_close($ch); // echo $output; $imgOCR = imagecreatefromstring(base64_decode($output)); //$imgOCR = imageCreateFromPng('password.png'); //      10  . 2 + 10*9 = 92 < 100 $maxchar = floor((imagesx($imgOCR) - 2) / 9); $imgBox = imagecreatetruecolor($wchar, $hchar); $hashDict = Array(); //   for ($k = 0; $k < strlen($strDict) ; $k++) { imagecopy($imgBox, $imgDict, 0, 0, 2 + $k * $wchar, 0, $wchar, $hchar); $hashStr = ""; for($y = 0; $y < $hchar ; $y++) for($x = 0; $x < $wchar; $x++) $hashStr .= (imagecolorat($imgBox, $x, $y) != 0xF6F6F6)? '1': '0'; $hashDict[$hashStr] = $strDict[$k]; } //     for ($k = 0; $k < $maxchar ; $k++) { imagecopy($imgBox, $imgOCR, 0, 0, 2 + $k * $wchar, 0, $wchar, $hchar); $hashStr = ""; for($y = 0; $y < $hchar ; $y++) for($x = 0; $x < $wchar; $x++) $hashStr .= (imagecolorat($imgBox, $x, $y) != 0xF6F6F6)? '1': '0'; $tempchar = $hashDict[$hashStr]; if ($tempchar=='u' || $tempchar=='y') //    $tempchar = (mt_rand(0, 1))? 'u': 'y'; //$tempchar = (time() / 60 % 60 % 2)? 'u': 'y'; elseif ($tempchar==' ') break; print($tempchar); } /* header('Content-type: image/png'); imagepng($imgDict); */ //var_dump($hashDict); imagedestroy($imgDict); imagedestroy($imgOCR); imagedestroy($imgBox); ?> 


рдпрд╣ PHP рд╕реНрдХреНрд░рд┐рдкреНрдЯ PNG рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рдХрд░реЛрдЯрд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВред рд░рд╛рдЙрдЯрд░ рдХреЛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдорд┐рдХрд░реЛрдЯрд┐рдХ рдХреЗ рд╕рд╛рдордиреЗ 2 рдордзреНрдпрд╡рд░реНрддреА рд╕реЗрд╡рд╛рдУрдВ рдХреА рдРрд╕реА рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рдереАред

рднрд╛рдЧ 2. рдЬреАрдПрдПрд╕ рдкрд░ рдзрдХреНрдХрд╛ред PHP рдбрд┐рдХреЛрдбрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ


рдЬреАрдПрдПрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рджреМрд░рд╛рди, PHP рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдбрд┐рдХреЛрдбрд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдЗрд╕реЗ рдЬреАрдПрдПрд╕ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ред рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛: Google рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ PNG рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ PNG рдХреЛ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИред рдЫрд╡рд┐ рднрд╛рдЧреЛрдВ рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд╣реЗрд░рдлреЗрд░ рдХрд╛ рдХреЛрдИ рд╕рд╡рд╛рд▓ рд╣реА рдирд╣реАрдВ рдерд╛ред рдореИрдВ рдкреАрдПрдирдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЬреАрдердм рдкрд░ рдЪрдврд╝ рдЧрдпрд╛, рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдкрд╛рдпрд╛: рдкреАрдПрдирдЬреА, рдЬреЗрдкреАрдПрдирдЬреА, рдЬреЗрдПрд╕рдЬреА, рдкреАрдПрдирдЬреАред рдХреБрдЫ рдкреАрдПрдирдЬреА рдкрд┐рдХреНрд╕реЗрд▓ (рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЫрд╡рд┐) рдХреА 1-рдмрд┐рдЯ рд░рдВрдЧ рдХреА рдЧрд╣рд░рд╛рдИ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдЬрд╝рд╛рд▓рд┐рдм рд╕рдВрдкреАрдбрд╝рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдм рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдмреЛрдЭрд┐рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдФрд░ рдореИрдВрдиреЗ рдЕрдкрдиреЗ PNG рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд┐рдо рдХрдирд╡рд░реНрдЯрд░ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ XY рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкрд┐рдХреНрд╕рд▓ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд┐рдЯрдореИрдк рдХреЗ рд▓рд┐рдПред рдлрд┐рд░ рдкреАрдПрдирдЬреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рд╕рд░реНрдЬрди рдЖрдпрд╛: рд╣реЗрдХреНрд╕ рд╕рдВрдкрд╛рджрдХ, рд░реАрдбрд┐рдВрдЧ рдорд╛рдирдХреЛрдВ, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡рд┐рд╡рд░рдг рдХреЗ рдвреЗрд░ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореИрдВ IDAT рдлрд╝рд╛рдЗрд▓ рдХреЗ PNG рд╕реЗрдХреНрд╢рди рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдЬрд┐рд╕рдореЗрдВ zlib рднрд░рд╛ рд╣реБрдЖ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдПрдХ рд╕рд░рдгреА рдереАред

рдпрд╣ zibib unpacking рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ GAS рдореЗрдВ рдирд╣реАрдВ рдерд╛ред рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ, рдЙрдирдХреЗ рдкрд╛рд╕ gzip / ungzip рдФрд░ zip / unzip рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ zlib рдирд╣реАрдВ рд╣реИред рдЧрдЬрд╝рд┐рдк (рдкреАрдПрдирдЬреА рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рдж рд╡рд┐рд╕рд░реНрдЬрди рдХрд╛ рджреВрд╕рд░рд╛ рд╕реНрддрд░) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдЖрдИрдбреАрдПрдЯреА рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдПрдХ рдЧрдЬрд╝рд┐рдк рдЕрд░реНрдз-рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ "рд╕рд╛рдЗрдХрд┐рд▓" рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓рд╛рд▓реА рд╕рдВрдкреАрдбрд╝рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╡реИрдз gzip рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдирдкреИрдХреНрдб рдбреЗрдЯрд╛ рдХреА рд▓рдВрдмрд╛рдИ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдирдкреИрдХ рдХрд┐рдП рдмрд┐рдирд╛ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ :) рдФрд░ рдЧрд▓рдд рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде, GAS рдиреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреВрд╖рд┐рдд рдорд╛рдирд╛ред рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдЧрд┐рддреБрдм рдХреА рдУрд░ рд░реБрдЦ рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рдорд╣рд╛рди рд╕рдорд╛рдзрд╛рди рдкрд╛рдпрд╛: Google Apps рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП zlib.js (https://github.com/hinimub/zlib.js/blob/develop/README.en.md)ред рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреБрдВрдЬреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреАрдПрдПрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдлрд┐рд░ рдкрд╣реЗрд▓реА рдХреЛ рд╕рдореЗрдЯрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдкрд┐рдХреНрд╕реЗрд▓ рд╕рд░рдгреА рдХреЗ рд╡рд┐рдШрдЯрди рдФрд░ XY рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдбреАрдХреЛрдбрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ PHP рд╕реЗ GAS рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред

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

рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдЬреАрдПрдПрд╕ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред
 function doGet() { //var file = DriveApp.getFilesByName("password2.png").next(); //var image = file.getBlob(); var image = UrlFetchApp.fetch('https://www.vpnbook.com/password.php').getBlob(); var imageString = image.getDataAsString(); var imageArray = image.getBytes().map(function(e) { return e & 0xff; }); // imageArray = blobToUint8(imageArray); var chunkIDATStart = imageString.indexOf("IDAT") + 4; //   IDAT var chunkIDATLen = bytesToUint32(imageArray, imageString.indexOf("IDAT") - 4); //   IDAT var IDATArray = imageArray.slice(chunkIDATStart, chunkIDATStart + chunkIDATLen) var inflate = new zlibjs.Inflate(IDATArray); //  IDAT   zlib var plain = inflate.decompress(); const Width = 100; //   const Height = 13; //   const wchar = 9; //   const hchar = 13; //   //Logger.log(typeof(plain)); //Logger.log(plain); rowlen = (Width / 8) >> 0; //   ,    if ((Width - rowlen * 8) > 0) { //    rowlen+=2; // +1 filter byte at the beginning of each row.    PNG } else { rowlen++; } function getXY(x, y) { //  : 0/1 var xbyte = (x / 8 >> 0); //  ,   //Logger.log("xbyte: " + xbyte); var xbit = x - xbyte * 8; //  ,    //Logger.log("xbit: " + xbit); return (plain[xbyte + 1 + y * rowlen] << xbit & 0x80) >> 7; // +1 filter byte at the beginning of each row } // Logger.log("getXY: " + getXY(4, 3)); // - .        8  (  ) x 10 ,        (byte),      10  . //  10 hex   . var hashDict = {'183C66C3C3C3FFC3C3C3':'A','FCC6C3C6FCC6C3C3C6FC':'B','3E63C1C0C0C0C0C1633E':'C','FCC6C3C3C3C3C3C3C6FC':'D', 'FEC0C0C0FCC0C0C0C0FE':'E','FFC0C0C0FCC0C0C0C0C0':'F','3E63C0C0C0C7C3C3633E':'G','C3C3C3C3FFC3C3C3C3C3':'H', '7E18181818181818187E':'I','1E666666466C38':'J','C3C6CCD8F0F0D8CCC6C3':'K','C0C0C0C0C0C0C0C0C0FE':'L', 'C3E7FFDBDBDBC3C3C3C3':'M','C3E3F3F3DBDBCFC7C7C3':'N','3C66C3C3C3C3C3C3663C':'O','FEC3C3C3FEC0C0C0C0C0':'P', '3C66C3C3C3C3DBCF663D':'Q','FEC3C3C3FEF8CCC6C3C3':'R','7EC3C0C07E333C37E':'S','FF181818181818181818':'T', 'C3C3C3C3C3C3C3C3663C':'U','C3C3C36666663C3C1818':'V','C3C3C3C3DBDBDBFFE7C3':'W','C3C3663C18183C66C3C3':'X', 'C3C3663C181818181818':'Y','FE66C183060C0C0FE':'Z','0003E6337FC3C77B':'a','C0C0C0DCE6C3C3C3E6DC':'b', '0003E63C0C0C0633E':'c','3333B67C3C3C3673B':'d','0003C66C3FFC0633E':'e','1E33333030FC30303030':'f', '0007DC7C6C67CC07E':'g','C0C0C0DCE6C3C3C3C3C3':'h','181803818181818187E':'i','660E66666C6':'j', '606060666C78786C6663':'k','3818181818181818183C':'l','000B6DBDBDBDBDBDB':'m','000DCE6C3C3C3C3C3':'n', '0003C66C3C3C3663C':'o','000DCE6C3C3C3E6DC':'p','0003B67C3C3C3673B':'q','000DE736060606060':'r', '0007EC3C07E3C37E':'s','03030FC30303030331E':'t','000C3C3C3C3C3673B':'u','000C3C366663C3C18':'v', '000C3C3DBDBDBFF66':'w','000C3663C183C66C3':'x','000C3C3C3C3C3673B':'y','0007E6C1830607E':'z', '183C66C3C3C3C3663C18':'0','1838781818181818187E':'1','3C66C336C183060FF':'2','7CC6361C633C67C':'3', '6E1E3666C6FF666':'4','FEC0C0DCE633C3663C':'5','3C66C2C0DCE6C3C3663C':'6','FF336C183060C0C0':'7', '3C66C3663C66C3C3663C':'8','3C66C3C3673B343663C':'9','0000000000':' '}; //      10  . 2 + 10*9 = 92 < 100 const maxchar = (Width - 2) / wchar >> 0; var password = ''; for (var charX = 2; charX < maxchar * wchar + 2; charX+=wchar) { //    var hash = ''; //   for (var charY = 3; charY < hchar; charY++) { //   Y- var charrow = 0; //   -  8   for (var charXbit = 0; charXbit < 8; charXbit++) { //   X- charrow <<= 1; charrow |= getXY(charX + charXbit, charY); } hash += charrow.toString(16).toUpperCase(); //Logger.log("charrow: " + charrow.toString(2)); //Logger.log("charrow: " + charrow.toString(16).toUpperCase()); } var tempChar = hashDict[hash]; if (tempChar === 'u' || tempChar === 'y') { //     tempChar = (Date.now() % 2) ? 'u': 'y'; } if (tempChar !== ' ') { password += tempChar; // Logger.log("hash: " + hash); // Logger.log("Char: " + tempChar); } } Logger.log("password: " + password); return ContentService.createTextOutput(password); } function blobToUint8(blob) { return blob.map(function(e){ return e & 0xff; }); } function bytesToUint32(byteArray, start) { var value = 0; for (var i = start; i < start + 4; i++) { value = (value * 256) + (byteArray[i] & 0xff); } return value; } function my2() { var file = DriveApp.getFilesByName("password2.png").next(); // var file = DriveApp.getFilesByName("test.bin").next(); var image = file.getBlob(); //var imageArray = image.getBytes(); //var img = UrlFetchApp.fetch('http://example.com/image.png'); var reader = new pngjs.PNGReader(image.getBytes()); var png = reader.parse(function(err, png){ if (err) throw err; return png; }); Logger.log(png); } 'рдП', 'FCC6C3C6FCC6C3C3C6FC': 'рдмреА', '3E63C1C0C0C0C0C1633E': 'рд╕реА', 'FCC6C3C3C3C3C3C3C6FC': 'рдбреА', 'FEC0C0C0FCC0C0C0C0FE': 'рдИ', 'FFC0C0C0FCC0C0C0C0C0': 'рдПрдл function doGet() { //var file = DriveApp.getFilesByName("password2.png").next(); //var image = file.getBlob(); var image = UrlFetchApp.fetch('https://www.vpnbook.com/password.php').getBlob(); var imageString = image.getDataAsString(); var imageArray = image.getBytes().map(function(e) { return e & 0xff; }); // imageArray = blobToUint8(imageArray); var chunkIDATStart = imageString.indexOf("IDAT") + 4; //   IDAT var chunkIDATLen = bytesToUint32(imageArray, imageString.indexOf("IDAT") - 4); //   IDAT var IDATArray = imageArray.slice(chunkIDATStart, chunkIDATStart + chunkIDATLen) var inflate = new zlibjs.Inflate(IDATArray); //  IDAT   zlib var plain = inflate.decompress(); const Width = 100; //   const Height = 13; //   const wchar = 9; //   const hchar = 13; //   //Logger.log(typeof(plain)); //Logger.log(plain); rowlen = (Width / 8) >> 0; //   ,    if ((Width - rowlen * 8) > 0) { //    rowlen+=2; // +1 filter byte at the beginning of each row.    PNG } else { rowlen++; } function getXY(x, y) { //  : 0/1 var xbyte = (x / 8 >> 0); //  ,   //Logger.log("xbyte: " + xbyte); var xbit = x - xbyte * 8; //  ,    //Logger.log("xbit: " + xbit); return (plain[xbyte + 1 + y * rowlen] << xbit & 0x80) >> 7; // +1 filter byte at the beginning of each row } // Logger.log("getXY: " + getXY(4, 3)); // - .        8  (  ) x 10 ,        (byte),      10  . //  10 hex   . var hashDict = {'183C66C3C3C3FFC3C3C3':'A','FCC6C3C6FCC6C3C3C6FC':'B','3E63C1C0C0C0C0C1633E':'C','FCC6C3C3C3C3C3C3C6FC':'D', 'FEC0C0C0FCC0C0C0C0FE':'E','FFC0C0C0FCC0C0C0C0C0':'F','3E63C0C0C0C7C3C3633E':'G','C3C3C3C3FFC3C3C3C3C3':'H', '7E18181818181818187E':'I','1E666666466C38':'J','C3C6CCD8F0F0D8CCC6C3':'K','C0C0C0C0C0C0C0C0C0FE':'L', 'C3E7FFDBDBDBC3C3C3C3':'M','C3E3F3F3DBDBCFC7C7C3':'N','3C66C3C3C3C3C3C3663C':'O','FEC3C3C3FEC0C0C0C0C0':'P', '3C66C3C3C3C3DBCF663D':'Q','FEC3C3C3FEF8CCC6C3C3':'R','7EC3C0C07E333C37E':'S','FF181818181818181818':'T', 'C3C3C3C3C3C3C3C3663C':'U','C3C3C36666663C3C1818':'V','C3C3C3C3DBDBDBFFE7C3':'W','C3C3663C18183C66C3C3':'X', 'C3C3663C181818181818':'Y','FE66C183060C0C0FE':'Z','0003E6337FC3C77B':'a','C0C0C0DCE6C3C3C3E6DC':'b', '0003E63C0C0C0633E':'c','3333B67C3C3C3673B':'d','0003C66C3FFC0633E':'e','1E33333030FC30303030':'f', '0007DC7C6C67CC07E':'g','C0C0C0DCE6C3C3C3C3C3':'h','181803818181818187E':'i','660E66666C6':'j', '606060666C78786C6663':'k','3818181818181818183C':'l','000B6DBDBDBDBDBDB':'m','000DCE6C3C3C3C3C3':'n', '0003C66C3C3C3663C':'o','000DCE6C3C3C3E6DC':'p','0003B67C3C3C3673B':'q','000DE736060606060':'r', '0007EC3C07E3C37E':'s','03030FC30303030331E':'t','000C3C3C3C3C3673B':'u','000C3C366663C3C18':'v', '000C3C3DBDBDBFF66':'w','000C3663C183C66C3':'x','000C3C3C3C3C3673B':'y','0007E6C1830607E':'z', '183C66C3C3C3C3663C18':'0','1838781818181818187E':'1','3C66C336C183060FF':'2','7CC6361C633C67C':'3', '6E1E3666C6FF666':'4','FEC0C0DCE633C3663C':'5','3C66C2C0DCE6C3C3663C':'6','FF336C183060C0C0':'7', '3C66C3663C66C3C3663C':'8','3C66C3C3673B343663C':'9','0000000000':' '}; //      10  . 2 + 10*9 = 92 < 100 const maxchar = (Width - 2) / wchar >> 0; var password = ''; for (var charX = 2; charX < maxchar * wchar + 2; charX+=wchar) { //    var hash = ''; //   for (var charY = 3; charY < hchar; charY++) { //   Y- var charrow = 0; //   -  8   for (var charXbit = 0; charXbit < 8; charXbit++) { //   X- charrow <<= 1; charrow |= getXY(charX + charXbit, charY); } hash += charrow.toString(16).toUpperCase(); //Logger.log("charrow: " + charrow.toString(2)); //Logger.log("charrow: " + charrow.toString(16).toUpperCase()); } var tempChar = hashDict[hash]; if (tempChar === 'u' || tempChar === 'y') { //     tempChar = (Date.now() % 2) ? 'u': 'y'; } if (tempChar !== ' ') { password += tempChar; // Logger.log("hash: " + hash); // Logger.log("Char: " + tempChar); } } Logger.log("password: " + password); return ContentService.createTextOutput(password); } function blobToUint8(blob) { return blob.map(function(e){ return e & 0xff; }); } function bytesToUint32(byteArray, start) { var value = 0; for (var i = start; i < start + 4; i++) { value = (value * 256) + (byteArray[i] & 0xff); } return value; } function my2() { var file = DriveApp.getFilesByName("password2.png").next(); // var file = DriveApp.getFilesByName("test.bin").next(); var image = file.getBlob(); //var imageArray = image.getBytes(); //var img = UrlFetchApp.fetch('http://example.com/image.png'); var reader = new pngjs.PNGReader(image.getBytes()); var png = reader.parse(function(err, png){ if (err) throw err; return png; }); Logger.log(png); } ',' C3C3C3C3FFC3C3C3C3C3 ':' рдПрдЪ ',' 7E18181818181818187E ':' рдореИрдВ ',' 1E666666466C38 ':' рдЬреЗ ',' C3C6CCD8F0F0D8CCC6C3 ':' рдХрд╢реНрдореАрд░ ',' C0C0C0C0C0C0C0C0C0FE ':' рдПрд▓ ', function doGet() { //var file = DriveApp.getFilesByName("password2.png").next(); //var image = file.getBlob(); var image = UrlFetchApp.fetch('https://www.vpnbook.com/password.php').getBlob(); var imageString = image.getDataAsString(); var imageArray = image.getBytes().map(function(e) { return e & 0xff; }); // imageArray = blobToUint8(imageArray); var chunkIDATStart = imageString.indexOf("IDAT") + 4; //   IDAT var chunkIDATLen = bytesToUint32(imageArray, imageString.indexOf("IDAT") - 4); //   IDAT var IDATArray = imageArray.slice(chunkIDATStart, chunkIDATStart + chunkIDATLen) var inflate = new zlibjs.Inflate(IDATArray); //  IDAT   zlib var plain = inflate.decompress(); const Width = 100; //   const Height = 13; //   const wchar = 9; //   const hchar = 13; //   //Logger.log(typeof(plain)); //Logger.log(plain); rowlen = (Width / 8) >> 0; //   ,    if ((Width - rowlen * 8) > 0) { //    rowlen+=2; // +1 filter byte at the beginning of each row.    PNG } else { rowlen++; } function getXY(x, y) { //  : 0/1 var xbyte = (x / 8 >> 0); //  ,   //Logger.log("xbyte: " + xbyte); var xbit = x - xbyte * 8; //  ,    //Logger.log("xbit: " + xbit); return (plain[xbyte + 1 + y * rowlen] << xbit & 0x80) >> 7; // +1 filter byte at the beginning of each row } // Logger.log("getXY: " + getXY(4, 3)); // - .        8  (  ) x 10 ,        (byte),      10  . //  10 hex   . var hashDict = {'183C66C3C3C3FFC3C3C3':'A','FCC6C3C6FCC6C3C3C6FC':'B','3E63C1C0C0C0C0C1633E':'C','FCC6C3C3C3C3C3C3C6FC':'D', 'FEC0C0C0FCC0C0C0C0FE':'E','FFC0C0C0FCC0C0C0C0C0':'F','3E63C0C0C0C7C3C3633E':'G','C3C3C3C3FFC3C3C3C3C3':'H', '7E18181818181818187E':'I','1E666666466C38':'J','C3C6CCD8F0F0D8CCC6C3':'K','C0C0C0C0C0C0C0C0C0FE':'L', 'C3E7FFDBDBDBC3C3C3C3':'M','C3E3F3F3DBDBCFC7C7C3':'N','3C66C3C3C3C3C3C3663C':'O','FEC3C3C3FEC0C0C0C0C0':'P', '3C66C3C3C3C3DBCF663D':'Q','FEC3C3C3FEF8CCC6C3C3':'R','7EC3C0C07E333C37E':'S','FF181818181818181818':'T', 'C3C3C3C3C3C3C3C3663C':'U','C3C3C36666663C3C1818':'V','C3C3C3C3DBDBDBFFE7C3':'W','C3C3663C18183C66C3C3':'X', 'C3C3663C181818181818':'Y','FE66C183060C0C0FE':'Z','0003E6337FC3C77B':'a','C0C0C0DCE6C3C3C3E6DC':'b', '0003E63C0C0C0633E':'c','3333B67C3C3C3673B':'d','0003C66C3FFC0633E':'e','1E33333030FC30303030':'f', '0007DC7C6C67CC07E':'g','C0C0C0DCE6C3C3C3C3C3':'h','181803818181818187E':'i','660E66666C6':'j', '606060666C78786C6663':'k','3818181818181818183C':'l','000B6DBDBDBDBDBDB':'m','000DCE6C3C3C3C3C3':'n', '0003C66C3C3C3663C':'o','000DCE6C3C3C3E6DC':'p','0003B67C3C3C3673B':'q','000DE736060606060':'r', '0007EC3C07E3C37E':'s','03030FC30303030331E':'t','000C3C3C3C3C3673B':'u','000C3C366663C3C18':'v', '000C3C3DBDBDBFF66':'w','000C3663C183C66C3':'x','000C3C3C3C3C3673B':'y','0007E6C1830607E':'z', '183C66C3C3C3C3663C18':'0','1838781818181818187E':'1','3C66C336C183060FF':'2','7CC6361C633C67C':'3', '6E1E3666C6FF666':'4','FEC0C0DCE633C3663C':'5','3C66C2C0DCE6C3C3663C':'6','FF336C183060C0C0':'7', '3C66C3663C66C3C3663C':'8','3C66C3C3673B343663C':'9','0000000000':' '}; //      10  . 2 + 10*9 = 92 < 100 const maxchar = (Width - 2) / wchar >> 0; var password = ''; for (var charX = 2; charX < maxchar * wchar + 2; charX+=wchar) { //    var hash = ''; //   for (var charY = 3; charY < hchar; charY++) { //   Y- var charrow = 0; //   -  8   for (var charXbit = 0; charXbit < 8; charXbit++) { //   X- charrow <<= 1; charrow |= getXY(charX + charXbit, charY); } hash += charrow.toString(16).toUpperCase(); //Logger.log("charrow: " + charrow.toString(2)); //Logger.log("charrow: " + charrow.toString(16).toUpperCase()); } var tempChar = hashDict[hash]; if (tempChar === 'u' || tempChar === 'y') { //     tempChar = (Date.now() % 2) ? 'u': 'y'; } if (tempChar !== ' ') { password += tempChar; // Logger.log("hash: " + hash); // Logger.log("Char: " + tempChar); } } Logger.log("password: " + password); return ContentService.createTextOutput(password); } function blobToUint8(blob) { return blob.map(function(e){ return e & 0xff; }); } function bytesToUint32(byteArray, start) { var value = 0; for (var i = start; i < start + 4; i++) { value = (value * 256) + (byteArray[i] & 0xff); } return value; } function my2() { var file = DriveApp.getFilesByName("password2.png").next(); // var file = DriveApp.getFilesByName("test.bin").next(); var image = file.getBlob(); //var imageArray = image.getBytes(); //var img = UrlFetchApp.fetch('http://example.com/image.png'); var reader = new pngjs.PNGReader(image.getBytes()); var png = reader.parse(function(err, png){ if (err) throw err; return png; }); Logger.log(png); } 'C3E3F3F3DBDBCFC7C7C3': 'рдПрди', '3C66C3C3C3C3C3C3663C': 'рд╣реЗ', 'FEC3C3C3FEC0C0C0C0C0': 'рдкреА', '3C66C3C3C3C3DBCF663D': 'рдХреНрдпреВ', 'FEC3C3C3FEF8CCC6C3C3': 'рдЖрд░', '7EC3C0C07E333C37E function doGet() { //var file = DriveApp.getFilesByName("password2.png").next(); //var image = file.getBlob(); var image = UrlFetchApp.fetch('https://www.vpnbook.com/password.php').getBlob(); var imageString = image.getDataAsString(); var imageArray = image.getBytes().map(function(e) { return e & 0xff; }); // imageArray = blobToUint8(imageArray); var chunkIDATStart = imageString.indexOf("IDAT") + 4; //   IDAT var chunkIDATLen = bytesToUint32(imageArray, imageString.indexOf("IDAT") - 4); //   IDAT var IDATArray = imageArray.slice(chunkIDATStart, chunkIDATStart + chunkIDATLen) var inflate = new zlibjs.Inflate(IDATArray); //  IDAT   zlib var plain = inflate.decompress(); const Width = 100; //   const Height = 13; //   const wchar = 9; //   const hchar = 13; //   //Logger.log(typeof(plain)); //Logger.log(plain); rowlen = (Width / 8) >> 0; //   ,    if ((Width - rowlen * 8) > 0) { //    rowlen+=2; // +1 filter byte at the beginning of each row.    PNG } else { rowlen++; } function getXY(x, y) { //  : 0/1 var xbyte = (x / 8 >> 0); //  ,   //Logger.log("xbyte: " + xbyte); var xbit = x - xbyte * 8; //  ,    //Logger.log("xbit: " + xbit); return (plain[xbyte + 1 + y * rowlen] << xbit & 0x80) >> 7; // +1 filter byte at the beginning of each row } // Logger.log("getXY: " + getXY(4, 3)); // - .        8  (  ) x 10 ,        (byte),      10  . //  10 hex   . var hashDict = {'183C66C3C3C3FFC3C3C3':'A','FCC6C3C6FCC6C3C3C6FC':'B','3E63C1C0C0C0C0C1633E':'C','FCC6C3C3C3C3C3C3C6FC':'D', 'FEC0C0C0FCC0C0C0C0FE':'E','FFC0C0C0FCC0C0C0C0C0':'F','3E63C0C0C0C7C3C3633E':'G','C3C3C3C3FFC3C3C3C3C3':'H', '7E18181818181818187E':'I','1E666666466C38':'J','C3C6CCD8F0F0D8CCC6C3':'K','C0C0C0C0C0C0C0C0C0FE':'L', 'C3E7FFDBDBDBC3C3C3C3':'M','C3E3F3F3DBDBCFC7C7C3':'N','3C66C3C3C3C3C3C3663C':'O','FEC3C3C3FEC0C0C0C0C0':'P', '3C66C3C3C3C3DBCF663D':'Q','FEC3C3C3FEF8CCC6C3C3':'R','7EC3C0C07E333C37E':'S','FF181818181818181818':'T', 'C3C3C3C3C3C3C3C3663C':'U','C3C3C36666663C3C1818':'V','C3C3C3C3DBDBDBFFE7C3':'W','C3C3663C18183C66C3C3':'X', 'C3C3663C181818181818':'Y','FE66C183060C0C0FE':'Z','0003E6337FC3C77B':'a','C0C0C0DCE6C3C3C3E6DC':'b', '0003E63C0C0C0633E':'c','3333B67C3C3C3673B':'d','0003C66C3FFC0633E':'e','1E33333030FC30303030':'f', '0007DC7C6C67CC07E':'g','C0C0C0DCE6C3C3C3C3C3':'h','181803818181818187E':'i','660E66666C6':'j', '606060666C78786C6663':'k','3818181818181818183C':'l','000B6DBDBDBDBDBDB':'m','000DCE6C3C3C3C3C3':'n', '0003C66C3C3C3663C':'o','000DCE6C3C3C3E6DC':'p','0003B67C3C3C3673B':'q','000DE736060606060':'r', '0007EC3C07E3C37E':'s','03030FC30303030331E':'t','000C3C3C3C3C3673B':'u','000C3C366663C3C18':'v', '000C3C3DBDBDBFF66':'w','000C3663C183C66C3':'x','000C3C3C3C3C3673B':'y','0007E6C1830607E':'z', '183C66C3C3C3C3663C18':'0','1838781818181818187E':'1','3C66C336C183060FF':'2','7CC6361C633C67C':'3', '6E1E3666C6FF666':'4','FEC0C0DCE633C3663C':'5','3C66C2C0DCE6C3C3663C':'6','FF336C183060C0C0':'7', '3C66C3663C66C3C3663C':'8','3C66C3C3673B343663C':'9','0000000000':' '}; //      10  . 2 + 10*9 = 92 < 100 const maxchar = (Width - 2) / wchar >> 0; var password = ''; for (var charX = 2; charX < maxchar * wchar + 2; charX+=wchar) { //    var hash = ''; //   for (var charY = 3; charY < hchar; charY++) { //   Y- var charrow = 0; //   -  8   for (var charXbit = 0; charXbit < 8; charXbit++) { //   X- charrow <<= 1; charrow |= getXY(charX + charXbit, charY); } hash += charrow.toString(16).toUpperCase(); //Logger.log("charrow: " + charrow.toString(2)); //Logger.log("charrow: " + charrow.toString(16).toUpperCase()); } var tempChar = hashDict[hash]; if (tempChar === 'u' || tempChar === 'y') { //     tempChar = (Date.now() % 2) ? 'u': 'y'; } if (tempChar !== ' ') { password += tempChar; // Logger.log("hash: " + hash); // Logger.log("Char: " + tempChar); } } Logger.log("password: " + password); return ContentService.createTextOutput(password); } function blobToUint8(blob) { return blob.map(function(e){ return e & 0xff; }); } function bytesToUint32(byteArray, start) { var value = 0; for (var i = start; i < start + 4; i++) { value = (value * 256) + (byteArray[i] & 0xff); } return value; } function my2() { var file = DriveApp.getFilesByName("password2.png").next(); // var file = DriveApp.getFilesByName("test.bin").next(); var image = file.getBlob(); //var imageArray = image.getBytes(); //var img = UrlFetchApp.fetch('http://example.com/image.png'); var reader = new pngjs.PNGReader(image.getBytes()); var png = reader.parse(function(err, png){ if (err) throw err; return png; }); Logger.log(png); } 000B6DBDBDBDBDBDB ':' рдореА ',' 000DCE6C3C3C3C3C3 ':' рдПрди ',' 0003C66C3C3C3663C ':' рдУ ',' 000DCE6C3C3C3E6DC ':' рдкреА ',' 0003B67C3C3C3673B ':' рдХреНрдпреВ ',' 000DE736060606060 ' function doGet() { //var file = DriveApp.getFilesByName("password2.png").next(); //var image = file.getBlob(); var image = UrlFetchApp.fetch('https://www.vpnbook.com/password.php').getBlob(); var imageString = image.getDataAsString(); var imageArray = image.getBytes().map(function(e) { return e & 0xff; }); // imageArray = blobToUint8(imageArray); var chunkIDATStart = imageString.indexOf("IDAT") + 4; //   IDAT var chunkIDATLen = bytesToUint32(imageArray, imageString.indexOf("IDAT") - 4); //   IDAT var IDATArray = imageArray.slice(chunkIDATStart, chunkIDATStart + chunkIDATLen) var inflate = new zlibjs.Inflate(IDATArray); //  IDAT   zlib var plain = inflate.decompress(); const Width = 100; //   const Height = 13; //   const wchar = 9; //   const hchar = 13; //   //Logger.log(typeof(plain)); //Logger.log(plain); rowlen = (Width / 8) >> 0; //   ,    if ((Width - rowlen * 8) > 0) { //    rowlen+=2; // +1 filter byte at the beginning of each row.    PNG } else { rowlen++; } function getXY(x, y) { //  : 0/1 var xbyte = (x / 8 >> 0); //  ,   //Logger.log("xbyte: " + xbyte); var xbit = x - xbyte * 8; //  ,    //Logger.log("xbit: " + xbit); return (plain[xbyte + 1 + y * rowlen] << xbit & 0x80) >> 7; // +1 filter byte at the beginning of each row } // Logger.log("getXY: " + getXY(4, 3)); // - .        8  (  ) x 10 ,        (byte),      10  . //  10 hex   . var hashDict = {'183C66C3C3C3FFC3C3C3':'A','FCC6C3C6FCC6C3C3C6FC':'B','3E63C1C0C0C0C0C1633E':'C','FCC6C3C3C3C3C3C3C6FC':'D', 'FEC0C0C0FCC0C0C0C0FE':'E','FFC0C0C0FCC0C0C0C0C0':'F','3E63C0C0C0C7C3C3633E':'G','C3C3C3C3FFC3C3C3C3C3':'H', '7E18181818181818187E':'I','1E666666466C38':'J','C3C6CCD8F0F0D8CCC6C3':'K','C0C0C0C0C0C0C0C0C0FE':'L', 'C3E7FFDBDBDBC3C3C3C3':'M','C3E3F3F3DBDBCFC7C7C3':'N','3C66C3C3C3C3C3C3663C':'O','FEC3C3C3FEC0C0C0C0C0':'P', '3C66C3C3C3C3DBCF663D':'Q','FEC3C3C3FEF8CCC6C3C3':'R','7EC3C0C07E333C37E':'S','FF181818181818181818':'T', 'C3C3C3C3C3C3C3C3663C':'U','C3C3C36666663C3C1818':'V','C3C3C3C3DBDBDBFFE7C3':'W','C3C3663C18183C66C3C3':'X', 'C3C3663C181818181818':'Y','FE66C183060C0C0FE':'Z','0003E6337FC3C77B':'a','C0C0C0DCE6C3C3C3E6DC':'b', '0003E63C0C0C0633E':'c','3333B67C3C3C3673B':'d','0003C66C3FFC0633E':'e','1E33333030FC30303030':'f', '0007DC7C6C67CC07E':'g','C0C0C0DCE6C3C3C3C3C3':'h','181803818181818187E':'i','660E66666C6':'j', '606060666C78786C6663':'k','3818181818181818183C':'l','000B6DBDBDBDBDBDB':'m','000DCE6C3C3C3C3C3':'n', '0003C66C3C3C3663C':'o','000DCE6C3C3C3E6DC':'p','0003B67C3C3C3673B':'q','000DE736060606060':'r', '0007EC3C07E3C37E':'s','03030FC30303030331E':'t','000C3C3C3C3C3673B':'u','000C3C366663C3C18':'v', '000C3C3DBDBDBFF66':'w','000C3663C183C66C3':'x','000C3C3C3C3C3673B':'y','0007E6C1830607E':'z', '183C66C3C3C3C3663C18':'0','1838781818181818187E':'1','3C66C336C183060FF':'2','7CC6361C633C67C':'3', '6E1E3666C6FF666':'4','FEC0C0DCE633C3663C':'5','3C66C2C0DCE6C3C3663C':'6','FF336C183060C0C0':'7', '3C66C3663C66C3C3663C':'8','3C66C3C3673B343663C':'9','0000000000':' '}; //      10  . 2 + 10*9 = 92 < 100 const maxchar = (Width - 2) / wchar >> 0; var password = ''; for (var charX = 2; charX < maxchar * wchar + 2; charX+=wchar) { //    var hash = ''; //   for (var charY = 3; charY < hchar; charY++) { //   Y- var charrow = 0; //   -  8   for (var charXbit = 0; charXbit < 8; charXbit++) { //   X- charrow <<= 1; charrow |= getXY(charX + charXbit, charY); } hash += charrow.toString(16).toUpperCase(); //Logger.log("charrow: " + charrow.toString(2)); //Logger.log("charrow: " + charrow.toString(16).toUpperCase()); } var tempChar = hashDict[hash]; if (tempChar === 'u' || tempChar === 'y') { //     tempChar = (Date.now() % 2) ? 'u': 'y'; } if (tempChar !== ' ') { password += tempChar; // Logger.log("hash: " + hash); // Logger.log("Char: " + tempChar); } } Logger.log("password: " + password); return ContentService.createTextOutput(password); } function blobToUint8(blob) { return blob.map(function(e){ return e & 0xff; }); } function bytesToUint32(byteArray, start) { var value = 0; for (var i = start; i < start + 4; i++) { value = (value * 256) + (byteArray[i] & 0xff); } return value; } function my2() { var file = DriveApp.getFilesByName("password2.png").next(); // var file = DriveApp.getFilesByName("test.bin").next(); var image = file.getBlob(); //var imageArray = image.getBytes(); //var img = UrlFetchApp.fetch('http://example.com/image.png'); var reader = new pngjs.PNGReader(image.getBytes()); var png = reader.parse(function(err, png){ if (err) throw err; return png; }); Logger.log(png); } 


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ GET рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рд╡реЗрдм рдРрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП GET рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рддреБрд░рдВрдд рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рд╣реЛрдЧрд╛ред

рднрд╛рдЧ 3. рдорд┐рдХрд░реЛрдЯрд┐рдХ рдФрд░ рдореВрд╡ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ 302


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

 [admin@MikroTik] /environment> :put ([/tool fetch url="https://script.google.com/macros/s/A.....A/exec" http-method=get output=user as-value]->"data") failure: closing connection: <302 Moved Temporarily "https://script.googleusercontent.com/macros/echo?user_content_key=....."> 173.194.222.138:443 (4) [admin@MikroTik] /environment> 

рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ред рд╡реЗрдм рдРрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рдЬреНрдЮрд╛рдд URL рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░, Google рдПрдХ рдЕрд╕реНрдерд╛рдпреА URL рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди PHP cURL рдХреЗ рд╡рд┐рдкрд░реАрдд, RouterOS рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реЗ рдЬрд╛рдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рд╡рд┐рдлрд▓рддрд╛ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди forum.mikrotik.com рддреБрд░рдВрдд рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдерд╛ред рдЖрдк рд╕рд╛рдВрддреНрд╡рдирд╛ рд╕реЗ рдлрд╛рдЗрд▓ рдореЗрдВ рдорд╛рдирдХ рд▓рд┐рдВрдЪ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдп рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд▓рдкреЗрдЯрдХрд░: рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирдП рдкрддреЗ рдХреЗ рд╕рд╛рде рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд URL рдФрд░ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЛ рдиреАрдЪреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 #  . Moved Temporarily 302.  fetch  gasfetchout.txt :local jobid [:execute script={/tool fetch url="https://script.google.com/macros/s/A.....A/exec" output=user as-value} file=gasfetchout.txt] #    ,     :while ([:len [/system script job find .id=$jobid ]] > 0) do={ delay 1s } #  gasfetchout.txt,  URL  :local fetchOut [/file get gasfetchout.txt contents] :local startURL [:find $fetchOut "http" -1] :local endURL [:find $fetchOut "\"> " startURL] :local moveURL [:pick $fetchOut $startURL $endURL] :global VPNBookPass2 ([/tool fetch url=$moveURL output=user as-value]->"data") 

рдпрд╣рд╛рдВ GAS рд╡реЗрдм рдРрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдХрд░реЛрдЯрд┐рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда рд╣реИ
 # VPNBookScript v4 :local VPNBookpIfName "pptp-out1" :local VPNBookServerAddresses {"PL226.vpnbook.com";"de4.vpnbook.com";"us1.vpnbook.com";"us2.vpnbook.com";"fr1.vpnbook.com ";"fr8.vpnbook.com ";"ca222.vpnbook.com ";"ca198.vpnbook.com"} :local VPNBookErr false :global VPNBookPass :global VPNBookRun :global VPNBookServerIndex :if ([:typeof $VPNBookServerIndex] != "num") do={:set VPNBookServerIndex 0} :if ([/interface pptp-client get $VPNBookpIfName running]) do={ :set VPNBookRun true } else { :if (!$VPNBookRun) do={ :set VPNBookServerIndex ($VPNBookServerIndex + 1) :if ($VPNBookServerIndex>=[:len $VPNBookServerAddresses]) do={:set VPNBookServerIndex 0} } else { :set VPNBookRun false } :if (![/interface pptp-client get $VPNBookpIfName disabled]) do={/interface pptp-client set $VPNBookpIfName disabled=yes} # :do {:set VPNBookPass ([/tool fetch url="http://serv/vpnbookpass_googlescript.php" output=user as-value]->"data")} on-error={:set VPNBookErr true} :do { # First request with Moved Temporarily. Fetch out to gasfetchout.txt :local jobid [:execute script={/tool fetch url="https://script.google.com/macros/s/A.....g/exec" output=user as-value} file=gasfetchout.txt] # Wait end job :while ([:len [/system script job find .id=$jobid ]] > 0) do={ delay 1s } # parse new URL for second fetch :local fetchOut [/file get gasfetchout.txt contents] :local startURL [:find $fetchOut "http" -1] :local endURL [:find $fetchOut "\"> " startURL] :local moveURL [:pick $fetchOut $startURL $endURL] :set VPNBookPass ([/tool fetch url=$moveURL output=user as-value]->"data") } on-error={:set VPNBookErr true} :if (!$VPNBookErr) do={ :if ([/interface pptp-client get $VPNBookpIfName password] != $VPNBookPass) do={/interface pptp-client set $VPNBookpIfName password=$VPNBookPass} :if ([/interface pptp-client get $VPNBookpIfName connect-to] != $VPNBookServerAddresses->$VPNBookServerIndex) do={/interface pptp-client set $VPNBookpIfName connect-to=($VPNBookServerAddresses->$VPNBookServerIndex)} :log info "VPNBook: Attempt to connect to: $($VPNBookServerAddresses->$VPNBookServerIndex). Password: $VPNBookPass" /interface pptp-client set $VPNBookpIfName disabled=no } } 


рднрд╛рдЧ 4. рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЬреАрдПрдПрд╕ рдкреНрд░реЙрдХреНрд╕реА


рдореИрдВрдиреЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рд╕реЗрд╡рд╛ рдХреЛ рдорд┐рдХрд░реЛрдЯрд┐рдХ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдЕрдЧрд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЗрд╕ рднрд╛рдЧ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдпрд╣рд╛рдВ рдЬреАрдПрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЕрдХрд╛рджрдорд┐рдХ рд╣рд┐рдд рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рд╕реЗрд╡рд╛ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдерд╛, рдЬрд┐рд╕рдореЗрдВ api.telegram.org рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреЙрдЯ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ PNG рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, GAS рд╡реЗрдм рдРрдк рдХреЛ Mikrtotik рд╕реЗ api.telegram.org рдкрд░ рдкреНрд░реЙрдХреНрд╕реА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ manzoorwanijk, WPTelegram Google Script gist.github.com/manzoorwanijk/ee9ed032caedf2bb0c83dea73cc9a28e рд╕реЗ рддреИрдпрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реА ред рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдИ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдПрдкреАрдЖрдИ рддрд░реАрдХреЛрдВ (рд▓реЗрдХрд┐рди рд╕рднреА рдирд╣реАрдВ) рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдХрд░ рд╕рдХрддреА рд╣реИред рдЖрд░реНрдЧреНрд╕ рдореЗрдВ, рдЖрдк рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП {"chat_id":"123","text":"HelloWorld"} ред рд▓реЗрдХрд┐рди рд░рд╛рдЙрдЯрд░рдУрдПрд╕ рдорд┐рдХрд╛рд░реЛрдЯреАрдХ рд╕реЗ рдкрд╛рда рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рдореЗрд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрдЯрд┐рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд░рд▓ рдХрд░ рджрд┐рдпрд╛ред рдЕрдВрддрддрдГ, рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡реЗрдм рдРрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ SendMessage рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред SendMessage рдкрджреНрдзрддрд┐ рдХреЗ рдирд╛рдо рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдХреЗ рдЗрд╕реЗ рдФрд░ рднреА рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ requestHandler рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ bot_token рдФрд░ chat_idред

 function doGet(e) { if(typeof e !== 'undefined'){ return ContentService.createTextOutput(requestHandler(e)); } } function doPost(e) { if(typeof e !== 'undefined'){ return ContentService.createTextOutput(requestHandler(e)); } } function requestHandler(e){ if (typeof e.parameter.bot_token === 'undefined'){ return 'Error! Bot token not provided'; } else if (typeof e.parameter.method === 'undefined') { return 'Error! Method name not provided'; } else if (typeof e.parameter.chat_id === 'undefined') { return 'Error! Chat id not provide'; } else if (typeof e.parameter.text === 'undefined') { return 'Error! Text not provide'; } /* if(typeof e.parameter.args !== 'undefined'){ var args = e.parameter.args; data.payload = JSON.parse(args); } */ if (e.parameter.method === 'sendMessage') { var data = { "method": "post", "muteHttpExceptions": true, payload : 'chat_id=' + e.parameter.chat_id + '&text=' + e.parameter.text } return UrlFetchApp.fetch('https://api.telegram.org/bot' + e.parameter.bot_token + '/' + e.parameter.method, data).getContentText(); } } 

рд╡реЗрдм рдРрдк рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП GET рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 https://script.google.com/macros/s/A.....A/exec?bot_token=3.....3&method=sendMessage&chat_id=2.....3&text=testtext123 

рдпрд╛ рд░реВрдЯрд░ рд░реВрдЯрд░ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдореЗрдВ:

 :do { /tool fetch url=("https://script.google.com/macros/s/A.....A/exec") keep-result=no http-method=post http-data=("bot_token=3.....3&method=sendMessage&chat_id=2.....3&text=testtext123") } on-error={ } 

рдЕрдиреБрд░реЛрдз рдбреВ-рдСрди-рдПрд░рд░ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдХреЙрд▓ рдПрдХ рдЕрдкрд╡рд╛рдж "рдореВрд╡реНрдб рдЯреЗрдореНрдкреЛрд░рд░реА 302" рдлреЗрдВрдХ рджреЗрдЧреА рдФрд░ рдСрди-рдПрд░рд░ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреАред рдлреЙрд░рд╡рд░реНрдб рдХрд┐рдП рдмрд┐рдирд╛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рджреВрд╕рд░реА рдХреЙрд▓ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рднрд╛рдЧ 5. рдЕрдВрддрд┐рдо


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

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


All Articles