如果频道有自定义url,如何使用Youtube数据API获取Youtube频道详细信息

如果频道有自定义url,如何使用Youtube数据API获取Youtube频道详细信息,youtube,youtube-api,Youtube,Youtube Api,我想获取具有自定义URL的YouTube频道的详细信息,如 自定义频道URL遵循以下格式:https://www.youtube.com/c/{custom_channel_name} 我可以通过频道ID和用户名获取YouTube频道的详细信息,没有任何问题。不幸的是,我需要使用自定义频道URL,这是我唯一一次遇到这个问题 几个月前我开发了我的应用程序,而定制频道URL直到几天前才开始工作。现在,如果我尝试使用YouTube自定义频道URL的自定义名称获取详细信息,那么YouTube数据API不

我想获取具有自定义URL的YouTube频道的详细信息,如

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

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

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

例如,要获取此频道的详细信息,请求将是:

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!"
    }
   }
  }
 ]
}
200
- SHOW HEADERS -
{
 "kind": "youtube#channelListResponse",
 "etag": "\"zekp1FB4kTkkM-rWc1qIAAt-BWc/TAiG4jjJ-NTZu7gPKn7WGmuaZb8\"",
 "pageInfo": {
  "totalResults": 0,
  "resultsPerPage": 5
 },
 "items": [
 ]
}
它工作得很好

现在我们必须了解这些频道的详细信息:

然后我们得到:

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/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!"
    }
   }
  }
 ]
}
200
- SHOW HEADERS -
{
 "kind": "youtube#channelListResponse",
 "etag": "\"zekp1FB4kTkkM-rWc1qIAAt-BWc/TAiG4jjJ-NTZu7gPKn7WGmuaZb8\"",
 "pageInfo": {
  "totalResults": 0,
  "resultsPerPage": 5
 },
 "items": [
 ]
}

使用。

最简单的解决方案(仅使用API)可以很容易地重现这一点,就是只使用YouTube数据API的搜索:列表方法。据我所知(请注意,这是我自己的研究结果,官方文档对此主题只字未提!),如果您使用自定义URL组件进行搜索,并使用“频道”结果类型过滤器和“相关性”(默认)排序,则第一个结果应该是您要查找的结果

下面的查询得到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的使用条款


编辑:对于较小的通道,它不会返回任何结果,因此根本不可靠。

另一种方法是使用解析器(PHP Simple HTLM DOM parser,例如下面的示例:):


(使用Youtube api的“搜索”方法的配额成本为100)

解决方法 将@jkondratowicz answer展开,使用
search.list
channels结合使用。list
大多数情况下,您可以从自定义url值解析频道

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

这里是一个有效的JavaScript方法,只需将api键替换为您自己的。虽然它仍然不完美,但它尝试返回的前50个通道。分页和分页令牌可以做更多的工作

函数getChannel(customValue,回调){ const API_KEY=“您的API_KEY” $.ajax({ 数据类型:“json”, 键入:“获取”, url:“https://www.googleapis.com/youtube/v3/search", 数据:{ 密钥:API_密钥, 部分:“片段”, 问:客户价值, 最大结果:50, 顺序:“相关性”, 类型:“频道” } }).完成(功能(res){ const channelIds=[];
对于(设i=0;i我假设只有频道所有者上传视频的频道才会感兴趣。这是一个意外的方便,因为我的方法无论如何都不适用于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(例如和vs,并指向同一个页面)的麻烦。虽然您首先需要手动输入url,但它可以很容易地实现自动化


我也很有信心,如果一个频道有0个视频,这种思路也适用于频道所有者创建的播放列表,只需稍加调整。但是如果频道创建了0个视频或播放列表…谁知道呢,这看起来可能是他们的API有问题。为什么不试试谷歌是否会为y修复它ou?这不是一个bug,而是一个缺失的功能。用户名(来自古时候,在YouTube和Google Plus集成之前)与自定义频道标识符不同,因此预计
forUsername
过滤器不会以这种方式工作。Youtube API在2018年是否仍然不支持此功能?现在是2021年,此功能仍然不受支持(或者至少在使用forUsername或id属性作为查找时对我不起作用)这几乎就是我们正在寻找的,除了“种类”:“youtube#searchResult”而不是“种类”:“youtube#activity”有办法获得小频道的id吗?@MahmoudHanafy除了我描述的方法之外,我没有看到任何其他从自定义url获得频道id的方法。非常感谢@jkondratowicz,你的回答帮助了我。