首先,这个主题已经存在一些问题,但没有一个问题完全掩盖了我的问题,因为它要么不是我需要的数据,要么无法正常工作。
InstaDP 等服务可以向您显示 Instagram 中任何个人资料图片的 HQ 版本。现在,我想知道这怎么可能?
我做了一些研究,在访问 https://www.instagram.com/instagramforbusiness/?__a=1 时能够找到更高质量的 URL(参见
profile_pic_url_hd
,回答此处)。然而,InstaDP 似乎有一个后端,它返回一个不同的网址,重定向到更高质量的图像:https://instadp-cors-222621.appspot.com/get-hd?id=1107766105(参见hd_profile_pic_url_info
)
,我从 ?__a=1
链接的结果中提取了 URL 的 ID)。我用我的个人资料对此进行了测试,并能够以 1024x1024 的出色质量获得我自己的图像。然而,?__a=1
链接似乎只返回我的个人资料图片的320x320链接。
由于 InstaDP 似乎不是唯一能够获取总部个人资料图片的玩家,因此我继续比较了这些玩家的后端。似乎每个服务对于同一 Instagram 帐户的总部个人资料图片都有不同的 URL。所以我的结论是 Instagram API 参与了这一切。
所以我在 https://www.instagram.com/developer/ 创建了一个客户端密钥。我还能够获取我的身份验证令牌并确定我登录的
X-CSRFToken
标头的 csrftoken。现在我的问题是如何继续?
我找到了这个主题的一些答案,说明我应该请求 https://i.instagram.com/api/v1/users/1107766105/info/,但它总是以 HTML 形式返回登录页面。
我之前尝试过使用 Chrome cookie 并登录 Instagram 的 REST 客户端,我尝试将 HTTP 标头设置为
X-CSRFToken:<mycookietoken>
和 Content-Type:application/json
。 (如果我没有设置 CSRFToken
,它会出错,所以我需要添加它,但如果设置了标头,即使 CSRFToken
正确,我也会再次获取 HTML。当CSRFToken
是错误的。)
我还尝试设置
Origin
、Referer
和 Host
来欺骗 Instagram 相信请求来自其自己的窗口位置,但没有运气。设置 Host
甚至会导致 400 错误请求。即使在 URL 中添加我的访问令牌也没有效果 (?access-token=########
)。
总结一下我的问题,这些服务如何从
cdninstagram
服务器获取高达 1024x1024 的高质量个人资料图片?
虽然我迟到了,但这可能对某人有帮助:
第1步: 您需要获取高清 Instagram 个人资料图片的第一件事是他们的个人资料 ID。这可以在用户配置文件链接的源代码中找到。例如,如果您查看以下链接的来源https://www.instagram.com/abdulhaq0/并搜索“logging_page_id”,您将获得“profilePage_1285389476”。个人资料页面后面的数字是该帐户的 ID。
第2步: 接下来,您需要将 ID 放入以下 URL https://i.instagram.com/api/v1/users/{ProfileID}/info/ 并在浏览器中打开它。在我们的例子中,链接是https://i.instagram.com/api/v1/users/1285389476/info/
第3步: 现在在上面的链接上搜索“hd_profile_pic_url_info”。在那里你可以得到高清 Instagram 个人资料图片的 URL。
希望这有帮助。
步骤:
或者如果您没有链接,instagram api 会在结果数组中为您提供一个永久链接选项,上面的链接为 Bo-Jru-g7Wa
结果:高质量图像网址:
https://www.instagram.com/p/Bo-Jru-g7Wa/media?size=l
这个链接可以被视为 Instagram 图像 URL 的速记代码,它要大得多
我相信像 https://instadp.site/ 这样显示高分辨率用户个人资料图像的网站不使用官方 Instagram API。
过去可以破解 Instagram 的 CDN URL 来更改参数并从中获取高分辨率,但现在 URL 已签名,如果更改任何参数,URL 将失败。
因此,他们可能使用的唯一解决方案是模拟客户端。有一个流行的 PHP 客户端:https://github.com/mgp25/Instagram-API
Instagram API 已更新。现在我们只能得到 320x320 大小的图像
https://www.instagram.com/{username}/?__a=1
即使您从此端点获取用户 ID,“用户信息”端点也不会在其响应中返回 hd url,并且现在也应该传递标头。
import requests
def get_user_by_user_id(user_id):
if user_id:
base_url = "https://i.instagram.com/api/v1/users/{}/info/"
headers = {
'user-agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Instagram 105.0.0.11.118 (iPhone11,8; iOS 12_3_1; en_US; en-US; scale=2.00; 828x1792; 165586599)'
}
try:
res = requests.get(base_url.format(user_id),headers=headers)
print(res.json())
except Exception as e:
print("getting user failed, due to '{}'".format(e.message))
get_user_by_user_id(userid)
您可以检查此代码并尝试。像 instadp 这样的网站我猜他们不使用 instagram 的官方 API
获取高清 (1080x1080) 个人资料图片的最简单、最可靠的方法是 Instaloader CLI。
instaloader USERNAME_OF_INTEREST --no-posts --login YOUR_USERNAME