如何修复编码返回的 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 结果标题的主要内容,如果未能解决你的问题,请参考以下文章