рдХрд░реЛ # рдЦреБрдж рд╕реА # рдореЗрдВ рдЯреНрд╡рд┐рдЯрд░ред рднрд╛рдЧ 1: OAuth рдкреНрд░рд╛рдзрд┐рдХрд░рдг


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

рдУрдмреЗрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╣реИрдмрд░ рдкрд░ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЯреНрд╡рд┐рдЯрд░ рдЕрдХрд╛рдЙрдВрдЯ рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЯреНрд╡рд┐рдЯрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдкреНрд░рд╢реНрдирд╛рд╡рд▓реА рднрд░реЗрдВ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдЖрд╡реЗрджрди рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдлрд┐рд░ рдЖрдкрдХреЛ рдЖрд╡реЗрджрди рдкреГрд╖реНрда рдкрд░ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕ рдкрд░ рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдЙрдкрднреЛрдХреНрддрд╛ рдХреБрдВрдЬреА рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рд░рд╣рд╕реНрдп - рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЬрд▓реНрдж рд╣реА рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдФрд░ рдЕрдм рдХреБрдЫ рд╕рд┐рджреНрдзрд╛рдВрддред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рддреАрди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
1. рд╣рдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди oauth_token рдФрд░ oauth_secret рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП api.twitter.com/oauth/request_token рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ
2. рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдПрдХ рдФрд░ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА api.twitter.com/oauth/authorize рдкрд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЯреНрд╡рд┐рдЯрд░ рдЦрд╛рддреЗ рд╕реЗ рдЕрдкрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо / рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░ рдПрдХ рдЕрдиреНрдп рд░реВрдк рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЕрджреНрднреБрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддрд╛ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреЛ рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ: рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдПред рдЬрдм рдЖрдк рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдкреГрд╖реНрда рдЦреБрд▓рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдкрд┐рди рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реЛрдЧрд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдкрд┐рди рдХреЛрдб рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
3. рдФрд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдкрд┐рди рдХреЛрдб рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ oauth_token рдФрд░ oauth_secret рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП api.twitter.com/oauth/access_token рдкрд░ рддреАрд╕рд░рд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдо рд╕рдм рдХреБрдЫ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рддрдХ рд╣рдореЗрдВ рдПрдХ рдРрд╕рд╛ рдЖрд╡реЗрджрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ OAuth рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХреЗред
рдЕрдм рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред
рдПрдХ рдирдпрд╛ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВред
рддреЛ, рдкрд╣рд▓реЗ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ api.twitter.com/oauth/request_token?oauth_consumer_key= <?> рдФрд░ Oauth_signature_method = <?> рдФрд░ Oauth_signature = <?> рдФрд░ Oauth_timestamp = <?> рдФрд░ Oauth_nonce = <?> рдФрд░ Oauth_version = <? >
рдХрд╣рд╛рдВ <?> рдЖрдкрдХреЗ рдореВрд▓реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдХреБрдЫ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЫреЛрдЯреЗ рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рдлрд▓ OAuthBase.cs рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛
рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВред

рдЪреВрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЗрдбрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
using System;<br> using OAuth;<br> using System.Net;<br> using System.IO;<br> using System.Text; <br><br> * This source code was highlighted with Source Code Highlighter .


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

// : <br> Uri uri = new Uri ( "http://api.twitter.com/oauth/request_token" );<br> string consumerKey = " consumerKey" ;<br> string consumerSecret = " consumerSecret" ;<br> // OAuthBase <br>OAuthBase oAuth = new OAuthBase();<br> // <br> string timeStamp = oAuth.GenerateTimeStamp();<br> string nonce = oAuth.GenerateNonce();<br> string normUri;<br> string normParams;<br> string sig = oAuth.GenerateSignature(uri, consumerKey, consumerSecret, string .Empty, string .Empty, "GET" , timeStamp, nonce, OAuth.OAuthBase.SignatureTypes.HMACSHA1, out normUri, out normParams);<br> // <br> string request_url = <br> "http://api.twitter.com/oauth/request_token" + "?" +<br> "oauth_consumer_key=" + consumerKey + "&" +<br> "oauth_signature_method=" + "HMAC-SHA1" + "&" +<br> "oauth_signature=" + sig + "&" +<br> "oauth_timestamp=" + timeStamp + "&" +<br> "oauth_nonce=" + nonce + "&" +<br> "oauth_version=" + "1.0" ;<br> Console .WriteLine( "Req: " + request_url); // <br> Console .WriteLine( "--------------------------------------------------------" );<br> // <br>HttpWebRequest Request = (HttpWebRequest) HttpWebRequest.Create(request_url);<br>HttpWebResponse Response = (HttpWebResponse)Request.GetResponse(); <br>StreamReader Reader = new StreamReader(Response.GetResponseStream(), Encoding .GetEncoding(1251));<br> string outline = Reader.ReadToEnd(); <br> Console .WriteLine( "Out: " + outline);<br> Console .WriteLine( "--------------------------------------------------------" );<br> // <br> char [] delimiterChars = { '&' , '=' };<br> string [] words = outline.Split(delimiterChars);<br> string oauth_token = words[1]; <br> string oauth_token_secret = words[3];<br> string oauth_callback_confirmed = words[5];<br> // <br> Console .WriteLine( "oauth_token = " + oauth_token); <br> Console .WriteLine( "oauth_token_secret = " + oauth_token_secret); <br> Console .WriteLine( "oauth_callback_confirmed = " + oauth_callback_confirmed);<br> Console .WriteLine( "--------------------------------------------------------" ); <br><br> * This source code was highlighted with Source Code Highlighter .


рдЕрдм рдЖрдк рджреВрд╕рд░реЗ рдЪрд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд┐рди рдХреЛрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

// <br> // PIN <br>request_url = "http://api.twitter.com/oauth/authorize?oauth_token=" + oauth_token;<br> Console .WriteLine( "Req: " + request_url);<br> Console .WriteLine( "--------------------------------------------------------" );<br>System.Diagnostics.Process.Start(request_url); // PIN- <br> Console .Write( "Enter PIN: " );<br> string oauth_verifier = Console .ReadLine(); // oauth_verifier тАФ PIN-. <br> Console .WriteLine( "--------------------------------------------------------" ); <br><br> * This source code was highlighted with Source Code Highlighter .


рдФрд░ рдЕрдВрддрд┐рдо рдЕрдиреБрд░реЛрдз, рдЬрд┐рд╕рдХрд╛ рдЙрддреНрддрд░ рд╣рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЦрд╛рддрд╛ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛

// <br>request_url = <br> "http://api.twitter.com/oauth/access_token" + "?" +<br> "oauth_consumer_key=" + consumerKey + "&" +<br> "oauth_token=" + oauth_token + "&" +<br> "oauth_signature_method=" + "HMAC-SHA1" + "&" +<br> "oauth_signature=" + sig + "&" +<br> "oauth_timestamp=" + timeStamp + "&" +<br> "oauth_nonce=" + nonce + "&" +<br> "oauth_version=" + "1.0" + "&" +<br> "oauth_verifier=" + oauth_verifier;<br> Console .WriteLine( "Req: " + request_url);<br> Console .WriteLine( "--------------------------------------------------------" ); <br> // <br>Request = (HttpWebRequest) HttpWebRequest.Create(request_url);<br>Response = (HttpWebResponse)Request.GetResponse(); <br>Reader = new StreamReader(Response.GetResponseStream(), Encoding .GetEncoding(1251));<br>outline = Reader.ReadToEnd(); <br> Console .WriteLine( "Out: " + outline);<br> Console .WriteLine( "--------------------------------------------------------" );<br> // <br>words = outline.Split(delimiterChars);<br>oauth_token = words[1]; <br>oauth_token_secret = words[3];<br> string user_id = words[5];<br> string screen_name = words[7];<br> // <br> Console .WriteLine( "oauth_token = " + oauth_token); <br> Console .WriteLine( "oauth_token_secret = " + oauth_token_secret); <br> Console .WriteLine( "user_id = " + user_id);<br> Console .WriteLine( "screen_name = " + screen_name); <br><br> * This source code was highlighted with Source Code Highlighter .


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

UPD: рд▓реЗрдЦрдХ рдХреЛ рдлрд┐рд░ рднреА рдЕрдкрдиреЗ рджрдо рдкрд░ рд╣реИрдмрд░ рдХреЛ рдирд┐рдордВрддреНрд░рдг рдорд┐рд▓рд╛ред рд╕реНрд╡рд╛рдЧрдд рд╣реИ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

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


All Articles