@Sketcher2010
PHP, python, java developer

Как из java авторизоваться в instagram, получить code и потом токен доступа?

Использую okhttp3 для работы с запросами.

Первым делом отсылаю запрос на instagram.com и получаю куки (в которых есть csrftoken для дальнейшей авторизации)
Потом авторизую пользователя отправляя его POST запросом на и записываю все куки в массив (если приходят обновления - обновляю)
Следующим делом иду на страницу получения CODE (для дальнейшего запроса токена) и получаю дефолтную страницу что-то типа prntscr.com/akttxx
Тут мне нужно нажать кнопку Authorize отправив на эту-же страницу post запрос с параметрами allow=Authorize и csrfmiddlewaretoken=csrftoken_который_получили (Методом научного тыка отследив через f12 всю цепочку авторизации я выяснил что это он)

и вот тут появляется проблема: возвращается вот такая ошибка: Не удалось загрузить страницу. Если в браузере отключены cookies или вы используете безопасный режим браузера, попробуйте включить cookies или выключить безопасный режим, а затем повторите свои действия.
Однако, если бы мы не включали куки - мы бы не авторизовались.

Вот примерный говнокод:
Headers.Builder headers = new Headers.Builder();
        String currentCookie = "";
        get("https://www.instagram.com/", headers.build());
        csrfToken = cookies[1].toString().split("=")[1].split(";")[0];
        FormBody.Builder body = new FormBody.Builder();
        body.add("username", login);
        body.add("password", password);
        int i = 0;
        while(cookies[i] != null) {
            currentCookie += cookies[i].name()+"="+cookies[i].value()+"; ";
            i++;
        }
        currentCookie += "ig_pr=1; ig_vw=1920;";
        headers.add("cookie", currentCookie);
        headers.add("accept", "*/*");
        headers.add("origin", "https://www.instagram.com"); // получили изначальные куки
        headers.add("content-length", "19");
        headers.add("accept-language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
        headers.add("referer", "https://www.instagram.com/");
        headers.add("user-agen", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36");
        headers.add("content-type", "application/x-www-form-urlencoded; charset=UTF-8");
        headers.add("x-csrftoken", csrfToken);
        headers.add("x-instagram-ajax", "1");
        headers.add("x-requested-with", "XMLHttpRequest");
        post("https://www.instagram.com/accounts/login/ajax/", body.build(), headers.build()); // авторизовались.
        currentCookie = "";
        i = 0;
        while(cookies[i] != null) {
            currentCookie += cookies[i].name()+"="+cookies[i].value()+"; ";
            i++;
        }
        headers = new Headers.Builder();
        currentCookie += "ig_pr=1; ig_vw=1920;";
        headers.add("cookie", currentCookie);
        headers.add("accept-language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
        headers.add("user-agen", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36");
        headers.add("upgrade-insecure-requests", "1");
        Response rr = get("https://www.instagram.com/oauth/authorize/?client_id=976226ea8cf547a5bb2817b82a852c1e&redirect_uri=http://localhost&response_type=code", headers.build()); // попытка получить редирект на прямую
        if(rr.code() != 302) { // если попытка провалилась (пришла форма, где нам нужно нажать кнопку) - мы нажимаем на кнопку
            currentCookie = "";
            i = 0;
            while(cookies[i] != null) {
                currentCookie += cookies[i].name()+"="+cookies[i].value()+"; ";
                i++;
            }
            headers = new Headers.Builder();
            currentCookie += "ig_pr=1; ig_vw=1920; s_network=;";
            headers.add("cookie", currentCookie);
            headers.add("accept-language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
            headers.add("user-agen", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36");
            headers.add("upgrade-insecure-requests", "1");
            headers.add("origin", "https://www.instagram.com");
            headers.add("referer", "https://www.instagram.com/oauth/authorize/?client_id=976226ea8cf547a5bb2817b82a852c1e&redirect_uri=http://localhost&response_type=code");
            headers.add("content-length", "68");
            headers.add("content-type","application/x-www-form-urlencoded; charset=UTF-8");
            headers.add("cache-control","max-age=0");
            headers.add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
            body = new FormBody.Builder();
            body.add("csrfmiddlewaretoken", csrfToken);
            body.add("allow", "Authorize");
            rr = post("https://www.instagram.com/oauth/authorize/?client_id=976226ea8cf547a5bb2817b82a852c1e&redirect_uri=http://localhost&response_type=code", body.build(), headers.build()); // вот тут приходит 403 ошибка которая гласит, что куки не включены
        }
  • Вопрос задан
  • 2175 просмотров
Пригласить эксперта
Ответы на вопрос 1
@VanKrock
Я не совсем понял зачем вы второй запрос делаете через браузер? У OAuth есть несколько видов авторизации: клиентская (приложение должно уметь управлять браузером, например приложение под андроид или декстопный клиент) и серверная (например для сайта, чтобы авторизоваться на вашем сайте при помощи социальных сетей), есть еще но тут не важно. Итак у вас насколько я понял используется второй вид, потому как вы используете code.

Алгоритм работы клиентской авторизации
Отправляете get запрос
https://www.instagram.com/oauth/authorize/
указываете response_type=token
и вас редиректит на указанный redirect_uri, в ссылке будет ваш токен, его нужно будет получить из адреса
по истечению срока токена вы просто авторизуетесь снова и если есть куки, редирект произойдет сразу, можно даже не показывать окно браузера пользователю.

Алгоритм работы для серверной авторизации
Отправляете get запрос
https://www.instagram.com/oauth/authorize/
указываете response_type=code и redirect_uri=адрес_на_вашем_сервере_который_обрабатывает_code
пользователя средиректит на ваш сервер, то есть вам сервер придет get запрос в параметрах которого будет code
а дальше, получив код вы уже с сервера отправляете запрос к instagram указав code и полученный при регистрации secret_key, по истечению срока токена вы отправляете запрос так же с сервера указав refresh_token
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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