Go 快速入門導覽課程

完成本頁其餘部分所述的步驟,大約五分鐘後,您就能建立簡單的 Go 指令列應用程式,向 YouTube Data API 發出要求。

本指南使用的程式碼範例會擷取 GoogleDevelopers YouTube 頻道的 channel 資源,並列印該資源的部分基本資訊。

必要條件

如要執行本快速入門導覽課程,您需要:

  • Go:建議使用最新版本。
  • Git,建議使用最新版本。
  • 連上網際網路並使用網路瀏覽器。
  • Google 帳戶。

步驟 1:開啟 YouTube Data API

  1. 使用這個精靈在 Google Developers Console 中建立或選取專案,並自動開啟 API。依序點選「繼續」和「前往憑證」。

  2. 在「Create credentials」(建立憑證) 頁面中,按一下「Cancel」(取消) 按鈕。

  3. 選取頁面頂端的「OAuth 同意畫面」分頁標籤。 選取「Email address」(電子郵件地址),輸入「Product name」(產品名稱) (如尚未設定),然後按一下「Save」(儲存) 按鈕。

  4. 選取「憑證」分頁標籤,按一下「建立憑證」按鈕,然後選取「OAuth 用戶端 ID」。

  5. 選取應用程式類型「其他」,輸入名稱「YouTube Data API 快速入門導覽課程」,然後按一下「建立」按鈕。

  6. 按一下「確定」,關閉對話方塊。

  7. 按一下用戶端 ID 右側的 (下載 JSON) 按鈕。

  8. 將下載的檔案移至目前使用的目錄,並重新命名為 client_secret.json。

步驟 2:準備工作區

  1. 將 GOPATH 環境變數設為目前使用的目錄。
  2. 使用下列指令,取得 YouTube Data API Go 用戶端程式庫和 OAuth2 套件:
go get -u google.golang.org/api/youtube/v3
go get -u golang.org/x/oauth2/...

步驟 3:設定範例

在工作目錄中建立名為 quickstart.go 的檔案,並複製下列程式碼:

// Sample Go code for user authorization

package main

import (
  "encoding/json"
  "fmt"
  "log"
  "io/ioutil"
  "net/http"
  "net/url"
  "os"
  "os/user"
  "path/filepath"

  "golang.org/x/net/context"
  "golang.org/x/oauth2"
  "golang.org/x/oauth2/google"
  "google.golang.org/api/youtube/v3"
)

const missingClientSecretsMessage = `
Please configure OAuth 2.0
`

// getClient uses a Context and Config to retrieve a Token
// then generate a Client. It returns the generated Client.
func getClient(ctx context.Context, config *oauth2.Config) *http.Client {
  cacheFile, err := tokenCacheFile()
  if err != nil {
    log.Fatalf("Unable to get path to cached credential file. %v", err)
  }
  tok, err := tokenFromFile(cacheFile)
  if err != nil {
    tok = getTokenFromWeb(config)
    saveToken(cacheFile, tok)
  }
  return config.Client(ctx, tok)
}

// getTokenFromWeb uses Config to request a Token.
// It returns the retrieved Token.
func getTokenFromWeb(config *oauth2.Config) *oauth2.Token {
  authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
  fmt.Printf("Go to the following link in your browser then type the "+
    "authorization code: \n%v\n", authURL)

  var code string
  if _, err := fmt.Scan(&code); err != nil {
    log.Fatalf("Unable to read authorization code %v", err)
  }

  tok, err := config.Exchange(oauth2.NoContext, code)
  if err != nil {
    log.Fatalf("Unable to retrieve token from web %v", err)
  }
  return tok
}

// tokenCacheFile generates credential file path/filename.
// It returns the generated credential path/filename.
func tokenCacheFile() (string, error) {
  usr, err := user.Current()
  if err != nil {
    return "", err
  }
  tokenCacheDir := filepath.Join(usr.HomeDir, ".credentials")
  os.MkdirAll(tokenCacheDir, 0700)
  return filepath.Join(tokenCacheDir,
    url.QueryEscape("youtube-go-quickstart.json")), err
}

// tokenFromFile retrieves a Token from a given file path.
// It returns the retrieved Token and any read error encountered.
func tokenFromFile(file string) (*oauth2.Token, error) {
  f, err := os.Open(file)
  if err != nil {
    return nil, err
  }
  t := &oauth2.Token{}
  err = json.NewDecoder(f).Decode(t)
  defer f.Close()
  return t, err
}

// saveToken uses a file path to create a file and store the
// token in it.
func saveToken(file string, token *oauth2.Token) {
  fmt.Printf("Saving credential file to: %s\n", file)
  f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
  if err != nil {
    log.Fatalf("Unable to cache oauth token: %v", err)
  }
  defer f.Close()
  json.NewEncoder(f).Encode(token)
}

func handleError(err error, message string) {
  if message == "" {
    message = "Error making API call"
  }
  if err != nil {
    log.Fatalf(message + ": %v", err.Error())
  }
}

func channelsListByUsername(service *youtube.Service, part string, forUsername string) {
  call := service.Channels.List(part)
  call = call.ForUsername(forUsername)
  response, err := call.Do()
  handleError(err, "")
  fmt.Println(fmt.Sprintf("This channel's ID is %s. Its title is '%s', " +
              "and it has %d views.",
              response.Items[0].Id,
              response.Items[0].Snippet.Title,
              response.Items[0].Statistics.ViewCount))
}


func main() {
  ctx := context.Background()

  b, err := ioutil.ReadFile("client_secret.json")
  if err != nil {
    log.Fatalf("Unable to read client secret file: %v", err)
  }

  // If modifying these scopes, delete your previously saved credentials
  // at ~/.credentials/youtube-go-quickstart.json
  config, err := google.ConfigFromJSON(b, youtube.YoutubeReadonlyScope)
  if err != nil {
    log.Fatalf("Unable to parse client secret file to config: %v", err)
  }
  client := getClient(ctx, config)
  service, err := youtube.New(client)

  handleError(err, "Error creating YouTube client")

  channelsListByUsername(service, "snippet,contentDetails,statistics", "GoogleDevelopers")
}

步驟 4:執行範例

在目前使用的目錄中,使用下列指令建構及執行範例:

go run quickstart.go

首次執行範例時,系統會提示您授予存取權:

  1. 在網路瀏覽器中瀏覽提供的網址。

    如果尚未登入 Google 帳戶,系統會提示你登入。如果您登入了多個 Google 帳戶,系統會要求您選取一個帳戶進行授權。

  2. 按一下「接受」按鈕。
  3. 複製系統提供的程式碼,貼到指令列提示中,然後按下 Enter 鍵。

附註

  • 授權資訊會儲存在檔案系統中,因此後續執行時不會提示授權。
  • 本範例中的授權流程適用於指令列應用程式。如要瞭解如何在網頁應用程式中執行授權,請參閱「使用 OAuth 2.0 處理網路伺服器應用程式」。

延伸閱讀