2011-08-15 3 views
5

J'essaie d'afficher la liste des vidéos favorites d'un utilisateur sur youtube. Donc, fondamentalement, avant d'obtenir le flux vidéo, je dois me connecter pour obtenir le jeton d'authentification. Je rencontre une sorte de problème avec les cookies. Voici mon code pour l'enregistrement:CircularRedirectException avec google authentication

public static String loginUser(String username, String password){ 

     Log.i("Utils", "Start logging user"); 
     // Create a new HttpClient and Post Header 
     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     CookieStore cookieStore = new BasicCookieStore(); 
     HttpContext localContext = new BasicHttpContext(); 
     // Bind custom cookie store to the local context 
     localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

     HttpPost httppost = new HttpPost("https://www.google.com/youtube/accounts/ClientLogin"); 
     httppost.addHeader("Content-Type","application/x-www-form-urlencoded"); 

     String result = ""; 
     try { 
      // Add your data 
      StringEntity tmp = 
       new StringEntity("Email="+ username +"&Passwd="+ password +"&service=youtube&source=speed bit", "UTF-8"); 
      httppost.setEntity(tmp); 

      // Execute HTTP Post Request 
      HttpResponse response = httpclient.execute(httppost, localContext); 
      result = EntityUtils.toString(response.getEntity()); 

     } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
     } catch (IOException e) { 
       // TODO Auto-generated catch block 
     } 
     finally{ 
       //httpclient.close(); 

     } 

     Log.i("Utils", "End logging user"); 


     if (result.equals("")) 
      return result; 

     String []firstArr = result.split("YouTubeUser"); 
     String []secondArr = firstArr[0].split("="); 
     result = secondArr[1]; 

     return result; 
    } 

et après que je reçois le jeton auth je reçois les vidéos:

String urlFeed = params[0]; 
        String auth = params[1]; 
        InputStream in; 
        HttpGet get = new HttpGet(urlFeed); 

        if (auth != null){ 

         get.setHeader("Authorization","GoogleLogin auth="+auth); 
         get.setHeader("X-GData-Key", 
         "key=AI39si5t8eJE_CVcakc-Hzs8wroPcsOHi_fqT03SG6f_lGrJsku0xyfPyB1qZlmYtN5cflfcYAgmvMF2QLy3uG1F6sy-cRzwdg"); 
        } 

        HttpResponse resp = null; 



        try { 
         DefaultHttpClient httpClient = new DefaultHttpClient(); 
         CookieStore cookieStore = new BasicCookieStore(); 
         HttpContext localContext = new BasicHttpContext(); 
         // Bind custom cookie store to the local context 
         localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 
         resp = httpClient.execute(get, localContext); 
        } catch (ClientProtocolException e) { 
         Log.e(getClass().getSimpleName(), "HTTP protocol error", e); 
        } catch (IOException e) { 

         Log.e(getClass().getSimpleName(), "Communication error", e); 
        } 

d'abord tout ce qu'il présente cette chose dans le logcat:

08-15 00:21:36.048: WARN/ResponseProcessCookies(4324): Cookie rejected: "BasicClientCookie[version=0,name=PREF,domain=.google.com,path=/,expiry=Wed Aug 14 00:21:36 GMT+02:00 2013]". Illegal domain attribute "google.com". Domain of origin: "www.google.co.il" 

et puis il se bloque sur resp = httpClient.execute(get, localContext); Voici le logcat pour cela:

08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324): HTTP protocol error 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324): org.apache.http.client.ClientProtocolException 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:557) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at com.android.mytubedownloader.BaseActivity$YoutubeFeedTask.doInBackground(BaseActivity.java:551) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at com.android.mytubedownloader.BaseActivity$YoutubeFeedTask.doInBackground(BaseActivity.java:1) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at java.lang.Thread.run(Thread.java:1019) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324): Caused by: org.apache.http.client.CircularRedirectException: Circular redirect to 'http://www.google.co.il/' 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at org.apache.http.impl.client.DefaultRedirectHandler.getLocationURI(DefaultRedirectHandler.java:173) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at org.apache.http.impl.client.DefaultRequestDirector.handleResponse(DefaultRequestDirector.java:903) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:468) 
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 

Répondre

0

chaque fois que je reçois une erreur de protocole HTTP, c'était à cause de la sécurité. Vous pouvez essayer HttpPost httppost = new HttpPost("**http**://www.google.com/youtube/accounts/ClientLogin");

et supprimer les s de https. Cela fait habituellement disparaître mes problèmes.

Bonne chance!

0

Je ne suis pas sûr si c'est la raison entière, mais this document dit que l'URL est dépréciée. J'espère que cela aide en quelque sorte.

Cette URL a été mise à jour en octobre 2010. L'ancienne URL a été abandonnée conformément à la politique expliquée dans nos Conditions d'utilisation. Si vous mettez à jour une application utilisant l'ancienne URL (https://www.google.com/youtube/accounts/ClientLogin), notez que la nouvelle URL ne renvoie pas le nom du compte YouTube de l'utilisateur en tant que valeur YouTubeUser en réponse à une demande ClientLogin réussie.

0

Vous ne devez pas accéder à Youtube via les URL de site Web. La manière officielle d'accéder aux vidéos est Youtube Data API