使用Twitter用户ID构建Twitter个人资料图片的URL

42

有没有一种方法可以使用用户ID或屏幕名称构建个人资料图片URL?我在数据库中存储用户ID,但不想存储个人资料图片URL。

编辑:
我也不想进行API调用。我想把用户ID放在URL中,例如

<img src="https://twitter.com/users/profile_pic?user_id=123"> 有没有这样的URL可以实现?

10个回答

93

5
如果您在移动浏览器上执行此操作,则无法正确重定向。这是 Twitter 尝试将所有人重定向到 m.twitter.com 的一部分。 - jfred
3
注意!如果你这样做了,而且 screen_name 也已经改变,那么 Twitter 将会把你的图片请求重定向到主页。如果你直接将它们放入 <img src='' /> 中,会变得很混乱。 - Dave Sumter
3
有没有类似的URL可以获取背景图片?它不是像你想象的那样是"profile_background_image",这个和API返回的键值不匹配。 - faceyspacey.com
6
今天似乎 https://twitter.com/TwitterEng/profile_image?size=original 无法加载并显示 Twitter 的错误页面。 - adriaan
8
我试图访问我的个人资料图片 https://twitter.com/Rashid_Jorvee/profile_image?size=original ,但是显示出错信息 抱歉,该页面不存在! - Rashid
显示剩余4条评论

28

截至2020年6月,被接受的答案和avatars.io都已失效。以下是两个替代方案:

unavatar.io

(曾用名unavatar.now.sh)

Unavatar可以从许多不同的地方获取图片,包括Twitter。请在下面的URL中用你想要的Twitter用户名替换[screen_name]

<img src="https://unavatar.io/twitter/[screen_name]" />

例如:

<img src="https://unavatar.io/twitter/jack" width="100" height"100" />

如果上面的演示停止工作,可能是因为unavatar.io不再可用。
不过,Unavatar是开源的,所以如果它停止运行,你可以从GitHub repo部署它——甚至有“Deploy to Vercel/Heroku”按钮。特别是获取Twitter头像的代码在这里,所以你也可以将其作为自己后端的一部分使用。

twivatar.glitch.me

⚠️ 截至2021年7月,此选项已不再可用,请改用上面的选项!
如果您想使用替代方案,也可以使用twivatar.glitch.me。请在下面的URL中将[screen_name]替换为您想要的Twitter用户名。
<img src="https://twivatar.glitch.me/[screen_name]" />

例如:

<img src="https://twivatar.glitch.me/jack" width="100" height"100" />

如果上面的演示停止工作,可能是因为twivatar.glitch.me不再可用。
顺便说一下,我没有建立这两个服务中的任何一个,它们都是由其他人制作的。

虽然这很好,但它并不会返回Twitter上实际的图像URL,这意味着如果像avatars.io一样的“服务”消失了,你就回到了原点。 - d70rr3s
@d70rr3s 你说得对,但是提问者问的是是否有一种仅使用URL的解决方案,而不必将实际图像URL存储在数据库中或进行API调用。因此,“从Twitter返回实际图像URL”的唯一方法是执行301重定向,这意味着您仍然依赖于该服务。但是,我已更新我的答案,包括多个替代方案,包括一个可以一键部署的方案,以防其中任何一个消失,就像avatars.io一样。希望这有所帮助! - Ethan
1
更新:看起来 unavatar.now.sh 已经修复并恢复了!@VictorMota - Ethan
在2023年,unavatar.io似乎不再起作用了 :/ - swyx

21

介绍一种最简单的方法来获取Twitter个人资料图片,而不使用Twitter API:

使用http://avatars.io/

正如@AlexB、@jfred所说,它在移动设备上根本不起作用

而且,使用常见的框架(如PHP或JavaScript)在您的单页中获取重定向URL是相当困难的

只需在您的图像标签中调用http://avatars.io/twitter/ruucm,就像这样:

<img src="https://avatars.io/twitter/ruucm" alt="twt_profile" border="0" width="259"/>

我已经在 Angular 2+ 上测试过它,没有任何问题。


2
这很不错。谢谢分享关于avatars.io的信息! - Barry
似乎这个API需要一个秘密令牌才能被“正确”使用。但是,它在哪里可以获取这些凭据? - Martin
他们的Github链接返回404错误。 - Anthony
话虽如此,他们的API似乎还是能够工作,尽管他们的Github账户已经消失了。 - Anthony
8
Avatars.io不再可用。我已经发布了一个新的答案,提供一个类似的仍然有效的服务:https://dev59.com/WmMl5IYBdhLWcg3wc21p#62263395 - Ethan

3

3
基于@Cristiana214的回答,
以下PHP片段可用于在移动设备上使https://twitter.com/[screen_name]/profile_image?size=normal技巧起作用。
由于Twitter将链接重定向到移动版网站,因此在移动设备上会破坏诸如https://twitter.com/[screen_name]/profile_image?size=normal之类的链接。
因此,脚本获取重定向响应(到用户头像),提取地址,然后重新定向页面本身。
if (!isset($_GET['id'])) $_GET['id'] = 'twitter';
$urlget = curl_init();
curl_setopt($urlget, CURLOPT_URL, 'https://twitter.com/' . $_GET['id'] . '/profile_image?size=normal'); 
curl_setopt($urlget, CURLOPT_HEADER, true);
curl_setopt($urlget, CURLOPT_RETURNTRANSFER, 1); 
$res = curl_exec($urlget);
preg_match_all("/location: (.*)/", $res, $found);
header('Location: ' . $found[1][0]);

所以,这可以通过twitteravatar.php?id=twitter访问,该文件(在撰写本文时)重新加载到https://pbs.twimg.com/profile_images/767879603977191425/29zfZY6I_normal.jpg
不太美观但是有效。

3
我用C#找到了这样的解决方案:
    public string Text_toTextFinder(string text, string Fromhere, string Here)
    {
        int start = text.IndexOf(Fromhere) + Fromhere.Length;
        int finish = text.IndexOf(Here, start);
        return text.Substring(start, finish - start);
    }
    string getPhotoURL(string UserName, string size ="x96")
    {
        using (WebClient client = new WebClient())
        {
            client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
            string htmlCode = client.DownloadString("https://twitter.com/" + UserName);
            return Text_toTextFinder(Text_toTextFinder(htmlCode, "<td class=\"avatar\">", "</td>"), "src=\"", "\"").Replace("normal",size);
        }
    }

使用方法:

MessageBox.Show(getPhotoURL("screen_name")); //size = 96x96
MessageBox.Show(getPhotoURL("screen_name","normal"));
MessageBox.Show(getPhotoURL("screen_name","200x200"));
MessageBox.Show(getPhotoURL("screen_name","400x400"));

2

您可以使用Twitter API的users/show方法来获取它 - 它正好能做到您描述的所有内容。您提供ID或屏幕名称,它会返回一堆数据,包括profile_image_url


1
我不想进行API调用。我想把用户ID放在URL中,例如: <img src="https://twitter.com/users/profile_pic?user_id=123"> 这可行吗? - mcan
3
据我所知,这方面似乎没有办法。在过去几年中,Twitter关于他们的API一直非常讨人厌。 - dnet

-1

-2

我正在使用一种巧妙的方式,通过PHP Dom解析器

include('simple_html_dom.php');
$html = file_get_html('http://twitter.com/mnckry');
$img = array();

foreach($html->find('img.size73') as $e)
    $img[] = $e->src;

foreach($html->find('.profile-header-inner') as $e)
    $img[] = str_replace("')", "", str_replace("url('", "", $e->{'data-background-image'}));



echo $img[0];//Avatar
echo "<br>";
echo end($img);//ProfileBG

这将会给你类似于这样的东西; https://pbs.twimg.com/profile_images/378800000487958092/e04a191de329fcf8d000ca03073ad594_bigger.png 获取其他两个尺寸; 对于大版本,请删除“_bigger”,对于小版本,请将“_bigger”替换为“_normal”。

-6

3
"_normal.png" 之前的第二个哈希值也是独一无二的,所以这样做行不通。 - Mike Barwick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接