web-dev-qa-db-fra.com

Flux RSS public Instagram

Je me demandais comment ink361 créait un flux RSS Instagram à partir d'un nom d'utilisateur.

Exemple de flux: http://ink361.com/feed/user/snoopdogg

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

Toute perspicacité serait appréciée.

Merci.

17
johnnyknox

Instagram a une API RSS accessible au public, il est difficile de trouver des informations à ce sujet, mais cela fonctionne pour les balises (nous l'utilisons).

Pour les balises, la syntaxe est la suivante:

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

Je ne sais pas s'ils ont quelque chose de similaire pour les flux d'utilisateurs, car j'ai dit qu'il était vraiment difficile de trouver des informations à ce sujet et que cela pouvait disparaître d'un jour à l'autre en faveur de l'API officielle, mais pour l'instant cela fonctionne pour Mots clés.

Voici un article de blog officiel à ce sujet (bien qu'il ne couvre que les tags): http://blog.instagram.com/post/8755963247/introducing-hashtags-on-instagram

11
Viktor Benei

La réponse de @ user2543857 était bonne. Malheureusement, la structure des données Instagram a changé. À la date de publication, cela fonctionnera. Copiez/collez dans un fichier sur votre serveur PHP et utilisez comme: yoursite.com/instarss.php?user=name_of_instagram_user Cela renverra un flux XML/RSS valide.

MODIFIER !! Naturellement, la sortie de la page/JSON a changé avec le nouveau look/feel d'Instagram. Voici le code mis à jour (juin 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'].'\'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;
?>

En fait, n'utilisez pas le code ci-dessus. Je vais essayer de maintenir ce Gist à l'avenir.

EDIT Décembre 2016: Je suis fatigué de courir après la sortie d'Instagram qui change constamment pour la gratter et la faire changer quelques mois plus tard. Je dirais qu'il suffit d'utiliser l'API .. Si vous êtes toujours intéressé à créer un flux RSS à partir de la page d'un utilisateur, ce Gist devrait vous donner une idée de la façon de le faire.

5
jonathanbell

Merci à torvin pour l'astuce.

Voici comment obtenir des images Instagram sur votre site sans utiliser l'API.

Créer un fichier json à partir de l'URL et du nom d'utilisateur (définissez-le comme un travail cron, X fois par jour)

<?
$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);
?>

Afficher quelques images du flux 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

Vous pouvez accéder au flux pour tout utilisateur d'Instagram en utilisant /users/user-id/media/recent Point de terminaison API. Ce point de terminaison nécessite un access_token que vous pouvez obtenir en autorisant certains utilisateurs avec Instagram (pas nécessairement celui pour lequel vous demandez le flux). Le processus de réception de access_token est décrit ici .

Donc, ce que ink361 peut faire, c'est obtenir un access_token pour eux-mêmes (leur utilisateur sur Instagram) et l'utiliser pour faire /users/user-id/media/recent les demandes de flux d'autres utilisateurs. Aussi simple que cela.

3
jamix

Si j'étais ink361, je ne ferais qu'explorer les pages Instagram, analyser le HTML et le transformer en RSS. Aucune API, aucune autorisation, aucun problème.

2
torvin

Malheureusement, la solution de user2543857 ci-dessus ne fonctionne plus. Voici une version qui fonctionne avec la source de la page de profil actuelle.

Créez un fichier JSON à partir de l'URL et du nom d'utilisateur (définissez-le comme un travail cron, X fois par jour)

<?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);
?>

Afficher quelques images du flux 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