Я использую HttpClient от Apache для совершения одного звонка и двух звонков на autozone.com. Вызов get предназначен для доступа к домашней странице, чтобы был установлен файл cookie JSessionId. Затем я пытаюсь найти магазины по определенному почтовому индексу с помощью их локатора магазинов, а затем установить первый результат как «Предпочитаемый магазин».
Ранее я обнаружил, что вся информация о пользователе хранится на стороне сервера, и просмотрел с помощью двух постоянных файлов cookie. В основном просто пара имя пользователя и пароль. Эти куки создаются вместе с JSessionId, потому что первый пост, который требует JSessionId, работает отлично. Я также узнал, что они также не возвращают страницу результатов напрямую, вместо этого они возвращают только заголовки Http со статусом 302 «Временно перемещенный». Поэтому я извлекаю новую страницу из заголовков и захожу туда.
Это именно то, что я вижу в моей программе. Вызов на домашнюю страницу успешно загружен, и установлены 3 необходимых файла cookie, и я получаю динамический номер подтверждения сеанса, который необходим для всех почтовых вызовов. Затем я делаю пост-вызов на страницу обработки для StoreLocator, передавая все необходимые аргументы, получаю местоположение результатов, выполняю вызов get и загружаю эту страницу. Я нахожу «prefStoreNumber», уникальный номер системы для идентификации магазина, и сохраняю его. Затем я создаю свой последний пост звонка. Идет на правильную страницу, чтобы обработать предпочтительный выбор магазина. Я снова передаю все аргументы в форме на HTML-странице, и возвращается ответ 302. Проблема возникает, когда я получаю новое местоположение. В HTML должен быть магазин, который я только что выбрал вдоль верхней панели, но вместо этого он остается таким же, как если бы магазин не был выбран. Я знаю, что файлы cookie передаются правильно, иначе я не получил бы результаты магазина.
Я не уверен, почему это не работает, поэтому любые идеи относительно того, что может происходить, очень ценятся. Я включил свой код на случай, если мне просто не хватает чего-то необходимого, но я проверил это тысячу раз и не могу найти ничего плохого. И я использовал WireShark, чтобы проверить, правильно ли создавался пост.
String useragent, homepage, locatorPage, host, sessionConf, results, preferedPage;
homepage = "/autozone";
locatorPage = "/autozone/storelocator/storeLocatorMain.jsp?_DARGS=/autozone/storelocator/storeLocatorSearch.jsp";
preferedPage = "/autozone/storelocator/storeLocatorMain.jsp?_DARGS=/autozone/storelocator/storeLocatorResults.jsp";
useragent = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1";
host = "http://www.autozone.com";
DefaultHttpClient client = new DefaultHttpClient();
client.getParams().setBooleanParameter("http.protocol.allow-circular-redirects", true);
client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, useragent);
HttpContext session = new BasicHttpContext();
HttpGet get = new HttpGet(host+homepage);
get.setHeader("User-Agent", useragent);
HttpEntity e = client.execute(get, session).getEntity();
sessionConf = getHTMLValue("_dynSessConf", EntityUtils.toString(e));
EntityUtils.consume(e);
HttpPost post = new HttpPost(host+locatorPage);
List<NameValuePair> form = new ArrayList<NameValuePair>();
form.add(new BasicNameValuePair("_dyncharset", "ISO-8859-1"));
form.add(new BasicNameValuePair("_dynSessConf", sessionConf));
form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.successURL", "/autozone/storelocator/storeLocatorMain.jsp?targetPage=storeLocatorResults"));
form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.successURL", " "));
form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.errorURL", "/autozone/storelocator/storeLocatorMain.jsp?targetPage=null"));
form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.errorURL", " "));
form.add(new BasicNameValuePair("city", ""));
form.add(new BasicNameValuePair("_D:city", " "));
form.add(new BasicNameValuePair("state", "-1"));
form.add(new BasicNameValuePair("zip", Integer.toString(zip)));
form.add(new BasicNameValuePair("_D:zip", " "));
form.add(new BasicNameValuePair("areaCode", ""));
form.add(new BasicNameValuePair("_D:areaCode", " "));
form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.findNearestLocations", "submit"));
form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.findNearestLocations", " "));
form.add(new BasicNameValuePair("_DARGS", "/autozone/storelocator/storeLocatorSearch.jsp"));
post.setEntity(new UrlEncodedFormEntity(form, "UTF-8"));
HttpResponse response = client.execute(post, session);
results = response.getFirstHeader("Location").toString().substring(10);
EntityUtils.consume(response.getEntity());
get = new HttpGet(results);
response = client.execute(get, session);
e = response.getEntity();
String storeID = getHTMLValue("prefStoreNumber", EntityUtils.toString(e));
EntityUtils.consume(e);
post = new HttpPost(host+preferedPage);
form = new ArrayList<NameValuePair>();
form.add(new BasicNameValuePair("_dyncharset", "ISO-8859-1"));
form.add(new BasicNameValuePair("_dynSessConf", sessionConf));
form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.preferedStoreSuccessURL", "/autozone/storelocator/storeLocatorMain.jsp?targetPage=storeLocatorResults"));
form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.preferedStoreSuccessURL", " "));
form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.errorURL", "/autozone/storelocator/storeLocatorMain.jsp?targetPage=storeLocatorResults"));
form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.errorURL", " "));
form.add(new BasicNameValuePair("prefStoreNumber", storeID));
form.add(new BasicNameValuePair("/autozone/diy/storelocator/StoreLocatorFormHandler.setPreferedStore", "submit"));
form.add(new BasicNameValuePair("_D:/autozone/diy/storelocator/StoreLocatorFormHandler.setPreferedStore", " "));
form.add(new BasicNameValuePair("_DARGS", "/autozone/storelocator/storeLocatorResults.jsp"));
post.setEntity(new UrlEncodedFormEntity(form, "UTF-8"));
response = client.execute(post, session);
displayResponse(response);
results = response.getFirstHeader("Location").toString().substring(10);
EntityUtils.consume(response.getEntity());
get = new HttpGet(results);
response = client.execute(get, session);
displayResponse(response);
displayResponse только для отладки. В нем перечислены все заголовки ответа, за которыми следует разделитель строк и основной HTML. Извините за многословность, но я хотел убедиться, что моя проблема была хорошо понята.
Обновление: ок. Я запустил WireShark по запросу браузера и моей программы. Я узнал, что я просто пропустил простую ошибку. Когда я извлек prefStoreNumber из HTML-кода, я случайно захватил слишком много, и в нем хранился некоторый случайный HTML-код. Я собираюсь исправить это и посмотреть, будет ли это работать, но были и другие отличия. Я перечислил их ниже. Кто-нибудь из них доставит мне неприятности?:
Поле: Браузер | Программа
Cache-Control: max-age=0|(N/A)
Origin: http://www.autozone.com|(N/A)
Content-Type: application/x-www-form-urlencoded|(N/A)
Accept: text/html,application/xhtml+xml,application/x ml;q=0.9,*/*;q=0.8|(N/A)
Referer: http://www.autozone .com/autozone/storelocator/storeLocatorMain.jsp? targetPage=storeLocatorResults&_ requestid=3010533|(N/A)
Accept-Encoding: gzip,deflate,sdch|(N/A)
Accept-Language: en-US,en ;q=0.8|(N/A)
Accept-Charset: ISO-8859 -1,utf-8;q=0.7,*;q=0.3|(N/A)
Cookie2: (N/A)|$Version=1
Обновление 2: все работало отлично после того, как я правильно проанализировал prefStoreNumber.