Wikipedia:WikiProjekt Bremen/BremenpediA/QRpedia+
QRpedia-Codes transportieren derzeit das Lemma des Zielartikels als (innerhalb der Sprachversion) eindeutige Kennung. Daher werden die physischen Codes unbrauchbar, wenn nach ihrer Erstellung der Artikel umbenannt und die dabei entstehende Weiterleitung gelöscht oder in eine Begriffsklärung umgebaut wird.
Am 30. Januar 2020 wurde am Bremer WP-Stammtisch daher besprochen, wie erreicht werden kann, dass QRpedia-Codes dauerhaft auf ihren Ziel-Artikel leiten. Dauerhafte Abhilfe ist demnach nur zu erwarten, wenn nicht das Lemma, sondern die Seiten-ID als Kennung genutzt wird. Dazu sind Skripte auf qrpedia.org und qrwp.org anzupassen. Das Vorhaben ist nicht besonders aufwendig.
Prinzip
[Quelltext bearbeiten]qrpedia.org: QRpedia-Code erzeugen
[Quelltext bearbeiten]Bei der Erzeugung der QRpedia-Codes wird die eingegebene URL zerlegt. Aus der Adresse http://de.wikipedia.org/Bremen werden zwei Bereiche genutzt:
- de: Die Subdomain adressiert die Wikipedia-Sprachversion. Es wird im Beipiel die API der de.Wikipedia abgefragt.
- Bremen: Der Artikeltitel.
Daraus entsteht die URL, die nach dem Scannen des QR-Codes das Auswerteprogramm adressiert: https://de.qrwp.org/Bremen Im Originalzustand wird im Ergebnis nur "wikipedia" durch "qrwp" ersetzt.
Funktionale Änderung
Die vorhandene API-Abfrage zur Bestimmung der Anzahl der Sprachversionen wirft nebenbei die Seiten-ID des Artikels aus. Die wird zusammen mit einem vorangestellten "id=" anstelle des urlencodierten Artikeltitels in die URL eingebaut, die an das Programm zur Berechnung der Grafik gesandt wird. Im QRpedia-Code wird damit die URL https://de.qrwp.org/id=554 gespeichert.
Mobilgerät
[Quelltext bearbeiten]Das Mobilgerät scannt und decodiert (ggf. mit einer App) den QRpedia-Code und adressiert im Browser den Empfänger qrwp.org. Außerdem wird die Spracheinstellung des Geräts übertragen.
qrwp.org: Artikelsuche in der passenden Sprache
[Quelltext bearbeiten]Die Darstellung ist ist sehr vereinfacht, mit Fokus auf die anzupassenden Funktionen.
Nachdem die Adresse in das PHP-Skript importiert wurde, werden zunächst Artikelsprache und die vom Gerät übermittelte Spracheinstellung verglichen.
- Wenn Artikelsprache und Gerätesprache identisch sind, wird in der Adresse nur die Domain von "qrwp" auf "wikipedia" geändert und die Markierung für Mobilgeräteansicht gesetzt. Das obige Beispiel ergibt dann https://de.m.wikipedia.org/Bremen und der Nutzer wird sofort dorthin weitergeleitet.
- Entspricht die Artikelsprache nicht der Gerätesprache wird die Wikipedia-API der Sprachversion des Artikels mit dem Artikeltitel als Suchkriterium abgefragt, die verschiedenen Spachversionen mit der Gerätesprache verglichen und bei Übereinstimmung die passende Version in Mobilgeräteansicht adressiert.
Funktionale Änderung
Der Import der URL wird so gestaltet, dass die Variable $_GET nicht mehr verwendet und so das zwangsweise Urldecode umgangen wird, damit die falsch doppelt urlencodierten Adressen zuverlässig verarbeitet werden können.
Dann wird geprüft, ob der Datenteil der URL aus der Zeichenfolge id= gefolgt von Ziffern besteht. Wenn ja, wird im
- Fall 1. die Adresse in Form des Permanentlinks (aka: link by ID) ausgegeben, obiges Beispiel:
https://de.wikipedia.org/w/index.php?curid=554. Im - Fall 2. wird die Seiten-ID anstelle des Artikel-Titels als Suchkriterium für die API-Abfrage verwendet.
Rückwärts-Kompatibilität für bestehende QRpedia-Codes ist damit gewährleistet.
Diffs
[Quelltext bearbeiten]Die erforderlichen Skript-Änderungen werden hier folgend im Format unified diff dargestellt. Die Originaldateien (old) liegen im Phabricator Repository – Ausnahme: qrpedia.org/index.html.
qrpedia.org – index.html
[Quelltext bearbeiten]Hier konnte statt der Repository-Version nur das HTML-Output (Seitenquelltext) der Seite zum Vergleich genutzt werden. Im Repository ist die neueste Version eine index.html, die nicht mit dem im Browser angezeigten Seitenquelltext übereinstimmt. Auf qrpedia.org läuft tatsächlich keine index.html, sondern eine index.php.
- Wikipedia-pageID statt Artikeltitel als Merkmal verwenden
- Verarbeitung auf qrwp.org steuern durch Übergabe der pageID als Key-Value-Paar: id=<pageID>
- Überflüssigen Code aufräumen
--- old/index.html Thu Nov 07 13:56:17 2019
+++ new/index.html Sat Feb 01 21:58:01 2020
@@ -90,25 +90,16 @@
var original_URL = $(this).val();
if (original_URL.indexOf('wikipedia.org/wiki/') > 0) // Lazy way to see if it's a Wikipedia URL
{
- // Form a qrwp URL
- var new_URL = original_URL.replace('wikipedia.org/wiki/','qrwp.org/');
- var new_URL = new_URL.replace('https://','http://');
-
// Get the URL path
var url = document.createElement('a');
- url.href = new_URL;
- var path = url.pathname.replace('/','');
+ url.href = original_URL;
+ var path = url.pathname.replace('/wiki/','');
// Get the language of the article
- var language = url.hostname.replace('.qrwp.org','');
+ var language = url.hostname.replace('.wikipedia.org','');
// Add some text saying how many languages the article has
// Call the Wikipedia API
- ///
- console.log(new_URL);
- console.log(language);
- console.log(path);
-
$.getJSON(
'https://'+language+'.wikipedia.org/w/api.php?format=json&callback=?',
{
@@ -138,8 +129,7 @@
}
}
- ///
- console.log(encodeURIComponent(new_URL));
+ var new_URL = 'https://' + language + '.qrwp.org/id=' + pageId;
// Add the image to the page
$('.qr').attr('src','https://qrpedia.org/qr/php/qr.php?size=345&e=L&d='+encodeURIComponent(new_URL));
qrwp.org – .htaccess
[Quelltext bearbeiten]- URL-Path in Querystring wandeln, ohne ein Key-Value-Paar zu bilden. Zweck:
- Artikeltitel nicht per $_GET[] importieren, um automatisches urdecode zu verhindern
- pageID per $_GET[] importieren.
--- old/.htaccess Fri Sep 09 18:32:00 2011
+++ new/.htaccess Sat Feb 01 22:16:13 2020
@@ -5,7 +5,7 @@
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
-RewriteRule ^(.*)$ index.php?title=$1 [L,QSA]
+RewriteRule ^(.*)$ index.php?$1 [L,QSA]
#RewriteEngine on
#Options +FollowSymLinks
qrwp.org – index.php
[Quelltext bearbeiten]- urldecode des Artikeltitels vollständig im Skript steuern
- Artikeltitel oder pageID auswerten, je nach Input
- Im API-Aufruf llurl (deprecated) durch llprop=url ersetzen
--- old/index.php Wed Sep 02 21:51:00 2015
+++ new/index.php Mon Feb 03 20:21:58 2020
@@ -42,12 +42,22 @@
}
}
- // An .htaccess file changes example.com/Foo to example.com/?title=foo
+ // An .htaccess file changes example.com/foo to example.com/?foo
// Remove any escaped characters. Eg \'
- $request = stripslashes( $_GET['title'] );
+ $request = stripslashes( $_SERVER['QUERY_STRING'] );
// If a request has been sent - redirect the user
if ( $request != null ) {
+ if (@$_GET['id']) {
+ $pid = $_GET['id'];
+ $search = 'pageids=' . $pid;
+ } else {
+ // Correct double urlencoded string
+ $request = str_replace('%25','%',$request);
+ $request = urldecode($request);
+ $search = 'titles=' . $request . '&redirects=';
+ }
+
// Gets the phone user's primary language - based on the headers of the phone's browser
// Code modified from http://www.php.net/manual/en/reserved.variables.server.php#94237
// RFC 2616 compatible Accept Language Parser
@@ -62,7 +72,7 @@
$splits = array();
if ( preg_match( $pattern, $lang, $splits ) ) {
- $phone_language = $splits[primarytag];
+ $phone_language = $splits['primarytag'];
// Once the language has been found - no need to continue the loop.
break;
}
@@ -71,9 +81,9 @@
// Get the language requested. For example fr.qrwp.org/foo assumes that /foo is French
$requested_server = $_SERVER['SERVER_NAME'];
- if ( $requested_server != $server_name ) // If this has a subdomain
- {
$pieces = explode( ".", $requested_server );
+ if ( count($pieces)>2 ) // If this has a subdomain
+ {
$requested_language = $pieces[0]; // Assume that only one sub domain has been chosen. "fr.en.de.qrwp.org" will return "fr"
} else // If there is no sub domain, use the default language set in config.php
{
@@ -93,7 +103,9 @@
// If the phone's language is the same as the requested language (eg en-gb & en.qrwp) do the redirection without a call to Wikipedia
if ( $phone_language == $requested_language ) {
- $mobile_url = "https://$requested_language.m.wikipedia.org/wiki/" . $request;
+ $mobile_url = "https://$requested_language.m.wikipedia.org/";
+ if($pid) $mobile_url .= 'w/index.php?curid=' . $pid;
+ else $mobile_url .= 'wiki/' . $request;
writeLog( urldecode( $mobile_url ) );
header( "Location: $mobile_url" );
exit;
@@ -105,14 +117,14 @@
https://en.wikipedia.org/w/api.php?action=query&
prop=info|langlinks& // Get page info and alternate languages
lllimit=200& // Max number of languages to return
- llurl& // Get the URLs of alternate languages
+ llprop=url& // Get the URLs of alternate languages
titles=Rossetta_Stone& // Title of the page
redirects=& // Page may redirect - so get the final page
format=json // Other formats are available. Leave off for human readable XML
*/
// Construct the API call - this is to the $requested_language Wikipedia
- $api_call = "https://$requested_language.wikipedia.org/w/api.php?action=query&prop=info|langlinks&lllimit=200&llurl&titles=$request&redirects=&format=json";
+ $api_call = "https://$requested_language.wikipedia.org/w/api.php?action=query&prop=info|langlinks&lllimit=200&llprop=url&$search&format=json";
// Use CURL to retrieve the information
$curl_handle = curl_init();
Phabricator
[Quelltext bearbeiten]Wie besprochen wurde diese Lösung auf Phabricator vorgeschlagen: phab:T245907