如何使用 youtube 数据 api 检查 creativecommons 视频?我有以下代码,如果视频是知识共享的,如何打印 true ?

How to check for creativecommons videos, by using youtube data api ? I have the following code, how to print true if a video is creative commons?

我正在尝试使用 YouTube 数据下载一些创意共享视频 API,但我对此很陌生,所以我被卡住了。如何前进?我想在 JSON 文件中找到 "license": "creativeCommon" ,如果为真则打印 true.

import urllib.request as urllib2
import json
response = urllib2.urlopen('https://www.googleapis.com/youtube/v3/videos?id=gwLej8heN5c&part=status&key=MY_KEY')
data = list(json.load(response))


{
 "kind": "youtube#videoListResponse",
 "etag": "\"Bdx4f4ps3xCOOo1WZ91nTLkRZ_c/3jdRB-NXSAfUQj7e_FmBbivkK1o\"",
 "pageInfo": {
  "totalResults": 1,
  "resultsPerPage": 1
 },
 "items": [
  {
   "kind": "youtube#video",
   "etag": "\"Bdx4f4ps3xCOOo1WZ91nTLkRZ_c/NUd32t1_moLGAwVuu-ZujlkaiWM\"",
   "id": "gwLej8heN5c",
   "status": {
    "uploadStatus": "processed",
    "privacyStatus": "public",
    "license": "creativeCommon",
    "embeddable": true,
    "publicStatsViewable": true
   }
  }
 ]
}

@goodvibration 回答正确,只要你注意json.load使用了读取功能,这意味着一旦读取数据,就无法再次读取。在这种情况下,它将 return 空字节字符串。

此代码通过在末尾打印 True 来工作。

response = urllib2.urlopen('https://www.googleapis.com/youtube/v3/videos?id=gwLej8heN5c&part=status&key=MY_KEY')
for item in json.load(response)['items']: print(item['status']['license'] == 'creativeCommon')

此外,在您的原始示例和错误示例中,您在保存到数据时使用了 list(json.load(response)) 。这意味着,您不会获得整个 json,而只会获得密钥。因此,对于您的情况,我建议不要更改对列表的响应。但是由于您在后面的示例中没有使用数据变量,因此它并没有真正改变结果。但这可能很重要,如果您有更多信息想要 check/save。

另外,在这种情况下,由于json.load()使用了读取函数,不能多次使用,所以需要将整个json保存下来,然后从中读取。代码将是:

response = urllib2.urlopen('https://www.googleapis.com/youtube/v3/videos?id=gwLej8heN5c&part=status&key=MY_KEY')
data = json.load(response)
for item in data['items']: print(item['status']['license'] == 'creativeCommon')

如果您尝试阅读收到的回复,就会看到这一点。你可以放下面的代码来测试一下:

response = urllib2.urlopen('https://www.googleapis.com/youtube/v3/videos?id=gwLej8heN5c&part=status&key=MY_KEY')
print(response.read())
print(response.read())

在这种情况下,结果将是:

b'{\n "kind": "youtube#videoListResponse",\n "etag": "\"Bdx4f4ps3xCOOo1WZ91nTLkRZ_c/3jdRB-NXSAfUQj7e_FmBbivkK1o\"",\n "pageInfo": {\n  "totalResults": 1,\n  "resultsPerPage": 1\n },\n "items": [\n  {\n   "kind": "youtube#video",\n   "etag": "\"Bdx4f4ps3xCOOo1WZ91nTLkRZ_c/NUd32t1_moLGAwVuu-ZujlkaiWM\"",\n   "id": "gwLej8heN5c",\n   "status": {\n    "uploadStatus": "processed",\n    "privacyStatus": "public",\n    "license": "creativeCommon",\n    "embeddable": true,\n    "publicStatsViewable": true\n   }\n  }\n ]\n}\n'
b''

在第一种情况下,结果是 byte-string 形式的 json,而第二种情况是空的 byte-string。因此,当您尝试在同一个响应元素上使用多个 json.load() 时,您会得到 JSONDecodeError(与您的评论中的相同),因为第二次没有 json 可以解析。