获取 GitHub 讨论正文时处理 `private-user-images`
发布在
Blog/zh
于12/13/2023
, last edited on12/13/2023
.
当我构建这个博客的新版本时,我使用了 GitHub Discussions API 提供的 bodyHTML 来提高性能。 一开始一切都很顺利,但是当我为内容设置缓存时,图像全部损坏了。 我发现 private-user-images.githubusercontent.com 可能导致了这个问题。 这篇博客将介绍我是如何处理的。
破碎的图像
我为 API 设置了缓存,以提高性能并避免额外请求。起初,我将最大时长设置为 60 * 60,即一个小时。然而,大约过了 5 分钟,文章中的所有图片都坏了。当我在浏览器中打开开发人员面板时,我发现这些图片的源 URL 并不是原始 URL。
在讨论正文的编辑器中,我的图片 URL 是:
![](https://github.com/ocoke/Biscus/assets/71591824/b6b47ca0-f77c-432a-8c0f-942a9b204b0a)
然而,当应用程序接口将其渲染为 HTML 时,它却变成了:
<img src="https://private-user-images.githubusercontent.com/71591824/286707243-b6b47ca0-f77c-432a-8c0f-942a9b204b0a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTEiLCJleHAiOjE3MDIwOTQ0MjMsIm5iZiI6MTcwMjA5NDEyMywicGF0aCI6Ii83MTU5MTgyNC8yODY3MDcyNDMtYjZiNDdjYTAtZjc3Yy00MzJhLThjMGYtOTQyYTliMjA0YjBhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFJV05KWUFYNENTVkVINTNBJTJGMjAyMzEyMDklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjMxMjA5VDAzNTUyM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI5ZGQ3ZTNhN2VkZGI1ZTM0MDljMTM2MDAwMTMzZDY1YjdiMTdmYjBiYmZiOTQxYzEyMTlhNWQxY2U5OWJjYzcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.xw9990CeWP9d-lOCY_Be1co9hATFX-XYjXZCx2CnQF0" alt="" style="max-width: 100%;">
URL 变得超长,其中包含一个令牌,源域名变成了 private-user-images.githubusercontent.com
。我发现令牌是 JWT
格式的(查询密钥也提到了这一点)。
JWT 解码
好吧,让我们从 ?jwt=
中找出答案。
打开 https://jwt.io/ ,将完整的 Token 粘贴到 Encoded
中。
然后,我们可以发现 payload
中有一些有用的信息。
例如,exp
表示过期时间,nbf
表示在此之前无效。
因此,我们可以推断图片的过期时间为 5 分钟。因为我们一开始设置的是一小时缓存,所以过了最初的 5 分钟后,图片将不可用。
解决方案
我们可以将缓存设置为 5 分钟,以避免过期。这样就可以了,这也是解决这个问题最简单的方法。
我们还可以使用 API 获取正文,以返回原始标记符格式的正文。然后,我们需要匹配并获取所有源图像的 URL 以替换它们(尽管这不是一个好主意)。
或者,我们可以自己渲染 markdown 内容,或者调用 api.github.com
上的 /markdown
API。