获取 GitHub 讨论正文时处理 `private-user-images`

发布在 Blog/zh12/13/2023, last edited on 12/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 中。

image

然后,我们可以发现 payload 中有一些有用的信息。

例如,exp 表示过期时间,nbf 表示在此之前无效。

image

因此,我们可以推断图片的过期时间为 5 分钟。因为我们一开始设置的是一小时缓存,所以过了最初的 5 分钟后,图片将不可用。

解决方案

我们可以将缓存设置为 5 分钟,以避免过期。这样就可以了,这也是解决这个问题最简单的方法。

我们还可以使用 API 获取正文,以返回原始标记符格式的正文。然后,我们需要匹配并获取所有源图像的 URL 以替换它们(尽管这不是一个好主意)。

或者,我们可以自己渲染 markdown 内容,或者调用 api.github.com 上的 /markdown API。