Добрый день!
Просьба подсказать в решении задачи по отправки СМС с ссылкой на Яндекс.Карты (со страницы сервиса) по средствам Java.
Как я понял при каждом обновлении страницы генерится csfrToken, который в последствии используется в POST-запросе для отправки СМС.
Проблема в том, что csfrToken я получаю, но такое впечатление что при каждом POST или GET он меняется (наверное я не до конца понимаю механизм работы ApacheHttpClient).
Пытаюсь реализовать используя следующий код:
public void WebRequest() throws Exception{
CookieHandler.setDefault(new CookieManager());
RequestConfig globalConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.DEFAULT)
.build();
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultRequestConfig(globalConfig)
.build();
RequestConfig localConfig = RequestConfig.copy(globalConfig)
.setCookieSpec(CookieSpecs.STANDARD_STRICT)
.build();
HttpGet request = new HttpGet("https://yandex.ru/maps");
HttpPost send = new HttpPost("https://yandex.ru/maps/api/sms/sendObject");
request.setConfig(localConfig);
send.setConfig(localConfig);
request.addHeader("Host", "yandex.ru");
request.addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0");
request.addHeader("Accept", "*/*");
request.addHeader("Accept-Language", "en-US,en;q=0.8,ru;q=0.6");
request.addHeader("Accept-Encoding", "gzip, deflate, br");
request.addHeader("Origin", "https://yandex.ru");
request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
request.addHeader("X-Requested-With", "XMLHttpRequest");
request.addHeader("Referer", "https://yandex.ru/maps/35/https://yandex.ru/maps/35/myCity/?text=someURL-WithSomeParams");
request.addHeader("Connection", "keep-alive");
HttpResponse result = httpclient.execute(request);
setCookies(result.getFirstHeader("Set-Cookie") == null ? "" :
result.getFirstHeader("Set-Cookie").toString());
BufferedReader rd = new BufferedReader(new InputStreamReader(result.getEntity().getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
System.out.println(line);
int pos=line.indexOf("csrfT");
tokenStr=line.substring(pos,pos+67).split("\"");
System.out.println(tokenStr[2]);
pos=line.indexOf("sessionId");
sessionId=line.substring(pos,pos+33).split("\"");
System.out.println(sessionId[2]);
}
//------------ОТПРАВКА--------------------
send.addHeader("Host", "yandex.ru");
send.addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0");
send.addHeader("Accept", "*/*");
send.addHeader("Accept-Language", "en-US,en;q=0.8,ru;q=0.6");
send.addHeader("Accept-Encoding", "gzip, deflate, br");
send.addHeader("Origin", "https://yandex.ru");
send.addHeader("Cookie", getCookies());
send.addHeader("Content-Type", "application/json; charset=UTF-8");
send.addHeader("X-Requested-With", "XMLHttpRequest");
send.addHeader("Referer", "https://yandex.ru/maps/35/myCity/?text=someURL-WithSomeParams");
send.addHeader("Connection", "keep-alive");
String json="{\"lang\":\"ru_RU\",\"gid\":35,\"uri\":\"ymapsbm1://org?oid=XXXXXXXXXX\",\"phone\":\"+7XXXXXXXXXX\",\"csrfToken\":\""+tokenStr[2].trim()+"\",\"sessionId\":\""+sessionId[2].trim()+"\",\"host_config\":{\"hostname\":\"yandex.ru\"}}";
StringEntity params = new StringEntity(json);
params.setContentType("application/json");
send.setEntity(params);
result = httpclient.execute(send);
rd = new BufferedReader(new InputStreamReader(result.getEntity().getContent()));
line = "";
while ((line = rd.readLine()) != null) {
System.out.println(line);
}
}
public void setCookies(String cookies) {
this.cookies = cookies;
}
public String getCookies() {
return cookies;
}
В итоге при попытке отправки получаю ошибку о том, что текущий Token не соотвествует тому который указан в POST запросе.
Просьба подсказать, что я делаю не так?!
P.S. Сразу скажу,что я не собираюсь заниматься спамом, мне необходимо реализовать автоматическое информирование пользователей сервиса при поступлении определенного рода заявок (на обслуживание оборудования). Заявки мне скидывает оператор, которые формируют сами пользователи.