2010-11-18 8 views
3

googleタスクにパブリックAPIがありません。回避策を書いてブラウザのようなデータを要求し、結果を解析してさらに表示する必要があります。 OAuthのた​​めにhttps://mail.google.com/Android:OAuthでGoogleタスクにアクセスする際の問題

私はサインポストのライブラリを使用してきましたし、それがうまく機能:私はこのURLにアクセスするためにGoogleとOAuth認証を実装したデータにアクセスするには

問題は、私がhttps://mail.google.com/tasks/igに署名したリクエストでアクセスしようとしているときに、タスクで希望するリストの代わりにログインページを返してしまうことです。

ここで、より具体的には私のコードです:

public class GoogleOAuthActivity extends Activity { 
    private static final String TAG = GoogleOAuthActivity.class.getSimpleName(); 
    private CommonsHttpOAuthProvider provider; 
    private CommonsHttpOAuthConsumer consumer; 

    @Override 
    @SuppressWarnings("unchecked") 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     provider = new CommonsHttpOAuthProvider(OAuthPrefs.GET_REQUEST_TOKEN_URL, OAuthPrefs.GET_ACCESS_TOKEN_URL, 
       OAuthPrefs.TOKEN_AUTHORIZATION_URL); 
     consumer = new CommonsHttpOAuthConsumer(OAuthPrefs.CONSUMER_KEY, OAuthPrefs.CONSUMER_SECRET); 
     consumer.setMessageSigner(new HmacSha1MessageSigner()); 

     Log.v(TAG, "Starting google authentication activity"); 
     new RequestGoogleOAuth(this, provider, consumer).execute(); 
    } 

    @Override 
    @SuppressWarnings("unchecked") 
    public void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     final Uri uri = intent.getData(); 
     if (uri != null && uri.getScheme().equals(OAuthPrefs.CALLBACK_SCHEME)) { 
      Log.v("OAUTH MAIN", "STARTING STAGE TWO"); 
      new ConfirmGoogleOAuthTask(this, provider, consumer).execute(uri); 
      finish(); 
     } 
    } 

} 

最初のOAuth段階

public class RequestGoogleOAuth extends OAuthGoogleTask { 
    public static final String TAG = RequestGoogleOAuth.class.getSimpleName(); 

    public RequestGoogleOAuth(Context context, CommonsHttpOAuthProvider provider, CommonsHttpOAuthConsumer consumer) { 
     super(context, provider, consumer); 
    } 

    protected Object doInBackground(Object... params) { 
     final String TAG = getClass().getName(); 
     try { 
      final String url = provider.retrieveRequestToken(consumer, OAuthPrefs.CALLBACK_URL); 
      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP 
        & Intent.FLAG_ACTIVITY_NO_HISTORY & Intent.FLAG_FROM_BACKGROUND); 
      context.startActivity(intent); 
      Log.v(TAG, "Request google authentication"); 
     } catch (Exception e) { 
      Log.e(TAG, "ERROR during google authentication request", e); 
     } 
     return null; 
    } 
} 

二のOAuth段階とGoogleタスクにこの時

public class ConfirmGoogleOAuthTask extends OAuthGoogleTask { 
    public ConfirmGoogleOAuthTask(Context context, CommonsHttpOAuthProvider provider, CommonsHttpOAuthConsumer consumer) { 
     super(context, provider, consumer); 
    } 

    @Override 
    public Object doInBackground(Object... params) { 
     final Uri uri = (Uri) params[0]; 
     final String TAG = getClass().getName(); 

     final SharedPreferences prefs = context.getSharedPreferences(OAuthPrefs.PREF_NAME, Context.MODE_PRIVATE); 
     final String oauthVerifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); 

     try { 
      provider.retrieveAccessToken(consumer, oauthVerifier); 
      final Editor edit = prefs.edit(); 
      edit.putString(OAuth.OAUTH_TOKEN, consumer.getToken()); 
      edit.putString(OAuth.OAUTH_TOKEN_SECRET, consumer.getTokenSecret()); 
      edit.commit(); 

      CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(OAuthPrefs.CONSUMER_KEY, OAuthPrefs.CONSUMER_SECRET); 
      consumer.setMessageSigner(new HmacSha1MessageSigner()); 
      consumer.setTokenWithSecret(consumer.getToken(), consumer.getTokenSecret()); 

      HttpClient httpClient = HttpUtils.createHttpClient(); 
      HttpGet httpGet = new HttpGet(consumer.sign("https://mail.google.com/tasks/ig")); 
      HttpResponse response = httpClient.execute(httpGet); 
      int statusCode = response.getStatusLine().getStatusCode(); 
      Log.d(TAG, "Status code = " + statusCode); 
      if (statusCode == HttpStatus.SC_OK) { 
       String xml = ConvertUtils.convertStreamToString(response.getEntity().getContent(), true); 
       Log.d(TAG, "XML = " + xml); 
      } 

      Log.v(TAG, "Successfully receive access token"); 
     } catch (Exception e) { 
      Log.e(TAG, "ERROR during request for access token", e); 
     } 
     return null; 
    } 
} 

にアクセスしようとします行:

String xml = ConvertUtils.convertStreamToString(response.getEntity().getContent(), true); 
        Log.d(TAG, "XML = " + xml); 

私は、「ログインページ」

を受けることを見ることができる私は、その理由は、Googleが、それは(このリソースへの私のアクセスを制限し、私はすでにのOAuthで認証したにもこのサービスへのアクセスを提供していないということだと思いますスコープをhttps://mail.google.com/と定義しても)。私はそれを今実装する方法はわかりませんが、ブラウザとGoogleとのやりとりを正確にシミュレートする必要があるようです(適切なcoockiesを取得して送信してください)。しかし、私はGoogleのタスクAPIにはパブリックAPI(石鹸、安静、または他のもの)がないので、この状況にどう対応するのか分からないので、私は尋ねています。機能...

誰かがアプリがパブリックAPIなしでGoogleリソースにアクセスする例がある場合は、そのことを確認することができます。

ありがとう、誰かが答えを知っていることを望みます!

答えて

5

[代わりにクッキーの通常のClientLoginを使用するように4/6、APIを推薦する5月11日に更新] Google Tasks APIが今あります!その代わりに、それはずっと簡単で、あなたのコードはより保守的になります。残念ながら、この答えの残りの部分を検討してください。

残念ながら、あなたは正しい軌道に乗っています。 OAuthなどのGoogleタスクのためのAPIはありませんので、少しのHTMLスクレイピングを行う必要があります。 :/ afaik、それは他のサードパーティのタスククライアントが今やっていることです。 ClientLoginは認証のために動作しますが、それは少なくとも何かです。

ここには、これを行うシェルスクリプトコードがあります:http://privacylog.blogspot.com/2010/09/updated-google-tasks-api.html。詳細は下記をご覧ください。

最初に、POSTから​​に記載されているように、http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html#Requestで認証トークンを取得します。サービス名としてgoanna_mobileを使用してください。 (これは重要!)

次に、GET https://mail.google.com/tasks/mと上記の認証トークンを持つAuthorization:GoogleLoginヘッダーを渡します。あなたはHTMLを返すでしょう。個々のタスクリストのIDを抽出する。 04291568652951293844:0:0という形式です。

JSONエンコードされた本文のPOSTをhttps://mail.google.com/tasks/r/dに送信し、各リストの内容を取得します。ここでは例として本体です:

r={action_list: 
    [{action_type: get_all, 
    action_id: 5, 
    list_id: 0429158965...:0:0, 
    get_deleted: false, 
    date_start: 1969-12-31, 
    get_archived: true 
    }], 
    client_version: 1256686 
    } 

重要な注意事項:

  • latest_sync_point:0すべてのタスク
  • を取得するには、r =中=が3D
  • のR%にエンコードない URLですヘッダー 'AT:1'を含めます。タスクがなければ、401 Unauthorizedが返されます。

は出力がより多くのJSONは、例えば次のとおりです。

{latest_sync_point: 1263000002293000, response_time:1263077227, results:[], tasks: 
    [{id: 04291589652955....:0:38, 
    last_modified: 1263000002281, 
    name: foo bar 
    notes: , 
    type: TASK, 
    deleted: false, 
    list_id: [0429158965...:0:0], 
    completed: false 
    }, 
    {id: 0429158965295...:0:37, 
    last_modified: 1262929947949, 
    name: baz 
    notes: , 
    type: TASK, 
    deleted:false, 
    list_id: [0429158965295...:0:0], 
    completed: false 
    }, 
    ... 
+0

[はい]をチェックし、今APIがあります... 5000要求に限定あなたが支払うつもりがない限り。あなたのアプリからの収入がコストをカバーするか、またはJSONはまだ行く方法です。 – RedGlyph

1

彼らは数週間以来のAPIを持っている今here

関連する問題