Sprachrohr aus der Hölle…
Dev
Alles was man so „Developen“ kann…
WordPress – Probleme mit translation und open_basedir auf Windows
14 September 13
Gerade das Problem gehabt, dass nach aktuellem Update von WordPress auf Version 3.6.1 einige Plugins über nicht erreichbare Übersetzungsdateien klagten. (open_basedir restrictions)
Fix: l10n.php ab Zeile 336 (Funktion load_textdomain( $domain, $mofile )):
$mofile = apply_filters( 'load_textdomain_mofile', $mofile, $domain ); // Sanitize $mofile = plugin_basename( $mofile ); // <-- eingefügt, dann stimmt der Pfad wieder. if ( !is_readable( $mofile ) ) return false;
fertig. Keine schäbbigen Warnungen mehr, weil WordPress mal wieder mit den Pfaden umherschmeißt.
Meh, vielleicht hilfts ja irgendwem.
Facebook RSS-App die Zweite…
11 Juni 12
Nachdem Facebook im Mai die Permanenten Tokens abgeschafft hat, musste ich meine RSS-Ping-Applikation gezwungenermaßen aktualisieren.
Der neue Authentication-Flow sieht es leider nicht mehr vor, dass eine Applikation ohne eingeloggten Benutzer agiert.
Daher ein kleines Update. Das neue Skript funktioniert nur noch mit einem Server im Hintergrund, während es bei dem alten Skript noch möglich war lokal zu testen ist man nun leider dazu gezwungen scharf zu schießen. (Macht es halt etwas umständlicher, imho.)
Zum Anmelden der neuen Applikation benötigt man nun nur noch folgende Rechte:
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=manage_pages,create_note&response_type=token # manage_pages für Seitenverwaltung # create_note um Notizen posten zu dürfen
Und der zugehörige Code der Applikation in Perl:
#!/usr/bin/perl use strict; use LWP::Simple; # Für Get-Anfragen an Facebook use CGI; # Zum Auswerten der Parameter use JSON; # Zum Auswerten der Antworten use URI::Escape; # Zum Escapen der Nachrichten my $q = CGI->new(); # Neuer Query # Anwendungs-ID my $client_id = '123456789012345'; # Anwendungs-Secret my $client_secret = '1234a56b789012cde345678a90123b45'; # Fan-Page ID my $page_id = '123456789012'; # Ort des Skripts # Muss mit Redirect_URI übereinstimmen und im # App-Domain Raum liegen. my $script_location = $q->url(); # Solange, wie der Parameter "Code" nicht angegeben ist. unless($q->param('code')) { my $code_query = "https://www.facebook.com/dialog/oauth?" . "client_id=" . $client_id . "&redirect_uri=" . $script_location . "&response_type=code"; print $q->redirect($code_query); exit; } else { if($q->param('code') eq "") { print $q->header(-status=>406), $q->start_html('Problems'), $q->h2('No Coffee for you.'), $q->strong('Code was empty... User not logged in?'); exit 0; } my $token_query = "https://graph.facebook.com/oauth/access_token?" . "client_id=" . $client_id . "&redirect_uri=" . $script_location . "&client_secret=" . $client_secret . "&code=" . $q->param('code'); my $app_token = get($token_query); &post_news($app_token); exit; } exit; sub post_news($) { # Application Token my $token = shift; # Betreff # Achtung! Lazy auf UTF8 konvertieren, sonst # werden Umlaute nicht richtig dargestellt. my $subject = uri_escape_utf8('Nur ein Test'); # Nachricht my $message = uri_escape_utf8('Testnachricht...<br>Hallo Welt!'); # Liste der Accounts (der verwalteten Seiten / Apps ...) holen # und Token für die Seite suchen. my $accounts = get('https://graph.facebook.com/me/accounts?' . $token); unless($accounts) { print $q->header(-status=>407), $q->start_html('Problems'), $q->h2('This should (hopefully) never happen...'), $q->strong('Accounts was undefined - Maybe wrong token?'); exit 0; } my %data = %{decode_json($accounts)}; my $page_access_token = ""; foreach my $access_page (@{$data{'data'}}) { my %item = %{$access_page}; if($item{'id'} eq $page_id) { $page_access_token = $item{'access_token'}; } } if(!defined $page_access_token || $page_access_token eq "") { print $q->header(-status=>408), $q->start_html('Problems'), $q->h2('No access token...'), $q->strong('manage_pages privilege removed? Try granting it again!'); exit 0; } # Nachricht posten my $news_id = get('https://graph.facebook.com/' . $page_id . '/notes?message='. $message . '&subject=' . $subject . '&method=post&access_token=' . $page_access_token); print $q->header(-status=>200), $q->start_html('Great Success'), $q->h2($news_id . " posted!"); exit; }
Sollte man ausgeloggt werden, reicht ein einfaches:
https://graph.facebook.com/oauth/access_token?client_id=APP_ID&client_secret=APP_SECRET&grant_type=fb_exchange_token&fb_exchange_token=ALTES_TOKEN
für den Relogin. (natürlich muss dann das alte pseudo perma Token durch das Neue ersetzt werden.)
Firefox – Probleme mit Unicodedarstellung
13 Mai 12
Firefox kennt plötzlich keine Dingbats mehr (quick-and-dirty)
Heute meinte mein Firefox plötzlich kein UTF-8 mehr zu können. Okay, ganz stimmt das nicht, UTF-8 konnte er noch – jedoch wurden Sonderzeichen aus bestimmten Bereichen (u+2700 Dingbats) nicht mehr dargestellt.
Anstelle den normalen Zeichen erhielt ich nur noch gesperrte Leerzeichen als Ausgabe.
Nach etwas Recherche erhärtete sich der Verdacht, dass eine defekte Schriftart dafür der Grund ist. Diese muss irgendwie zusammen mit der letzten Office 2007 Installation und entsprechenden Updates auf mein System geraten sein, denn davor ging alles noch ohne Probleme.
Die Besonderheit beim Firefox ist, dass er sich die – für ihn am besten aussehende – Repräsentation aus den Schriftarten aussucht, die die Zeichen darstellen kann. Für UTF-8 gibt es keine bevorzugten Schriftarten, wie zum Beispiel bei Kyrillisch, Griechisch oder Ähnlichem. (about:config font.name-list… oder im Schriftarten-Dialog unter Darstellung)
Für UTF-8 benutzt der Firefox, genau wie Thunderbird und andere Mozilla-Produkte die Einstellungen aus „Andere Sprachen“. Enthält die dort eingestellte Schriftart (z.B. für Serif – Times New Roman) keine Darstellung für die gesuchten Zeichen wird aus der Liste der installierten Schriftarten die nächst Beste genommen, die die Zeichen „vermutlich“ (wo der darzustellende Bereich nicht gesperrt ist) darstellen kann.
In meinem Fall scheint genau diese Schriftart aber an den besagten Stellen nur gesperrte Leerzeichen (also nix) zu enthalten, der Bereich selber ist jedoch nicht gesperrt.
Beheben lässt sich dies, in dem man für Serif zum Beispiel eine Schriftart auswählt, welche an besagten Stellen keine Leerzeichen aufweist. (Wie zum Beispiel die wundervolle kostenlose Schriftart DejaVu Sans)
Quick-And-Dirty
Der „Fix“ ist natürlich sehr sehr quick-and-dirty (schnell-und-unsauber), da er das eigentliche Problem, die „defekte“ Schriftart, bzw. die Firefox Auswahl Dieser als bessere Repräsentation, nicht behebt, jedoch kann man so wenigstens wieder sicher sein alle Zeichen zu sehen, die auch wirklich da seien sollten.
Eine sauberere Lösung wäre die besagte Schriftart, wenn nicht benötigt, zu entfernen oder durch eine vollständige Unicode Schriftart zu ersetzen.
Update: Die besagte Schriftart ist jpn_boot (oder eine der anderen _boot-Schriftarten), welche wohl durch die unbeaufsichtigte Installation von Windows Vista oder 7 auf die Festplatte kommt. Zu sehr geringer Wahrscheinlichkeit fällt die Firefox Auswahl genau auf diese. Festzustellen mit dem Addon „Font Info„[1].
Bisher gibts diesbezüglich 2 offene Bugpostings[2][3] bei Mozilla. Mal schaun, was sich da noch tut. 🙂
—
[1] https://addons.mozilla.org/en-US/firefox/addon/fontinfo/
[2] https://bugzilla.mozilla.org/show_bug.cgi?id=91190
[3] https://bugzilla.mozilla.org/show_bug.cgi?id=713595
Mystique und die Probleme mit dem M�rz
29 März 12
Irgendwie hat Mystique (das Theme was ich hier einsetze) manchmal Probleme mit den Monatsnamen. Keine Ahnung ob es an irgendeiner Fehlkonfiguration von mir liegt oder so, jedoch hat bei mir beim Monat März in der Standardinstallation einen kleinen Schönheitsmakel (Remember that „Schei� Encoding“ shirt?!).
Beheben lässt sich dieser durch 2 kleine Änderungen.
Einer Extended „archive.php“ die den selben Inhalt trägt, wie die normale archive.php, mit dieser Zeile anstelle des alten Datumsstrings:
<h1><?php atom()->te('Archive for %s', sprintf('%s', $wp_locale->get_month(get_the_time('n')) . " " . get_the_time('Y'))); ?>
und einer kleinen Änderung der Funktion getDate() in der atom-core.php
/* * Return the post date * * @since 1.0 * @param string $mode * @return string */ public function getDate($mode = ''){ // 'relative' or a date string like 'd-M-Y' $mode = empty($mode) ? atom()->options('post_date_mode') : $mode; if($mode === 'absolute') $mode = get_option('date_format'); // date_i18n($mode, strtotime(get_the_time('Y-m-d', $this->data->ID))) // was get_the_time($mode, $this->data->ID) return ($mode !== 'relative') ? date_i18n($mode, strtotime(get_the_time('Y-m-d', $this->data->ID))) : atom()->getTimeSince(abs(strtotime("{$this->data->post_date} GMT"))); }
und schon wird aus M�rz wieder der gute alte März. 😉
Btw. � ist � (in case anyone is wondering)
QtonPi
2 Februar 12
Unglaublich, da geht man ein mal die Refferer des Blogs durch und wird daran erinnert, dass man Anfang Dezember letzten Jahres an einem „Gewinnspiel“ teilgenommen hat. Neugierig wie ich bin, gleich nachgesehen… steht meine Projektidee dort unter approved! … Uh, Ik freu mir! Hatte ich doch die Seite schon fast vergessen 😀
Hmm ich hoffe, dass meine Bestätigungsmail nun nicht zu spät war. Wenn nicht möchte ich mich jetzt schon bei Nokia bedanken!
Facebook RSS App
21 Juni 11
Achtung! Dieser Artikel ist Outdated!
Die Offline_Access-Tokens gibt es seit dem 07.05.2012 nicht mehr. Eine aktualisierte Version dieses Artikels (und der APP) gibt es hier.
Nachdem Facebook endlich auch Fremdfeeds erlaubt (vorher erlaubte Facebook nur Feeds über Feedburner bzw. über Dienste, die „Facebook approved“ waren) ist mir aufgefallen, dass der „normale Import“ nur schleppend funktioniert. Mal ordentlich verspätet, mal gar nicht.
Was ich brauche ist also ein Ping-Dienst, ein Dienst, der Facebook sagt „Hey, mein RSS hat neue Einträge“. Leider habe ich auf die Schnelle nichts derartiges gefunden. Was es jedoch gibt sind RSS-Fetcher also Applikationen die eben diesen RSS Import übernehmen, zum Beispiel RSS.Graffiti welches bei einigen Seiten ganz gut zu funktionieren scheint. Da der Dienst von RSS.Graffiti heute jedoch nach der Anmeldung jedes Eintragen eines Feeds verweigerte habe ich mich kurzum mal dazu entschlossen einen Blick auf die Facebook App-Entwicklung zu werfen.
Ziel: Eine App, die den letzten Post meiner Seite als Notiz auf der Fan-Page bei Facebook einträgt.
Also im Grunde, genau das, was der RSS Import bereits macht oder was RSS.Graffiti tun sollte (wenn es denn mal möchte) mit dem Unterschied, dass ich die Kontrolle darüber habe wann was als Notiz eingetragen wird.
Der Prozess gestaltet sich an sich ganz einfach:
- Die Entwickler-Anwendung zum eigenen Profil hinzufügen
- Den Button „Erstelle eine neue Anwendung“ betätigen, Titel eingeben und den Geschäftsbedingungen (natürlich ungelesen) zustimmen.
Fertig ist die App, äh, falsch… fertig sind die Anmeldeinformationen für eine zukünftige App. Also die APP-ID und der Secret Key welcher für die Interaktionen auf Facebook nötig sind. Soweit so gut. Die Dokumentation über den OAUTH Anmeldeprozess scheint auf den ersten Blick sehr verständlich. Beispiele sind auch ein paar dabei – blöder weise brauchen einige davon aber wiederum eigene Apps, was das ganze dann doch wieder etwas umständlich macht.
Die erste Hürde kam natürlich direkt. Facebook meldete bei einem ersten Browsertest, dass die request_uri invalid sei. Nach ein wenig suchen hab ich den Fehler gefunden, in den App-Einstellungen kann man angeben welche Domains berechtigt sind Anfragen anzunehmen. (Bzw. den Request-Token entgegenzunehmen). Domain eingetragen, läuft. Im gleichen Zug fix den Sandbox-Mode eingeschaltet, der nur mir erlaubt diese Anwendung zu benutzen 😛
Da meine Anwendung ja nicht auf meiner Profilseite posten sollte, sondern auf meiner Fan-Page, war also der nächste Schritt einen Access-Token für die Seite zu bekommen. Das geht, wer hätte es gedacht, eigentlich auch recht einfach. Wenn, ja wenn da nicht das Problem wäre, dass man sich als User authentifizieren muss. Loggt der Administrator der Seite aus, oder läuft das alte Token ab ist Schicht im Schacht.
Zum Glück gibt es die Möglichkeit ein Permanent-Token zu bekommen. Eins mit unendlicher Lebensdauer (sofern sich der Admin nicht von der App abmeldet). Man holt sich also über https://www.facebook.com/dialog/oauth ein Token über den Schalter „offline_access“ mit dem wahnsinnig tollen Warnungstext, dass die Anwendung auch posten darf, wenn man sie gar nicht verwendet…
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=manage_pages,create_note,offline_access&response_type=token # manage_pages für Seitenverwaltung # create_note um Notizen posten zu dürfen # offline_access für permanentes Token
Eigentlich irgendwie … imho falsch übersetzt, denn ich verwende sie ja, ich bin nur nicht online wenn sie was tut. Meiner Meinung nach wäre der Hinweistext das die Anwendung Aktionen ausführen darf während ich offline bin besser. (Würde dann auch zu offline_access passen)
Somit muss sich die App nun nur noch meine Seiten anschauen, sich für die Entsprechende das Token raus suchen und darf loslegen.
#!/usr/bin/perl use strict; use LWP::Simple; # Für Get-Anfragen an Facebook use JSON; # Zum Auswerten der Antworten use URI::Escape; # Zum Escapen der Nachrichten # Anwendungs-ID my $client_id = '1234567890'; # Anwendungs-Secret my $client_secret = 'abcdef1234567890abcdef12345'; # Fan-Page ID my $page_id = '1234567890'; # Betreff # Achtung! Lazy auf UTF8 konvertieren, sonst # werden Umlaute nicht richtig dargestellt. my $subject = uri_escape_utf8('Nur ein Test'); # Nachricht my $message = uri_escape_utf8('Testnachricht...<br>Hallo Welt!'); # Permanentes Token aus dem Registrierungsprozess my $perma_token = '1234567890|abcdef1234567890abcdef|jashjdu3478924'; # Liste der Accounts (der verwalteten Seiten / Apps ...) holen # und Token für die Seite suchen my $accounts = get('https://graph.facebook.com/me/accounts?' . $perma_token); if(!defined $accounts) { print "Login fehlgeschlagen!"; exit 1; } my %data = %{decode_json($accounts)}; my $page_access_token = ""; foreach my $access_page (@{$data{'data'}}) { my %item = %{$access_page}; if($item{'id'} eq $page_id) { $page_access_token = $item{'access_token'}; } } if(!defined $page_access_token || $page_access_token eq "") { print "Fehler beim Token-Fetch"; exit 1; } # Nachricht posten my $news_id = get('https://graph.facebook.com/' . $page_id . '/notes?message='. $message . '&subject=' . $subject . '&method=post&access_token=' . $page_access_token); print $news_id; exit;
Thats it!
Was mich aber immer noch brennend interessiert:
a) wie bekommt man die Autoren der Nachricht geändert &id=url_zur_app (Graph https://developers.facebook.com/blog/post/465/)
b) Wie kann ich den Link zur ursprünglichen Nachricht einfügen &id=url_zur_app (s.o.)
Die Dokumentation gibt dazu nichts her und sagt, die einzigen Parameter seien „message“ und „subject“ 🙁