如果频道有自定义网址

时间:2016-05-17 04:45:11

标签: youtube youtube-api

我想了解包含自定义网址的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轻松复制。

4 个答案:

答案 0 :(得分:8)

最简单的解决方案,仅使用API​​,就是使用YouTube Data API的搜索:列表方法。从我所知道的(请注意,这是来自我自己的研究,官方文档对此主题没有任何说明!),如果您使用自定义URL组件进行搜索,使用“频道”结果类型过滤器和“相关性”(默认)排序,第一个结果应该是您正在寻找的。

因此,以下查询得到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.listchannels.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 个视频或播放列表......谁知道