74 votes

Accès à l'image principale de la page wikipedia par API

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 ?

6voto

Óscar Palacios Points 501

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.

6voto

vanwinter Points 16

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.

4voto

Vineed Points 11

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

3voto

Paul Weber Points 505

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...

2voto

netfed Points 108

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X