Загальнодоступний RSS-канал Instagram

Мені було цікаво, як ink361 створював RSS-канал Instagram з імені користувача.

Example feed: http://ink361.com/feed/user/snoopdogg

Blog post: http://blog.ink361.com/post/23664609916/new-rss-instagram-feed-feature-on-ink361-com

Будь-яке розуміння буде оцінено.

Дякую.

16
Схоже, що тепер у 2018 році вони позбавляються апі і вибірки даних по RSS-каналу не виконується? Завжди міняючи речі, виганяє одного.
додано Автор drooh, джерело
Я бачу, що RSS-канал користувача ink361 більше не працює.
додано Автор jonathanbell, джерело
Відповідно до нового TOS ви/ми не зможемо читати з каналу користувачів і, можливо, з ключових слів.
додано Автор PJunior, джерело
browse-tutorials.com/snippet/php-instagram-rss-feed цей підхід використовує пейджинговий зв'язок. Таким чином, ви можете контролювати кількість елементів.
додано Автор ram4nd, джерело

8 Відповіді

У Instagram є загальнодоступний RSS API, важко знайти будь-яку інформацію про нього, але він працює для тегів (ми його використовуємо).

Для тегів синтаксис такий:

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

Я не впевнений, що вони мають щось подібне для каналів користувачів, оскільки я сказав, що дуже важко знайти інформацію про нього, і він може зникнути з дня на день на користь офіційного API, але зараз він працює для теги.

Here's an official blog post about it (although it covers only tags): http://blog.instagram.com/post/8755963247/introducing-hashtags-on-instagram

11
додано
На сьогоднішній день цей канал перестав працювати :( Я використав його на декількох проектах, у мене є відчуття, що вони просто забули про це! Вони повинні були це помітити ...
додано Автор Nathan Hornby, джерело
@Paulo ні, не більше. Ми використовували його для додатка iOS, над яким я працював у той час.
додано Автор Viktor Benei, джерело
Привіт, Вікторе. Ви все ще використовуєте канал RSS? Мені було б цікаво/цікаво у вашому випадку використання (чи є посилання?). Дякую!
додано Автор Paulo, джерело

Відповідь @ user2543857 була гарною. На жаль, структура даних Instagram змінилася. На дату розміщення цього буде працювати. Скопіюйте/вставте у файл на вашому PHP-сервері і використовуйте як: yoursite.com/instarss.php?user=name_of_instagram_user Це поверне дійсний канал XML/RSS.

EDIT!! Naturally, the output of the page/JSON has changed with instagram's new look/feel. Here is updated code (June, 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_feed .= '<title>'.$_GET['user'].'\'s Instagram Feed</title><link>http://instagram.com/'.$_GET['user'].'</link>'.$_GET['user'].'\'s Instagram Feed';

foreach($data->entry_data->ProfilePage[0]->user->media->nodes as $node) {

    $rss_feed .= '<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>'.date("r", $node->date).'display_src.'" />]]>https://instagram.com/p/'.$node->code.'/';

}//foreach "node" (photo)

$rss_feed .= '';

echo $rss_feed;
?>

Actually, don't use the above code. I'll try to maintain this Gist in the future.

EDIT December 2016: I'm tired of chasing the every-changing Instagram output only to screen scrape it and have it change a few months later. I'd say just use the API.. If you are still interested in making an RSS feed from a user's page, this Gist should give you an idea of how to do it.

5
додано
@marca спасибі! Просто пам'ятайте з тегами, вам доведеться часто запитувати RSS, оскільки деякі теги використовуються досить часто, і дані будуть швидко оновлюватися. Таким чином, скрипт не пропустить повідомлення!
додано Автор jonathanbell, джерело
@ MPękalski Добре знати! Радий, що це допомогло.
додано Автор jonathanbell, джерело
Дякую за код. Просто зауваження, з PHP 5.5 я отримував помилку, викликану htmlspecialchars , і довелося змінити ENT_HTML5 на 'utf-8' , після чого почалося працювати як шарм.
додано Автор MPękalski, джерело
Чудова робота, і чудово, що у вас є робота з тегами. Дякую
додано Автор marca, джерело

Завдяки torvin для підказки.

Ось як ви можете отримати зображення Instagram на вашому сайті без використання API.

Створити файл json з URL-адреси та імені користувача (встановити це як завдання 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 '';
print '';
print '';
?>
4
додано
зараз не працює
додано Автор Srinivas08, джерело
будь-яка ідея, як це зробити в 2018 році?
додано Автор drooh, джерело
Хороша техніка. Вихід змінився, але це легко зрозуміти і застосувати це знову до екрану screp. :) CHEERS!
додано Автор jonathanbell, джерело
Хороша техніка. Я вважаю, що це має певний шанс у майбутньому, якщо Instagram змінить спосіб форматування JSON або змінить роботу сторінки.
додано Автор Jeff Shillitto, джерело

Ви можете отримати доступ до каналу для будь-якого користувача Instagram з /users/user-id/media/recent Кінцева точка API. Для цієї кінцевої точки потрібен код access_token , який можна отримати за допомогою авторизації деякого користувача з Instagram (не обов'язково той, для якого ви запитуєте канал). Процес отримання access_token описаний тут .

Так, що ink361 може робити, це отримати access_token для себе (свого користувача на Instagram) і використовувати його, щоб зробити /users/user-id/media/recent запити на будь-які канали інших користувачів. Просто як це.

3
додано
Ця кінцева точка в основному однакова, але вимагає лише ідентифікатор клієнта.
додано Автор Percival Ulysses, джерело
Щоб пояснити: це забезпечить доступ до ресурсу Instagram API , який буде документом JSON, а не каналу RSS.
додано Автор raindev, джерело

Якщо б я був ink361, я б просто сканував сторінки Instagram, розбираю HTML і перетворюю його на RSS. Немає API, немає авторизації, проблем немає.

2
додано
У випадку з Instagram це робить роботу насправді простіше! Подивіться на вихідний код instagram.com/snoopdogg , рядок, який починається з ["lib/fullpage/переходи "... просто чистий JSON. Отже, вам навіть не потрібно взагалі розбирати HTML! Просто використовуйте будь-який JSON-парсер і бум! - дані для вашого каналу RSS готові
додано Автор torvin, джерело
Проблема в тому, що Instagram повністю породжується javascript. Котрий здається досить божевільний - особливо для місця це спрямовується до мобільних користувачів - але робить сканування це як ви пропонуєте багато більше тяжкого.
додано Автор Nick F, джерело
Ha, так, гарний пункт!
додано Автор Nick F, джерело

Ви можете отримати доступ до вашого каналу RSS для instagram, використовуючи їх API. Їх API використовує oAuth2 для аутентифікації. Я використовую цей метод на моєму особистому блозі, щоб витягти фотографії з Instagram на домашній сторінці. Я підозрюю, що так працює сайт ink361. Ink361 підключатиметься до API instagram і підкажуть користувачеві логін через поле instagram, яке вони використовують, щоб дозволити ink361 доступ до свого облікового запису instagram. Сайт ink361 буде кешувати маркер, отриманий instagram, як тільки аутентифікація буде успішною, щоб вони потім могли повторно повертатися до instagram api на періодичній основі, використовуючи той же маркер для аутентифікації. Бінго у вас є доступ до даних користувачів, і ви можете створити RSS-канал з нього.

1
додано
Привіт Matthew, спасибі за відповідь. Справа в Ink361 полягає в тому, що вони не використовують oAuth. Я не схвалив додаток ink361 (& я не snoop dogg;), але я все ще можу отримати RSS snoop dogg: ink361.com/feed/user/snoopdogg
додано Автор johnnyknox, джерело

На жаль, рішення user2543857 вище не працює. Ось версія, яка працює з поточним джерелом сторінки профілю.

Створити файл 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 '';
    print '';
    print '';
?>
1
додано
Замінити "мініатюру" на "стандартний_розділ" для повного розміру 640 x 640 або "low_resolution" для зображення розміром 306 x 306.
додано Автор Trae, джерело

Відповідь проста.

Щоб отримати доступ до даних користувача, потрібно просто мати дійсний маркер доступу.

У соціальній мережі ink361 є додаток у соціальній мережі http://vk.com/app3225087 , в якому зберігаються маркери доступу користувачів із автентифікацією .

Залишається тільки знайти в db дійсний і отримати будь-які користувацькі дані, які ви хочете

1
додано