рдЯреНрд╡рд┐рдЯрд░ рдРрдкред рдЯреНрд╡реАрдЯ рдФрд░ рдирд┐рдЬреА рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛

рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕рднреА рдХреНрдпреВрдмреНрд╕ рдХреЛ рдореЛрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ ...

рдЫрд╡рд┐

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



рдФрд░ рдЕрдм рдЕрдВрдХ рдХреЗ рд▓рд┐рдП:

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

2. рдЕрдм рд╣рдо рдЯреНрд╡рд┐рдЯрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рдПрдВрдЧреЗ, рдЬрд╣рд╛рдВ, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
рдЯреНрд░рд┐рдЯрд░ рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб ред рдПрдХ рдмрд╛рд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЦрд╛рддрд╛ рдореЗрдиреВ рдореЗрдВ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛
рдмрд┐рдВрджреБ "рдореЗрд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ" рдФрд░ рдЦреБрд▓рдиреЗ рд╡рд╛рд▓реЗ рдкреГрд╖реНрда рдкрд░, рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдЫрд╡рд┐

рдЫрд╡рд┐

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

рдЫрд╡рд┐

3. рдЯреНрд╡рд┐рдЯрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдЧрд▓рд╛ рдЪрд░рдг OAuth рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ- C # рдореЗрдВ рд╕реНрд╡рдпрдВ рдЯреНрд╡рд┐рдЯрд░ рд▓реЗрдЦ ред рднрд╛рдЧ 1: OAuth рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЖрдкрдХреЛ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рдЗрд╕ рд▓реЗрдЦ рд╕реЗред рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛, рддреЛ рдЕрдВрдд рдореЗрдВ рдЖрдк OAuth рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗ рдФрд░ 2 рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореВрд▓реНрдп рдЖрдкрдХреЛ рд╕реМрдВрдкреЗ рдЬрд╛рдПрдВрдЧреЗ:
рдкрд╣реБрдВрдЪ рдЯреЛрдХрди рдФрд░
рдкрд╣реБрдВрдЪ рдЧреБрдкреНрдд рд░рд╣рд╕реНрдп
рд╡реЗ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рд╡рд░рдг рдЯреИрдм рдХреЗ рдЖрдкрдХреЗ рдкрд╣реБрдВрдЪ рдЯреЛрдХрди рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрд╕реА рдЦрдВрдб рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рд╕реНрддрд░ рдлрд╝реАрд▓реНрдб рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЯреНрд╡реАрдЯ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдФрд░ рдирд┐рдЬреА рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд░реАрдб, рд░рд╛рдЗрдЯ рдФрд░ рдбрд╛рдпрд░реЗрдХреНрдЯ рдореИрд╕реЗрдЬ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЯреИрдм рдкрд░ рдкрд╣реБрдВрдЪ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ OAuth рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЫрд╡рд┐

рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рдЯреНрд╡рд┐рдЯрд░ рдЦрд╛рддрд╛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ "рдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдореЗрдиреВ рдЦреЛрд▓реЗрдВ, рдлрд┐рд░ рдЯреНрд╡рд┐рдЯрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рдкрдВрдЬреАрдХреГрдд рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЛ рд╡рд╣рд╛рдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

4. рдЕрдм рдЙрди рдЪрд░рдгреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░реЗрдВ рдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдП рдереЗ:
рдЙрдкрднреЛрдХреНрддрд╛ рдХреБрдВрдЬреА
рдЙрдкрднреЛрдХреНрддрд╛ рд░рд╣рд╕реНрдп
рдкрд╣реБрдВрдЪ рдЯреЛрдХрди
рдкрд╣реБрдВрдЪ рдЧреБрдкреНрдд рд░рд╣рд╕реНрдп

рд╣рдо MessageSender рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдореЗрдВ рд▓рдЧреЗ рд░рд╣реЗрдВрдЧреЗ:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.Net; using System.IO; namespace TwitterOAuth { class MessageSender { private readonly string consumerKey; private readonly string consumerSecret; private readonly string oauthToken; private readonly string oauthTokenSecret; private const string headerFormat = "OAuth oauth_nonce=\"{0}\", oauth_signature_method=\"{1}\", " + "oauth_timestamp=\"{2}\", oauth_consumer_key=\"{3}\", " + "oauth_token=\"{4}\", oauth_signature=\"{5}\", " + "oauth_version=\"{6}\""; /// <summary> ///      /// </summary> public MessageSender(string consumer_key, string consumer_secret, string oauth_token, string oauth_token_secret) { this.consumerKey = consumer_key; this.consumerSecret = consumer_secret; this.oauthToken = oauth_token; this.oauthTokenSecret = oauth_token_secret; } /// <summary> ///     /// </summary> /// <param name="user">without @</param> /// <param name="text"></param> public void SendDirectMessage(string user, string text) { string post_data; string resource_url; string authHeader = GetPostDirectMessageBaseString(text, user, oauthToken, oauthTokenSecret, out post_data, out resource_url); Send(resource_url, post_data, authHeader); } /// <summary> ///    /// </summary> /// <param name="text"></param> public void SendTwit(string text) { string post_data; string resource_url; string authHeader = GetStatusBaseString(text, oauthToken, oauthTokenSecret, out post_data, out resource_url); Send(resource_url, post_data, authHeader); } private void Send(string resource_url, string post_data, string auth_header) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url); request.Headers.Add("Authorization", auth_header); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = post_data.Length; using (Stream stream = request.GetRequestStream()) { byte[] content = ASCIIEncoding.ASCII.GetBytes(post_data); stream.Write(content, 0, content.Length); } try { WebResponse response = request.GetResponse(); Console.WriteLine(response.ToString()); } catch (WebException e) { Console.WriteLine(e.Status.ToString()); } } private string GetBaseString(string oauth_token, string oauth_token_secret, string post_data, string resource_url) { var oauth_version = "1.0"; var oauth_signature_method = "HMAC-SHA1"; var oauth_nonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString())); var timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); var oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString(); var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" + "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&" + post_data; var baseString = string.Format(baseFormat, consumerKey, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_token, oauth_version ); baseString = string.Concat("POST&", Uri.EscapeDataString(resource_url), "&", Uri.EscapeDataString(baseString)); //Encrypt data var compositeKey = string.Concat(Uri.EscapeDataString(consumerSecret), "&", Uri.EscapeDataString(oauth_token_secret)); string oauth_signature; using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey))) { oauth_signature = Convert.ToBase64String( hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString))); } //Finish Auth header var authHeader = string.Format(headerFormat, Uri.EscapeDataString(oauth_nonce), Uri.EscapeDataString(oauth_signature_method), Uri.EscapeDataString(oauth_timestamp), Uri.EscapeDataString(consumerKey), Uri.EscapeDataString(oauth_token), Uri.EscapeDataString(oauth_signature), Uri.EscapeDataString(oauth_version) ); return authHeader; } private string GetStatusBaseString(string status, string oauth_token, string oauth_token_secret, out string post_data, out string resource_url) { post_data = "status=" + Uri.EscapeDataString(status); resource_url = "https://api.twitter.com/1.1/statuses/update.json"; return GetBaseString(oauth_token, oauth_token_secret, post_data, resource_url); } private string GetPostDirectMessageBaseString(string text, string screen_name, string oauth_token, string oauth_token_secret, out string post_data, out string resource_url) { post_data = "screen_name=" + Uri.EscapeDataString(screen_name) + "&text=" + Uri.EscapeDataString(text); resource_url = "https://api.twitter.com/1.1/direct_messages/new.json"; return GetBaseString(oauth_token, oauth_token_secret, post_data, resource_url); } } } 


рдЯреЗрдк рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, SendTwit рд╡рд┐рдзрд┐ ("рдХреБрдЫ рд╕рдВрджреЗрд╢") рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ,
рдФрд░ рдПрдХ рдирд┐рдЬреА рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо SendDirectMessage рдкрджреНрдзрддрд┐ ("рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛", "рдХреБрдЫ рд╕рдВрджреЗрд╢") рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ

  static void Main(string[] args) { //  MessageSender ms = new MessageSender(consumerKey, consumerSecret, oauth_token, oauth_token_secret); ms.SendTwit("I can sent twit"); //         ms.SendDirectMessage("user", "Direct message for user"); Console.ReadLine(); } 


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреЛ рдмрд╛рд░ рдПрдХ рд╣реА рд╕рдВрджреЗрд╢ рдЯреЗрдк рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдФрд░ рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рд╣реИ:

рдЫрд╡рд┐

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ REST API v1.1 рд░рд┐рд╕реЛрд░реНрд╕ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рд╣реИ ред рдирд┐рдЬреА рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ: screen_name рдФрд░ рдкрд╛рда, рдФрд░ resource_url рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрд░реЛрдз рдЕрдиреБрднрд╛рдЧ, POST рдлрд╝реАрд▓реНрдб

  private string GetPostDirectMessageBaseString(string text, string screen_name, string oauth_token, string oauth_token_secret, out string post_data, out string resource_url) { post_data = "screen_name=" + Uri.EscapeDataString(screen_name) + "&text=" + Uri.EscapeDataString(text); resource_url = "https://api.twitter.com/1.1/direct_messages/new.json"; return GetBaseString(oauth_token, oauth_token_secret, post_data, resource_url); } 


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

рдЫрд╡рд┐

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

рд╕реМрднрд╛рдЧреНрдп рд╣реИ

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


All Articles