我正在从 Graph API 获取 Instagram 图像,特别是 IG 用户媒体 终点
要求:
GET /me/media/?
access_token=<token>&
fields=id,caption,media_type,media_url,permalink,timestamp,username
媒体 URL 保存到数据库中,格式为:
https://scontent-iad3-1.cdninstagram.com/v/t51.29350-15
/336488XXX_42796964621XXXX_411090403787759XXXX_n.jpg?
_nc_cat=107&
ccb=1-7&
_nc_sid=8ae9d6&
_nc_ohc=Pji5XmNsjN4AX-9CEpw&
_nc_ht=scontent-iad3-1.cdninstagram.com&
edm=ANo9K5cEAAAA&
oh=00_AfCauzwgMIg6CNeeGLrt9OwVmW72sy9ndxgaMYciKOHxhw&
oe=650CEAF2
现在,这些 URL 在一定时间后就会过期。
问题是我不知道那个时间段是什么。
可以使用每 x 小时的计时作业更新网址,但选项是:
经过几次测试,看起来在短时间内(约 1 小时,也许更长)多次调用获取资产会返回完全相同的 url。
我的理解是,这使事情变得更加复杂,因为这意味着网址不会根据请求的时间而过期,而是具有固定的窗口。
可以从url参数中获取过期时间吗?
有没有关于 Instagram 如何处理 URL 过期的详细信息的文档?
结果
oe
url 参数包含以十六进制编码的到期时间戳。
在 JavaScript/TypeScript 中检查 url 何时过期:
export function isIgMediaUrlValidTill(
mediaUrl: string | URL,
till: Date = new Date()
): boolean {
let url = new URL(mediaUrl);
let urlExpiryTimestamp = parseInt(url.searchParams.get("oe") ?? "0", 16);
let tillTimestamp = Math.floor(till.getTime() / 1000);
return tillTimestamp <= urlExpiryTimestamp;
}