Собирайте файлы 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 не будет иметь значения - что сервер, вероятно, просто проигнорирует то, что он не потребляет.
С учетом сказанного у меня все еще есть проблема установки куки-файла, который не задается ответом.