Instagram 公共 RSS 提要
Posted
技术标签:
【中文标题】Instagram 公共 RSS 提要【英文标题】:Instagram public RSS feed 【发布时间】:2013-02-07 09:38:27 【问题描述】:我想知道 ink361 是如何从用户名创建 Instagram RSS 提要的。
Feed 示例:http://ink361.com/feed/user/snoopdogg
博文: http://blog.ink361.com/post/23664609916/new-rss-instagram-feed-feature-on-ink361-com
任何见解将不胜感激。
谢谢。
【问题讨论】:
我看到 ink361 用户的 RSS 提要不再工作。 根据新的 TOS,您/我们将无法从用户提要中读取信息,并且可能从关键字中读取。 browse-tutorials.com/snippet/php-instagram-rss-feed 这个利用了分页。因此,您可以控制项目数量。 现在看起来在 2018 年他们正在取消 api 并且通过 rss 提要获取数据不可行?总是在改变东西,让人发疯。 【参考方案1】:Instagram 有一个可公开访问的 RSS API,很难找到任何有关它的信息,但它适用于标签(我们确实使用它)。
标签的语法如下:
http://instagr.am/tags/some-tag-you-want-to-follow/feed/recent.rss
我不确定他们是否对用户的提要有类似的东西,因为我说过很难找到有关它的信息,而且它可能会一天天消失,有利于官方 API,但现在它适用于标签。
这是一篇关于它的官方博客文章(虽然它只涉及标签):http://blog.instagram.com/post/8755963247/introducing-hashtags-on-instagram
【讨论】:
嗨维克多。您还在使用 RSS 提要吗?我会对您的用例感到好奇/感兴趣(有链接吗?)。谢谢! @Paulo 不,不再是。我们将它用于我当时正在开发的 ios 应用程序。 最近这个提要已经停止工作:(我在几个项目中使用过它,我感觉他们只是忘记了它!他们一定已经注意到了......跨度> 【参考方案2】:@user2543857 的回答很好。不幸的是,Instagram 数据的结构发生了变化。从发布之日起,这将起作用。复制/粘贴到您的 PHP 服务器上的文件中并使用如下: yoursite.com/instarss.php?user=name_of_instagram_user 这将返回有效的 XML/RSS 提要。
编辑!!自然,页面/JSON 的输出随着 instagram 的新外观/感觉而改变。这是更新的代码(2015 年 6 月):
<?php
if (!isset($_GET['user']))
exit('Not a valid RSS feed. You didn\'nt provide an Instagram user. Send one via a GET variable. Example .../instarss.php?user=snoopdogg');
header('Content-Type: text/xml; charset=utf-8');
$html = file_get_contents('http://instagram.com/'.$_GET['user'].'/');
$html = strstr($html, '"static_root');
$html = strstr($html, '</script>', true);
//$html = substr($html,0,-6);
$html = substr($html, 0, -1);
$data = json_decode($html);
// print_r($data->entry_data->ProfilePage[0]->user->media->nodes);
$rss_feed = '<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel>';
$rss_feed .= '<title>'.$_GET['user'].'\'s Instagram Feed</title><atom:link href="http://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"].'" rel="self" type="application/rss+xml" /><link>http://instagram.com/'.$_GET['user'].'</link><description>'.$_GET['user'].'\'s Instagram Feed</description>';
foreach($data->entry_data->ProfilePage[0]->user->media->nodes as $node)
$rss_feed .= '<item><title>';
if(isset($node->caption) && $node->caption != '')
$rss_feed .= htmlspecialchars($node->caption, ENT_QUOTES, ENT_HTML5);
else
$rss_feed .= 'photo';
// pubdate format could also be: "D, d M Y H:i:s T"
$rss_feed .= '</title><link>https://instagram.com/p/'.$node->code.'/</link><pubDate>'.date("r", $node->date).'</pubDate><dc:creator><![CDATA['.$_GET['user'].']]></dc:creator><description><![CDATA[<img src="'.$node->display_src.'" />]]></description><guid>https://instagram.com/p/'.$node->code.'/</guid></item>';
// foreach "node" (photo)
$rss_feed .= '</channel></rss>';
echo $rss_feed;
?>
其实,不要使用上面的代码。 以后我会尽量维护this Gist。
2016 年 12 月编辑:我已经厌倦了追逐不断变化的 Instagram 输出,只是为了筛选它并在几个月后对其进行更改。我想说只使用 API。如果您仍然对从用户页面制作 RSS 提要感兴趣,this Gist 应该让您知道如何做。
【讨论】:
感谢您的代码。请注意,使用 PHP 5.5 我遇到了由 htmlspecialchars 引起的错误,必须将 ENT_HTML5 更改为 'utf-8' 然后它开始了发挥魅力。 @MPękalski 很高兴知道!很高兴它有帮助。 很棒的工作,很高兴你也可以使用标签。谢谢 @marca 谢谢!请记住使用标签,您必须经常查询 RSS,因为某些标签使用频率很高,并且数据会快速更新。这样,脚本就不会错过帖子!【参考方案3】:您可以使用/users/user-id/media/recent
API 端点访问任何 Instagram 用户的提要。此端点需要一个access_token
,您可以通过使用 Instagram 授权 some user(不一定是您为其请求提要的用户)来获取该地址。接收access_token
的过程描述为here。
因此,ink361 可能正在做的是为自己(他们在 Instagram 上的用户)获取一个 access_token
,并使用它为任何其他用户的提要发出 /users/user-id/media/recent
请求。就这么简单。
【讨论】:
This endpoint 基本相同,只是需要一个客户端ID。 澄清一下:这将提供对 Instagram API 资源的访问,该资源将是 JSON 文档,而不是 RSS 提要。【参考方案4】:感谢 torvin 的提示。
以下是不使用 API 即可在您的网站上获取 Instagram 图片的方法。
从 url 和用户名创建 json 文件(将此设置为 cron 作业,每天 X 次)
<?
$html = file_get_contents('http://instagram.com/username/');
$html = strstr($html, '["lib');
$html = strstr($html, '</script>', true);
$html = substr($html,0,-6);
file_put_contents("username.json",$html);
?>
显示来自 json feed 的几张图片
<?
$json = file_get_contents('username.json');
$data = json_decode($json);
$img1 = $data[2][0]->props->userMedia[0]->images->standard_resolution->url;
$img2 = $data[2][0]->props->userMedia[1]->images->standard_resolution->url;
$img3 = $data[2][0]->props->userMedia[2]->images->standard_resolution->url;
print '<img src="'.$img1.'" />';
print '<img src="'.$img2.'" />';
print '<img src="'.$img3.'" />';
?>
【讨论】:
技术不错。我认为如果 Instagram 更改 JSON 的格式或更改页面的工作方式,这有可能在未来某个时候失败。 技术不错。输出已更改,但很容易找出并将其再次应用于屏幕抓取。 :) 干杯! 知道如何在 2018 年做到这一点吗?【参考方案5】:如果我是 ink361,我只会抓取 Instagram 页面,解析 HTML 并将其转换为 RSS。没有 API,没有授权,没有问题。
【讨论】:
问题是,Instagram 完全是由 javascript 生成的。这似乎很疯狂 - 特别是对于一个针对移动用户的网站 - 但按照您的建议抓取它变得更加困难。 如果 Instagram 让工作变得更轻松!看instagram.com/snoopdogg的源码,以["lib\/fullpage\/transitions"...开头的那行就是纯JSON。因此,您甚至根本不需要解析 HTML!只需使用任何 JSON 解析器即可! - 您的 RSS 提要的数据已准备就绪【参考方案6】:不幸的是,上面 user2543857 的解决方案不再有效。不过,这是一个适用于当前个人资料页面源的版本。
从 URL 和用户名创建 JSON 文件(将此设置为 cron 作业,每天 X 次)
<?php
$json = file_get_contents('http://instagram.com/username');
$json = strstr($json, '"entry_data"');
$json = strstr($json, '</script>', true);
$json = rtrim($json,';');
file_put_contents("username.json",$json);
?>
显示来自 JSON 提要的几张图片
<?php
$json = file_get_contents('username.json');
$data = json_decode($json,true);
$img1 = $data['entry_data']['UserProfile'][0]['userMedia'][0]['images']['thumbnail']['url'];
$img2 = $data['entry_data']['UserProfile'][0]['userMedia'][1]['images']['thumbnail']['url'];
$img3 = $data['entry_data']['UserProfile'][0]['userMedia'][2]['images']['thumbnail']['url'];
print '<img src="'.$img1.'" />';
print '<img src="'.$img2.'" />';
print '<img src="'.$img3.'" />';
?>
【讨论】:
将完整尺寸 640 x 640 的“thumbnail”替换为“standard_resolution”或 306 x 306 的图像替换为“low_resolution”。【参考方案7】:您可以使用他们的 API 访问您的 instagram RSS 提要。他们的 API 使用 oAuth2 进行身份验证。我在我的个人博客上使用这种方法在主页上拉入 instagram 图片。我怀疑这就是ink361 网站的工作方式。 Ink361 将连接到 instagram api 并通过 instagram 框提示用户登录,他们使用该框允许ink361 访问他们的 instagram 帐户。一旦身份验证成功,ink361 站点将缓存 instagram 收到的令牌,以便他们可以使用相同的令牌定期重复返回 instagram api 进行身份验证。宾果游戏您可以访问用户数据,并且可以从中创建 rss 提要。
【讨论】:
嗨,马修,感谢您的回答。 Ink361 的问题是他们不使用 oAuth。我还没有批准 ink361 应用程序(我不是 snoop dogg ;)但我仍然可以获得 snoop dogg 的 RSS:ink361.com/feed/user/snoopdogg【参考方案8】:答案很简单。 要访问用户数据,您只需拥有有效的访问令牌。 ink361 在社交网络http://vk.com/app3225087 中有一个应用程序,它将经过身份验证的用户访问令牌存储在数据库中。 它只剩下在 db 中找到一个有效的并获取您想要的任何用户数据
【讨论】:
以上是关于Instagram 公共 RSS 提要的主要内容,如果未能解决你的问题,请参考以下文章
为什么iTunes商店评论RSS Feed有时会返回没有结果?
是否可以从 restservice java 消费 rss 提要?