@zebox

Как отправить SMS через HttpClient в Java со страницы Yandex Maps?

Добрый день!
Просьба подсказать в решении задачи по отправки СМС с ссылкой на Яндекс.Карты (со страницы сервиса) по средствам 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. Сразу скажу,что я не собираюсь заниматься спамом, мне необходимо реализовать автоматическое информирование пользователей сервиса при поступлении определенного рода заявок (на обслуживание оборудования). Заявки мне скидывает оператор, которые формируют сами пользователи.
  • Вопрос задан
  • 595 просмотров
Пригласить эксперта
Ответы на вопрос 1
TOBBOT
@TOBBOT
Автоматизатор
воспользуйтесь снифером для изучения запросов, которыми обменивается ваш браузер с сервером при отправке нескольких SMS.

Я рекомендую снифер Fiddler2.

Проверьте меняется ли csrfToken при каждом новом запросе. Скорее всего меняется, т.к. в этом его основное назначение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы