Problème fopen [Résolu]

Messages postés
7
Date d'inscription
jeudi 21 décembre 2000
Dernière intervention
5 septembre 2010
- 22 mars 2010 à 17:58 - Dernière réponse :
Messages postés
7
Date d'inscription
jeudi 21 décembre 2000
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 ?
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Dernière intervention
5 juin 2013
- 23 mars 2010 à 11:39
3
Merci
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"

Merci TychoBrahe 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de TychoBrahe
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Dernière intervention
5 juin 2013
- 22 mars 2010 à 19:14
0
Merci
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.
Commenter la réponse de TychoBrahe
Messages postés
7
Date d'inscription
jeudi 21 décembre 2000
Dernière intervention
5 septembre 2010
- 22 mars 2010 à 19:54
0
Merci
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
Commenter la réponse de cs_Femto1218
Messages postés
7
Date d'inscription
jeudi 21 décembre 2000
Dernière intervention
5 septembre 2010
- 22 mars 2010 à 20:16
0
Merci
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 -_-
Commenter la réponse de cs_Femto1218
Messages postés
7
Date d'inscription
jeudi 21 décembre 2000
Dernière intervention
5 septembre 2010
- 22 mars 2010 à 21:04
0
Merci
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;

?>
Commenter la réponse de cs_Femto1218
Messages postés
7
Date d'inscription
jeudi 21 décembre 2000
Dernière intervention
5 septembre 2010
- 23 mars 2010 à 16:27
0
Merci
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
Commenter la réponse de cs_Femto1218

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.