Youtube 最近推出了 handles 功能,他们为用户提供 youtube.com/@xxx 输入用户名,当访问这些 URL 时会显示用户的频道,但我在 API 存储库中找不到任何文档或参考。
如何从 YouTube 用户的句柄中提取 YouTube 用户频道 ID?
再一次YouTube Data API v3 不提供基本功能。
我建议您尝试我的开源YouTube操作API。事实上,通过获取 https://yt.lemnoslife.com/channels?handle=@HANDLE,您将获得您在
item["id"]
中查找的 YouTube 频道 ID。
@WHO
,您将得到:
{
"kind": "youtube#channelListResponse",
"etag": "NotImplemented",
"items": [
{
"kind": "youtube#channel",
"etag": "NotImplemented",
"id": "UC07-dOwgza1IguKA86jqxNA"
}
]
}
浪费了大约 2 个小时来导出以下工作代码/修复...
// Youtube NEW garbage handles to channel IDs
// https://stackoverflow.com/questions/75372496/how-can-i-get-youtube-channel-id-using-channel-name-url/75374713#75374713
// https://youtube.com/@AndreoBee
// https://stackoverflow.com/questions/74323173/how-to-map-youtube-handles-to-channel-ids
// One more time YouTube Data API v3 doesn't provide a basic feature.
// https://yt.lemnoslife.com/ Open Source YouTube API
/* sample JSON returned
{
"kind": "youtube#channelListResponse",
"etag": "NotImplemented",
"items": [
{
"kind": "youtube#channel",
"etag": "NotImplemented",
"id": "UC9rnrMdYzfqdjiuNXV7q8oQ"
}
]
}
*/
/// <summary>
/// Return Videos from ChannelId (derived from new Google garbage handle to channel)
/// 20230415
/// </summary>
/// <param name="UserName"></param>
/// <returns></returns>
public async Task<List<YouTubeInfo>> UserVideosViaNewHandleToChannelId(String UserName)
{
string URI = "https://yt.lemnoslife.com/channels?handle=" + UserName;
//
// https://swimburger.net/blog/dotnet/configure-servicepointmanager-securityprotocol-through-appsettings
// https://stackoverflow.com/questions/28286086/default-securityprotocol-in-net-4-5
// without the following Microsoft garbage now (httpClient.GetStringAsync(URI);) will crash.
System.Net.ServicePointManager.SecurityProtocol |=
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
//
// https://learn.microsoft.com/en-us/dotnet/csharp/tutorials/console-webapiclient
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json"));
httpClient.DefaultRequestHeaders.Add("User-Agent", ".NET Foundation Repository Reporter");
//
// "https://api.github.com/orgs/dotnet/repos"
var JSON_String = await httpClient.GetStringAsync(URI);
Console.Write(JSON_String);
// https://peterdaugaardrasmussen.com/2022/01/18/how-to-get-a-property-from-json-using-selecttoken/
var JSON_Object = JObject.Parse(JSON_String);
//
var ChannelId = JSON_Object["items"][0]["id"].ToString();
return await ChannelVideosInfo(ChannelId);
}
截至2023年12月,YouTube API仍然没有支持通过句柄拉取频道数据的端点。
使用 PHP,我确实找到了一些解决方法。
use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;
public function getChannelIDFromUrl($url) {
$httpClient = new HttpBrowser(HttpClient::create());
$crawler = $httpClient->request('GET', $url);
$channelUrl = $crawler->filterXPath('//meta[@property=\'og:url\']')
->attr('content');
return explode('/', $channelUrl)[4];
}
注意:$url 返回一个带有@句柄的字符串。