WordPress, Uberspace, Https

Ich habe heute eine Stunde investiert, un diesen Blog auf SSL umzustellen. Dank Let’s encrypt kriegt man diesen Spaß nun auch kostenlos.

Im ersten Augenblick mag es sinnlos erscheinen einen öffentlichen Blog über Https auszuliefern. Diese Mentalität kommt aus der Zeit in der man jahrlich irgendeiner obskuren Zertifikatsbude eine bestimmte Summe Geld (wenig bei einer Domain bis verdammt viel für ein Wildcard Zertifikat) in den Rachen schmeißen mußte um an ein Zertifikat zu kommen, damit der normale User ein grünes Schloss in seinem Browser sieht. Dank Let’s encrypt können wir mit diesem Denkansatz brechen und alles über SSL liefern. Dank Https wird es schwieriger Malware in die Verbindung zu schleusen und das Lauschen gestaltet sich schwieriger. Manche Stimmen meinen, daß wir diversen Geheimdiensten das Leben schwerer machen, wenn die Masse an verschlüsselten Übertragungen ansteigt.  Angeblich bekommen Https Seiten in der Google Suche auch einen Bonus.

Hier schreibe ich grob nieder was ich machen mußte. Wenn ich was vergessen habe werde ich den Post anpassen. Über Tipps und Verbesserungsvorschläge freue ich mich natürlich

Der Blog läuft seit geraumer Zeit stressfrei auf uberspace.de wobei stressfrei für mich das wohl höchste Lob an einen Hoster ist, welches ich vergeben kann. Das Zertifikat wird auf dem Terminal erzeugt und aktiviert. Eine nette Anleitung gibt es im Blog. Der Apache wird per Rewrite Rule gezwugen Http Requests immer auf Https umzubiegen.

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{ENV:HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

Im Anschluss müssen noch ein Paar WordPress spezifische Sachen angepasst werden. Ich habe das in der Datenbank getan (vorher unbedingt ein Backup machen!).
Die Queries fand ich bei „Webongo“. Vor der Ausführung das sollte das ihreseite.de durch was sinnvolles ersetzt werden:

s/ihreseite.de/meineseite.de/g
#blog urls
UPDATE wp_options SET option_value = replace(option_value, 'http://www.ihreseite.de', 'https://www.ihreseite.de') WHERE option_name = 'home' OR option_name = 'siteurl';
#permalinks
UPDATE wp_posts SET guid = replace(guid, 'http://www.ihreseite.de','https://www.ihreseite.de');
#links, img src's
UPDATE wp_posts SET post_content = replace(post_content, 'http://www.ihreseite.de', 'https://www.ihreseite.de');
#Meta values
UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://www.ihreseite.de','https://www.ihreseite.de');

In manchen Artikeln habe ich Bilder von anderen Domains referenziert und das auch noch über http!
Solch Unfug läßt sich leicht mit LIKE finden:

select id, post_title, post_content from wp_posts where post_content like "<img%src=\"http://%" AND post_status="publish";

Einfach die ID an die Post.php Url dranhängen https://www.radikalblogger.de/wp-admin/post.php?post=[HIER REIN MIT DER ID]&action=edit und das Bild anpassen.

Angepasste RSS Feeds für WordPress

Aus gegebenen Anlass muß ich mich mal wieder mit meiner liebsten Blog/ CMS Software beschäftigen. Genauer gesagt geht es um Feeds und wie man sie aus WordPress rauskitzeln kann.

Wenn man /feed an die Url anhängt wird statt Html Xml ausgegeben:

http://schmiddi.co.cc/feed/

 

Dank mod_rewrite kann man den Feed nach verschiedensten Parametern filtern:

http://schmiddi.co.cc/2010/feed/

http://schmiddi.co.cc/category/linux/feed/

http://schmiddi.co.cc/tag/sticker/feed/

http://schmiddi.co.cc/comments/feed/

 

Mit GET Parametern sind dem Spaß keine Grenzen mehr gesetzt. Dem ungeübten sei gesagt, daß GET Parameter für Rattenschwanzlange Links verantwortlich sind.

Der 1. Parameter hängt mit einem Fragezeichen an der aktuellen Url, weitere kann man mit einem & Zeichen anhängen.

Um Einträge der Kategorie Linux anzuzeigen muß diese Url aufgerufen werden:

http://schmiddi.co.cc/feed/rss/?cat=7

 

Die ID 7 habe ich aus der Datenbank. Die WordPress Entwickler haben sich ein schlüssiges und gut verständliches Schema ausgedacht.

Einen Überblick über die Kategorien deines Blogs bekommst Du mit diesem SQL Befehl:

SELECT t.name, t.term_id
FROM wp_terms AS t, wp_term_taxonomy AS tax
WHERE tax.taxonomy = 'category' AND tax.term_taxonomy_id=t.term_id;

Wenn man eine Kategorie ausblenden möchte muß man das Minus Zeichen benutzen:

http://schmiddi.co.cc/?cat=-3

 

 

Man kann auch mehrere Id’s übergeben. Diese müssen mit einem Komma getrennt werden:

http://schmiddi.co.cc/feed/?cat=8,9,10,11,13,18,20

 

Weitere Parameter füge ich hier ein sobald ich sie benötige.

 

Kachingle – eine Alternative zu Flattr?

Draußen ist es so warm, dass ich schon gar keine Lust mehr habe vor die Tür zu gehen. Also surfe ich  sinnlos rum und müll den Blog von Grabi voll. Dabei bin ich auf dieses interessante Interview mit der Gründerin von Kachingle gestoßen. Meiner Meinung liest sich das Interview ein wenig wie Eigenwerbung, ist aber dennoch brauchbar.

Das Prinzip ist das ähnlich wie bei Flattr: Ich habe einen Button in meiner Seitenleiste. Wenn nun jemand Freude an meinem Blog hat, klickt er den Kachingle Button. Der geneigte Leser kann dies natürlich auch öfter tun. Am Ende des Monats wird die Einlage des Benutzers gleichmäßig auf die angeklickten Anbieter verteilt.

Das Bezahlmodell ist analog zu Flattr. Im Moment sind nur Zahlungen via PayPal möglich. Momentan kann man nur 5 US$ monatlich einzahlen. Es fallen 15%  Gebühren an (inkl. PayPal). Bei Flattr zahlt man 10% Gebühren exklusive  Kosten für den Bezahldienst. Falls ich mich nicht irre, muß man als Content Erzeuger nichts zahlen. (aufgrund der hohen Temperaturen kann ich mich aber durchaus irren). Schön an der Geschichte ist das transparente Abrechnungssystem. Ich glaube, daß man auch ohne Account Einsicht in die Daten hat. Als Beispiel soll der Benutzer „Jörg Eisfeld-Reschke“ dienen, denen ich zufällig und ohne Absicht ausgesucht habe. Das System kann man sich auch von der anderen Seite anschauen, hier exemplarisch die Statistik von Neunetz.com. Ausgeschüttet werden Beträge ab 3,35 US$

Anbindung: Momentan habe ich ein kleines TextWidget mit JavaScript in der Seitenleiste.

Fazit: Nun ja, das kann ich jetzt schlecht ziehen. Der Dienst sieht interessant aus, Kachinglen kann ich noch nicht, da mein PayPal Konto mal wieder leer ist und ich eben erst auf der Bank war zum Überweisen. Am Ende des Monats werde ich mal wieder was drüber schreiben. Bis dahin wünsche ich Euch viel Freude in der Hitze:)

WordPress Exportfile mit PHP verarbeiten

Biere 333 Export
Attribution-NonCommercial-NoDerivs License by Kris_B

Momentan skripte ich relativ viel. Dabei bin ich auf das Problem gestoßen, den XML Export von WordPress in eine andere Datenbankstruktur zu quetschen. Als Hilfe dient mir dabei ein wenig oO Ekel-Code, der per simpleXML der das File parst und alles relevante in ADT’s (strcuts mit get + set) drückt, damit man leichter weiterkommt. Wers will, hier ist es. Zum Skript ist nicht viel zu sagen, es gibt Unmengen an ADT’s mit redundanten Funktionen und ein paar Arrays die damit gefüllt sind. Am Besten schaut man sich die Chose mit dem Classbrowser einer beliebigen PHP IDE an. Vielleicht erspare ich damit jemandem eine Stunde Arbeit. 🙂

Notizen zur Pluginschreiberei für WordPress

spot the wordpress
Attribution-NonCommercial-ShareAlike License by miss604

Wordpressplugins selbst schreiben ist kein Problem. Die Dokumentation ist recht ordentlich, manche Dinge sind jedoch ein wenig hakelig. Aber mit ein wenig Hartnäckigkeit erzielt man rasch Ergebnisse.

Einen englischsprachigen Einstieg findet man hier:

Diese Anleitung orientiert sich an dem Plugin schmie_twitter. Download kann man es hier. Die Eigentlichen Funktionen sind soweit es geht von WordPresscode getrennt.

Das Plugin aktualisiert den Status bei Shortmessaging Diensten (Twitter und Identica), wenn ein neuer Artikel erstellt wurde, oder ein älterer aktualisiert wurde.

Näher betrachtet wird folgendes:

  • Das Erstellen einer Settingspage.
  • Lesen und Schreiben von WordPress Einstellungen
  • Das Hook- oder Action System von WordPress
  • Übersetzungen von Plugins
  • Verteilen eines Plugins über das Plugin Directory

Ich möchte an dieser Stelle keine deutsche Übersetzung der WordPressdokumentation erstellen, sondern kurz und bündig beschreiben, was wie funktioniert.

Dieses Plugin sendet keine Ausgaben an den Benutzer, abgesehen von einer Seite mit Einstellungen.

in guter Einstieg ist das Betrachten der Verzeichnisshierarchie

schmiddi@dasgrauen:~/web/schmie_twitter$ ls -R

.:

classes  img  lang  readme.txt  schmie_twitter_options.php  schmie_twitter.php  screenshot-1.png  uninstall.php

./classes:

Cschmie_twitter.php  CToIdentica.php  CTo_Twitter.php  CUrlshortener.php

./img:

logo.png

./lang:

schmie_twitter-de_DE.mo  schmie_twitter.de_DE.mo  schmie_twitter.po

Die beiden letzten Ordner sind relativ unwichtig. In img. liegt eine Bilddatei mit dem Logo und in lang sind die zur Internationalisierung nötigen Dateien abgelegt. Dazu später mehr.

In classes liegen 4 Klassen, die die Grundfuntionen bereitstellen.

schmie_twitter.php ist der Einstieg in das Plugin.

Um ein Plugin zu schreiben wird nur eine PHP Datei benötigt, die den Namen des Plugins trägt. Die Datei kann auch in einen Unterordner nach diesem Schema abgelegt werden : schmie_twitter/schmie_twitter.php

Wichtig ist die Einzigartigkeit des Namens. Leider bietet WordPress keine Namespacefunktionen oder sonstige Garantien der Einzigartigkeit. Ich wähle zur Namensvergebung einen Präfix und anschließend einen prägnanten Namen. Die Plugindatei benötigt einen speziellen Header, der von WordPress geparsed wird:

Actions & Hooks

Zumindest der Plugin Name muß gesetzt sein, damit WordPress das Plugin akzeptiert.

Was nun folgt ist normaler PHP Code:

	//Codeauszug schmie_twitter.php

	function post_twit($post_ID) {
	/**
	....
	**/
	}//function
	add_action('publish_post','post_twit');

Bemerkenswert ist der add_action Mechanismus. (http://codex.wordpress.org/Function_Reference/add_action)

Um dies zu erklären, muß auf die Hook Mechanismen eingegangen werden. Bestimmten Ereignisse sind mit Hooks (Haken) oder actions (Aktionen) verbunden. Wenn diese Ereignisse ablaufen, wird abgeprüft, welche Funktionen noch ausgeführt werden sollen. Diese werden mit der add_action Funktion angemeldet. In unserem Fall wird bei dem Ereigniss ‚publish_post‘ also bei der Veröffentlichung eines Posts die Funktion post_twit angehängt und entsprechend ausgeführt.

Ein weiteres Beispiel:

/**** Save Settings **/
	$st= new CSchmie_twitter();
	add_action( 'admin_init', 'register_mysettings' );
	function register_mysettings() {
		global $st;
		$st->register_mysettings();
	}//function

Hier wird deutlich, dass das Actionsystem nur Funktional und nicht objekt-orientiert angesteuert werden kann. In der Funktion register_mysettings wird die Methode register_mysettings des CSchmie_twitter Objekts aufgerufen. Das Schlüsselword global wird benötigt um die Variable innerhalb der Funktion bekannt zu machen, da PHP merwürdige Gültigkeitsbereiche im Vergleich zu anderen Sprachen hat.

Ein letztes Beispiel wäre das Erzeugen einer Settingspage:

/** @see schmie_twitter_options.php ***/
add_action('admin_menu', 'schmie_twitter_create_menu');
function schmie_twitter_create_menu() {
	add_options_page('schmie_Twitter Settings', 'schmie_twitter Settings', 'administrator', __FILE__, 		'schmie_twitter_settings_page', __FILE__);

}//function

function schmie_twitter_settings_page() {
	if ( file_exists ( dirname(__FILE__).'/schmie_twitter_options.php' )) {
		include( dirname(__FILE__).'/schmie_twitter_options.php' );
	} else {
		e( '

Couldn't locate the settings page.

', 'wp-to-twitter' );
	}//fi
}//function
Auch hier werden wieder Grenzen des Systems aufgezeigt. Zuerst wird die Action create_menu() bei der Generierung des Administratormenüs aufgerufen und erzeugt die Links zu der Einstellungsseite und anschließend wird die Einstellungsseite generiert. Der include Mechanismus ist analog zum Präprozessorbefehl in C.
Durch die Modularisierung mit Hooks kann dies nicht in einem Schritt geschehen. Möglich wäre nur eine Zusammenfassung innerhalb einer neuen Funktion . (@@@wirklch? Meta Hooks?)

Optionspages

Der nächste Punkt ist das Erstellen einer Einstellungsseite (Optionspage).
Zum größten Teil werden hier nur Abgleichungen mit der Datenbank erledigt.
Wichtig hierbei sind die Funktionen register_settings(‚optiongroup‘,’option‘), und get_option(‚option‘).
WordPress speichert sämtliche Einstellungen in einer Datenbanktabelle namens Options. Die Funktion register_settings prüft das Vorhandensein der Einstellung und legt sie gegebenfalls an. Bei Optiongroup handelt es sich um eine Art Namespace, um die Einzigartigkeit zu gewährleisten.
Die Verarbeitung der Einstellungen geschieht über ein HTML Formular. Zuerst wird die Optiongroup bekannt gemacht:
<?php settings_fields( ’schmie_settings_group‘ ); ?>
Der Lese / Schreibzugriff wird über die Funktion get_option(‚option‘) abgewickelt. Die Funktion ist robust, doch leider mit sehr viel HTML verbunden:
BESCHREIBUNG
<input name="OPTION NAME" type="text" value=";" />

Zum einen ergbit dies eine sehr unelegante Vermischung aus PHP un HTML, zum anderen ist es mit einigem Schreibaufwand verbunden. Generatorfunktionen sind meines Wissens nicht vorhanden. Sehr nützlich für mich waren ein paar einfache PHP Funktionen, die die Einstellungen mit einem HTML Rumpf ausgeben:

function schmie_generate_textfield($description,$option,$password=false) {
	$option_val=get_option($option);
	$type='text';
	if ($password)
		$type='password';

echo "	
        $description
        
        ";
}//function

//looks nice :)
schmie_generate_textfield(__("Twitter Password", 'schmie_twitter'), 'schmie_tw_pass',true);

Bei der Namenswahl sollte man immer recht vorsichtig sein, damit keine WordPressfunktionen überschrieben werdem. Auch hier hat sich wie bei Settings das Präfixsystem für mich bewährt.

Übersetzung

Das Thema Internationalisierung sollte direkt zu Anfang der Entwicklung betrachtet werden. Dies erspart viel Änderungen am Code. Verwendet wird die innerhalb der Sprache PHP implementierte Gettext Bibliothek. Das Softwarepaket gettext ist für Übersetzungen erforderlich.

Links:
http://www.gnu.org/software/gettext/manual/gettext.html
http://www.php.net/manual/de/intro.gettext.php
http://codex.wordpress.org/I18n_for_WordPress_Developers

Sehr empfehlenswert ist dieser Beitrag aus der Blogosphäre, der deutlich tiefer auf die Thematik eingeht. Leider habe ich den Artikel zu spät entdeckt:(:

http://www.tuxlog.de/wordpress/2007/wordpress-plugins-ubersetzen-mit-gettext-po-und-pot-dateien/

Zuerst muß im Code gekennzeichnet werden, was übersetzt werden soll. Dabei wird die Zeichenkette mit einem Funktionsaufruf umschlossen und ein Namespace für die Übersetzung angegeben:

$foo=__('Dies könnte Ihre Übersetzung sein', 'NAMESPACE') .

Eine direkte Ausgabe erfolgt mit :

_e('Hallo Welt', 'NAMESPACE');

Platzhalter sind auch möglich:

_e("$ctr Flaschen Bier an der Wand",'NAMESPACE');

oder mit

printf(__("%d Flaschen Bier an der Wand",'NAMESPACE'), $ctr);

Das Einsetzten des Namespaces kann auch durch diverse Skripte (z.B.: innerhalb der Admin Funktionen im WordPress Plugindirectory). Dann genügt auch ein $bar = __(‚Hallo W‘);

Nun wird mit xgettext mit den o.g. Admin Funktionen eine POT Datei (Portable Object Template) erzeugt.

xgettext -L PHP -k –keyword=_e –keyword=__ –from-code=utf8 –default-domain=schmie_twitter –output=schmie_twitter.pot *.php

Dabei handelt es sich um eine Liste der zu übersetzenden Strings. Nun erstellt man eine Kopie der POT Datei und pflegt die entsprechenden Übersetzungen dort ein:

cp schmie_twitter.pot schmie_twitter-de_DE.po

Dies kann per Texteditor oder speziellen Tools wie KBabel oder Poedit erfolgen.

Wenn dies erledigt ist, wird eine binäre Datei mit der Namenskonvention pluginname-<lang_string>.mo mit msgfmt erzeugt:
msgfmt -o schmie_twitter.mo de_DE.po
Den Namnesstring erfährt man in der wp-config.php. Die Datei ist im Hauptverzeichniss der WordPress installation zu finden. Der String für deutschsprachige Unterstützung sieht so aus: define (‚WPLANG‘, ‚de_DE‘);

Nun muß die Übersetzung innerhalb des PHP Codes geladen werden. Dies geschieht mit folgenden Zeilen:

$path= basename(dirname(__FILE__));
	$domain='schmie_twitter';
	load_plugin_textdomain('schmie_twitter', false, $path . '/lang');
Ich habe mich dazu entschlossen alle Übersetzungen in den Unterordner lang zu legen.

Deinstallation:

Ein Skript kann händisch entfernt werden, indem einfach alle PHP Dateien entfernt werden. Datenbankeinträge bleiben dabei jedoch vorhanden. Deswegen solle immer der Deinstallationsmechanismus von WordPress verwendet werden.
Um eine Uninstallroutine zu schreiben, gibt es 2 Möglichkeiten:
-per hook
-Uninstall.php
Bei der Methode mit Hook wird wie bei den oben beschrieben Actions vorgegangen:
register_uninstall_hook(__FILE__, 'my_uninstall_hook');
	function my_uninstall_hook() {
		delete_option('option_1');
	}//
Allerdings wurde dieser Hook erst mit der Version 2.7 von WordPress implementiert. Man kann zwar mit function_exists(callback) eine Fehlermeldung abfangen, allerdings passiert bleiben die Einstellungen in der Datenbank.
Deshalb sollte man dem Weg mit der Uninstall.php den Vorzug geben. Dabei wird im Hauptverzeichnis des Plugins die genannte Datei erzeugt. Bevor man an das entfernen der Einstellungen geht, sollte man Prüfen, ob die WP_UNINSTALL Konstante gesetzt ist:

	if(!defined('WP_UNINSTALL_PLUGIN') )
	    exit();
	delete_option( 'schmie_tw_user' );

das WordPress Plugin Directory

Da man Plugins aus dem Directory recht bequem direkt in WordPress installieren kann, empfiehlt es sich seine Werke dort zu veröffentlichen. Nach der Registrierung (Passwort aufschreiben) füllt man einen Antrag auf Aufnahme des Plugins an. Ein WordPress Mensch schaut sich das Plugin an und nach einer gewissen Zeit (Spanne: Stunden bis Tage) wird das Plugin freigeschaltet. Zuerst schaut man sich die Pluginseite an, vor allem den Adminbereich. Was jetzt noch fehlt ist die Beschreibung im Directory. Dies geschieht über ein Textfile. Ausreichende Infos gibts hier.
Es gibt auch eine sehr brauchbare Seite mit Informationen zum Repo http://wordpress.org/extend/plugins/about/svn/.

Hier die Schnellversion (auch für den Laien):
Die Adresse des Repo’s findet Ihr auf Eurer Pluginseite.
Zuerst wird in ein leeres Verzeichniss ausgecheckt (Check Out):

	svn co http://plugins.svn.wordpress.org/schmie-twitter/

Hier gibts 3 Ordner branches tags trunk. Die aktuelle Version des Plugins liegt immer im trunk.
Also das Plugin dorthin kopieren. Nun fügen wir die Dateien dem Repository hinzu:

svn add trunk/*

Sehr nett ist es ältere Versionen im Tagsverzeichnis zu sichern. Dann stehen auch diese Versionen zum Download zur Verfügung. Falls man mal in älteren Code sehen will und nicht so bewandert mit SVN ist, hat man hier alles schnell zur Hand also:

svn cp trunk tags/1.0

Eingecheckt wird so (Check In):

svn ci -m "hey du willst es hier ist es"

Anmeldung am Repository mit den Directory Benutzerdaten.
Jetzt noch ein paar Worte für diejenigen, die noch nie mit Versionierungssoftware gearbeitet haben. Löschen im Dateimanager ist recht sinnlos, wenn man mit SVN oder ähnlichem arbeitet, da die Datei(en) zwar von der Platte getilgt sind, aber nicht aus dem Repo. Das gilt auch für Verschieben oder Umbenennen von Dateien. Auf solche Details ist immer zu achten. Eine gute Dokumentation für Subversion findet sich in Version Control with Subversion.

Das wärs von mir zu diesem Zeitpunkt. Viel Freude beim skripten / programmieren. Für Tipps oder Verbesserungen bin ich wie immer sehr dankbar. Wenn ich mal wieder ein Widget schreibe oder eines besseren belehrt werde, wird der Artikel angepasst.

Plugins für WordPress schreiben (diesmal Twitter)

Power Plugs
Attribution-NonCommercial License by Gone-Walkabout

Heute mal  etwas in eigener Sache. Der Artikel hat zwar (leider) nicht soviel mit Ubuntu zu tun, aber vielleicht interessiert es doch den ein oder anderen auif dem UU Planeten.Vor Ewigkeiten hatte ich mal 2 Plugins für WordPress geschrieben und ich muß sagen, daß das eine recht angenehme Sache ist – auch für Leute die sich eher selten mit Skriptsprachen rumschlagen. Die englischsprachige Doku ist sehr gut, die Methoden logisch und einfach zu implementieren. Da ich massive Probleme mit Twitter und meinem Hoster hatte (hier und auch da) entschloss ich mich mal wieder ein Plugin zu schreiben. Zu finden ist das gute Stück namens schmie_twitter im Plugin Directory. Die Funktionen beschränken sich auf ein Minimum:

  1. Auf Twitter veröffentlichen bei neuem Post
  2. Auf Twitter veröffentlichen bei Aktualisierung eines Posts
  3. Twitternachricht vorkonfigurieren. (Hallo bei %blog gibt Neuigkeiten: %Post, %url)
  4. Url kürzen (ein paar Dienste inkl. bit.ly vorhanden).

Der Clou an der Sache ist, dass man sowohl per HTTP  mit Twitter reden kann, als auch per Email (Twittermail); wenn der Hoster Twitter ausgesperrt hat. Was noch fehlt ist ein wenig i18n ansonsten wars das. Wenn  Interesse an einem Artikel über Pluginprogrammiererei besteht oder jemand etwas auf der Seele hat wegen schmie_twitter einfach einen Kommentar hinterlassen.

Update: jetzt auch schon fast mit Identi.ca Support. Super

Twitter und Byethost

Bekanntlich möchte mein Webhoster ja nicht mit Twitter. Eben mal ein wenig analyisert. Laut phpinfo(); ist Curl aktiviert, funktioniert recht normal, nur nicht mit Twitter und Facebook. Gethostbyname schafft Gewissheit:

Twitter?: <?php echo gethostbyname(‚twitter.com‘); ?><br/>
Facebook?: <?php echo gethostbyname(‚facebook.com‘); ?><br/>
Google?: <?php echo gethostbyname(‚google.com‘); ?><br/>
Byet.net?: <?php echo gethostbyname(‚byet.net‘); ?>

Hier die Ausgabe

Twitter?: twitter.com
Facebook?: facebook.com
Google?: 209.85.225.99
Byet.net?: 173.45.83.131

Wenn der Name nicht aufgelöst wird, klappts nicht. Also gilt es Alternativen zu finden.
Ich kann zwar erfolgreich ein Curl auf eine Twitter IP machen, allerdings klappt das Posten nicht, da bei Twitter anscheinend geclustert / geloadbalanced (geiles Wort:)) wird und ein einzelner Server meine Anfrage nicht verarbeiten will:
schmiddi@nohost:~$ ping -c 1  www.twitter.com
PING twitter.com (168.143.162.68) 56(84) bytes of data.
64 bytes from 168.143.162.68: icmp_seq=1 ttl=247 time=208 ms
— twitter.com ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 208.490/208.490/208.490/0.000 ms
schmiddi@nohost:~$ ping -c 1  www.twitter.com
PING twitter.com (168.143.161.20) 56(84) bytes of data.
64 bytes from 168.143.161.20: icmp_seq=1 ttl=247 time=236 ms
— twitter.com ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 236.249/236.249/236.249/0.000 ms
schmiddi@nohost:~$ ping -c 1  www.twitter.com
PING twitter.com (168.143.162.100) 56(84) bytes of data.
64 bytes from 168.143.162.100: icmp_seq=1 ttl=247 time=213 ms
— twitter.com ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 213.934/213.934/213.934/0.000 ms
Verdammt. Laut Hoster wurde der Zugriff auf solche Seiten gesperrt, da allerhand Idiotenvolk über Byethost dort SPAM verbreitet hat.
Mit Twitterfeed funktionierts über Umwege. Twitterfeed prüft ungefähr stündlich den RSS Feed und veröffentlicht Neues via Twitter. Das nicht zeitnah veröffentlicht wird, ist zwar nicht lebensnotwendig, stört jedoch den Kontrollfreak.Leider hat man auch keine Möglichkeit die Posts zu manipulieren.  Posttitel + gekürzte URL, das wars. Klappt zwar, ist aber nicht das Wahre.

Ich brauche eine Art Broadcast-Dienst, dessen Adresse hier nicht gesperrt ist. Ich stell mir das so vor, dass ich diesem Dienst eine Nachricht sende und dann wird es auf den unterschiedlichsten Diensten (u.A. Twitter) veröffentlich.

Leider, leider bin ich noch immer auf der Suche nach sowas, aber vielleicht findet ich ja noch eine schöne Quick & dirty Lösung für PHP :).

Sicherheitslücke in WordPress

Lady bug First time in this year
Attribution License by joka2000

Eben bin ich bei heise.de auf  diese „Sicherheitslücke“ in WordPress gestoßen. Betroffen ist nicht nur die aktuelle Version 2.8.3 sondern auch alle Versionen darunter (Quelle). Zum Spaß hab ich’s mal bei mir lokal auf der Maschine ausprobiert. Wenn die wp-login.php aufgerufen wird und dem Argument key ein Array statt einer einzelnen Variablen übergeben wird, generiert das Script ein neues Passwort, schickt dieses aber nicht per Mail an den Admin.  (Siehe function reset_password($key) in Zeile 189). Ein Einbruch in den Blog ist so nicht möglich, aber der Admin kann ausgesperrt werden.

Diesen Bug behebt man indem man in der reset_password($key) dem

if (empty($key))

eine Arrayprüfung anhängt

if (empty($key) || is_array($key))

Falls das Kind schon ins Wasser gefallen ist, gibts hier Hilfe.

Ich habe dem Artikel den Tag „Linux“ hinzugefügt, weil es für die Blogger vom Ubuntuplaneten auch interessant sein dürfte.

Flickr-Plugin für WordPress

HPIM1912
Bilder in meine Posts einfügen war  bis vor 10 Minuten eine regelrechte Qual. Bilder für den Blog uppe ich bei Flickr oder Verwende etwas mit CC Lizenz. Wenn die Bilder auch auf meinem furchbar langsamen Webspace lägen, würde es unerträglich mit den Ladezeiten werden :(.Nun bin ich auf das Plugin WordPress-Flickr Manager gestoßen. Allerdings läuft die Version aus dem WordPress Repository nicht mit meinem WordPress 2.8. Die Gründe werden hier erörtert und eine angepasste Version angeboten. Die Installation läuft ab wie immer, man muß nur noch in Flickr den Zugriff gewähren.Im Artikeleditor gibts dann  über dem Textfeld ein Flickr-Icon. Mit dem Manager kann man die Metainfos der Bider verändern, neue Bilder hochladen, löschen usw..  Davon lasse ich die Finger. Uploads tätige ich mit jUploadr.

Hier noch ein Screenshot von der Geschichte:

screenshot wordpress flickr plugin

Kommentar-Spam UPDATE

In letzter Zeit besucht mich des öfteren ein Spambot, der mir merkwürdige Nachrichten à la

CRFX9K yozenanuhwar, [url=http://qsiblkcdiudm.com/]qsiblkcdiudm[/url], [link=http://oojpidnudwqe.com/]oojpidnudwqe[/link], http://nrvxxrryljly.com/

hinterläßt. Ist zwar eine nette Abwechslung zu den Penis enlargement Geschichten aber auf die Dauer etwas nervig.

Ein Turing Test für die Kommentare muß her. Solch merkwürdigen Buchstabensalat möchte ich niemandem zumuten.

Am nettesten erschienen mir die Captcha’s mit Rechenaufgaben:

Allerdings ist Mustererkennung – vor allem Testerkennung ein recht alter Hut für den gewieften Informatiker.Nach 2 Minuten googlen bin ich sogar auf einen OCR Service im Web gestoßen. Klappt prima, leider kommt der Dienst nicht mit PNG zurecht, beweist aber, dass sich diese Captchas mit wenig Aufwand aushebeln lassen.   🙁

Wenn  ein Spammer dieses Plugin einmal austrickst, müssen sich viele Blogger die unendliche Mühe machen und das Plugin updaten, ein Neues zu installieren, oder einfach aufgeben.

Interessanter ist  reCaptcha. Fast jeder ist irgendwann mal über diese rote Abfragebox gestolpert.

reCaptcha beschäftigt sich mit der Digitalisierung von Büchern. Man bekommt immer 2 Wörter serviert. Eines wurde bereits korrekt digitalisiert (in diesem Fall glaube ich „RONALD“, bei dem 2. hatte die OCR Software Probleme. Wenn nun RONALD korrekt eingegeben wird, geht reCaptcha davon aus, dass brokaw auch korrekt eingetippt wurde und der Kommentar wird veröffentlicht. Über die korrekte Schreibweise von brokaw entscheidet dann seitens reCaptcha ein Statistikprogramm. Mit dem Eingeben des Captchas erbringt man nicht nur den Beweis ein Mensch zu sein, sondern hilft auch noch bei der Übersetzung von Büchern.  Finde ich echt nett 🙂

Etwas über die Installtion zu schreiben erübrigt sich. Lediglich eine Registrierung auf der Seite ist notwenig, um an die API Keys zu kommen. Das Plugin ist für WordPress, MediaWiki, phpBB, Movable Type, Drupal, Symfony, Typo3, NucleusCMS, vBulletin, Joomla und JSP Mailhide verfügbar.

Nachtrag

Dank der Tips von zefanja, Jan und Christoph habe ich die rsCaptchas wieder ausgeschaltet und versuche es nun mit einer Kombination aus Akismet und NoSpamNX.

Siehe auch:

http://linuxundich.de/de/webhosting/wordpress-mit-nospamnx-und-akismet-gegen-spam-harten/