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.

Übersichtsseite der Facebook App

Facebook App

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“ 🙁