RSS-рассылка Instagram
Мне было интересно, как ink361 создает RSS-канал Instagram из имени пользователя.
Пример: http://ink361.com/feed/user/snoopdogg
Сообщение в блоге:
http://blog.ink361.com/post/23664609916/new-rss-instagram-feed-feature-on-ink361-com
Любое понимание будет оценено.
Спасибо.
Ответы
Ответ 1
Instagram имеет общедоступный RSS-интерфейс, ему трудно найти какую-либо информацию об этом, но он работает с тегами (мы его используем).
Для тегов синтаксис следующий:
http://instagr.am/tags/some-tag-you-want-to-follow/feed/recent.rss
Я не уверен, что у них есть что-то похожее для фидов пользователей, так как я сказал, что очень сложно найти информацию об этом, и может исчезнуть с одного дня на другой в пользу официального API, но прямо сейчас он работает для тегов.
Здесь публикуется официальное сообщение в блоге (хотя оно охватывает только теги): http://blog.instagram.com/post/8755963247/introducing-hashtags-on-instagram
Ответ 2
@пользователь2543857 ответ был хорошо. К сожалению, структура данных Instagram изменилась. По состоянию на дату публикации этого, это будет работать. Скопируйте/вставьте файл в свой PHP-сервер и используйте как: yoursite.com/instarss.php?user=name_of_instagram_user. Это вернет корректный канал XML/RSS.
ИЗМЕНИТЬ!! Естественно, выход страницы /JSON изменился с новым интерфейсом instagram. Вот обновленный код (июнь, 2015):
<?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'].'\ 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'].'\ 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;
?>
Собственно, не используйте приведенный выше код. Я попытаюсь сохранить этот Gist в будущем.
EDIT Декабрь 2016 года: Я устал преследовать каждый изменяющийся вывод Instagram только для того, чтобы очистить экран и изменить его несколько месяцев спустя. Я бы сказал, просто используйте API. Если вы все еще заинтересованы в создании RSS-ленты с пользовательской страницы, этот Gist должен дать вам идея о том, как это сделать.
Ответ 3
Благодаря torvin для наконечника.
Вот как вы можете получать изображения instagram на своем сайте без использования API.
Создайте json файл из url и username (установите это как задание 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
<?
$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
Вы можете получить доступ к фиду для любого пользователя Instagram, используя конечную точку API /users/user-id/media/recent
. Для этой конечной точки требуется access_token
, которую вы можете получить, авторизуя некоторого пользователя с Instagram (не обязательно тот, который вы запрашиваете для канала). Процесс получения access_token
описан здесь.
Итак, что может сделать ink361, получите access_token
для себя (своего пользователя на Instagram) и используйте это, чтобы сделать запросы /users/user-id/media/recent
для любых других каналов пользователей. Просто как это.
Ответ 5
Если бы я был ink361, я бы просто сканировал страницы Instagram, анализировал HTML и превращал его в RSS. Нет API, нет авторизации, нет проблем.
Ответ 6
В соответствии с новым TOS вы/мы не сможем читать из фида пользователей и, возможно, из ключевых слов.
Ответ 7
К сожалению, приведенное выше решение пользователя2543857 больше не работает. Здесь версия, которая работает с текущим источником страницы профиля.
Создайте JSON файл по URL-адресу и имени пользователя (установите это как задание 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.'" />';
?>
Ответ 8
Вы можете получить доступ к вашему rss-каналу для instagram, используя их API. Их API использует oAuth2 для аутентификации. Я использую этот метод в своем личном блоге, чтобы вытащить фотографии instagram на главной странице. Я подозреваю, что так работает сайт ink361. Ink361 подключается к instagram api и запрашивает у пользователя логин через окно instagram, которое они используют, чтобы позволить ink361 получить доступ к своей учетной записи instagram. Сайт ink361 будет кэшировать токен, полученный с помощью instagram после успешной проверки подлинности, поэтому они могут повторно возвращаться к instagram api на периодической основе, используя тот же токен для аутентификации. Bingo у вас есть доступ к данным пользователей, и вы можете создать rss-канал из него.
Ответ 9
Ответ прост.
Чтобы получить доступ к пользовательским данным, вы должны иметь действительный токен доступа.
У ink361 есть приложение в социальной сети http://vk.com/app3225087, в котором хранятся токены, прошедшие проверку подлинности, в db.
Его осталось оставить в db действительным и получить любые пользовательские данные, которые вы хотите