begin process at 2012 05 31 13:03:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Divers

 > 

Débutant(e)

 > 

Problème fopen


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème fopen

lundi 22 mars 2010 à 17:58:18 | Problème fopen

Femto1218

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:

Code PHP :
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 ?
lundi 22 mars 2010 à 19:14:14 | Re : Problème fopen

TychoBrahe

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.
lundi 22 mars 2010 à 19:54:51 | Re : Problème fopen

Femto1218

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
lundi 22 mars 2010 à 20:16:23 | Re : Problème fopen

Femto1218

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:

Code PHP :
<?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 -_-
lundi 22 mars 2010 à 21:04:42 | Re : Problème fopen

Femto1218

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)

Code PHP :
<?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 '<pre>';

print_r($xml);

echo '</pre>';
*/

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

?>
mardi 23 mars 2010 à 11:39:58 | Re : Problème fopen

TychoBrahe

Réponse acceptée !
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 :

Code PHP :
<?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 :
Code PHP :
<?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 :
Code PHP :
$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 :
Code PHP :
<?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"

mardi 23 mars 2010 à 16:27:16 | Re : Problème fopen

Femto1218

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


Cette discussion est classée dans : problème, récupérer, php, article, fopen


Répondre à ce message

Sujets en rapport avec ce message

Problème récupération des variables depuis un formulaire inclus dans un code php [ par anakyl ] Bonjour à tous,Je suis depuis plusieurs jours sur un problème que je n'arrive pas à résoudre.Je souhaite créer un formulaire avec une liste déroulante Variable php dans url: problème pour la récupérer dans la nouvelle page [ par ecirtap12 ] Je vous expose mon problème car je débute en php et je sèche complètement malgré des heures de recherche sur le Net.J'ai une page x.php dans laquelle Récupérer une variable d'une méthode envoyer par un formulaire [ par Noizet ] Hello,J'ai une fonction en javaScript qui me retourne un tableau et j'aimerai la récupèrer une fois que j'ai cliquer sur mon bouton et qu'il m'a amene problème avec php et snmp [ par djamols ] bonjour, j'ai installé xampp serveur et net-snmp sous windows,j'ai essayé de lancer un script copié dans le site php.net utilisant les fonctions php-s php et javascript [ par youssefmst ] salutJ'ai un petit problème, le veux affiché des image selon le résultat d'une requête sql(la résulta sera 1,2,ou3  et les image sont: 1.gif, 2.gif et swiftMailer [ par lucwoods ] Bonjour,Je vous expose mon problème. Je réalise pour le moment une newsletter en php. Pour ça, j'avais utiliser PHPMailer mais apparemment, il y a un problème de formulaire php [ par lenfanta ] Problème : appel de fichier en php [ par Aikanaru ] Bonjour, j'ai installé un projet réalisé pour une entreprise sur un de leur serveur linux (red hat) et j'ai rencontrer des problèmes, après tests j'ai Problème de mise en cache dans la mémoire (php& apache) [ par oshin ] Salut à tous,J'ai un GROS problème URGENT.J'ai un serveur dédié avec apache et php installé : Apache/1.3.37 (Unix) mod_gzip/1.3.19.1a PHP/4.4.4 mod_ss


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,328 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales