【问题标题】:How to get Youtube channel details using Youtube data API if channel has custom url如果频道具有自定义 URL,如何使用 Youtube 数据 API 获取 Youtube 频道详细信息
【发布时间】:2016-09-13 00:49:20
【问题描述】:

我想获取具有自定义 URL 的 YouTube 频道的详细信息,例如 https://www.youtube.com/c/pratiksinhchudasamaisawesome

自定义频道 URL 遵循以下格式:https://www.youtube.com/c/{custom_channel_name}

我可以毫无问题地通过频道 ID 和用户名获取 YouTube 频道的详细信息。不幸的是,我需要使用自定义频道 URL,这是我唯一一次遇到此问题。

几个月前我开发了我的应用程序,自定义频道 URL 直到几天前才正常工作。现在,如果我尝试使用自定义名称获取详细信息,YouTube 数据 API 不会为 YouTube 自定义频道 URL 返回任何内容。

要获取此频道的详细信息: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 轻松复制。

【问题讨论】:

  • 这看起来可能是他们的 API 的错误。为什么不report it 看看 Google 是否会为您修复它?
  • 这不是错误,而是缺少的功能。用户名(来自过去,在 YouTube 和 Google Plus 集成之前)与自定义频道标识符不同,因此预计 forUsername 过滤器不会以这种方式工作。
  • 2018 年 Youtube API 还是不支持这个吗?
  • 现在是 2021 年,仍然不支持此功能(或者至少在使用 forUserName 或 id 属性作为查找时对我不起作用)

标签: youtube youtube-api


【解决方案1】:

仅使用 API 的最简单解决方案是仅使用 YouTube Data API 的 Search:list 方法。据我所知(请注意,这是我自己的研究,官方文档对此主题只字未提!),如果您使用自定义 URL 组件进行搜索,使用“通道”结果类型过滤器和“相关性”(默认)排序,第一个结果应该就是你要找的。​​p>

因此,以下查询得到 16 个结果,其中第一个是您要查找的结果。我测试的所有其他自定义频道 URL 也是如此,所以我认为这是最可靠的方法。

GET https://www.googleapis.com/youtube/v3/search?part=id%2Csnippet&q=annacavalli&type=channel&key={YOUR_API_KEY}

另一个想法是在自定义 URL 处抓取 YouTube 页面,您可以在其中找到 HTML 代码中的一个元标记中的 ChannelID。但这是无效、不可靠且违反 YouTube 使用条款的 AFAIK。

编辑:嗯,它不会为较小的频道返回任何结果,所以它根本不可靠。

【讨论】:

  • 这几乎就是我们要找的,除了 "kind": "youtube#searchResult" 而不是 "kind": "youtube#activity"
  • 有没有办法获取小频道的id?
  • @MahmoudHanafy 除了我描述的方法之外,我没有看到任何其他从自定义 url 获取 channelId 的方法。
  • 非常感谢@jkondratowicz,您的回答帮助了我。
【解决方案2】:

解决方法

扩展@jkondratowicz 答案,结合使用search.listchannels.list,您可以在大多数情况下从自定义url 值解析频道。

channel resource has a property customUrl 因此,如果我们从search.list 结果中获取频道并从channels.list 中获取有关它们的额外详细信息,则可以尝试将自定义url 值与customUrl 属性匹配。

这里是一个有效的 JavaScript 方法,只需将 api 密钥替换为您自己的。虽然它仍然不完美,但它会尝试返回的前 50 个通道。使用 paging 和 pageTokens 可以做更多事情。

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 查询中返回。如果自定义频道 url 太通用,实际频道可能不会在search.list 结果中返回,这似乎是可能的。虽然这种方法要可靠得多,但取决于 search.list 的第一个条目是否正确,因为搜索结果并不总是以相同的顺序返回。

问题

在过去一年中,至少有 3 个功能请求向 Google 提出请求,要求为此自定义 url 值提供额外的参数,但均因不可行而被拒绝。显然实施起来太难了。它也被提到不在他们的路线图上。

资源

【讨论】:

    【解决方案3】:

    另一种方法是使用解析器(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)

    【讨论】:

    • 这很好用......我想知道如果我这样做谷歌是否会惩罚我的应用程序,我不希望经常调用此代码,但一天可能会调用几次 ? ‍♂️
    【解决方案4】:

    我假设只有包含频道所有者上传的视频的频道才会感兴趣。这很方便,因为我的方法无论如何都不适用于 0 视频通道。

    给定一个频道的 url,我的方法将获取该频道的视频选项卡的 beautifulsoup HTML 对象,并抓取 HTML 以找到唯一的频道 ID。然后它将重建所有内容并返回具有唯一频道 ID 的频道 url。

    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/c url(例如/user/vechz/c/vechz/c/coreyms/user/schafer5 导致同一页面)的头痛。虽然一开始需要手动输入网址,但很容易自动化。

    我也相当有信心,如果一个频道有 0 个视频,这种思路也适用于频道所有者创建的播放列表,只需要稍微调整一下。但是如果频道创建了 0 个视频或播放列表...谁知道呢

    【讨论】:

      【解决方案5】:

      正如@jkondratowicz 指出的那样,由于小频道不会在搜索结果的顶部返回,因此无法从 API 可靠地获取此信息。

      下面是一个 JS 示例,说明如何通过从 HTML 频道页面中提取频道 id (h/t @Feign') 来获取频道 ID:

      export const getChannelIdForCustomUrl = async (customUrl: string) => {
        const page = await axios.get(`https://www.youtube.com/c/${customUrl}`)
      
        const chanId = page.data.match(/channelId":"(.*?)"/)[1]
      
        return chanId
      }
      

      【讨论】:

        猜你喜欢
        • 2019-03-08
        • 1970-01-01
        • 2021-08-12
        • 2013-06-02
        • 2018-10-19
        • 2018-04-16
        • 2019-04-09
        • 2020-10-24
        • 2020-02-19
        相关资源
        最近更新 更多