Get YouTube Watch History via YouTube Data API + OAuth


由於有些需要,所以最近接觸了一下 Android,而這次主要的目標是使用透過 YouTube Data API 來取得使用者過去看過的影片 (Watched History)。

但是在網路上 survey 了很久,一直都都沒有找到相關的教學或是sample code (或許我跟Android太不熟了,找錯方向),在經過一些嘗試後,
終於完成使用 Google OAuth + YouTube Data API 來達成這次的需求。

在這邊把過程和幾個重點邏輯節錄出來,方便路過的大家參考,也歡迎給我這個Android超級新手建議!

介紹

存取 YouTube Data API 大概的重點有下面幾個:
1. 透過 AccountManager 讓 User 選取要使用在手機上註冊的哪一個 email
2. 用 GoogleAuthUtil 取得 Token
3. 用 GoogleAccountCredential 並且取得 OAuth2 的 credential
4. 使用 YouTube Data API build 出 request

Google OAuth

參考來源:官方文件Authorizing with Google for REST APIs

使用者挑選帳號的視窗

private void pickUserAccount() {
    String[] accountTypes = new String[] {
        "com.google"
    };
    Intent intent = AccountPicker.newChooseAccountIntent(null, null,
    accountTypes, true, "請選擇一您常使用的YouTube帳號登入", null, null, null);
    startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);
}

使用者挑選帳號後的處理

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case REQUEST_CODE_PICK_ACCOUNT:
            if (resultCode == RESULT_OK) {
                mEmail = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                settings.edit()
                    .putString("email", mEmail)
                    .commit();
                //getToken() ...
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Failed to pick user account", Toast.LENGTH_SHORT).show();
            }
            break;

        case REQUEST_CODE_GRANT_PERMISSION:
            if (resultCode == RESULT_OK) {
                //getToken() ...
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Grant user permission failed", Toast.LENGTH_SHORT).show();
            }
    }
}

GoogleAuthUtil 取得 token

參考來源:官方文件

protected String getToken() throws IOException {
    try {
        return GoogleAuthUtil.getToken(mActivity, mEmail, mScope);
    } catch (UserRecoverableAuthException userRecoverableException) {
        Log.d("ZzTest", "No app permission, starting recovery process, showing window");
        userRecoverableException.printStackTrace();
        mActivity.startActivityForResult(userRecoverableException.getIntent(), LoginYouTube.REQUEST_CODE_GRANT_PERMISSION);
    } catch (GoogleAuthException fatalException) {
        fatalException.printStackTrace();
    }
    return null;
}

GoogleAccountCredential

透過 GoogleAccountCredential.usingOAuth2 取得 OAuth2 的 credential
這邊要注意scope的選用

public static String[] SCOPES = {Scopes.PROFILE, YouTubeScopes.YOUTUBE, YouTubeScopes.YOUTUBE_READONLY};
credential = GoogleAccountCredential.usingOAuth2(
                mActivity, Arrays.asList(SCOPES));
        credential.setBackOff(new ExponentialBackOff());
        credential.setSelectedAccountName(mEmail);

YouTube Data API

GoogleAccountCredential credential;
final HttpTransport transport = AndroidHttp.newCompatibleTransport();
final JsonFactory jsonFactory = new GsonFactory();

YouTube youtube = new YouTube.Builder(transport, jsonFactory, credential)
    .setApplicationName("TestApp")
    .build();

取得List

clist = youtube.channels().list("contentDetails")
        .setOauthToken(mToken)
        .setMine(true).setMaxResults((long) 50)
        .execute();

取得屬於Watch History的ID

historyPlayListId = c.getContentDetails().getRelatedPlaylists().getWatchHistory();

至於取得到了id以後,再依照對應的ID透過不同的YouTube API去拿自己需要的影片資訊就好了!
基本上,上面的幾個點就是一些比較重要的點,接下來應用的部分就給各位朋友自己延續了!

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s