@popov654
Специалист в области веб-технологий

Почему возникает ошибка авторизации в Google?

Пишу приложение на Java, которое должно загружать видео на YouTube (одна из его функций). Авторизацию решил делать не через API, а эмулируя браузер. Просьба не писать что-то в духе "за такое нужно пальцы ломать", "зачем это нужно", и прочее. На то были причины, и не только спортивный интерес :)

В качестве клиента выбрал Apache Commons HTTP Client. В итоге авторизацию на YouTube воспроизвёл полностью (правда почему-то повторно по тем же кукам не пускает, что очень странно, при каждом запуске приложения приходится повторять процесс с нуля), загрузку видео - отладил, файл загружаю сегментами, в ответ получаю корректные статусы, и в самом конце получаю статус FINALIZED. Казалось бы, время праздновать, но... Я не могу это видео "закоммитить". Оно нигде не появляется - я не вижу его ни в браузере, ни в менеджере видео, загруженном моей же прогой через тот же HTTP Client с теми же куками сразу после завершения загрузки файла.

Тут я подумал, что надо бы воспроизвести и всякие вспомогательные запросы, которые браузер шлёт во время загрузки. Покопавшись, нашёл два запроса на сервер www.googleapis.com, оба без кук. При этом отладчик Firefox почему-то не видел в них полезный payload (в JSON формате, метод запросов - POST).

Chrome эти данные увидел. Реализовал их. Первый из них не возвращает ничего ценного, а вот второй важный - он возвращает ID видео в системе YouTube (которое потом нужно, в частности, для ещё одного важного AJAX запроса). И вот этот второй запрос у меня фейлится. JSON валидный, данные все подставляю корректные, но в ответ получаю следующую ошибку:

{
 "items": [
  {
   "id": {
    "frontendKey": "web_upload:b6f80105-8d27-4d57-b3a0-bebd857de319:0"
   },
   "feedback": {
    "videoId": {
     "registrationStatus": "STATUS_FAILED",
     "failureReason": "FAILED_ACCOUNT_ERROR"
    }
   }
  }
 ]
}


Фрагмент кода на Java, формирующий эти два запроса и читающий ответы (первый запрос заканчивается успехом, к слову):

private void unlockStatusAPI() {
        try {
            HttpPost httpPost = new HttpPost("https://www.googleapis.com/videofeedback/v1/feedback/list");
            httpPost.setHeader(new BasicHeader("Origin", "https://www.youtube.com"));
            httpPost.setHeader(new BasicHeader("Content-Type", "application/json"));
            httpPost.setHeader(new BasicHeader("Accept-Encoding", "gzip, deflate"));
            httpPost.setEntity(org.apache.http.client.entity.EntityBuilder.create().setText("{\"client\":{\"name\":\"youtube_web_uploads\",\"version\":\"" + web_upload_token.split(":")[1] + "\",\"token\":\"" + web_upload_token.split(":")[2] + "\"},\"queries\":[{\"id\":{\"frontendKey\":\"web_upload:" + web_upload + ":0\"},\"choice\":{\"editorSuggestions\":true}}]}").build());
            CloseableHttpResponse response = hc.execute(httpPost);
            response.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private void unlockStatusAPI2() {
        try {
            HttpPost httpPost = new HttpPost("https://www.googleapis.com/videofeedback/v1/feedback/list");
            httpPost.setHeader(new BasicHeader("Origin", "https://www.youtube.com"));
            httpPost.setHeader(new BasicHeader("Content-Type", "application/json"));
            httpPost.setHeader(new BasicHeader("Accept-Encoding", "gzip, deflate"));
            httpPost.setEntity(org.apache.http.client.entity.EntityBuilder.create().setText("{\"client\":{\"name\":\"youtube_web_uploads\",\"version\":\"" + web_upload_token.split(":")[1] + "\",\"token\":\"" + web_upload_token.split(":")[2] + "\"},\"queries\":[{\"id\":{\"frontendKey\":\"web_upload:" + web_upload + ":0\"},\"choice\":{\"editorSuggestions\":true,\"videoId\":true,\"videoInfo2\":true,\"videoIssues\":true,\"processingProgress\":true,\"youtubeStatus\":true,\"thumbnailsDone\":true}}]}").build());
            CloseableHttpResponse response = hc.execute(httpPost);
            HttpEntity entity = response.getEntity();

            String line = "";
            br = new BufferedReader(new InputStreamReader(entity.getContent()));
            while ((line = br.readLine()) != null) {
                System.out.println(line);
                Matcher m = Pattern.compile(".*\"youtubeId\": \"([A-Za-z0-9-]+)\".*").matcher(line);
                if (m.matches()) {
                    video_id = m.group(1);
                    System.out.println("Video ID: " + video_id);
                }
            }

            response.close();

            sendYummyAjaxData2();

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private void sendYummyAjaxData2() throws ClientProtocolException, IOException {
        HttpPost httpPost = new HttpPost("https://www.youtube.com/yummy_ajax");
        Vector<BasicNameValuePair> fields = new Vector<BasicNameValuePair>();
        fields.add(new BasicNameValuePair("action_report", "1"));
        fields.add(new BasicNameValuePair("event_type", "REGISTRATION_INFO_RECEIVED"));
        fields.add(new BasicNameValuePair("frontend_id", "web_upload:" + web_upload + ":0"));
        fields.add(new BasicNameValuePair("version", "1"));
        fields.add(new BasicNameValuePair("video_id", video_id));
        fields.add(new BasicNameValuePair("session_token", identity_token));

        httpPost.setEntity(new UrlEncodedFormEntity(fields));
        CloseableHttpResponse response = hc.execute(httpPost);
        HttpEntity entity = response.getEntity();

        String line = "";
        br = new BufferedReader(new InputStreamReader(entity.getContent()));
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        response.close();
    }


Что я упускаю?

P. S. Исходники программы могу скинуть, если это поможет в решении проблемы.
  • Вопрос задан
  • 565 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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