Existe-t-il un moyen d'accéder à la vignette de n'importe quelle page wikipedia en utilisant une API ? Je veux dire l'image en haut à droite dans la boîte. Existe-t-il des API pour cela ?
Réponses
Trop de publicités?Je suis désolée de ne pas avoir répondu spécifiquement à votre question sur la principal image. Mais voici du code pour obtenir une liste de toutes les images :
function makeCall($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
return curl_exec($curl);
}
function wikipediaImageUrls($url) {
$imageUrls = array();
$pathComponents = explode('/', parse_url($url, PHP_URL_PATH));
$pageTitle = array_pop($pathComponents);
$imagesQuery = "http://en.wikipedia.org/w/api.php?action=query&titles={$pageTitle}&prop=images&format=json";
$jsonResponse = makeCall($imagesQuery);
$response = json_decode($jsonResponse, true);
$imagesKey = key($response['query']['pages']);
foreach($response['query']['pages'][$imagesKey]['images'] as $imageArray) {
if($imageArray['title'] != 'File:Commons-logo.svg' && $imageArray['title'] != 'File:P vip.svg') {
$title = str_replace('File:', '', $imageArray['title']);
$title = str_replace(' ', '_', $title);
$imageUrlQuery = "http://en.wikipedia.org/w/api.php?action=query&titles=Image:{$title}&prop=imageinfo&iiprop=url&format=json";
$jsonUrlQuery = makeCall($imageUrlQuery);
$urlResponse = json_decode($jsonUrlQuery, true);
$imageKey = key($urlResponse['query']['pages']);
$imageUrls[] = $urlResponse['query']['pages'][$imageKey]['imageinfo'][0]['url'];
}
}
return $imageUrls;
}
print_r(wikipediaImageUrls('http://en.wikipedia.org/wiki/Saturn_%28mythology%29'));
print_r(wikipediaImageUrls('http://en.wikipedia.org/wiki/Hans-Ulrich_Rudel'));
Je l'ai eu pour http://en.wikipedia.org/wiki/Saturn_%28mythology%29 :
Array
(
[0] => http://upload.wikimedia.org/wikipedia/commons/1/10/Arch_of_SeptimiusSeverus.jpg
[1] => http://upload.wikimedia.org/wikipedia/commons/8/81/Ivan_Akimov_Saturn_.jpg
[2] => http://upload.wikimedia.org/wikipedia/commons/d/d7/Lucius_Appuleius_Saturninus.jpg
[3] => http://upload.wikimedia.org/wikipedia/commons/2/2c/Polidoro_da_Caravaggio_-_Saturnus-thumb.jpg
[4] => http://upload.wikimedia.org/wikipedia/commons/b/bd/Porta_Maggiore_Alatri.jpg
[5] => http://upload.wikimedia.org/wikipedia/commons/6/6a/She-wolf_suckles_Romulus_and_Remus.jpg
[6] => http://upload.wikimedia.org/wikipedia/commons/4/45/Throne_of_Saturn_Louvre_Ma1662.jpg
)
Et pour la deuxième URL ( http://en.wikipedia.org/wiki/Hans-Ulrich_Rudel ):
Array
(
[0] => http://upload.wikimedia.org/wikipedia/commons/e/e9/BmRKEL.jpg
[1] => http://upload.wikimedia.org/wikipedia/commons/3/3f/BmRKELS.jpg
[2] => http://upload.wikimedia.org/wikipedia/commons/2/2c/Bundesarchiv_Bild_101I-655-5976-04%2C_Russland%2C_Sturzkampfbomber_Junkers_Ju_87_G.jpg
[3] => http://upload.wikimedia.org/wikipedia/commons/6/62/Bundeswehr_Kreuz_Black.svg
[4] => http://upload.wikimedia.org/wikipedia/commons/9/99/Flag_of_German_Reich_%281935%E2%80%931945%29.svg
[5] => http://upload.wikimedia.org/wikipedia/en/6/64/HansUlrichRudel.jpeg
[6] => http://upload.wikimedia.org/wikipedia/commons/8/82/Heinkel_He_111_during_the_Battle_of_Britain.jpg
[7] => http://upload.wikimedia.org/wikipedia/commons/6/66/Regulation_WW_II_Underwing_Balkenkreuz.png
)
Notez que l'URL a changé un peu sur le 6ème élément du second tableau. C'est ce que @JosephJaber mettait en garde dans son commentaire ci-dessus.
J'espère que cela aidera quelqu'un.
J'ai écrit un code qui récupère l'image principale (URL complète) par le titre de l'article de Wikipedia. Ce n'est pas parfait, mais dans l'ensemble je suis très satisfait des résultats.
Le problème est que lorsqu'on demande un titre spécifique, Wikipedia renvoie plusieurs noms de fichiers d'images (sans chemin). De plus, la recherche secondaire (j'ai utilisé le code que varatis a posté dans ce fil de discussion - merci !) renvoie les URL de toutes les images trouvées sur la base du nom de fichier de l'image recherchée, sans tenir compte du titre original de l'article. Après tout cela, nous pouvons nous retrouver avec une image générique non pertinente pour la recherche, donc nous les filtrons. Le code itère sur les noms de fichiers et les URLs jusqu'à ce qu'il trouve (avec un peu de chance) la meilleure correspondance... un peu compliqué, mais ça marche :)
Note sur le filtre générique : J'ai compilé une liste de chaînes d'images génériques pour la fonction isGeneric(), mais la liste ne cesse de s'allonger. J'envisage de la maintenir en tant que liste publique - si vous êtes intéressés, faites-le moi savoir.
Pré :
protected static $baseurl = "http://en.wikipedia.org/w/api.php";
Fonction principale - obtenir l'URL de l'image à partir du titre :
public static function getImageURL($title)
{
$images = self::getImageFilenameObj($title); // returns JSON object
if (!$images) return '';
foreach ($images as $image)
{
// get object of image URL for given filename
$imgjson = self::getFileURLObj($image->title);
// return first image match
foreach ($imgjson as $img)
{
// get URL for image
$url = $img->imageinfo[0]->url;
// no image found
if (!$url) continue;
// filter generic images
if (self::isGeneric($url)) continue;
// match found
return $url;
}
}
// match not found
return '';
}
\== Les fonctions suivantes sont appelées par la fonction principale ci-dessus ==
Obtenir un objet JSON (noms de fichiers) par titre :
public static function getImageFilenameObj($title)
{
try // see if page has images
{
// get image file name
$json = json_decode(
self::retrieveInfo(
self::$baseurl . '?action=query&titles=' .
urlencode($title) . '&prop=images&format=json'
))->query->pages;
/** The foreach is only to get around
* the fact that we don't have the id.
*/
foreach ($json as $id) { return $id->images; }
}
catch(exception $e) // no images
{
return NULL;
}
}
Obtenir des objets JSON (URLs) par nom de fichier :
public static function getFileURLObj($filename)
{
try // resolve URL from filename
{
return json_decode(
self::retrieveInfo(
self::$baseurl . '?action=query&titles=' .
urlencode($filename) . '&prop=imageinfo&iiprop=url&format=json'
))->query->pages;
}
catch(exception $e) // no URLs
{
return NULL;
}
}
Filtrez les images génériques :
public static function isGeneric($url)
{
$generic_strings = array(
'_gray.svg',
'icon',
'Commons-logo.svg',
'Ambox',
'Text_document_with_red_question_mark.svg',
'Question_book-new.svg',
'Canadese_kano',
'Wiki_letter_',
'Edit-clear.svg',
'WPanthroponymy',
'Compass_rose_pale',
'Us-actor.svg',
'voting_box',
'Crystal_',
'transportation_inv',
'arrow.svg',
'Quill_and_ink-US.svg',
'Decrease2.svg',
'Rating-',
'template',
'Nuvola_apps_',
'Mergefrom.svg',
'Portal-',
'Translation_to_',
'/School.svg',
'arrow',
'Symbol_',
'stub',
'Unbalanced_scales.svg',
'-logo.',
'P_vip.svg',
'Books-aj.svg_aj_ashton_01.svg',
'Film',
'/Gnome-',
'cap.svg',
'Missing',
'silhouette',
'Star_empty.svg',
'Music_film_clapperboard.svg',
'IPA_Unicode',
'symbol',
'_highlighting_',
'pictogram',
'Red_pog.svg',
'_medal_with_cup',
'_balloon',
'Feature',
'Aiga_'
);
foreach ($generic_strings as $str)
{
if (stripos($url, $str) !== false) return true;
}
return false;
}
Les commentaires sont les bienvenus.
Prenons l'exemple d'une page http://en.wikipedia.org/wiki/index.html?curid=57570 pour obtenir Main Pic
Vérifiez
prop=pageprops
action=query&pageids=57570&prop=pageprops&format=json
Page de résultats Données Eg.
{ "pages" : { "57570":{
"pageid":57570,
"ns":0,
"title":"Sachin Tendulkar",
"pageprops" : {
"defaultsort":"Tendulkar,Sachin",
"page_image":"Sachin_at_Castrol_Golden_Spanner_Awards_(crop).jpg",
"wikibase_item":"Q9488"
}
}
}
}}
Nous obtenons le nom du fichier Pic principal ce résultat comme
** (wikiId).pageprops.page_image = Sachin_at_Castrol_Golden_Spanner_Awards_(crop).jpg**
Maintenant que nous avons le nom du fichier image, nous devrons faire un autre appel Api pour obtenir le chemin complet de l'image à partir du nom du fichier comme suit
action=query&titles=Image:INSERT_EXAMPLE_FILE_NAME_HERE.jpg&prop=imageinfo&iiprop=url
Eg.
action=query&titles=Image:Sachin_at_Castrol_Golden_Spanner_Awards_(crop).jpg&prop=imageinfo&iiprop=url
Retourne un tableau de données d'image contenant l'URL en tant que http://upload.wikimedia.org/wikipedia/commons/3/35/Sachin_at_Castrol_Golden_Spanner_Awards_%28crop%29.jpg
Il existe un moyen fiable d'obtenir une image principale pour une page wikipedia - l'extension appelée PageImages.
L'extension PageImages recueille des informations sur les images utilisées sur une page.
Son objectif est de retourner la vignette la plus appropriée associée à un article. associée à un article, en essayant de ne renvoyer que les images significatives, par ex. celles des modèles de maintenance, des stubs ou des icônes de drapeaux. Actuellement, il utilise la première image non signifiante utilisée dans la page.
https://www.mediawiki.org/wiki/Extension:PageImages
Ajoutez simplement la prop pageimages à votre requête API :
/w/api.php?action=query&prop=pageimages&titles=Somepage&format=xml
Cette extension filtre de manière fiable les images par défaut gênantes et vous évite de devoir les filtrer vous-même ! L'extension est installée sur toutes les pages principales de wikipedia...
Comme Anuraj l'a mentionné, le paramètre pageimages est le bon. Regardez l'url suivante qui vous apportera quelques trucs intéressants :
https://en.wikipedia.org/w/api.php?action=query&prop=info|extracts|pageimages|images&inprop=url&exsentences=1&titles=india
Ses paramètres sont intéressants :
- Les deux paramètres extraits y exsentences vous donne une courte description que vous pouvez utiliser. (exsentences est le nombre de phrases que vous voulez inclure dans l'extrait)
- L'info et le inprop=url paramètres vous donne l'url de la page
- La propriété prop comporte plusieurs paramètres séparés par un symbole de barre.
- Et si vous insérez le format=json là-dedans, c'est encore mieux