Problème fopen

Résolu
cs_Femto1218 Messages postés 7 Date d'inscription jeudi 21 décembre 2000 Statut Membre Dernière intervention 5 septembre 2010 - 22 mars 2010 à 17:58
cs_Femto1218 Messages postés 7 Date d'inscription jeudi 21 décembre 2000 Statut Membre Dernière intervention 5 septembre 2010 - 23 mars 2010 à 16:27
Bonjour

Je souhaite récupérer un article au hasard sur wikipédia et diffuser le lien par la suite (utilité 0 je sais )
J'ai donc découvert que wikipédia fournit une sorte de API en php avec différentes fonctions dont celle de l'article au hasard:
http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=1

Quand vous cliquez dessus une page xml est générée avec le titre de l'article et son id.
Mon but sera de parser ce xml et de récupérer le titre de l'article pour ensuite créer le lien www.wikipedia.org/Le_Titre_de_l'article.

Donc il faut déjà récupérer ce xml et j'ai penser à utiliser un simple fopen.
Et pour vérifier que cela fonctionne bien j'ai fait un simple test:

if (!$fp = fopen("http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=2","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}
else {
echo "reussi";
}


Et donc le problème c'est que le fopen ne fonctionne pas :/
Quelqu'un aurais il une autre idée ?

6 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
23 mars 2010 à 11:39
Salut,

Ne cherches pas midi à 14 heures, c'est bien plus simples que ça. En effet il te faut indiquer format=xml dans l'url afin d'obtenir du xml. À partir de ça, un simplexml_load_file() sur cette url te retourne un objet SimpleXMLElement te permettant de manipuler les données :

<?php
$Wiki = simplexml_load_file('http://fr.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=1&format=xml');
?>


Seul soucis, ça génère une erreur 403 (accès interdit). La raison ? Normalement on ne devrai pas utiliser un bot qui ne soit pas authentifié, pour différencier els bots des humains l'api mediawiki se base sur el user agent. À celà deux solution :
1. Avoir un compte utilisateur pour le bot et le faire s'authentifier dessus (bonne pratique).
2. Modifier le useragent afin de se faire passer pour un humain (plus simple).

Pour modifier le useragent par défaut de php, il te faut modifier l'option de configuration nommée user_agent dans ton php.ini. Il est également possible d'appeller ini_set() afin de modifier cette option de configuration sans avoir à modifier le php.ini. Ainsi le code suivant récupère bien le flux xml décrivant un article aléatoire :
<?php
ini_set('user_agent', 'Mozilla/5.0 (X11; U; GNU Hurd; C -) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.10.1');
$Wiki = simplexml_load_file('http://fr.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=1&format=xml');
?>


Pour récupérer le nom de l'article c'est simple, grâce à simple xml on y accède directement de cette manière :
$Wiki->query->random->page['title']

Il est possible de caster en string afin de convertir cet objet SimpleXMLElement en chaîne de caractère.
Afin de récupérer un lien vers l'article, il me semble qu'il faut commencer par remplacer tous les espaces par des underscores puis appliquer la fonction urlencode afin de convertir les caractères spéciaux. On obtient donc le code suivant :
<?php

ini_set('user_agent', 'Mozilla/5.0 (X11; U; GNU Hurd; C -) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.10.1');
$Wiki = simplexml_load_file('http://fr.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=1&format=xml');
var_dump((string)$Wiki->query->random->page['title']);
$link = 'http://fr.wikipedia.org/wiki/' . urlencode(str_replace(' ', '_', $Wiki->query->random->page['title']));
var_dump($link);
?>


Et ça fonctionne :
tycho@uraniborg-> php toto.php
string(8) "BB 27000"
string(37) "http://fr.wikipedia.org/wiki/BB_27000"
tycho@uraniborg-> php toto.php
string(17) "Palestine (Texas)"
string(50) "http://fr.wikipedia.org/wiki/Palestine_%28Texas%29"
tycho@uraniborg-> php toto.php
string(47) "Parcours du Tours Volley-Ball en coupe d'Europe"
string(78) "http://fr.wikipedia.org/wiki/Parcours_du_Tours_Volley-Ball_en_coupe_d%27Europe"
3
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
22 mars 2010 à 19:14
Salut,

Utilises donc plutôt simplexml_load_file(). Je te laisse regarder la doc de simplexml, et en particulier les exemples, pour apprendre à t'en servir, c'est très simple et intuitif.
0
cs_Femto1218 Messages postés 7 Date d'inscription jeudi 21 décembre 2000 Statut Membre Dernière intervention 5 septembre 2010
22 mars 2010 à 19:54
Arf y'a un petit soucis :/.
Si j'ai bien compris logiquement si j'utilise le simplexml_load_file(), à l'intérieur je devrais mettre un ".xml".
Et regarde justement le lien que je j'ai mis au début (http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=1 ).
C'est écrit que c'est une représentation du format xml ><", donc ça ne fonctionne pas (j'ai refais le test avec simplexml_load_file())

Si j'ai rater un truc n'hésite pas à me corriger
0
cs_Femto1218 Messages postés 7 Date d'inscription jeudi 21 décembre 2000 Statut Membre Dernière intervention 5 septembre 2010
22 mars 2010 à 20:16
Haa j'ai du nouveau (dsl je ne peut pas éditer)

Donc si je veut du xml c'est tout bête
ceci:
http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=1

deviens ceci:
http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=2&format=xml

(et là c'est bien une page xml rassurez moi)

J'ai donc commencer a lire la doc sur simplexml et j'ai voulu tester ceci:

<?php


if (file_exists("http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=2&format=xml")) 
{
    $xml = simplexml_load_file('test.xml');

    print_r($xml);
} else {
    exit('Echec lors de l\'ouverture du fichier test.xml.');
}
?>


Et toujours échec pour le moment -_-
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Femto1218 Messages postés 7 Date d'inscription jeudi 21 décembre 2000 Statut Membre Dernière intervention 5 septembre 2010
22 mars 2010 à 21:04
Désolé si je spamm mais je ne peut pas éditer:

J'ai encore essayer un autre truc avec file_get_contents et toujours rien -_- (j'ai essayer avec la home page de wikipédia et là ça fonctionne)

<?php
//1ere tentative
/*if (file_exists("http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=2&format=xml")) 
{
    $xml = simplexml_load_file("http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=2&format=xml");

    print_r($xml);
} else {
    exit('Echec lors de l\'ouverture du fichier test.xml.');
}*/

//2ème
/*
$Url = "http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=2&format=xml";

$file = file_get_contents($Url);

$xml = simplexml_load_string($file);

echo '';

print_r($xml);

echo '

';
*/

// troisième, pour tester file_get_contents() (fonctionne)
$homepage = file_get_contents('http://en.wikipedia.org/wiki/Main_Page');
echo $homepage;

?>
0
cs_Femto1218 Messages postés 7 Date d'inscription jeudi 21 décembre 2000 Statut Membre Dernière intervention 5 septembre 2010
23 mars 2010 à 16:27
Merci ! Je me disais bien que j'étais proche, je comprend maintenant avec cette histoire d'accès, merci aussi pour l'astuce de useragent, l'histoire du castage de string je l'avais déjà un peu en tête donc j'étais sur la bonne voie .

Merci encore
0