Was habe ich mir über die API der mediawiki schon den Kopf zerbrochen und geflucht...

Im aktuellen Fall will ich einige Artikel meines Wikis in einem anderen System anzeigen, ohne dass jeder Benutzer des anderen Systems einen Wiki-Zugang benötigt. (Und natürlich soll die Wiki auch nicht öffentlich sein)
So lassen sich prima in der Wiki Arbeitsanweisungen pflegen, die dann im Arbeitssystem der Benutzer angezeigt werden können.

Bis ich aber mal dahinter kam, wie ich das, was auf https://www.mediawiki.org/wiki/API:Parsing_wikitext steht, letztendlich produktiv nutzen kann...

1. botuser in der Wiki anlegen
Wir brauchen erstmal einen Bot-User, mit dessen Zugangsdaten man später die API-Zugriffe machen kann. Das geht über die Spezialseite "Bots" des Wikis z.B. https://wiki.mydomain.net/index.php/Spezial:BotPasswords

2. Ablauf im PHP-Skript: Token holen, einloggen und Artikel abrufen
Keine Ahnung, für was für einen Einsatzzweck die Entwickler von mediawiki sich diese API überlegt hatten. Aber um einen Token zu bekommen und auch nutzen zu können, müssen Cookies gesetzt werden. Deshalb ist bei jedem curl-Aufruf der CURLOPT_COOKIEJAR mit dem Pfad zu einer Datei zu setzen, die irgendwo auf dem Webserver liegt und in welcher die Cookies gespeichert werden können.

Hier mal rein als Entwurf, wie es gehen würde:

<?php
$ch = curl_init();

// Erst Token holen
curl_setopt($ch, CURLOPT_URL,"https://wiki.mydomain.net/api.php?action=query&meta=tokens&type=login&format=json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
$result = curl_exec($ch);

if (!$json = json_decode($result, true)) die("error: $result");
$token = $json['query']['tokens']['logintoken'];

// Dann mit den Zugangsdaten des Bot-Users einloggen
// Achtung: Der Bot-Benutzername besteht aus dem eigenen Benutzernamen
//          plus einem @ und dem eigentlichen Bot-Namen
curl_setopt($ch, CURLOPT_URL,"https://wiki.mydomain.net/api.php?action=login&format=json");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array(
                'lgname'     => 'wikiuser@botname',
                'lgpassword' => 'strengGeheimesPasswort',
                'lgtoken'    => $token
                )));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
$result = curl_exec($ch);

if (!$json = json_decode($result, true)) die("error: $result");
if ($json['login']['result'] != "Success") die("error: $result");

// Nun die eigentliche Abfrage
// Der gewünschte Artikel wird über den GET-Parameter "page" abgefragt
// > page=Seitentitel_wie_in_der_wiki
curl_setopt($ch, CURLOPT_URL,"https://wiki.mydomain.net/api.php?action=parse&page=Seitentitel_wie_in_der_wiki&prop=text&formatversion=2&format=json");
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
$result = curl_exec($ch);

if (!$json = json_decode($result, true)) die("error: $result");
echo($json['parse']['text']);
?>
Das Cookie muss unbedingt mit curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); als Datei auf dem Server vorgehalten werden.
Ich hatte erst mit curl_setopt($ch, CURLOPT_COOKIE, $cookies); und curl_setopt($ch, CURLOPT_HEADERFUNCTION, "curlResponseHeaderCallback"); versucht, die Cookie-Daten in einer lokalen Variable zu halten. Dies funktionierte aber nur bis zum Login. Beim Seitenabruf bekam ich – wieso auch immer – einen readapierror