Ken-in-California Ответов: 0

Собирайте файлы cookie, которые не установлены httpwebresponse - C#


Мне нужно соскрести таблицу информации с сайта, для которого у меня есть действительные учетные данные - владельцы сайта не предоставляют API.

Я выполнил вход в систему и сохранил трафик с помощью Fiddler, а также пытаюсь повторить ключевые шаги. Я собираюсь показать шаги, которые я сделал до сих пор, и добраться до того места, где я застрял. Извините, что некоторые из этих вещей так элементарны.

Я делаю это с помощью HTTPWebRequest и HTTPWebResponse.

Я предполагаю, что данные cookie в третьем вызове, приведенном ниже, необходимы, и это задается клиентским скриптом, который собирается между 2-м и 3 - м вызовами - но я новичок в этом и не уверен-и понятия не имею, как получить действительный файл cookie без использования браузера.

Вероятно, я могу решить эту проблему с помощью объекта webbrowser, но это кажется неуклюжим решением. Есть ли менее неуклюжий путь? Есть ли другие объекты или библиотеки,которые я должен попробовать? (RestSharp? Почтальон? Объект Webrequest вместо HTTPWeRequest?) Есть ли какой-нибудь тип объекта, который запустит скрипт и позволит мне захватить файлы cookie?



Что я уже пробовал:

1 - я долго вхожу в базовый url-вызовите его https:\www.abc.com. Вместе с возвратом устанавливается файл cookie. Мой код выглядит так:

CookieContainer jar = new CookieContainer();
request = (HttpWebRequest)WebRequest.Create(urlBase);
request.CookieContainer = cookieJar;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
newUrl = response.ResponseUri.ToString();

Примечание-когда я смотрю на cookiecontainer (cookieJar), он имеет счет 1 после вызова. Интересно, что объект ответа не содержит cookie-но я думаю, что все в порядке, потому что я могу использовать cookieJar.

2-теперь есть 2-й звонок (я еще не нахожусь на странице, где представлены имя и пароль - это происходит только после 4-го звонка. Мой код выглядит так:

HttpWebRequest request = (HttpWebRequest)WebRequest.Создать (urlBase +
secondCallFolderAddition);

CookieCollection bakery = новая коллекция CookieCollection();

запрос.Сообщения keepalive = истина;
запрос.Headers. Add ("Upgrade-Insecure-Requests", @ " 1");
//запрос.UserAgent = " Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/537.36 (KHTML, как Gecko) Chrome/59.0.3071.115 Safari/537.36
ОПР/46.0.2597.57";
запрос.Принимать =
"текст/HTML,применение/с xhtml+xml,в приложение/XML;Q в=0.9,изображения/файлы WebP,
изображение/apng,*/*; q=0,8";
запрос.Заголовки.Комплект(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
запрос.Заголовки.Комплект(HttpRequestHeader.AcceptLanguage, " en-US, en; q=0,8");
HttpWebResponse response = (HttpWebResponse)request. GetResponse();
строка newURL = ответ.Ответьте мне.Метод toString();


Пока все хорошо - я получаю статус OK, и ответ выглядит хорошо по сравнению с оригинальным захватом трафика Fiddler. В оригинале этот 2-й вызов не устанавливает куки-файл, и здесь куки-файл не устанавливается.

Но вот тут я теряюсь. Для третьего вызова браузер отправил данные cookie с тремя значениями (я запутался):

__utma=1.123456789.123456789.123456789.123456789.1
olfsk=olfsk12345678901234567890123456789
hblid=abCDl11ABCabXabc1aABv1FLFX1RE1OS


Я не знаю, где эти ценности устанавливаются. Они, кажется, связаны с Google Analytics (из статей, которые я нашел), но я не знаю, как их собрать, чтобы я мог прикрепить их к звонку, который я делаю. Мой звонок выглядит так:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newUrl); // url 
collected above

request.KeepAlive = true;
request.Headers.Add("Upgrade-Insecure-Requests", "1");
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 OPR/46.0.2597.57";
 request.Accept = 
"text/html,application/xhtml+xml,application/xml;
 q=0.9,image/webp,image/apng,*/*;q=0.8";

request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8");

///request.Headers.Set(HttpRequestHeader.Cookie, 
@"__utma=1.123456789.123456789.123456789.123456789.1; 
olfsk=olfsk12345678901234567890123456789; 
hblid=abCDl11ABCabXabc1aABv1FLFX1RE1OS");

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Uri newURL = response.ResponseUri;



Пожалуйста, обратите внимание на закомментированную строку с данными cookie-я пробовал это сделать и с этой строкой без комментариев.

Что происходит, так это то, что я никогда не получаю ответа на звонок.

Graeme_Grant

Вы пробовали использовать программу под названием Скрипач[^] чтобы посмотреть на нормальный поток, когда используется веб-браузер?

Ken-in-California

Грэм,
Да-скрипач был моей отправной точкой. Я вошел в систему с помощью браузера и перешел на страницу, где находится список данных (захват данных-моя цель).

Как вы знаете, Fiddler показывает, когда установлены файлы cookie и когда они отправляются как часть вызова.

Существует файл cookie, который устанавливается во время ответа, и я хватаю этот файл cookie и помещаю его в CookieContainer. Это печенье не проблема. Проблема в том, что при третьем вызове посылаются некоторые данные cookie, но нет никакой "записи" о том, что они были установлены в сеансах Fiddler.

Я пришел к выводу, что файл cookie устанавливается скриптом javascript на странице (на странице, полученной в ответ на второй вызов).

Поэтому я планирую попытаться найти сценарий и попытаться воспроизвести в c# то, что он делает, а затем использовать данные cookie, сгенерированные таким образом.

Если все остальное не удастся, я сделаю это с помощью объекта webbrowser - но это неуклюже, и я не думаю, что смогу управлять несколькими потоками http-трафика так, как планировал позже в программе.

Graeme_Grant

Он все еще должен быть виден... Проверьте также, соответствует ли ваш ответ типу "метод". Там могут быть ключи заголовка, которые не передаются...

Ken-in-California

Я обещаю вам, что в первый раз они появляются в вызове запроса, который включает их, как я описал выше. И я был очень скрупулезен с заголовками. Появляются файлы cookie, указанные выше: _ _ utma, olfsk и hblid. Первый, по-видимому, создан сценарием google analytics. Второй и третий, по-видимому, устанавливаются olark (который является надстройкой live chat). И все они устанавливаются на стороне браузера.

Richard Deeming

Похоже, вы используете другой CookieContainer для каждого запроса.

Вам нужно использовать один CookieContainer экземпляр для всех запросов, которые должны совместно использовать один и тот же набор файлов cookie. Это должно позаботиться о чтении файлов cookie из ответа и передаче их следующему запросу.

Ken-in-California

Спасибо, Ричард. Я следил за последовательностью звонков, которые собирал с Fiddler, где Куки менялись от звонка к звонку. Я попробую использовать тот же контейнер - а это значит, что в некоторых случаях я буду отправлять больше данных cookie, чем браузер. С учетом сказанного я бы предположил, что отправка дополнительных файлов cookie не будет иметь значения - что сервер, вероятно, просто проигнорирует то, что он не потребляет.
С учетом сказанного у меня все еще есть проблема установки куки-файла, который не задается ответом.

0 Ответов