如何修复编码返回的 Youtube API 结果标题

Posted

技术标签:

【中文标题】如何修复编码返回的 Youtube API 结果标题【英文标题】:How to fix Youtube API results title that are returned encoded 【发布时间】:2019-08-18 12:19:24 【问题描述】:

我正在使用youtube-search 1.1.4 查找视频。问题是我得到的结果标题用&' 编码,而不仅仅是&' 等等。

我从下面的示例代码中得到的一个结果示例(同样,故意在字符之间添加空格): title: "Post Malone - "Wow." (Official Music Video)"

尝试通过 decodeURI 、decodeURIComponent 或 unescape 解决这个问题,但没有帮助。 直接调用youtube api 并得到相同的结果。 我错过了什么?

var youtubeSearch = require("youtube-search")

var opts = 
  maxResults  : 15,
  key         : 'MY_API_KEY',
  part        : 'snippet',
  type        : 'video',
;

youtubeSearch('post malone', opts, function(err, results) 
  if(err) return console.log(err);

  console.dir(results);
);

【问题讨论】:

如果您不介意使用库,请快速搜索找到我He.js 我自己已经看到这种行为两个多星期了。我的理解是这个问题其实是 API 的一个bug。也许您应该向issuetracker.google.com 提交错误报告。 搜索了谷歌问题跟踪器,发现:issuetracker.google.com/u/1/issues/128673539 @ramidulman 这不是同一个问题。如果字符串本身包含此字符,则 JSON 字符串必须使用反斜杠转义双引号字符。例如""" 无效,而"\"" 有效。链接的问题与 html 编码无关。 @3limin4t0r:抱歉,您错了:rami dulman 确实将他的问题与 Google 的问题 #128673539 正确关联。请参阅我的评论issuetracker.google.com/issues/128673539#comment8。 【参考方案1】:

你可以使用 DOM Parser

var parser = new DOMParser;

let finalResult = parser.parseFromString(results, "text/html")
console.log(finalResult.body.innerHtml); // will turn & to &

【讨论】:

这可行,但我想知道这是否是正确的解决方案,我是否需要使用整个 DOMParser 来解码我的 React 组件中的 Youtube 视频标题? 似乎@ErikAGriffin 提到了一个小得多的替代库 - unescape。 github.com/jonschlinkert/unescape 编辑:发现了一个由已知的 sindresorhus 更新的软件包,3 个月前与 unescape 2 年前更新。 npmjs.com/package/escape-goat【参考方案2】:

在 google 的问题跟踪器上找到相关票证后: issuetracker.google.com/u/1/issues/128673539 并得到谷歌的回应,这是预期的行为,他们不会修复它,我只是使用用户 3limin4t0r 建议并使用 he.js 库解码返回值标题,这是解决这个问题的空闲方式但我无意等待谷歌做出决定......

所以,我的解决方案是这样的:

var youtubeSearch = require("youtube-search")
let he            = require('he');

var opts = 
  maxResults  : 15,
  key         : 'MY_API_KEY',
  part        : 'snippet',
  type        : 'video',
;

youtubeSearch('post malone', opts, function(err, results) 
  if(err) return console.log(err);
  results = results.map(item => 
        item.snippet.title = he.decode(item.snippet.title);
        return item;
   );
  console.dir(results);
);

【讨论】:

如果您只需要对 html 实体进行转义,那么这个库要小得多:unescape

以上是关于如何修复编码返回的 Youtube API 结果标题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 从 youtube v3 api 修复 json?

如何确保 YouTube API 仅返回可在 iPhone 上流式传输的视频?

使用 Youtube API 在网络服务器上显示视频时如何修复播放 ID 错误?

YouTube 数据 API 某些视频不返回频道

如何从 googleapi Youtube API 获取 XML 响应

Google Maps API:返回邮政编码结果