Google Chrome рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ VKontakte API рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛

рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ, рдореИрдВ Google рдХреНрд░реЛрдо рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ VKontakte API рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ VKontakte API рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЛрдХрди рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдиреНрдпреВрдирддрдо рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ (рддрд╛рдХрд┐ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╣реЛ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдЗрд╕реЗ рдЬреАрдЖрдИрдПрдл рдХреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдореЗрдЬрдмрд╛рдиреА рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рд╕рд░рд▓ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:

1. рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИред
2. рдЙрд╕ рдЫрд╡рд┐ рдХрд╛ URL рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЛ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдФрд░ рдЪреБрдирд╛ред
3. OAuth 2.0 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИ рдФрд░ VKontakte API (рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдирд╣реАрдВ рд╣реИ) рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ Google рдХреНрд░реЛрдо рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдЯреЛрдХрди рднреА рдмрдЪрд╛рддрд╛ рд╣реИред
4. XMLHttpRequest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреИрд╢ рд╕реЗ рдмреНрд▓реЙрдм рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╕реНрд╡реАрд░ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
5. VKontakte рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЕрдиреБрднрд╛рдЧ (VKontakte рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░) рдореЗрдВ рддрд╕реНрд╡реАрд░ рдмрдЪрд╛рддрд╛ рд╣реИред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрдВрдд рдореЗрдВ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИред

рдЕрдиреБрднрд╛рдЧ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреНрдпреЛрдВ? рдмрд╣реБрдд рд╕рд░рд▓, рдкреНрд░рддрд┐ рдлрд╝рд╛рдЗрд▓ 200mb рдХреА рд╕реАрдорд╛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕реАрдорд┐рдд рд╕реНрдерд╛рди, рд╕рд╛рде рд╣реА рдЙрддреНрдХреГрд╖реНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдЧрддрд┐ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Google рдХреНрд░реЛрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рд╣рдм рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдкрдж рдереЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдмрд╕реЗ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рднреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреЗрдЦреЗрдВ рдХрд┐ VKontakte рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреИрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ , рд╡рд╣рд╛рдВ рднреА рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЖрдкрдХреЛ рдЕрднреА рднреА рдЗрд╕реЗ рдкрдврд╝рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рджреЗрд░реА рди рдХрд░реЗрдВред рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ VKontakte рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реНрд░реЛрдд рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдореИрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдмрд╣реБрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдпрд╣рд╛рдВ рджреЗрддрд╛ рд╣реВрдВред рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рд╣реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдХрдЯреНрдард╛, рд╕реНрд╡реАрдХреГрдд рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░) рд╕реНрдерд┐рдд рд╣реИред

рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ:

рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ .json - рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ, рдореБрдЦреНрдп рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рд╛рдЗрд▓ред рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдФрд░ рдЕрднрд┐рдЧрдо рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдгред
background.js рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдПрдХ рддрд╕реНрд╡реАрд░ рдкрд░ рдПрдХ рдХреНрд▓рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ VKontakte API рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЛрдХрди рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЕрдкрд▓реЛрдбред html - рдПрдХ рд╕реНрдЯрдм рдкреГрд╖реНрда рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреБрдЫ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рд╣реИ ( рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдПрдХ рдПрдирд┐рдореЗрдЯреЗрдб рдЬреАрдЖрдИрдПрдл рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ)ред
upload.js - рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рд╕реАрдзреЗ VKontakte рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░рддреА рд╣реИред
Wait.gif - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ GIF - рдкреНрд░рдЧрддрд┐ рдмрд╛рд░ред
imageinfo-128.png - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдЗрдХрди рдмрдбрд╝рд╛ рд╣реИред
imageinfo-16.png - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдЗрдХрди рдЫреЛрдЯрд╛ рд╣реИред
imageinfo-48.png - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдЗрдХрди рдФрд╕рдд рджрд░реНрдЬреЗ рдХрд╛ рд╣реИред

рдЕрдм рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ:
рд╡рд┐рд╕реНрддрд╛рд░ рдкреНрд░рдХрдЯ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ:

"permissions": [ "contextMenus", "tabs", "storage" , "http://*/*", "https://*/*" ] 


рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ, рдЯреИрдм, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрдЯреЛрд░реЗрдЬ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕рднреА рдЦреБрд▓реЗ рдкреГрд╖реНрдареЛрдВ рдкрд░ рд╕рдХреНрд░рд┐рдп рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реА рдореБрдЦреНрдп рд▓рд┐рдкрд┐ рдореЗрдВ, рдЬрд┐рд╕рдХрд╛ рд╡рд░реНрдгрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  "background": { "scripts": [ "background.js" ]} 


рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд░рд╕рдВрдЧ рдореЗрдиреВ рдореЗрдВ рд╣рдорд╛рд░реА рд╕рдирдХ рдЬреЛрдбрд╝реЗрдВ:

 chrome.contextMenus.create( { "title": "Rehost on vk.com", "type": "normal", "contexts": ["image"], "onclick": getClickHandler() }); 


рддрджрдиреБрд╕рд╛рд░, рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрдЗрдЯрдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, getClickHandler () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, getClickHandler () рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Google рдХреНрд░реЛрдо рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ VKontakte API рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдЪреЗрдХ рдХрд░реЗрдВ, рдЕрдЪрд╛рдирдХ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд┐рд▓ рдЧрдпрд╛ред

 chrome.storage.local.get({'vkaccess_token': {}}, function(items) { ... 


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

рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЬрд╛рдБрдЪ рдХреА рдФрд░ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕реНрдЯреЛрд░ рдореЗрдВ рдХреЛрдИ рдЯреЛрдХрди рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ OAuth 2.0 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ VKontakte API рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдФрд░ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо VKontakte рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрддреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреИрдм рдЦреЛрд▓реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ:

oauth.vk.com/authorize?client_id=3315996&scope=docs,offline&redirect_uri=http%3A%2F%2Foauth.vk.com%2Fblank.html&display=page&response_type=token

1. client_id = 3315996 рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЖрдИрдбреА рд╣реИ рдЬреЛ VKontakte рдЖрдкрдХреЛ рджреЗрдЧрд╛ред рдЗрд╕ рдкрддреЗ рдкрд░ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред рдЖрд╡реЗрджрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреА рдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдирд╛рдо рд▓рд┐рдЦреЗрдВ рдФрд░ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдЗрд╕рд╕реЗ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рдПрдХ client_id рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

2. рд╕реНрдХреЛрдк = рдбреЙрдХреНрд╕, рдСрдлрд▓рд╛рдЗрди - рдпреЗ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдПрдкреА рд╣реИрдВ, рдЬрд┐рди рддрдХ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкрд╣реБрдВрдЪ рд╣реЛрдЧреА ред рдЪреВрдБрдХрд┐ рд╣рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдЙрдирд╕реЗ рд╣реА рдкрд╣реБрдБрдЪ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рдСрдлрд╝рд▓рд╛рдЗрди рдкрд╣реБрдБрдЪ - рд╣рдореЗрдВ рдПрдХ рдЯреЛрдХрди рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдЖрдкрдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдлрд┐рд░ рд╕реЗ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

3. рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ_рдпреВрд░реА = рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо VKontakte рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдпреВрд░реА рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ (рдпрд╛ рдирд╣реАрдВ) рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЯреЛрдХрди рдЗрд╕ рдЙрд░реА рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╣реЛрдЧрд╛ (рдпреЗ рд╕рднреА OAuth 2.0 рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдорд╛рдирдХ рдХреЗ рднрд╛рдЧ рд╣реИрдВред рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ)ред

4. рдкреНрд░рджрд░реНрд╢рди = рдкреГрд╖реНрда - рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╡рд┐рдВрдбреЛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐
5. response_type = token - рд╣рдо VKontakte рд╕рд░реНрд╡рд░ рд╕реЗ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВрдЧреЗред

рдпреЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ VKontakte рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкреЗрдЬ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред

рдФрд░ рдЗрд╕рд▓рд┐рдП, VKontakte рдХрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреИрд╕реЗ рд╣реИред рд╣рдорд╛рд░рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ VKontakte рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрдард┐рдд uri рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдЯреИрдм рдЦреЛрд▓рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред

 var authUrl = 'https://oauth.vk.com/authorize?client_id=3315996&scope=docs,offline&redirect_uri=http%3A%2F%2Foauth.vk.com%2Fblank.html&display=page&response_type=token'; chrome.tabs.create({url: authUrl,selected: true}, function(tab) {... 


VKontakte рд╕рд░реНрд╡рд░ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдЗрдЯ рдкрд░ рдЕрдзрд┐рдХреГрдд рд╣реИ рдпрд╛ рдирд╣реАрдВ (рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд▓реЙрдЧрд┐рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛)
(рдпреЗ VKontakte рдХреЗ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдЪрд┐рддреНрд░ рд╣реИрдВ, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ)



рдФрд░ рдлрд┐рд░ рдкреВрдЫрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред



рдпрджрд┐ рдЖрдк рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВ - рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреГрд╖реНрда рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ uri рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ VK API рддрдХ рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП access_token рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рддреНрд░реБрдЯрд┐ = access_denied рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЖрдПрдЧрд╛ред

рдмреЗрд╢рдХ , рд╣рдо рдПрдХреНрд╕реЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ рдФрд░ рдЙрд╕ рдЯреИрдм рдореЗрдВ рдЬрд┐рд╕реЗ рд╣рдо рдЦреЛрд▓рддреЗ рд╣реИрдВ, рд╡рд╣ oauth.vk.com/blank.html рдкреЗрдЬ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреИрдм рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЯреИрдм рдЕрдкрдбреЗрдЯ рд╣реИрдВрдбрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред

  authTabId = tab.id; chrome.tabs.onUpdated.addListener(function tabUpdateListener(tabId, changeInfo) { if(tabId == authTabId && changeInfo.url != undefined && changeInfo.status == "loading") { if ( changeInfo.url.indexOf('oauth.vk.com/blank.html') > -1 ) { ... 


рд╣рдо рдЕрдкрдиреЗ рдЯреИрдм рдХреА рдЖрдИрдбреА рдХреЛ рдмрдЪрд╛рдПрдВрдЧреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ рдФрд░ рдЯреИрдм рдХреА uri рдореЗрдВ access_token рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдЬреИрд╕реЗ рд╣реА рд╣рдореЗрдВ рдЯреИрдм рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп access_token рдорд┐рд▓рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддреЗ рд╣реИрдВ:

 chrome.storage.local.set({'vkaccess_token': accToken}, function() { ... 


рдФрд░ рдлрд┐рд░ рддреБрд░рдВрдд рд╣рдорд╛рд░реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдЕрд░реНрдерд╛рддреН, рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ VKontakte рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ред

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

 chrome.tabs.update(tabId,{'url': 'upload.html#' + imgSrc + '&' + accToken,'active': true}, function(tab){}); 


рд╣рдорд╛рд░рд╛ upload.html рдкреГрд╖реНрда рд╕рд░рд▓ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдкреНрд░рдЧрддрд┐ рдмрд╛рд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ - рдПрдХ gifред рдФрд░ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ upload.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рдо рдХрд░рддреА рд╣реИ ред

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

 var x = new XMLHttpRequest(); x.onload = function() { .. } x.responseType = 'blob'; x.open('GET', imageUrl); x.send(); 


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

рдЕрдЧрд▓рд╛ VKontakte API рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ рдЬреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реИред рд╣рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХрд╛ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИ ( docs.getUploadServer ), рдлреЙрд░реНрдордбреЗрдЯрд╛ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлреЙрд░реНрдо рдмрдирд╛рдПрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдмреВрдБрдж рдХреЛ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдЫрд╡рд┐ рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рдПред рд╣рдо рдЪрд┐рддреНрд░ рдХреЛ POST рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЪрд┐рддреНрд░ рдХреЛ рд╕рд░реНрд╡рд░ ( docs.save ) рдкрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪрд┐рддреНрд░ рдХрд╛ uri рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рдорд╛рд░реЗ рдЯреИрдм рдореЗрдВ VKKakte рд╕рд░реНрд╡рд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдХреА рдЧрдИ рддрд╕реНрд╡реАрд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред

рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдореИрдВ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд▓рд┐рдП рджреЛрд╖ рди рджреЗрдВред

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


All Articles