我想了解包含自定义网址的YouTube频道的详细信息,例如https://www.youtube.com/c/pratiksinhchudasamaisawesome。
自定义渠道网址遵循以下格式:https://www.youtube.com/c/{custom_channel_name}
。
我可以通过频道ID和用户名获取YouTube频道的详细信息,而不会出现任何问题。不幸的是,我需要使用自定义渠道网址,这是我遇到此问题的唯一时间。
我几个月前开发了我的应用程序,自定义渠道网址直到几天才开始运作。现在,如果我尝试使用自定义名称获取详细信息,则YouTube数据API不会返回YouTube自定义渠道网址的任何内容。
要获取此频道的详细信息:https://www.youtube.com/user/thenewboston,例如,请求将为:
GET https://www.googleapis.com/youtube/v3/channels?part=snippet&forUsername=thenewboston&key={YOUR_API_KEY}
响应
200
- SHOW HEADERS -
{
"kind": "youtube#channelListResponse",
"etag": "\"zekp1FB4kTkkM-rWc1qIAAt-BWc/8Dz6-vPu69KX3yZxVCT3-M9YWQA\"",
"pageInfo": {
"totalResults": 1,
"resultsPerPage": 5
},
"items": [
{
"kind": "youtube#channel",
"etag": "\"zekp1FB4kTkkM-rWc1qIAAt-BWc/KlQLDlUPRAmACwKt9V8V2yrOfEg\"",
"id": "UCJbPGzawDH1njbqV-D5HqKw",
"snippet": {
"title": "thenewboston",
"description": "Tons of sweet computer related tutorials and some other awesome videos too!",
"publishedAt": "2008-02-04T16:09:31.000Z",
"thumbnails": {
"default": {
"url": "https://yt3.ggpht.com/--n5ELY2uT-U/AAAAAAAAAAI/AAAAAAAAAAA/d9JvaIEpstw/s88-c-k-no-rj-c0xffffff/photo.jpg"
},
"medium": {
"url": "https://yt3.ggpht.com/--n5ELY2uT-U/AAAAAAAAAAI/AAAAAAAAAAA/d9JvaIEpstw/s240-c-k-no-rj-c0xffffff/photo.jpg"
},
"high": {
"url": "https://yt3.ggpht.com/--n5ELY2uT-U/AAAAAAAAAAI/AAAAAAAAAAA/d9JvaIEpstw/s240-c-k-no-rj-c0xffffff/photo.jpg"
}
},
"localized": {
"title": "thenewboston",
"description": "Tons of sweet computer related tutorials and some other awesome videos too!"
}
}
}
]
}
效果很好。
现在我们必须了解这些渠道的详细信息:
然后我们得到:
GET https://www.googleapis.com/youtube/v3/channels?part=snippet&forUsername=annacavalli&key={YOUR_API_KEY}
响应
200
- SHOW HEADERS -
{
"kind": "youtube#channelListResponse",
"etag": "\"zekp1FB4kTkkM-rWc1qIAAt-BWc/TAiG4jjJ-NTZu7gPKn7WGmuaZb8\"",
"pageInfo": {
"totalResults": 0,
"resultsPerPage": 5
},
"items": [
]
}
可以使用API explorer轻松复制。
答案 0 :(得分:8)
最简单的解决方案,仅使用API,就是使用YouTube Data API的搜索:列表方法。从我所知道的(请注意,这是来自我自己的研究,官方文档对此主题没有任何说明!),如果您使用自定义URL组件进行搜索,使用“频道”结果类型过滤器和“相关性”(默认)排序,第一个结果应该是您正在寻找的。 p>
因此,以下查询得到16个结果,第一个是您正在寻找的结果。我测试的所有其他自定义渠道网址也是如此,所以我认为这是最可靠的方法。
GET https://www.googleapis.com/youtube/v3/search?part=id%2Csnippet&q=annacavalli&type=channel&key={YOUR_API_KEY}
另一个想法是在自定义网址上抓取YouTube页面,您可以在其中的HTML代码中的某个元标记中找到ChannelID。但这是违反YouTube使用条款的无效,不可靠和AFAIK。
编辑:嗯,它没有为较小的频道返回任何结果,所以它根本不可靠。
答案 1 :(得分:0)
另一种方法是使用解析器(以下示例为PHP Simple HTLM DOM解析器:PHP Simple HTML DOM Parser):
<?php
$media_url = 'https://www.youtube.com/c/[Channel name]';
$dom = new simple_html_dom();
$html = $dom->load(curl_get($media_url));
if (null !== ($html->find('meta[itemprop=channelId]',0))) {
$channelId = $html->find('meta[itemprop=channelId]',0)->content;
}
?>
(使用Youtube api的“搜索”方法的配额费用为100)
答案 2 :(得分:0)
扩展@jkondratowicz答案,将search.list
与channels.list
结合使用,您大部分时间可以从自定义网址值中解析频道。
channel resource has a property customUrl
,因此,如果我们从search.list
结果中获取渠道,并从channels.list
获得有关它们的更多详细信息,则可以尝试将自定义url值与customUrl
属性。
这里的JavaScript方法有效,只需用您自己的api键替换即可。尽管仍然不够完美,但仍尝试返回的前50个频道。使用分页和pageToken可以完成更多工作。
function getChannel(customValue, callback) {
const API_KEY = "your_api_key"
$.ajax({
dataType: "json",
type: "GET",
url: "https://www.googleapis.com/youtube/v3/search",
data: {
key: API_KEY,
part: "snippet",
q: customValue,
maxResults: 50,
order: 'relevance',
type: 'channel'
}
}).done(function (res) {
const channelIds = [];
for (let i=0; i<res.items.length; i++) {
channelIds.push(res.items[i].id.channelId);
}
$.ajax({
dataType: "json",
type: "GET",
url: "https://www.googleapis.com/youtube/v3/channels",
data: {
key: API_KEY,
part: "snippet",
id: channelIds.join(","),
maxResults: 50
}
}).done(function (res) {
if (res.items) {
for (let i=0; i<res.items.length; i++) {
const item = res.items[i];
if (item.snippet.hasOwnProperty("customUrl") && customValue.toLowerCase() === item.snippet.customUrl.toLowerCase()) {
callback(item);
}
}
}
}).fail(function (err) {
logger.err(err);
});
}).fail(function (err) {
logger.err(err);
});
}
与https://www.youtube.com/c/creatoracademy一起使用的好例子。
getChannel('creatoracademy', function (channel) {
console.log(channel);
});
但是,它仍然不可靠,因为它取决于频道是否在原始search.list
查询中返回。如果自定义频道的网址过于笼统,则实际的频道可能不会在search.list
结果中返回。尽管这种方法更加可靠,但是由于搜索结果并非总是以相同的顺序返回,因此取决于search.list
的第一个条目才是正确的选择。
在过去的一年中,至少有3个功能要求Google要求为此自定义网址值添加一个附加参数,但都被认为是不可行的。显然,这太难实施了。还提到它不在他们的路线图上。
答案 3 :(得分:0)
我假设只有包含频道所有者上传的视频的频道才会引起关注。这意外地很方便,因为我的方法无论如何都不适用于 0 个视频频道。
给定一个频道的 url,我的方法将获取该频道的视频选项卡的 beautifulsoup HTML 对象,并抓取 HTML 以找到唯一的频道 ID。然后它会重建所有内容并返回带有唯一频道 ID 的频道网址。
input_shape=(33,3840,1)
model = Sequential()
#C1
model.add(Conv2D(16, (5, 5), strides=( 2, 2), padding='same',activation='relu', input_shape=input_shape))
model.add(keras.layers.MaxPooling2D(pool_size=( 2, 2), padding='same'))
model.add(BatchNormalization())
#C2
model.add(Conv2D(32, ( 3, 3), strides=(1,1), padding='same', activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2), padding='same'))
model.add(BatchNormalization())
model.add(Dense(32, input_dim=32,kernel_regularizer=regularizers.l2(0.1)))
model.add(keras.layers.Dropout(0.6))
model.add(Flatten())
model.add(Dropout(0.6))
model.add(Dense(256, activation='sigmoid'))
model.add(Dropout(0.6))
model.add(Dense(2, activation='softmax'))
opt_adam = keras.optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss=categorical_focal_loss(), optimizer=opt_adam, metrics=['accuracy'])
这种方法绕过了一个频道具有不同的 your_channel_url = 'Enter your channel url here'
channel_url = your_channel_url.strip("https://").strip("featured")
https = "https://"
channel_vids_tab = https + channel_url + '/videos'
import requests
from bs4 import BeautifulSoup
source = requests.get(channel_vids_tab).text
soup = BeautifulSoup(source, "html.parser")
a = soup.find('body').find('link')['href']
channel_id = a.split('/')[-1]
print(a)
print(channel_id)
和 /user
url(例如 /user/vechz 和 /c/vechz vs /c/coreyms 和 {{3} } 指向同一页面)。虽然您需要先手动输入网址,但可以轻松自动输入。
我也相当有信心,如果一个频道有 0 个视频,这种思路也适用于频道所有者创建的播放列表,只需稍作调整即可。但如果频道创建了 0 个视频或播放列表......谁知道