如何在应用引擎上使用 Go 获取 youtube 播放列表视频
how to fetch youtube playlist videos using Go on app engine
使用 Api 键,我能够从 Api Explorer 中获取播放列表中的视频。 不使用 OAuth 执行 获取结果 json。这里是 link.
https://developers.google.com/apis-explorer/?hl=en_US#p/youtube/v3/youtube.playlistItems.list?part=snippet&playlistId=PLHyTuYqPkZCzt7mWZ4hmmrRdjLJiw6O2T&_h=2&
在 App Engine 上使用 Go 实现相同的调用失败并出现以下错误:
Get https://www.googleapis.com/youtube/v3/playlistItems?alt=json&part=snippet&playlistId=PLHyTuYqPkZCzt7mWZ4hmmrRdjLJiw6O2T: http.DefaultTransport and http.DefaultClient are not available in App Engine. See https://cloud.google.com/appengine/docs/go/urlfetch/
这是我使用的代码:
import (
"net/http"
"code.google.com/p/google-api-go-client/googleapi/transport"
"code.google.com/p/google-api-go-client/youtube/v3"
"log"
)
var service *youtube.Service
func init() {
var err error
log.Println("Apikey = ", apiKey)
client := &http.Client{Transport: &transport.APIKey{Key: apiKey}}
service, err = youtube.New(client)
if err != nil {
log.Println("ERROR in creating youtube New client ", err)
}
var items *youtube.PlaylistItemListResponse
if items, err = service.PlaylistItems.List("snippet").PlaylistId("PLHyTuYqPkZCzt7mWZ4hmmrRdjLJiw6O2T").Do(); err != nil {
log.Println("Error in fetching playlist items ", err) //this line shows the error
}
log.Println(Jsonify(items))
}
截至目前,我 运行 我的代码在本地开发服务器上,即 goapp serve
少了什么?如何使用 v3 api 和 ApiKey 获取 youtube 播放列表视频?
不幸的是,链接的文档没有完全解释为什么您的代码无法正常工作。在 App Engine 上,您需要使用 urlfetch
包提供的特殊 http.Transport
;见 https://cloud.google.com/appengine/docs/go/urlfetch/
找到解决方案。下面的代码为我完成了任务。
func FetchVideos(w http.ResponseWriter, r *http.Request) {
var service *youtube.Service
ctx := appengine.NewContext(r)
transport := &transport.APIKey{
Key: apiKey,
Transport: &urlfetch.Transport{Context: ctx}}
client := &http.Client{Transport: transport}
var err error
service, err = youtube.New(client)
if err != nil {
log.Println("ERROR in creating youtube New client ", err)
}
var items *youtube.PlaylistItemListResponse
if items, err = service.PlaylistItems.List("snippet").PlaylistId("PLHyTuYqPkZCzt7mWZ4hmmrRdjLJiw6O2T").Do(); err != nil {
log.Println("Error in fetching playlist items ", err)
}
log.Println(Jsonify(items))
使用 Api 键,我能够从 Api Explorer 中获取播放列表中的视频。 不使用 OAuth 执行 获取结果 json。这里是 link.
https://developers.google.com/apis-explorer/?hl=en_US#p/youtube/v3/youtube.playlistItems.list?part=snippet&playlistId=PLHyTuYqPkZCzt7mWZ4hmmrRdjLJiw6O2T&_h=2&
在 App Engine 上使用 Go 实现相同的调用失败并出现以下错误:
Get https://www.googleapis.com/youtube/v3/playlistItems?alt=json&part=snippet&playlistId=PLHyTuYqPkZCzt7mWZ4hmmrRdjLJiw6O2T: http.DefaultTransport and http.DefaultClient are not available in App Engine. See https://cloud.google.com/appengine/docs/go/urlfetch/
这是我使用的代码:
import (
"net/http"
"code.google.com/p/google-api-go-client/googleapi/transport"
"code.google.com/p/google-api-go-client/youtube/v3"
"log"
)
var service *youtube.Service
func init() {
var err error
log.Println("Apikey = ", apiKey)
client := &http.Client{Transport: &transport.APIKey{Key: apiKey}}
service, err = youtube.New(client)
if err != nil {
log.Println("ERROR in creating youtube New client ", err)
}
var items *youtube.PlaylistItemListResponse
if items, err = service.PlaylistItems.List("snippet").PlaylistId("PLHyTuYqPkZCzt7mWZ4hmmrRdjLJiw6O2T").Do(); err != nil {
log.Println("Error in fetching playlist items ", err) //this line shows the error
}
log.Println(Jsonify(items))
}
截至目前,我 运行 我的代码在本地开发服务器上,即 goapp serve
少了什么?如何使用 v3 api 和 ApiKey 获取 youtube 播放列表视频?
不幸的是,链接的文档没有完全解释为什么您的代码无法正常工作。在 App Engine 上,您需要使用 urlfetch
包提供的特殊 http.Transport
;见 https://cloud.google.com/appengine/docs/go/urlfetch/
找到解决方案。下面的代码为我完成了任务。
func FetchVideos(w http.ResponseWriter, r *http.Request) {
var service *youtube.Service
ctx := appengine.NewContext(r)
transport := &transport.APIKey{
Key: apiKey,
Transport: &urlfetch.Transport{Context: ctx}}
client := &http.Client{Transport: transport}
var err error
service, err = youtube.New(client)
if err != nil {
log.Println("ERROR in creating youtube New client ", err)
}
var items *youtube.PlaylistItemListResponse
if items, err = service.PlaylistItems.List("snippet").PlaylistId("PLHyTuYqPkZCzt7mWZ4hmmrRdjLJiw6O2T").Do(); err != nil {
log.Println("Error in fetching playlist items ", err)
}
log.Println(Jsonify(items))