MYGGL GOOGLE API CLASS FOR BEGINERZ

phpAnonyme Messages postés 392 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 23 mars 2012 - 23 mars 2011 à 17:26
lezj Messages postés 66 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 juillet 2013 - 7 avril 2011 à 13:44
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52974-myggl-google-api-class-for-beginerz

lezj Messages postés 66 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 juillet 2013
7 avril 2011 à 13:44
bien le bonjour à tous,
je tiens à vous remercier pour la participation que vous apportez sur cette source mais il semblerait que vous n'ayez lu ni la description de la source, ni même le titre de la source. "MYGGL GOOGLE API CLASS FOR BEGINERZ"!et oui, FOR BEGINNERS! ce qui veut dire que je voulais faire quelque chose de simple et accessible aux débutants, donc biensur il est possible de l'améliorer comme vous le voulez. mais à condition que çà reste comme voulu par son auteur (moi), à la portée du développeur qui vient de commencer en php et qui dit: "wais cool! je veux APPRENDRE à interagir avec google!".ok?surtout que je voudrais en faire un tutoriel dès que j'en aurai le temps.
merci
p.s: Akhenaton, c'est vrai que je peux utiliser un simple fopen() mais google préconise d'utiliser cURL pour l'accès à leur api en php.
LeFauve42 Messages postés 239 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 20 avril 2009
28 mars 2011 à 14:48
Akhenathon,

Le probleme est justement que la version SOAP de l'API n'existe plus depuis Aout 2009 (ainsi que ses conditions d'utilisation tres permissives).

Je ne dis pas que c'est inutile d'acceder en PHP a une API AJAX en general, mais dans le cas particulier de l'API Google, je pense que ca l'est :
Les CDU de l'API Google AJAX indiquent explicitement que tu ne peux faire une recherche que sur une action directe de l'utilisateur, et que tu ne dois pas alterer le resultat.
Partant de la, pourquoi passer par du PHP et forcer un reload de la page quand on peux simplement afficher les resultats dans une partie de la page ?

Eric
cs_aKheNathOn Messages postés 575 Date d'inscription dimanche 23 décembre 2001 Statut Membre Dernière intervention 23 octobre 2012
28 mars 2011 à 12:50
Le REST (Api AJAX) est à la mode ces derniers temps et c'est très simple de comprendre le pk, c'est tout simplement plus compatible contrairement à SOAP...(je suis pas trop d'accord avec lefauve sur le manque d'utilité d'une classe exploitant REST plutôt que du SOAP)

Pour le côté PHP (alors que REST semble que pour JavaScript) ça se justifier, car même si une alternative SOAP existe, c'est plus sympa de faire un file_get_contents sur une URL avec des paramètres en GET plutôt que d'utiliser des librairies SOAP qui ne sont pas distribuées par défaut sur toutes les versions...

J'insiste un peu sur cURL mais dommage de l'avoir utilisé forçant à avoir cette librairie, et le côté obscur de REST étant, vu que c'est moins formalisé je spaghéttise mon code ... les retours JSON devraient être toujours encapsulés dans des classes spécifiques ...
LeFauve42 Messages postés 239 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 20 avril 2009
28 mars 2011 à 12:39
Bonjour,

De quelle nouvelle API google parles-tu ?
L'API AJAX qui remplace l'ancienne version SOAP ?

Parce que si c'est le cas, il n'y a aucun interet a utiliser cette API concue pour JavaScript avec PHP (a part lancer des requetes "en batch" ou pour enregistrer les resultats sur ton serveur, deux choses que les conditions d'utilisation interdisent explicitement).

Eric

PS: Si c'est bien l'API Google AJAX, il y a au moins 2 ans qu'elle est nouvelle (il y a 2 ans que Google a discontinue l'API SOAP et conseille d'utiliser AJAX).
cs_aKheNathOn Messages postés 575 Date d'inscription dimanche 23 décembre 2001 Statut Membre Dernière intervention 23 octobre 2012
28 mars 2011 à 11:17
Petit conseil pour rendre ta librairie plus compatible avec tout genre de config : je te conseillerais d'oublier cUrl et d'utiliser un simple fopen sur l'URL ...

Sinon à mon avis il te manque une classe stockant le résultat de retour et dans google il te faudrait une fonction privée pour gérer le retour php et google...

bonne continuation,
akh
phpAnonyme Messages postés 392 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 23 mars 2012 55
24 mars 2011 à 02:31
Je t'ai pas dit que tu peux ni que tu dois ! Je t'ai dis que tu faisait la boucle sur le nombre de résulats estimés

## CODE ORIGINALE ##
# $this->oNombreTotalPages = $this->oJson['responseData']['cursor']['estimatedResultCount'];
# for($i = 0; $i < $this->oNombreTotalPages; $i++)
# {
# if($this->oJson['responseData']['results'][$i]['visibleUrl'] == $this->oRequete)
# $this->oNombrePagesIndex++;
# }

Hors s'il y en a 10000 ou 1000000 etc le script plantera !
D'où la correction que j'y est apporté :
for($i = 0; $i < sizeof($this->oJson['responseData']['results']); $i++)
{
if($this->oJson['responseData']['results'][$i]['visibleUrl'] == $this->oRequete)
$this->oNombrePagesIndex++;
}
lezj Messages postés 66 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 juillet 2013
24 mars 2011 à 01:56
merci php anonyme mais à ma connaissance, la nouvelle api google ne peut renvoyer que 10 résultats donc je ne peux pas boucler sur 3000000 de résultats.
phpAnonyme Messages postés 392 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 23 mars 2012 55
23 mars 2011 à 23:33
Bon n'ayant rien à faire je me suis replongé dans ton code et j'apporte des modifications parfois non négligeable car il y a avait des erreurs de conception notamment dans la fameuse boucle dont je parle dans mon précèdent poste !

### dans la méthode function initialise($pRequete) ###
function initialise($pRequete)
{
$this->oNombrePagesIndex = 0;
$this->oNombreTotalPages = 0;
$this->oNombreBackLinks = 0;
$this->oNombrePagesSite = 0;
preg_match('{^(.*\//)?(.*)\/?}', trim($pRequete, '/'), $out);
$this->oRequete = $out[2];
$this->oReferer = isset($_SERVER['HTTP_REFERER']) ? htmlspecialchars($_SERVER['HTTP_REFERER'], ENT_COMPAT, 'UTF-8') : FALSE;
}

/// Explication :
- $this->oUrl = ""; ne servait à rien puisque la visibilité de l'objet est privé
- $this->oReferer = 'http://Nom de votre site'; pas très intéressant, encore une fois méthode privé et puis taper dans la classe l'url de provenance pas trop 'génial'
- $this->oRequete = $pRequete; dans la méthode nombrePageIndexReference() tu l'utilise pour vérifier la visibilité de l'url hors celle-ci est uniquement du type www.xxx.com. Si l'utilisateur passe en paramètre une url complète http://... il ne sera donc pas pris en compte.

### Création d'une nouvelle méthode ###
function parseResult($url)
{
$this->oBody = false;
$this->oCh = curl_init();
curl_setopt($this->oCh, CURLOPT_CONNECTTIMEOUT, ini_get('max_execution_time'));
curl_setopt($this->oCh, CURLOPT_URL, $url);
curl_setopt($this->oCh, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($this->oCh, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($this->oCh, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($this->oCh, CURLOPT_REFERER, $this->oReferer);
$this->oBody = curl_exec($this->oCh);
if($this->oBody === false)
throw new Exception('Erreur Curl : ' . curl_error($this->oCh));

return $this->oBody;
}

// Explication
Tu utilise à trois reprises curl pour obtenir tes résultats. Inutile de mettre dans les 3 méthodes 3 fois cette opération.

[ A NOTER ] dans les trois méthodes suivantes :
- nombrePageIndexReference()
- nombreBackLinks()
- nombrePagesSite()
Il faut remplacer les opérations de curl par cette simple ligne :
$this->oBody = $this->parseResult($this->oUrl);

### dans la méthode nombrePageIndexReference(), DANS la fameuse boucle ###
for($i = 0; $i < sizeof($this->oJson['responseData']['results']); $i++)
{
if($this->oJson['responseData']['results'][$i]['visibleUrl'] == $this->oRequete)
$this->oNombrePagesIndex++;
}

// Explication
Je n'avais pas remarquer au premier abord(et donc dans mon précèdent poste) que tu bouclais sur le nombre de résultats/pages d'où le trop grand nombre pour 3000000 de résultats/pages. En faite il faut boucler sur le nombre de résultats effectifs/indexés.

Normalement maintenant ça devrait rouler !
phpAnonyme Messages postés 392 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 23 mars 2012 55
23 mars 2011 à 17:26
Des erreurs ou manquement dans nombrePageIndexReference()

## Petite correction

$this->oCh = curl_init();
curl_setopt($this->oCh, CURLOPT_CONNECTTIMEOUT, ini_get('max_execution_time'));
curl_setopt($this->oCh, CURLOPT_URL, $this->oUrl);
curl_setopt($this->oCh, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($this->oCh, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($this->oCh, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($this->oCh, CURLOPT_REFERER, $this->oReferer);

if(curl_exec($this->oCh) === false)
throw new Exception('Erreur Curl : ' . curl_error($this->oCh));

$this->oBody = curl_exec($this->oCh);
curl_close($this->oCh);
##
Me parait plus judiciable !

Ensuite pour les nombre de pages pour JSON, faire une boucle, me semble pas approprier, à 3 000 000 de résultats par exemple, si le temps d'éxécution du script n'a pas pas été allongé on aura a coup sûre un plantage du script :
##
for($i = 0; $i < $this->oNombreTotalPages; $i++)
{
if($this->oJson['responseData']['results'][$i]['visibleUrl'] == $this->oRequete)
$this->oNombrePagesIndex++;
}
##
Rejoignez-nous