Created
July 16, 2015 14:28
-
-
Save stdray/15e7863f016cb01deabe to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using System.Collections.Generic; | |
| using System.Linq; | |
| using System.Net; | |
| using System.Net.Http; | |
| using System.Security.Authentication; | |
| using System.Threading.Tasks; | |
| using CsQuery; | |
| using Ya.Parser.Properties; | |
| namespace Ya.Parser | |
| { | |
| class Program | |
| { | |
| static void Main() | |
| { | |
| var client = new YaClient("login", "password"); | |
| client.Login().Wait(); | |
| var emails = client.GetEmailList().Result; | |
| foreach (var email in emails) | |
| Console.WriteLine("{0} : {1}", email.Item1, email.Item2); | |
| Console.ReadLine(); | |
| } | |
| } | |
| public class YaClient | |
| { | |
| const HtmlParsingOptions HtmlOptions = HtmlParsingOptions.Default | HtmlParsingOptions.IgnoreComments; | |
| readonly string _login; | |
| readonly HttpClient _http; | |
| readonly string _password; | |
| readonly Settings _settings; | |
| public YaClient(string login, string password, Settings settings = null) | |
| { | |
| _settings = settings ?? Settings.Default; | |
| _login = login; | |
| _password = password; | |
| _http = CreateHttp(); | |
| } | |
| public async Task Login() | |
| { | |
| try | |
| { | |
| var data = new Dictionary<string, string> | |
| { | |
| {_settings.LoginInputName, _login}, | |
| {_settings.PasswordInputName, _password} | |
| }; | |
| var form = new FormUrlEncodedContent(data); | |
| var resp = await _http.PostAsync(_settings.LoginUri, form); | |
| resp.EnsureSuccessStatusCode(); | |
| } | |
| catch (Exception ex) | |
| { | |
| throw new AuthenticationException("Login failed", ex); | |
| } | |
| } | |
| public async Task<IEnumerable<Tuple<string, string>>> GetEmailList() | |
| { | |
| var emailPage = await GetPage(_settings.MailUri); | |
| return ParseMessages(emailPage); | |
| } | |
| IEnumerable<Tuple<string, string>> ParseMessages(string emailPage) | |
| { | |
| var dom = CreateDom(emailPage); | |
| var messages = dom.Find(".b-messages__message"); | |
| return messages.Select(ParseMessage); | |
| } | |
| Tuple<string, string> ParseMessage(IDomObject msg) | |
| { | |
| var dom = msg.Cq(); | |
| var fromSpan = dom.Find(".b-messages__from__text"); | |
| var from = fromSpan.Text(); | |
| var subjectSpan = dom.Find(".b-messages__subject"); | |
| var subject = subjectSpan.Text(); | |
| return Tuple.Create(from, subject); | |
| } | |
| HttpClient CreateHttp() | |
| { | |
| var handler = new HttpClientHandler | |
| { | |
| CookieContainer = new CookieContainer() | |
| }; | |
| var client = new HttpClient(handler) | |
| { | |
| //todo: base uri? | |
| }; | |
| foreach (var str in _settings.DefaultHeaders) | |
| { | |
| var header = ParseHeader(str); | |
| client.DefaultRequestHeaders.Add(header.Item1, header.Item2); | |
| } | |
| return client; | |
| } | |
| static Tuple<string, string> ParseHeader(string str) | |
| { | |
| var idx = str.IndexOf(":", StringComparison.InvariantCultureIgnoreCase); | |
| var key = str.Substring(0, idx).TrimEnd(); | |
| var val = str.Substring(idx + 1).TrimStart().Trim('"'); | |
| return Tuple.Create(key, val); | |
| } | |
| static CQ CreateDom(string content) | |
| { | |
| return new CQ(content, parsingOptions: HtmlOptions); | |
| } | |
| async Task<string> GetPage(string uri) | |
| { | |
| var resp = await _http.GetAsync(uri); | |
| resp.EnsureSuccessStatusCode(); | |
| return await resp.Content.ReadAsStringAsync(); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment