此端点可以帮助您
响应包含播放列表集合、每个条目的上下文以及下一页的游标。
何时使用
在需要保证条目顺序和下一页续取的定期采集工作流中使用“按播放列表 ID 获取视频”。
先查看结果和常见工作流,然后再了解参数和可运行的请求示例。
响应包含播放列表集合、每个条目的上下文以及下一页的游标。
在需要保证条目顺序和下一页续取的定期采集工作流中使用“按播放列表 ID 获取视频”。
按顺序将新的 YouTube 条目迁入内部存储。
保存可用的公开集合,以便搜索和后续处理。
从最新的一页继续,发现新出现的对象。
两个版本完成相同的任务,接受相同的参数。使用切换按钮比较响应结构,并选择您的客户端所需的版本。
在本页面切换版本,即可在同一文档 URL 下比较响应结构。
V1 和 V2 的身份验证、必填参数和请求结构均相同。实际上,您只需在构建端点路径和解析响应时选择版本。
主要区别在于响应结构。新集成请使用 V2;仅在需要兼容现有客户端契约时保留 V1。
两个版本使用相同的 API 密钥请求头和相同的查询参数。本文档先展示共享的参数集合,然后展示各版本特定的端点路径和代码片段。
| 参数 | 必填 | 类型 | 示例 | 说明 |
|---|---|---|---|---|
playlist_id |
是 | str |
UUBJycsmduvYEL83R_U4JriQ |
所选平台上的播放列表 ID。 |
cursor |
否 | str | None |
cursor-next-page |
上一次响应返回的下一页游标。获取第一页时请省略。 |
复制确切的端点路径、示例 URL 和代码片段时请选择版本。上方的参数列表保持不变。
GET /api/v2/youtube.com/playlist/videos-by-playlist-idcurl --request GET \
--url "https://www.scrapestorm.net/api/v2/youtube.com/playlist/videos-by-playlist-id" \
--header "X-API-Key: 00000000-0000-4000-8000-000000000000" \
--get --data-urlencode 'playlist_id=UUBJycsmduvYEL83R_U4JriQ' \
# Optional parameters:
# --data-urlencode 'cursor=cursor-next-page'
from urllib.parse import urljoin
import requests
BASE_URL = "https://www.scrapestorm.net"
ENDPOINT = "/api/v2/youtube.com/playlist/videos-by-playlist-id"
HEADERS = {"Accept": "application/json", "X-API-Key": "00000000-0000-4000-8000-000000000000"}
params = {
"playlist_id": "UUBJycsmduvYEL83R_U4JriQ",
}
# Optional parameters
# params["cursor"] = "cursor-next-page"
with requests.Session() as session:
response = session.request(
method="GET",
url=urljoin(BASE_URL, ENDPOINT),
headers=HEADERS,
params=params,
timeout=30,
)
response.raise_for_status()
payload = response.json()
print(payload)
const BASE_URL = "https://www.scrapestorm.net";
const endpoint = "/api/v2/youtube.com/playlist/videos-by-playlist-id";
const params = new URLSearchParams({
playlist_id: "UUBJycsmduvYEL83R_U4JriQ",
});
// Optional parameters
// params.set("cursor", "cursor-next-page");
const response = await fetch(`${BASE_URL}${endpoint}?${params.toString()}`, {
method: "GET",
headers: {
Accept: "application/json",
"X-API-Key": "00000000-0000-4000-8000-000000000000",
},
});
if (!response.ok) {
throw new Error(`Request failed: ${response.status} ${response.statusText}`);
}
const payload = await response.json();
console.log(payload);
import axios from "axios";
const client = axios.create({
baseURL: "https://www.scrapestorm.net",
timeout: 30000,
headers: {
Accept: "application/json",
"X-API-Key": "00000000-0000-4000-8000-000000000000",
},
});
const params = {
playlist_id: "UUBJycsmduvYEL83R_U4JriQ",
};
// Optional parameters
// params.cursor = "cursor-next-page";
const { data: payload } = await client.request({
method: "GET",
url: endpoint,
params,
});
console.log(payload);
<?php
declare(strict_types=1);
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
$client = new Client([
'base_uri' => "https://www.scrapestorm.net",
'timeout' => 30.0,
'headers' => [
'Accept' => 'application/json',
'X-API-Key' => "00000000-0000-4000-8000-000000000000",
],
]);
$query = [
"playlist_id" => "UUBJycsmduvYEL83R_U4JriQ",
];
// Optional parameters
// $query["cursor"] = "cursor-next-page";
try {
$response = $client->request("GET", "/api/v2/youtube.com/playlist/videos-by-playlist-id", [
'query' => $query,
]);
$payload = json_decode(
(string) $response->getBody(),
true,
512,
JSON_THROW_ON_ERROR
);
var_dump($payload);
} catch (GuzzleException $e) {
throw $e;
}
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
)
func main() {
baseURL := "https://www.scrapestorm.net"
endpoint := "/api/v2/youtube.com/playlist/videos-by-playlist-id"
params := url.Values{}
params.Set("playlist_id", "UUBJycsmduvYEL83R_U4JriQ")
// Optional parameters
// params.Set("cursor", "cursor-next-page")
req, err := http.NewRequest(
"GET",
fmt.Sprintf("%s%s?%s", baseURL, endpoint, params.Encode()),
nil,
)
if err != nil {
panic(err)
}
req.Header.Set("Accept", "application/json")
req.Header.Set("X-API-Key", "00000000-0000-4000-8000-000000000000")
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var payload any
if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil {
panic(err)
}
fmt.Printf("%+v\n", payload)
}
复制确切的端点路径、示例 URL 和代码片段时请选择版本。上方的参数列表保持不变。
GET /api/v1/youtube.com/playlist/videos-by-playlist-idcurl --request GET \
--url "https://www.scrapestorm.net/api/v1/youtube.com/playlist/videos-by-playlist-id" \
--header "X-API-Key: 00000000-0000-4000-8000-000000000000" \
--get --data-urlencode 'playlist_id=UUBJycsmduvYEL83R_U4JriQ' \
# Optional parameters:
# --data-urlencode 'cursor=cursor-next-page'
from urllib.parse import urljoin
import requests
BASE_URL = "https://www.scrapestorm.net"
ENDPOINT = "/api/v1/youtube.com/playlist/videos-by-playlist-id"
HEADERS = {"Accept": "application/json", "X-API-Key": "00000000-0000-4000-8000-000000000000"}
params = {
"playlist_id": "UUBJycsmduvYEL83R_U4JriQ",
}
# Optional parameters
# params["cursor"] = "cursor-next-page"
with requests.Session() as session:
response = session.request(
method="GET",
url=urljoin(BASE_URL, ENDPOINT),
headers=HEADERS,
params=params,
timeout=30,
)
response.raise_for_status()
payload = response.json()
print(payload)
const BASE_URL = "https://www.scrapestorm.net";
const endpoint = "/api/v1/youtube.com/playlist/videos-by-playlist-id";
const params = new URLSearchParams({
playlist_id: "UUBJycsmduvYEL83R_U4JriQ",
});
// Optional parameters
// params.set("cursor", "cursor-next-page");
const response = await fetch(`${BASE_URL}${endpoint}?${params.toString()}`, {
method: "GET",
headers: {
Accept: "application/json",
"X-API-Key": "00000000-0000-4000-8000-000000000000",
},
});
if (!response.ok) {
throw new Error(`Request failed: ${response.status} ${response.statusText}`);
}
const payload = await response.json();
console.log(payload);
import axios from "axios";
const client = axios.create({
baseURL: "https://www.scrapestorm.net",
timeout: 30000,
headers: {
Accept: "application/json",
"X-API-Key": "00000000-0000-4000-8000-000000000000",
},
});
const params = {
playlist_id: "UUBJycsmduvYEL83R_U4JriQ",
};
// Optional parameters
// params.cursor = "cursor-next-page";
const { data: payload } = await client.request({
method: "GET",
url: endpoint,
params,
});
console.log(payload);
<?php
declare(strict_types=1);
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
$client = new Client([
'base_uri' => "https://www.scrapestorm.net",
'timeout' => 30.0,
'headers' => [
'Accept' => 'application/json',
'X-API-Key' => "00000000-0000-4000-8000-000000000000",
],
]);
$query = [
"playlist_id" => "UUBJycsmduvYEL83R_U4JriQ",
];
// Optional parameters
// $query["cursor"] = "cursor-next-page";
try {
$response = $client->request("GET", "/api/v1/youtube.com/playlist/videos-by-playlist-id", [
'query' => $query,
]);
$payload = json_decode(
(string) $response->getBody(),
true,
512,
JSON_THROW_ON_ERROR
);
var_dump($payload);
} catch (GuzzleException $e) {
throw $e;
}
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
)
func main() {
baseURL := "https://www.scrapestorm.net"
endpoint := "/api/v1/youtube.com/playlist/videos-by-playlist-id"
params := url.Values{}
params.Set("playlist_id", "UUBJycsmduvYEL83R_U4JriQ")
// Optional parameters
// params.Set("cursor", "cursor-next-page")
req, err := http.NewRequest(
"GET",
fmt.Sprintf("%s%s?%s", baseURL, endpoint, params.Encode()),
nil,
)
if err != nil {
panic(err)
}
req.Header.Set("Accept", "application/json")
req.Header.Set("X-API-Key", "00000000-0000-4000-8000-000000000000")
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var payload any
if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil {
panic(err)
}
fmt.Printf("%+v\n", payload)
}
预览保留了关键字段和集合中的前几项,便于您快速浏览响应结构。切换版本会改变 JSON 格式。
此简明 JSON 示例来自 V2 最近一次成功的验证运行。
{
"success": true,
"status": "ok",
"pagination": {
"cursor": "QVFB...",
"has_more": true
},
"search_context": {
"playlist_id": "UUBJycsmduvYEL83R_U4JriQ"
},
"data": {
"playlist_context": {
"title": "Uploads from Marques Brownlee"
},
"videos": {
"count": 100,
"items": [
{
"author": {
"url": "https://www.youtube.com/@mkbhd",
"channel_id": "UCBJycsmduvYEL83R_U4JriQ",
"username": "mkbhd",
"display_name": "Marques Brownlee"
},
"url": "https://www.youtube.com/watch?v=_oRgdlJUD18",
"video_id": "_oRgdlJUD18",
"title": "iOS 27 Hands-On: Top 5 New Features!",
"published_time": "5 days ago",
"duration_seconds": 919,
"duration_text": "15:19",
"view_count": 4600000,
"thumbnail_url": "https://example.com/image.jpg",
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/_oRgdlJUD18/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAqzYI5SutN61Swg3NyCUT_iqmWvg",
"width": 168,
"height": 94
},
{
"url": "https://i.ytimg.com/vi/_oRgdlJUD18/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBUzyfR53JdNwx7K0o1k2OVhXM7UQ",
"width": 196,
"height": 110
},
{
"_more_items": 2
}
],
"playlist_index": null,
"is_playable": null
},
{
"author": {
"url": "https://www.youtube.com/@mkbhd",
"channel_id": "UCBJycsmduvYEL83R_U4JriQ",
"username": "mkbhd",
"display_name": "Marques Brownlee"
},
"url": "https://www.youtube.com/watch?v=eWKY0OnPByg&pp=0gcJCaAAKgI3ePta",
"video_id": "eWKY0OnPByg",
"title": "Apple Lost the AI Race",
"published_time": "11 days ago",
"duration_seconds": 424,
"duration_text": "7:04",
"view_count": 2000000,
"thumbnail_url": "https://example.com/image.jpg",
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/eWKY0OnPByg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBjN5ZGxtyPGP847jBMfzvK6OOCww",
"width": 168,
"height": 94
},
{
"url": "https://i.ytimg.com/vi/eWKY0OnPByg/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBlYd2GGr3sxRPzWyDetQnI-FsaNw",
"width": 196,
"height": 110
},
{
"_more_items": 2
}
],
"playlist_index": null,
"is_playable": null
},
{
"_more_items": 98
}
]
}
}
}
此简明 JSON 示例来自 V1 最近一次成功的验证运行。
{
"success": true,
"status": "ok",
"pagination": {
"cursor": "QVFB...",
"has_more": true
},
"search_context": {
"playlist_id": "UUBJycsmduvYEL83R_U4JriQ"
},
"data": {
"responseContext": {
"serviceTrackingParams": [
{
"service": "GFEEDBACK",
"params": [
{
"key": "is_podcast_show_page",
"value": "0"
},
{
"key": "browse_id",
"value": "VLUUBJycsmduvYEL83R_U4JriQ"
},
{
"_more_items": 3
}
]
},
{
"service": "GOOGLE_HELP",
"params": [
{
"key": "is_podcast_show_page",
"value": "0"
},
{
"key": "browse_id",
"value": "VLUUBJycsmduvYEL83R_U4JriQ"
},
{
"_more_items": 1
}
]
},
{
"_more_items": 3
}
],
"mainAppWebResponseContext": {
"loggedOut": true,
"trackingParam": "k5_fmPxhoXZReDjg9tUg_RqAkFlfq5Z4Md6jSR9_ZA0gL2F_bUiggJPg_wRMkusEmIBwOcCw59TLtslLKPQGSS"
},
"responseId": "IhMIlcXviNXflQMVD8c_BB1R_QoD",
"webResponseContextExtensionData": {
"webResponseContextPreloadData": {
"preloadMessageNames": [
"playlistHeaderRenderer",
"buttonRenderer",
{
"_more_items": 53
}
]
},
"ytConfigData": {
"visitorData": "Cgt4N0JiRG5EMEVXRSjn_fTSBjIKCgJVUxIEGgAgDWLfAgrcAjIwLllUPUNfMWpRMHJlQk1McFpvcW96LW54NS03VzZrZUhaazNJU0pJVjh4bHM1NVdlakdMbjktUm5CeDVTaTAxVHhYc0ZGVkZ1a184cU9qNkVhazdpR2NoaXptT1gxY…",
"rootVisualElementType": 5754
},
"hasDecorated": true
}
},
"contents": {
"twoColumnBrowseResultsRenderer": {
"tabs": [
{
"tabRenderer": {
"selected": true,
"content": "…",
"tabIdentifier": "PL",
"trackingParams": "CCIQ8JMBGAQiEwiVxe-I1d-VAxUPxz8EHVH9CgM="
}
}
]
}
},
"header": {
"playlistHeaderRenderer": {
"playlistId": "UUBJycsmduvYEL83R_U4JriQ",
"title": {
"simpleText": "Uploads from Marques Brownlee"
},
"numVideosText": {
"runs": [
{
"text": "1,833"
},
{
"text": " videos"
}
]
},
"ownerText": {
"runs": [
{
"text": "Marques Brownlee",
"navigationEndpoint": "…"
}
]
},
"viewCountText": {
"simpleText": "29,077,346 views"
},
"shareData": {
"canShare": true
},
"isEditable": false,
"likeButton": {
"likeButtonRenderer": {
"target": {
"playlistId": "UUBJycsmduvYEL83R_U4JriQ"
},
"likeStatus": "INDIFFERENT",
"trackingParams": "CCEQpUEiEwiVxe-I1d-VAxUPxz8EHVH9CgM=",
"likesAllowed": false,
"hideDislikeButton": false
}
},
"ownerEndpoint": {
"clickTrackingParams": "CBsQ8DciEwiVxe-I1d-VAxUPxz8EHVH9CgPKAQRetfVv",
"commandMetadata": {
"webCommandMetadata": {
"url": "/@mkbhd",
"webPageType": "WEB_PAGE_TYPE_CHANNEL",
"rootVe": 3611,
"apiUrl": "/youtubei/v1/browse"
}
},
"browseEndpoint": {
"browseId": "UCBJycsmduvYEL83R_U4JriQ",
"canonicalBaseUrl": "/@mkbhd"
}
},
"editableDetails": {
"canDelete": false
},
"trackingParams": "CBsQ8DciEwiVxe-I1d-VAxUPxz8EHVH9CgM=",
"serviceEndpoints": [
{
"clickTrackingParams": "CBsQ8DciEwiVxe-I1d-VAxUPxz8EHVH9CgPKAQRetfVv",
"commandMetadata": {
"webCommandMetadata": "…"
},
"playlistEditEndpoint": {
"actions": "…"
}
}
],
"stats": [
{
"runs": [
"…",
"…"
]
},
{
"simpleText": "29,077,346 views"
}
],
"briefStats": [
{
"runs": [
"…",
"…"
]
}
],
"playlistHeaderBanner": {
"heroPlaylistThumbnailRenderer": {
"thumbnail": {
"thumbnails": "…"
},
"maxRatio": 0.5625,
"trackingParams": "CCAQw-wJIhMIlcXviNXflQMVD8c_BB1R_QoD",
"onTap": {
"clickTrackingParams": "CCAQw-wJIhMIlcXviNXflQMVD8c_BB1R_QoDWhpWTFVVQkp5Y3NtZHV2WUVMODNSX1U0SnJpUZoBAxD6LMoBBF619W8=",
"commandMetadata": "…",
"watchEndpoint": "…"
},
"thumbnailOverlays": {
"thumbnailOverlayHoverTextRenderer": "…"
}
}
},
"shareButton": {
"buttonRenderer": {
"style": "STYLE_MONO_TONAL_OVERLAY",
"size": "SIZE_DEFAULT",
"isDisabled": false,
"icon": {
"iconType": "SHARE"
},
"navigationEndpoint": {
"clickTrackingParams": "CB4Q8FsiEwiVxe-I1d-VAxUPxz8EHVH9CgPKAQRetfVv",
"commandMetadata": "…",
"shareEntityServiceEndpoint": "…"
},
"accessibility": {
"label": "Share"
},
"tooltip": "Share",
"trackingParams": "CB4Q8FsiEwiVxe-I1d-VAxUPxz8EHVH9CgM=",
"accessibilityData": {
"accessibilityData": "…"
}
}
},
"playButton": {
"buttonRenderer": {
"style": "STYLE_MONO_FILLED_OVERLAY",
"size": "SIZE_DEFAULT",
"isDisabled": false,
"text": {
"simpleText": "Play all"
},
"icon": {
"iconType": "PLAY_ARROW"
},
"navigationEndpoint": {
"clickTrackingParams": "CB0Q2M8CIhMIlcXviNXflQMVD8c_BB1R_QoDWhpWTFVVQkp5Y3NtZHV2WUVMODNSX1U0SnJpUZoBAxD6LMoBBF619W8=",
"commandMetadata": "…",
"watchEndpoint": "…"
},
"trackingParams": "CB0Q2M8CIhMIlcXviNXflQMVD8c_BB1R_QoD"
}
},
"shufflePlayButton": {
"buttonRenderer": {
"style": "STYLE_MONO_TONAL_OVERLAY",
"size": "SIZE_DEFAULT",
"isDisabled": false,
"text": {
"simpleText": "Shuffle"
},
"icon": {
"iconType": "SHUFFLE"
},
"navigationEndpoint": {
"clickTrackingParams": "CBwQsssCIhMIlcXviNXflQMVD8c_BB1R_QoDWhpWTFVVQkp5Y3NtZHV2WUVMODNSX1U0SnJpUZoBAxD6LMoBBF619W8=",
"commandMetadata": "…",
"watchEndpoint": "…"
},
"trackingParams": "CBwQsssCIhMIlcXviNXflQMVD8c_BB1R_QoD"
}
},
"cinematicContainer": {
"cinematicContainerRenderer": {
"backgroundImageConfig": {
"thumbnail": "…"
},
"gradientColorConfig": [
"…",
"…",
{
"_more_items": 1
}
],
"config": {
"lightThemeBackgroundColor": 4284825647,
"darkThemeBackgroundColor": 4284825647,
"colorSourceSizeMultiplier": 2,
"applyClientImageBlur": true
}
}
},
"byline": [
{
"playlistBylineRenderer": {
"text": "…"
}
},
{
"playlistBylineRenderer": {
"text": "…"
}
},
{
"_more_items": 1
}
]
}
},
"metadata": {
"playlistMetadataRenderer": {
"title": "Uploads from Marques Brownlee",
"androidAppindexingLink": "android-app://com.google.android.youtube/http/www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ",
"iosAppindexingLink": "ios-app://544007664/vnd.youtube/www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ"
}
},
"trackingParams": "CAAQhGciEwiVxe-I1d-VAxUPxz8EHVH9CgPKAQRetfVv",
"topbar": {
"desktopTopbarRenderer": {
"logo": {
"topbarLogoRenderer": {
"iconImage": {
"iconType": "YOUTUBE_LOGO"
},
"tooltipText": {
"runs": "…"
},
"endpoint": {
"clickTrackingParams": "CBoQsV4iEwiVxe-I1d-VAxUPxz8EHVH9CgPKAQRetfVv",
"commandMetadata": "…",
"browseEndpoint": "…"
},
"trackingParams": "CBoQsV4iEwiVxe-I1d-VAxUPxz8EHVH9CgM=",
"overrideEntityKey": "EgZ0b3BiYXIg9QEoAQ%3D%3D"
}
},
"searchbox": {
"fusionSearchboxRenderer": {
"icon": {
"iconType": "SEARCH"
},
"placeholderText": {
"runs": "…"
},
"config": {
"webSearchboxConfig": "…"
},
"trackingParams": "CBYQ7VAiEwiVxe-I1d-VAxUPxz8EHVH9CgM=",
"searchEndpoint": {
"clickTrackingParams": "CBYQ7VAiEwiVxe-I1d-VAxUPxz8EHVH9CgPKAQRetfVv",
"commandMetadata": "…",
"searchEndpoint": "…"
},
"clearButton": {
"buttonRenderer": "…"
},
"showImageSourceDialog": {
"clickTrackingParams": "CBYQ7VAiEwiVxe-I1d-VAxUPxz8EHVH9CgPKAQRetfVv",
"showDialogCommand": "…"
},
"disableAiAppearance": true
}
},
"trackingParams": "CAoQq6wBIhMIlcXviNXflQMVD8c_BB1R_QoD",
"topbarButtons": [
{
"topbarMenuButtonRenderer": {
"icon": "…",
"menuRequest": "…",
"trackingParams": "CBQQ_qsBGAAiEwiVxe-I1d-VAxUPxz8EHVH9CgM=",
"accessibility": "…",
"tooltip": "Settings",
"style": "STYLE_DEFAULT"
}
},
{
"buttonRenderer": {
"style": "STYLE_SUGGESTIVE",
"size": "SIZE_SMALL",
"text": "…",
"icon": "…",
"navigationEndpoint": "…",
"trackingParams": "CBMQ1IAEGAEiEwiVxe-I1d-VAxUPxz8EHVH9CgM=",
"targetId": "topbar-signin"
}
}
],
"hotkeyDialog": {
"hotkeyDialogRenderer": {
"title": {
"runs": "…"
},
"sections": [
"…",
"…",
{
"_more_items": 2
}
],
"dismissButton": {
"buttonRenderer": "…"
},
"trackingParams": "CBEQteYDIhMIlcXviNXflQMVD8c_BB1R_QoD"
}
},
"backButton": {
"buttonRenderer": {
"trackingParams": "CBAQvIYDIhMIlcXviNXflQMVD8c_BB1R_QoD",
"command": {
"clickTrackingParams": "CBAQvIYDIhMIlcXviNXflQMVD8c_BB1R_QoDygEEXrX1bw==",
"commandMetadata": "…",
"signalServiceEndpoint": "…"
}
}
},
"forwardButton": {
"buttonRenderer": {
"trackingParams": "CA8QvYYDIhMIlcXviNXflQMVD8c_BB1R_QoD",
"command": {
"clickTrackingParams": "CA8QvYYDIhMIlcXviNXflQMVD8c_BB1R_QoDygEEXrX1bw==",
"commandMetadata": "…",
"signalServiceEndpoint": "…"
}
}
},
"a11ySkipNavigationButton": {
"buttonRenderer": {
"style": "STYLE_DEFAULT",
"size": "SIZE_DEFAULT",
"isDisabled": false,
"text": {
"runs": "…"
},
"trackingParams": "CA4Q8FsiEwiVxe-I1d-VAxUPxz8EHVH9CgM=",
"command": {
"clickTrackingParams": "CA4Q8FsiEwiVxe-I1d-VAxUPxz8EHVH9CgPKAQRetfVv",
"commandMetadata": "…",
"signalServiceEndpoint": "…"
}
}
},
"voiceSearchButton": {
"buttonRenderer": {
"style": "STYLE_DEFAULT",
"size": "SIZE_DEFAULT",
"isDisabled": false,
"serviceEndpoint": {
"clickTrackingParams": "CAsQ7a8FIhMIlcXviNXflQMVD8c_BB1R_QoDygEEXrX1bw==",
"commandMetadata": "…",
"signalServiceEndpoint": "…"
},
"icon": {
"iconType": "MICROPHONE_ON"
},
"tooltip": "Search with your voice",
"trackingParams": "CAsQ7a8FIhMIlcXviNXflQMVD8c_BB1R_QoD",
"accessibilityData": {
"accessibilityData": "…"
}
}
}
}
},
"microformat": {
"microformatDataRenderer": {
"urlCanonical": "http://www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ",
"title": "Uploads from Marques Brownlee",
"description": "",
"thumbnail": {
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/_oRgdlJUD18/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBwlFiuuf-O763vrApAZcbpkiCvHw&days_since_epoch=20653",
"width": 480,
"height": 270
}
],
"sampledThumbnailColor": {
"red": 101,
"green": 64,
"blue": 47
},
"darkColorPalette": {
"section2Color": 3350551,
"iconInactiveColor": 9666422,
"iconDisabledColor": 5851715
},
"vibrantColorPalette": {
"iconInactiveColor": 10058091
}
},
"siteName": "YouTube",
"appName": "YouTube",
"androidPackage": "com.google.android.youtube",
"iosAppStoreId": "544007664",
"iosAppArguments": "http://www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ",
"ogType": "website",
"urlApplinksWeb": "http://www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ&feature=applinks",
"urlApplinksIos": "http://www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ&feature=applinks",
"urlApplinksAndroid": "http://www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ&feature=applinks",
"urlTwitterIos": "http://www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ&feature=twitter-deep-link",
"urlTwitterAndroid": "http://www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ&feature=twitter-deep-link",
"twitterCardType": "summary",
"twitterSiteHandle": "@YouTube",
"schemaDotOrgType": "http://schema.org/WebPage",
"noindex": false,
"unlisted": false,
"linkAlternates": [
{
"hrefUrl": "http://www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ"
},
{
"hrefUrl": "android-app://com.google.android.youtube/http/youtube.comhttp://www.youtube.com/playlist?list=UUBJycsmduvYEL83R_U4JriQ"
},
{
"_more_items": 1
}
]
}
},
"sidebar": {
"playlistSidebarRenderer": {
"items": [
{
"playlistSidebarPrimaryInfoRenderer": {
"thumbnailRenderer": "…",
"title": "…",
"stats": "…",
"menu": "…",
"thumbnailOverlays": "…",
"navigationEndpoint": "…",
"showMoreText": "…"
}
},
{
"playlistSidebarSecondaryInfoRenderer": {
"videoOwner": "…",
"button": "…"
}
}
],
"trackingParams": "CAEQk-8CIhMIlcXviNXflQMVD8c_BB1R_QoD"
}
}
}
}
将本文档作为第一个决策点,然后在将端点接入常规使用之前,继续了解价格、平台覆盖范围和集成规则。
借助这些解答,判断此 API 方法是否适合您的工作流、版本选择和上线计划。
该方法针对播放列表执行“按播放列表 ID 获取视频”操作。下方的简明响应示例展示了确切的字段结构。
新集成请选择 V2,因为它提供规范化的结构。仅在兼容已使用平台原生格式的客户端时使用 V1。
创建 API 密钥,在请求头中发送它,并提供表格中的必填参数。代码示例中已包含正确的路径和请求结构。