2017-04-19 1 views
0

J'ai le problème, que je veux remplir une liste avec les noms de toutes les pages de mon wiki. Mon script:liste = toutes les pages ne livrent pas toutes les pages

$TitleList = []; 
$nsList = []; 

$nsURL= 'wiki/api.php?action=query&meta=siteinfo& siprop=namespaces|namespacealiases&format=json'; 
$nsJson = file_get_contents($nsURL); 
$nsJsonD = json_decode($nsJson, true); 
foreach ($nsJsonD['query']['namespaces'] as $ns) 
{ 
    if ($ns['id'] >= 0) 
    array_push ($nsList, $ns['id']);  
} 

# populate the list of all pages in each namespace 
foreach ($nsList as $n) 
{ 
    $urlGET = 'wiki/api.php?action=query&list=allpages&apnamespace='.$n.'&format=json'; 
    $json = file_get_contents($urlGET); 
    $json_b = json_decode($json ,true); 

    foreach ($json_b['query']['allpages'] as $page) 
    {  
    echo("\n".$page['title']); 
    array_push($TitleList, $page["title"]); 
    } 
} 

Mais il y a encore 35% de pages manquantes, que je peux visiter sur mon wiki (test avec "site aléatoire"). Est-ce que quelqu'un sait, pourquoi cela pourrait-il arriver?

+0

trace cette condition 'if (ns $ [ » id ']> = 0) ' – diavolic

+0

l'identifiant -2 (Media) et -1 (Special) renvoie une erreur, lorsqu'il est attaché à' apnamespace = ' –

Répondre

1

L'API MediaWiki ne renvoie pas tous les résultats à la fois, mais le fait par lots. Un lot par défaut est seulement de 10 pages; vous pouvez spécifier aplimit pour changer cela (500 max pour les utilisateurs, 5 000 max pour les robots).

Pour obtenir le lot suivant, vous devez spécifier le paramètre continue=; dans chaque lot, vous obtiendrez également une propriété continue dans les données renvoyées, que vous pouvez utiliser pour demander le lot suivant. Pour obtenir toutes les pages, vous devez boucler tant qu'un élément continue est présent.

Par exemple, sur la Wikipédia en anglais, ce serait le premier appel de l'API: https://en.wikipedia.org/w/api.php?action=query&list=allpages&apnamespace=0&format=json&aplimit=500&continue=

... et l'objet continue sera ceci: "continue":{ "apcontinue":"\"Cigar\"_Daisey", "continue":"-||" }

(mise à jour selon des observations par OP , avec le code exemple)

Vous voulez maintenant aplatir le tableau continue dans les paramètres d'URL, par exemple en utilisant `

Voir plus explication complète ici: https://www.mediawiki.org/wiki/API:Query#Continuing_queries

Une version de travail de votre code devrait être (testé avec Wikipedia avec un code légèrement différent):

# populate the list of all pages in each namespace 

    $baseUrl = 'wiki/api.php?action=query&list=allpages&apnamespace='.$n.'&format=json&limit=500&'; // Increase limit if you are using a bot, up to 5,000 
foreach ($nsList as $n) { 
    $next = ''; 
    while (isset($next)) { 
    $urlGET = $baseUrl . $next; 
    $json = file_get_contents($urlGET); 
    $json_b = json_decode($json, true); 
    foreach ($json_b['query']['allpages'] as $page) 
    { 
     echo("\n".$page['title']); 
     array_push($TitleList, $page["title"]); 
    } 

    if (isset($json_b['continue'])) { 
     $next = http_build_query($json_b['continue']); 
    } 
    } 
} 
+0

Merci pour votre aide. Je reçois une erreur "badcontinue" quand je fais le prochain appel d'API. donc je viens de sauvegarder le paramètre dans une variable '$ continue = résultat ['continue'] ['apcontinue']'. et dans la prochaine boucle j'ajoute cette variable à '& continue = $ continue', ce qui entraîne l'erreur" mauvais ". Cela ne fonctionne pas quand je passe seulement '$ continue = résultat ['continue']' –

+0

Donc, ce que vous devez faire est d'aplatir l'élément "continue" retourné et ajouter chacune de ses paires de clés à l'URL de la requête. Vous pouvez le faire en utilisant quelque chose comme ceci 'http_build_query ($ json_b ['continue']);'. Je vais mettre à jour ma réponse. –

+0

Merci, vos réponses ont été d'une grande aide pour moi. Cela fonctionne enfin! Je suis très reconnaissant. –