如何修复Gatsby oEmbed Instagram的故障(附代码)

129 阅读4分钟

我使用Benedicte Raaegatsby-remark-oembed,因为它使在Phil.TechPhil.Bike中嵌入Tweets、Instagram帖子、YouTube视频等就像粘贴URL一样简单:

If it's hot, sit under a tree. If it's cold, put your jacket on. If it's raining, keep riding until you find somewhere dry. No air conditioning required!

https://www.instagram.com/p/B5SYlkZFTBY

If that seems terrible to you, there's some way more mainstream approaches to getting work done on the road.

它通过利用oEmbed来做到这一点,oEmbed是一种出色的格式,允许网页在其他网站上嵌入其页面的代表。你不必四处点击,找到 "用HTML嵌入 "之类的按钮,然后把所有的HTML塞进你的博客文章,你可以让机器人为你做这些。

不出所料,Facebook已经决定迅速行动,再次打破一切,毁掉一些好东西,以便他们可以迫使更多的人建立账户,跳过无意义的障碍。

Facebook已经制作了一个新的Instagram oEmbed API,它取代了Instagram oEmbed Legacy API,后者应该还能工作一段时间:

本页记录的端点将在2020年10月24日被废弃,并返回错误代码400。请使用新的Instagram oEmbed端点来代替;它们提供相同的功能。为了模拟这一变化,看看它是如何影响你的应用程序的,在你的请求中包括breaking_change=oembed查询字符串参数。

返回400的东西听起来不像是 "废弃 "的东西,这听起来像是完全破坏了它。他们在修复旧API的日期上也完全撒谎了,在过去的一两周里出现了400错误,今天是10月15日,而不是10月24日...。

当你直接通过curl接近它时,它仍然工作:

$ curl https://api.instagram.com/oembed/\?url\=https://www.instagram.com/p/B5SYlkZFTBY
{"version": "1.0", "title": "My photo title is here...

但是使用gatsby-remark-oembed插件,这个插件已经持续工作了很久,现在却出现了400错误:

gatsby-remark-oembed。错误嵌入www.instagram.com/p/B5SYlkZFT…请求失败,状态代码400

这个插件的作者建议我们尝试改变URL,如果Facebook能正确地弃用和替换一些东西的话,这不是任何人都应该做的事情,但好吧,我就试试吧!"

// gatsby-config.js

{
  resolve: `@raae/gatsby-remark-oembed`,
  options: {
    providers: {
      include: [
        'Twitter',
        'Instagram',
        'YouTube',
        'Vimeo',
      ],
      settings: {
        Instagram: {
          url: "https://api.instagram.com/oembed/"
        }
      },
    },
  },
}

没有喜悦。它仍然是错误的。

经过一番折腾,我接受了这样的事实:如果我想在我的文章中出现任何Instagram视频,我就必须跳过Facebook要求我跳过的所有障碍,以使用他们的访问限制API。这个新的oEmbed API需要一个oEmbed的访问令牌(这从根本上打破了oEmbed的概念),而且令人沮丧的是,这需要你建立一个Facebook账户,一个Facebook开发者账户,一个Facebook应用程序。

为了重新启用我的一个旧的、实际上不是我的Facebook开发者账户,当然需要上传一个带照片的身份证,但我的口袋里有一本无效的护照,他们不能做任何有趣的事情,所以不管怎样。做了这个,等了一个星期让他们验证,现在我可以登录了。我重新使用了一家破产多年的公司的Facebook应用程序,跳过了一堆验证,现在我可以在我的自行车博客上看到Instagram的视频。多么糟糕的事情。

为了使gatsby-remark-oembed发挥作用,我通过命令行用我的Facebook应用程序的凭证抓取了一个应用程序访问令牌

curl -X GET "https://graph.facebook.com/oauth/access_token?client_id={app-id}&client_secret={app-secret}&grant_type=client_credentials"

然后我把这个令牌直接塞进了gatsby-config.js 的gatsby-remark-oembed的配置中,看看它是否工作:

settings: {
  Instagram: {
    access_token: 'myverysecrettoken',
  },
},

成功了!好了,现在要把它变成一个环境变量!按照Gatsby环境变量文档,我做了一个npm install dotenv ,创建了一个.env.development 文件,并把令牌塞进去:

INSTAGRAM_ACCESS_TOKEN=myverysecrettoken

然后,配置就可以被更新为:

settings: {
  Instagram: {
    access_token: process.env.INSTAGRAM_ACCESS_TOKEN,
  },
},

为了使其发挥作用,别忘了在gatsby-config.js 的顶部添加这个:

require('dotenv').config();

为了让环境变量进入Netlify,以便在生产中构建,而不仅仅是在我的笔记本电脑上,我把INSTAGRAM_ACCESS_TOKEN ,塞进他们的环境界面。

当然,随着时间的推移,我也会找到其他的方法,因为这简直是胡闹。当时我只想发表一篇关于在摩洛哥骑自行车的文章,而不是为一些愚蠢的视频片段建立一个全新的视频流解决方案。

总之,在过去的几个月里,我专注于Stoplight的一些新的API设计工具的产品规划,能用手弄脏一些技术性的东西是很好的,但这不是人们应该需要做的事情。

不要随意地破坏人们的API!弃用涉及到首先警告人们,并逐步淘汰一些东西。这并不意味着说你会在一个月内破坏这些东西,但却在一周内破坏这些东西。不要在OEmbed上添加访问令牌。如果你在处理负载方面有困难,就给它增加一个CDN或其他东西:我不明白把它弄得这么复杂的动机。