Skip to content

Instantly share code, notes, and snippets.

@stdray
Created July 16, 2015 14:28
Show Gist options
  • Select an option

  • Save stdray/15e7863f016cb01deabe to your computer and use it in GitHub Desktop.

Select an option

Save stdray/15e7863f016cb01deabe to your computer and use it in GitHub Desktop.
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