it-swarm.com.de

Facebook Offline-Zugriff Schritt für Schritt

UPDATE: Die Berechtigung Facebook offline_access ist veraltet. Weitere Informationen finden Sie in der offiziellen Dokumentation .
Sie haben bis 1. Mai 2012 , an welchem ​​Datum diese Einstellung deaktiviert wird. Weitere Informationen finden Sie in der Entwickler-Roadmap .


Nachdem Sie buchstäblich einen Tag auf Facebook und Google nach einer aktuellen und funktionierenden Möglichkeit gesucht haben, etwas scheinbar Einfaches zu tun:

Ich suche nach einer schrittweisen Erklärung, um für einen Benutzer einen Offline-Zugriff für eine Facebook-App zu erhalten und diesen dann (Sitzungsschlüssel) zu verwenden, um die Daten offline und nicht innerhalb eines Browsers, Freunde und Profil, abzurufen.

Am liebsten in der Fb Java API.

Vielen Dank.

Und ja, ich habe das Facebook-Wiki überprüft.

Update: Jemand?

folgendes: http://www.facebook.com/authorize.php?api_key=<api-key>&v=1.0&ext_perm=offline_access gibt mir offline_Access, aber wie kann ich den session_key abrufen?

Warum kann Facebook nicht einfach eine einfache Dokumentation machen, ich meine, es arbeiten ungefähr 600 Leute dort?

Die scheinbar gleiche Frage: Offline-Zugriff für die Arbeit mit Facebook Beantwortet nicht das Abrufen des Sitzungsschlüssels

Edit: Ich bin immer noch dabei. Ich vermute, noch hat niemand so einen Batch-Zugriff wirklich ausprobiert ...

57
Ben

Mit der neuen Facebook Graph API wurde es etwas einfacher, aber weit weniger dokumentiert. Folgendes habe ich getan, um meine Pinnwandbeiträge nur von einer Serverseite (nicht Teil einer Browsersitzung) eines PHP-Skripts laden zu können:

  1. erstellen Sie eine Facebook-Anwendung, falls Sie noch keine für dieses Projekt verwendbare http://www.facebook.com/developers/apps.php#!/developers/createapp.php-- haben, und aktivieren Sie den Sandbox-/Entwicklermodus. @ Erweiterte Einstellungen> Sandbox-Modus> Aktivieren (Nur die Entwickler Ihrer Anwendung können es sehen.) Sie benötigen die Anwendungs-ID (APP_ID) und den geheimen Schlüssel (SECRET_KEY), die in der Übersicht Ihres Entwicklerkontos dieser Anwendung aufgeführt sind aber nicht der alte API-Schlüssel.

  2. laden Sie in Ihrem Browser und sind Sie bereits bei fb als das Konto angemeldet, unter dem Ihre serverseitige App eine Verbindung herstellen soll, und klicken Sie für die angeforderten Berechtigungen auf "Zulassen": https://graph.facebook.com/oauth/authorize?client_id=APP_ID&scope=offline_access,read_stream&redirect_uri=http://www.facebook.com/connect/login_success.html

  3. kopieren Sie den "code" -Parameter aus der Abfragezeichenfolge des resultierenden URLs. Verwenden Sie den folgenden Code in: https://graph.facebook.com/oauth/access_token?client_id=APP_ID&redirect_uri=http://www.facebook.com/connect/login_success.html&client_secret=APP_SECRET&code=CODE_FROM_2 Kopieren Sie die rechte Seite von access_token = in den Text der resultierenden Seite, der folgende Struktur hat: APP_ID | HEXNUM -USER_ID | WEIRD_KEY

  4. laden Sie jetzt entweder von der Graph-API oder der klassischen Rest-API mit dem Eidzugriffstoken herunter, das Sie gerade erhalten haben (wobei SOURCE_ID die Facebook-ID für den Benutzer/die Gruppe/was auch immer Sie suchen):

    <?php
    $stream = json_decode(file_get_contents("https://api.facebook.com/method/stream.get?source_ids=SOURCE_ID&access_token=ACCESS_TOKEN&format=json"));
    var_dump($stream);
    // this one gives a 500 internal server error from the http get if any of the fields are invalid, but only in php, not when loaded in a browser... weird.
    $feed = json_decode(file_get_contents("https://graph.facebook.com/SOURCE_ID/feed?fields=id,from,created_time,link,type&access_token=ACCESS_TOKEN"));
    var_dump($feed);
    ?>
    

Beachten Sie, dass die Grafik-API und die Ruhe-API nicht nur unterschiedliche Strukturen, sondern auch andere Informationen liefern. Daher ziehe ich hier die Ergebnisse der Rest-API (der ersten) vor, obwohl ich die Felder in der neuen Grafik gerne einschränken möchte api (das zweite).

Unter http://developers.facebook.com/docs/authentication/ in den Abschnitten "Erweiterte Berechtigungen anfordern" und "Benutzer in einer Webanwendung authentifizieren" finden Sie die offiziellen (spärlichen) Details.

Wenn Sie dies routinemäßig tun möchten, d. H. Programmgesteuert, ist hier die automatisierte Version der Schritte 2 + 3:

Setzen Sie dies als "facebook_access_token.php" auf Ihren Webserver:

<?php $token = explode('=', file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=APP_ID&redirect_uri=http://$_SERVER[SERVER_NAME]$_SERVER[PHP_SELF]&client_secret=APP_SECRET&code=" . 
(get_magic_quotes_gpc() ? stripslashes($_GET['code']) : $_GET['code']))); 
echo $token[1]; 
// store this, the access token, in the db for the user as logged in on your site -- and don't abuse their trust! ?>

Und weisen Sie die Benutzer in ihren Browsern an: https://graph.facebook.com/oauth/authorize?client_id=APP_ID&scope=offline_access,read_stream&redirect_uri=http://www.example.com/facebook_access_token.php

63
Chris

Wenn Sie PHP endlich mit dem Facebook PHP SDK v3 ( siehe github ) verwenden möchten, ist es ziemlich einfach. Um jemanden mit der offline_access-Berechtigung zu protokollieren, fragen Sie ihn, wenn Sie die Login-URL generieren. So tun Sie das.

Holen Sie sich das Offline-Zugriffstoken

Zuerst prüfen Sie, ob der Benutzer angemeldet ist oder nicht:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$user = $facebook->getUser();

if ($user) {
  try {
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    $user = null;
  }
}

Ist dies nicht der Fall, generieren Sie die URL "Mit Facebook anmelden", in der Sie nach der offline_access-Berechtigung gefragt werden:

if (!$user) {
    $args['scope'] = 'offline_access';
    $loginUrl = $facebook->getLoginUrl($args);
}

Und dann den Link in Ihrer Vorlage anzeigen:

<?php if (!$user): ?>
    <a href="<?php echo $loginUrl ?>">Login with Facebook</a>
<?php endif ?>

Dann können Sie das Offline-Zugriffstoken abrufen und speichern. Um es zu bekommen, rufen Sie an:

if ($user) {
    $token = $facebook->getAccessToken();
    // store token
}

Verwenden Sie das Offline-Zugriffstoken

So verwenden Sie das Offline-Zugriffstoken, wenn der Benutzer nicht angemeldet ist:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$facebook->setAccessToken("...");

Und jetzt können Sie API-Aufrufe für diesen Benutzer durchführen:

$user_profile = $facebook->api('/me');

Hoffentlich hilft das !

11
Quentin

Ich habe vor kurzem auf meinem Blog ein Tutorial gemacht. Es erfordert keine Plugins oder so weiter, es wird in PHP gemacht und ich habe es getestet. Ich habe es hauptsächlich für Wandbeiträge gemacht, aber nachdem Sie sich authentifiziert haben, können Sie die gewünschte Funktion verwenden.

BEARBEITEN: Post existiert nicht mehr. FB API wird trotzdem aktualisiert ... 

6
Jonathan Reyes

Beginnen Sie mit dem Lesen des Abschnitts Server Side Flow im Authentifizierungshandbuch. Beginnen Sie grundsätzlich mit dieser URL:

https://www.facebook.com/dialog/oauth

Fügen Sie Ihre Anwendungs-ID ( hier verfügbar ) der URL hinzu, die in der OAuth-Sprache client_id lautet:

https://www.facebook.com/dialog/oauth?client_id=184484190795

Fügen Sie den offline_accessErlaubnis oder scope in der OAuth-Sprache hinzu:

https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access

Fügen Sie einen redirect_uri hinzu, zu dem Facebook weiterleitet, nachdem der Benutzer den Autorisierungsschritt abgeschlossen hat ("Zulassen" oder "Nicht zulassen", suchen Sie in den Dokumenten nach dem Antwortformat oder probieren Sie es einfach aus)

https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access&redirect_uri=https%3A%2F%2Ffbrell.com%2Fecho

Wenn Sie dem Link oben folgen, gelangen Sie zu einer Eingabeaufforderung. Wenn Sie auf Zulassen/Nicht zulassen klicken, gelangen Sie zu einer Seite, auf der die Anforderung "Echos" ausgeführt wird. Wenn Sie auf Zulassen klicken, erhalten Sie einen code-Parameter zurück, den Sie gegen einen access_token austauschen können, indem Sie von Ihrem Server eine HTTP-Anfrage an Facebook stellen. Dies bewirkt Folgendes:

https://graph.facebook.com/oauth/access_token?client_id=184484190795&client_secret=XXX&code=YYY&redirect_uri=ZZZ

Sie müssen Ihren client_id übergeben, Ihr application secret muss als client_secret übergeben werden, derselbe redirect_uri, den Sie zuvor verwendet haben, und die code, die Sie als Antwort erhalten haben. Dies gibt den offline_access aktivierten access_token für diesen Benutzer zurück.

Beachten Sie jedoch, dass Ihre Anwendung, auch wenn Sie offline_access anfordern, die ungültigen oder abgelaufenen access_tokens ordnungsgemäß behandeln muss, da dies aus verschiedenen Gründen passieren kann.

5
daaku

Ich kenne zwei Lösungen: Java und JavaScript

Java: A. Servlet-Code (vergessen Sie nicht, relevante Gläser zu importieren):

String url="http://www.facebook.com/login.php?api_key=YOUR_API_KEY&v=1.0";
url+="&fbconnect=true&return_session=true&req_perms=offline_access,status_update";
url+="&next=http://YOUR_FaceBookCallback_SERVLET"; 
response.sendRedirect(url);
return;

// Sie werden aufgefordert, sich bei Facebook anzumelden und die erweiterten Berechtigungen zuzulassen

b. Vergessen Sie nicht, Ihre ConnectUrl (in Ihrem Facebook-Konto) als http: // YourUrlFromWhereDoYouTurnToTheServletAbove

c. Erstellen Sie ein weiteres Servlet: YOUR_FaceBookCallback_SERVLET (siehe oben) mit diesem Code:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String session = request.getParameter("session");
//from this string you can obtain your infinite session_key.In order to do this, parse this string as JSON.
//Save it in the database or in the other data storage  
response.sendRedirect(ThePlaceThatYouWant);}

d. Verwenden Sie diesen geheimen session_key wie folgt:

FacebookXmlRestClient  client = new FacebookXmlRestClient(YOUR_API_KEY, FACEBOOK_APPLICATION_SECRET,SECRET_SESSION_KEY);
client.setIsDesktop(false); 
client.users_setStatus("YourMessage");

Wenn jemand die JavaScript-Lösung (das große Sicherheitsloch) möchte, schreibt mir

3
Leonid L

Ich fand heraus, wie man den endlosen Sitzungsschlüssel für den Offlinezugriff nach viel Haarspalterei, einigen Versuchen und Irrtümern "abrufen" kann und mich über die anderen produktiven Möglichkeiten wundert, die ich in dieser Zeit hätte verbringen können besser 

1) Wenn Sie die Facebook-Java-API verwenden, dann werfen Sie einen Blick auf die Facebook-Demo-Website für "mobiles Web", um die URL für das Anfordern des Offline-Zugriffs zu formatieren
http://itsti.me/index.php

<a href="http://www.facebook.com/connect/Prompt_permissions.php?api_key=YOUR_API_KEY&ext_perm=publish_stream%2Coffline_access&next=http%3A%2F%2Fmysite%2Ffacebookconnect&cancel=http%3A%2F%2Fmysite%2Fhome&display=wap"><img alt="Connect" src="http://static.ak.fbcdn.net/images/fbconnect/login-buttons/connect_light_medium_long.gif" id="fb_login_image"/></a>

2) Wie wird der Offline-Sitzungsschlüssel aus der Sitzung abgerufen? Der Trick ist: Wenn Facebook den Benutzer direkt nach dem Erteilen des Offline-Zugriffs auf die "nächste" URL umleitet, sollten Sie die Facebook-Sitzung erneut "erhalten" wird den unendlichen Sitzungsschlüssel haben.
Hier ist ein Beispiel für das mobile Web. Sie sollten es für eine reguläre Website herausfinden können. Das auth_token wird nur für mobile Websites verwendet. Sie benötigen es möglicherweise nicht für eine normale Website 

FacebookJsonRestClient fbc = new FacebookJsonRestClient(MY_API_KEY, SECRET, sessionKey);
String auth_token = request.getParameter("auth_token");
System.out.println("infinite session kEY = " +   fbc.auth_getSession(auth_token));
2
Naren

Für den Sitzungszugriff musste ich die Login-URL verwenden, die von der Facebook-PHP-API bereitgestellt wurde, da es 2/3 zusätzliche Variablen zu geben scheint, die in der Authentifizierungsanforderung gesendet werden, einschließlich return_session und session_version. Auch die neue php5-sdk sendet die Anfrage an login.facebook.com anstatt an https://graph.facebook.com/oauth/authorize . So habe ich es ausgearbeitet:

$b=new facebook(array('appId'=>APP_ID,'secret'=>SECRET))

So fordern Sie eine Authentifizierung an:

$facebook->getLoginUrl(array('next'=>$redirect_uri,'req_perms'=>$scope))

Denken Sie daran, offline_access in $ scope aufzunehmen. Sobald Sie zu dieser Seite umgeleitet wurden (nachdem Sie sich bei fb angemeldet und Berechtigungen erteilt haben), haben Sie eine $ _GET ['session'] im json-Format.

Speichern Sie es einfach, wo immer Sie wollen (ich mache es in einer Datenbank). Wenn Sie das nächste Mal etwas mit dem Benutzerkonto tun möchten, verwenden Sie einfach Folgendes:

$session = json_decode($db->query("SELECT ..."));//get session from db $this->facebook->setSession($session);

Danach werden alle Anfragen, die die API macht, über den Zugriff dieses Benutzers erfolgen.

Das Schlimmste an der aktuellen Facebook-Grafik-API ist (korrigieren Sie mich, wenn ich mich irre), dass die aktuelle API die Sitzung (die ein Überbleibsel der alten API zu sein scheint) in ihrer gesamten Dokumentation vernachlässigt und nur über das access_token spricht. Die aktuelle API (php5-sdk) verfügt jedoch nicht über die Funktion, eine tatsächliche Anfrage nur mit dem access_token zu senden. Wenn es eine Funktion zum Starten einer Sitzung gibt, die nur das access_token verwendet, ist mir dies nicht bekannt.

0
Nemo