В проэкте есть WebBrowser с пройденой авторизацией на сайте wordstat.yandex.ru
Мы копируем куки с webBrowser и вставляем их в в запрос(смотрите код)
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Windows.Forms;
using System.Windows;
using System.Threading;
namespace Passport
{
public partial class Form1 : Form
{
string sLogin = "t.pentsak";
CookieContainer container = new CookieContainer();
string sPassword = "qwerty12345";
string kyki = "";
public Form1()
{
InitializeComponent();
webBrowser1.Navigate("http://wordstat.yandex.ru");
}
public CookieContainer GetCookieContainer()
{
foreach (string cookie in webBrowser1.Document.Cookie.Split(';'))
{
string name = cookie.Split('=')[0];
string value = cookie.Substring(name.Length + 1);
string path = "/";
string domain = ".wordstat.yandex.ru"; //change to your domain name
kyki+= cookie;
kyki += ";";
container.Add(new Cookie(name.Trim(), value.Trim(), path, domain));
}
kyki.Remove(kyki.Length - 1);
return container;
}
private void button1_Click(object sender, EventArgs e)
{
GetCookieContainer();
HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://wordstat.yandex.ru");
myHttpWebRequest.Accept = "*/*";
myHttpWebRequest.Headers.Add("Accept-Language", "uk,en-US;q=0.8,en;q=0.5,ru;q=0.3");
myHttpWebRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0; .NET4.0E; .NET4.0C; InfoPath.3; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729)";
myHttpWebRequest.AllowAutoRedirect = false;
myHttpWebRequest.Headers.Add(HttpRequestHeader.Cookie, kyki); // вот здесь добавляем куки в myHttpWebRequest из WebBrowser
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
}
}
}
Теперь о сути, по идее после передачи куков в которых пройдена авторизация из WebBrowser в HttpWebRequest\response , в запросе сделанном через(HttpWebRequest\response) должна быть пройдена авторизация.
Но увы, есть проблема ... читайте дальше.
При запуске программы сразу же открывается ссылка в WebBrowser,там есть куки, в куках есть определённый session_ID который то и не удалось достать методом GetCookieContainer. То есть, оба запроса что с WebBrowser что с HttpWebRequest\response идентичны кроме того, что в WebBrowser есть session_ID которого при копировании куков не наблюдаеться.И соответственно авторизоваться не получаеться.
P.S. запросы что с того, что с того идентичны при просмотре через Fiddler, разница лишь в том что в куках WB есть строчка session id , которой не наблюдаеться в HttpWebRequest\response.
Теперь сам вопрос - что могло помешать залогиниться в этом случае?Как достать session_ID с куков или как его сгенерировать?
Единственная наша теория "почему не выходит залогиниться с HttpWebRequest\response" - это отсутствующий Session Id.
Хотелось бы посмотреть ваши рассуждения\идеи по этому поводу.
Возможно на странице есть javascript который собственно и записывает куки.
Очистил куки WebBrowser1,заново залогинился,session ID получаю в ответе яндекса об удачной авторизации, т.е.
Мы отправили запрос с логином и пассом - далее автоматические отправляется запрос типа auth/finish ,т.е. об удачной авторизации, в котором мы и получаем сессион айди.
Странно,если смотреть куки в фиддлере, то SI присутствует, а если выводить куки WB на RichTextBox , то никаким session ID там ин е пахнет.
Добавлено через 4 часа 14 минут
Вытянули куки с WB и вставил их в ручную в HttpWebreq\res - авторизация успешна и там, и там.
НО, теперь появилась другая проблема, авторизация нам нужна была для того что бы вытянуть html код с определённого запроса,а для тех кто не в теме, результаты по определённому запросу можно узнать лишь будучи авторизованим.Сама суть, при просмотре HTML кода страницы с результатами по определённому запросу, в Fiddler вот такие каракули, при чём и в WB и в HttpWebreq\res каракули одинаковы.
[Ссылки могут видеть только зарегистрированные пользователи. ]
То что вместо HTML кода страницы находиться бред это понятно.
Идём дальше.
Казалось бы что нету html кода при просмотре через Fiddler, но если вытягивать html методом
richTextBox1.Text = webBrowser1.Document.Body.InnerHtml;// это не обычный DocumentText,это метод который возвращает данные с под тега Body, т.е. результаты которые нам прислал яндекс.Обычным DocumentText не спарсишь данные с подтега body
и выводить его на экран формы, то html есть, при чём с нужными результатами, без каракуль, в общем всё на пятерочку.
НО
нам нужно спарсить html код с результатами из HttpWebreq\res, а вот здесь и начинаеться крутяк.У HttpWebreq\res нету никаких либо методов для парсинга html страницы, вот такой вариант парсинга страницы это танцы с бубном которые выводят на ричтекст бокс вот такие каракули.
Сам метод парса html с HttpWebreq\res StreamReader sr = new StreamReader(myHttpWebResponse.GetResponseStream() );
string html = "";
html = sr.ReadToEnd();
html = HttpUtility.UrlEncode(html);
А вот и каракули которые добыты методом выше.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Итоги:
У WebBrowser есть методы которые выводят html страницы несмотря на то что в FIddler этот html отображаеться как кусок гов**.У HttpWebRes\req нету никаких встроенных методов для вывода html, а танцы с бубном приводят к результату скриншотом выше.
Хотелось бы услишать ваши рассуждения\советы(может кто нибудь сталкивалися и находил решения)
Спасибо.
P.S. если кто не понял, тот бред что на первом скриншоте был выведен на RichTextBox, и он стал еще более
Ладно, дам подсказку, метод называется [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ], эти два слова объясняют суть "бреда" который вы получаете.
ЗЫ Уж не знаю, что страшнее, плохой код или плохие кодеры?
Ладно, дам подсказку, метод называется [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ], эти два слова объясняют суть "бреда" который вы получаете.
ЗЫ Уж не знаю, что страшнее, плохой код или плохие кодеры?
Уловил суть, в общем авторизация успешно пройдена с помощью одного человека, вскоре напишу статейку об авторизации на ЯД.