Wikipedia:WikiProjekt Bremen/BremenpediA/QRpedia+

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

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.

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.

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

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();

Wie besprochen wurde diese Lösung auf Phabricator vorgeschlagen: phab:T245907