Vkontakte wall.post рд╕реА # рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ

рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, VKontakte рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рджреАрд╡рд╛рд░ рдкрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕реНрд╡рдд: рдкреНрд░рдХрд╛рд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ред рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдп, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдореИрдВ C # рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рддреИрдпрд╛рд░ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП:
  1. рдЖрд╡реЗрджрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ рдФрд░ AppID рдФрд░ AppSecret рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИ ;
  2. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ VKontakte рдкреГрд╖реНрда рдкрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ рд╡рд╣ рдЖрдкрдХреА рдУрд░ рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдкрд░ рдЕрдзрд┐рдХрд╛рд░ рджреЗрдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдЧрд╛;
  3. рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ;
  4. рджреАрд╡рд╛рд░ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред

рдЪрд░рдг 1: рдЖрд╡реЗрджрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ


рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ 2 рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрдЧреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
  1. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдИрдбреА ( рдПрдкреАрдЖрдИрдбреА );
  2. рдПрдкреНрд▓реАрдХреЗрд╢рди рд╕реАрдХреНрд░реЗрдЯ рдХреА ( AppSecret )ред

рдЪрд░рдг 2: рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рд╕рдлрд▓ рдкреБрд╖реНрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЗ VKontakte рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдзрд┐рдХрд╛рд░ рджреЗрдиреЗ рд╕реЗ рдХреЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЯреЛрдХрди -рдП рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред GetCode () рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ Vk рдмрдирд╛рдПрдВ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкреГрд╖реНрда рдкрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред
public static class Vk
{
public static void GetCode()
{
string reqStrTemplate =
"http://api.vkontakte.ru/oauth/authorize?client_id={0}&scope=offline,wall" ;

System.Diagnostics.Process.Start(
string .Format(reqStrTemplate, Publics.Vk_AppID));

}
}


* This source code was highlighted with Source Code Highlighter .


рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдХреЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдкреГрд╖реНрда рд╕реЗ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдЗрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдкрд╛рджрди рдореЗрдВ рджрд░реНрдЬ рдХрд░реЗрдВ)ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рддреЛ рдЪреАрдЬреЗрдВ рдереЛрдбрд╝реА рдмреЗрд╣рддрд░ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдЖрдк рдкреНрд░рд╛рдкреНрдд рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░ ((redirect_uri = http: // yourite) рдореЗрдВ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд╛ рдкрддрд╛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдХреЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реАрдзреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЪрд░рдг 3: рдЯреЛрдХрди


рдЯреЛрдХрди (рдХреА) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЪрд░рдг 1-3 рдХреЛ рдЫреЛрдбрд╝ рдХрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдУрд░ рд╕реЗ рдХрд╛рд░реНрдпрд╡рд╛рд╣реА рдХрд░ рд╕рдХреЗрдВрдЧреЗред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЯреЛрдХрди OAuth рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдорд░реНрдерди / рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЖрдзрд╛рд░рд╢рд┐рд▓рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ AppID , AppSecret рдФрд░ AppCode рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрд╡реЗрджрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп рд╣рдордиреЗ 1 рдФрд░ 2 рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП, рдФрд░ рд╣рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ AppCode рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред
рдЯреЛрдХрди рдХреА рд╕рдлрд▓ рдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, VKontakte рдЯреЛрдХрди рдХреЗ рд╕рд╛рде json рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЯреЛрдХрди рдХреА рд╕рдорд╛рдкреНрддрд┐ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
public class VkJsonTokenResponse
{
public string access_token { get ; set ; }
public string expires_in { get ; set ; }
public string user_id { get ; set ; }
}


* This source code was highlighted with Source Code Highlighter .


public static string GetToken( string Code)
{
string reqStrTemplate =
"https://api.vkontakte.ru/oauth/access_token?client_id={0}&client_secret={1}&code={2}" ;

string reqStr = string .Format(reqStrTemplate, Publics.Vk_AppID, Publics.Vk_Secret, Code);

WebClient webClient = new WebClient();
string response = webClient.DownloadString(reqStr);

JavaScriptSerializer s = new JavaScriptSerializer();
VkJsonTokenResponse jsonResponse = s.Deserialize<VkJsonTokenResponse>(response);
Token = jsonResponse.access_token;
SaveTokens();
return Token;
}


* This source code was highlighted with Source Code Highlighter .


рдЪрд░рдг 4: рджреАрд╡рд╛рд░ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдЕрдВрддрд┐рдо рдЪрд░рдг


рдкрд╛рда, рд▓рд┐рдВрдХ / рдореАрдбрд┐рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
public static string PostMessage( string Message, string Link, string CapchaID, string CapchaKey)
{
string reqStr = string .Format(
"https://api.vkontakte.ru/method/wall.post?owner_id={0}=&access_token={1}&message={2}" ,
Publics.Vk_GroupID, Vk.Token, Message);

if (! string .IsNullOrEmpty(Link))
reqStr += string .Format( "&attachment={0}" , System.Web.HttpUtility.UrlEncode(Link));

if (! string .IsNullOrEmpty(CapchaID))
reqStr += string .Format( "&captcha_sid={0}" , CapchaID);

if (! string .IsNullOrEmpty(CapchaKey))
reqStr += string .Format( "&captcha_key={0}" , CapchaKey);

WebClient webClient = new WebClient();
return webClient.DownloadString(reqStr);
}


* This source code was highlighted with Source Code Highlighter .

рд╕рд╛рджрд╛ рдкрд╛рда рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ post_id рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рдкрд╛рда рдФрд░ рд▓рд┐рдВрдХ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ : 1 , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ VKontakte рдиреЗ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдВрднрд╡рддрдГ рдПрдХ рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдХреНрдпреЛрдВ "рд╣реЛ рд╕рдХрддрд╛ рд╣реИ" рд▓реЗрдЦ рдХрд╛ рдЕрдВрдд рджреЗрдЦреЗрдВред
рдЦреИрд░, рдЯреЛрдХрди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб:
private static void SaveTokens()
{
XmlSerializer s = new XmlSerializer( typeof ( string ));
FileStream fs = new FileStream (Publics.CurrPath + "vk.xml" , FileMode .OpenOrCreate);
s.Serialize(fs, Token);
fs.Flush();
}

public static void LoadTokens()
{
try
{
XmlSerializer s = new XmlSerializer( typeof ( string ));
FileStream fs = new FileStream (Publics.CurrPath + "vk.xml" , FileMode .Open);
Token = ( string )s.Deserialize(fs);
}
catch (Exception ex)
{
Error.SaveError( "Vk.LoadTokens" , ex.Message);
}
}


* This source code was highlighted with Source Code Highlighter .

рдПрдХреНрд╕рдПрдордПрд▓ рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ, рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рдП, рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдереЗред

рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕реБрдЭрд╛рд╡ / рдирд┐рд░рд╛рд╢рд╛рдПрдБ


  1. рдЖрдк рдЕрдкрдиреА рджреАрд╡рд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХрд╣реАрдВ рднреА рд▓рд┐рдВрдХ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкрд╛рда рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рдЬрдмрдХрд┐ VKontakte рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рд╣реИ ;
  2. рдпрджрд┐ рдЖрдк рдПрдХ рд▓рд┐рдВрдХ (рдЕрдкрдиреЗ рдкреЗрдЬ рдкрд░) рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд▓рд┐рдВрдХ рд╡реИрдз рд╣реИ (рдореМрдЬреВрджрд╛ рдкреЗрдЬ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ + System.Web.HttpUtility.UrlEncode (рд▓рд┐рдВрдХ) рдХреЛ рдордд рднреВрд▓рдирд╛)ред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд▓рд┐рдВрдХ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА рдФрд░ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрд╕рд░рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдерд╛, рд▓рд┐рдВрдХ рд╡рд╛рд▓реЗ рдкреЛрд╕реНрдЯ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЬрд╡рд╛рдм рдореЗрдВ рдЖрдкрдХреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛: 1;
  3. рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдФрд░ рдПрдХ рддрд╕реНрд╡реАрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
  4. рдЖрдк рдХрд┐рд╕реА рд╕рдореВрд╣ рдХреА рдУрд░ рд╕реЗ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ;
  5. 2-5 рдорд┐рдирдЯ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд╢рди рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ, рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдХреИрдкреНрдЪрд╛ рдкрд╣рдЪрд╛рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рдкреНрд░рдХрд╛рд╢рди рдЕрдиреБрд░реЛрдз рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ, рдЖрдкрдХреЛ рдХреИрдкреНрдЪрд╛ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рдмрд╛рд░-рдмрд╛рд░ рдЕрдиреБрд░реЛрдз рдкрд░ рдЖрдкрдХреЛ 2 рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗ: captcha_sid рдФрд░ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп ( рдХреИрдкреНрдЪрд╛_рдХреА )ред


VKontakte API рдХреА рд╡рд┐рдХреГрддрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЖрдкрдХреЗ рдкреЛрд░реНрдЯрд▓ / рдкрддреНрд░рд┐рдХрд╛ / рдмреНрд▓реЙрдЧ рдХреА рдЦрдмрд░реЛрдВ рдХреЗ VKontakte рд╕рдореВрд╣ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
рд╕рдВрджрд░реНрдн:
  1. Vkontakte рдПрдкреАрдЖрдИ рдкреНрд░рд▓реЗрдЦрди

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


All Articles