web-dev-qa-db-ja.com

Instagram公開RSSフィード

Ink361がユーザー名からInstagram RSSフィードをどのように作成しているか疑問に思いました。

フィードの例: http://ink361.com/feed/user/snoopdogg

ブログ記事: http://blog.ink361.com/post/23664609916/new-rss-instagram-feed-feature-on-ink361-com

どんな洞察もありがたいです。

ありがとう。

17
johnnyknox

Instagramには一般公開されているRSS APIがあり、それに関する情報を見つけることは困難ですが、タグに対しては機能します(使用しています)。

タグの構文は次のとおりです。

http://instagr.am/tags/some-tag-you-want-to-follow/feed/recent.rss

私はそれについての情報を見つけるのは本当に難しいと言っていたので、それらがユーザーのフィードに似たものを持っているかどうかはわかりません。タグ。

これについての公式ブログ投稿があります(タグのみをカバーしています): http://blog.instagram.com/post/8755963247/introducing-hashtags-on-instagram

11
Viktor Benei

@ 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 を使用すると、その方法がわかります。

5
jonathanbell

torvinに感謝します。

APIを使用せずにサイトでInstagramイメージを取得する方法は次のとおりです。

URLとユーザー名からJSONファイルを作成します(これを1日X回、cronジョブとして設定します)

<?
$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フィードからいくつかの画像を表示する

<?
$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.'" />';
?>
4
user2543857

/users/user-id/media/recent APIエンドポイントを使用して、Instagramユーザーのフィードにアクセスできます。このエンドポイントにはaccess_tokenが必要です。これは、Instagramでsome userを認証することで取得できます(フィードを要求するものとは限りません)。 access_tokenを受信するプロセスは ここ で説明されています。

そのため、ink361が行うことは、自分(Instagramのユーザー)に対してaccess_tokenを取得し、それを使用して他のユーザーのフィードに対して/users/user-id/media/recentリクエストを行うことです。そのような単純な。

3
jamix

私がink361だったら、Instagramページをクロールし、HTMLを解析してRSSに変換するだけでした。 API、承認、問題はありません。

2
torvin

残念ながら、上記のuser2543857のソリューションは機能しません。ただし、現在のプロファイルページのソースで動作するバージョンは次のとおりです。

URLとユーザー名からJSONファイルを作成します(これを1日X回、cronジョブとして設定します)

<?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.'" />';
?>
2
Trae