X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=facebook%2Ffacebook.php;h=b6e40654cd41c536b8905731cde3221a78d9fbc3;hb=f6f0578d123202f30a839975e67b152c299c2323;hp=cc8b85cdba6ef7d04ea5b7c2ca03868d51c3d66c;hpb=c51ae6551d9d3fd0afe1a8ea5c48663de05feca9;p=friendica-addons.git
diff --git a/facebook/facebook.php b/facebook/facebook.php
index cc8b85cd..b6e40654 100755
--- a/facebook/facebook.php
+++ b/facebook/facebook.php
@@ -1,8 +1,9 @@
+ * Tobias HöÃl
*/
/**
@@ -24,14 +25,16 @@
* d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set
* Site URL to yoursubdomain.yourdomain.com. Set Site Domain to your
* yourdomain.com.
- * 2. (This step is now obsolete. Enable the plugin via the Admin panel.)
- * Enable the facebook plugin by including it in .htconfig.php - e.g.
- * $a->config['system']['addon'] = 'plugin1,plugin2,facebook';
+ * 2. Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
+ * and click 'Install Facebook Connector'.
* 3. Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
* and click 'Install Facebook Connector'.
* 4. This will ask you to login to Facebook and grant permission to the
* plugin to do its stuff. Allow it to do so.
- * 5. You're done. To turn it off visit the Plugin Settings page again and
+ * 5. Optional step: If you want to use Facebook Real Time Updates (so new messages
+ * and new contacts are added ~1min after they are postet / added on FB), go to
+ * Settings -> plugins -> facebook and press the "Activate Real-Time Updates"-button.
+ * 6. You're done. To turn it off visit the Plugin Settings page again and
* 'Remove Facebook posting'.
*
* Vidoes and embeds will not be posted if there is no other content. Links
@@ -42,9 +45,21 @@
* authenticate to your site to establish identity. We will address this
* in a future release.
*/
+
+ /** TODO
+ * - Implement a method for the administrator to delete all configuration data the plugin has created,
+ * e.g. the app_access_token
+ */
-define('FACEBOOK_MAXPOSTLEN', 420);
+// Size of maximum post length increased
+// see http://www.facebook.com/schrep/posts/203969696349811
+// define('FACEBOOK_MAXPOSTLEN', 420);
+define('FACEBOOK_MAXPOSTLEN', 63206);
+define('FACEBOOK_SESSION_ERR_NOTIFICATION_INTERVAL', 259200); // 3 days
+define('FACEBOOK_DEFAULT_POLL_INTERVAL', 60); // given in minutes
+define('FACEBOOK_MIN_POLL_INTERVAL', 5);
+require_once('include/security.php');
function facebook_install() {
register_hook('post_local', 'addon/facebook/facebook.php', 'facebook_post_local');
@@ -52,6 +67,7 @@ function facebook_install() {
register_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets');
register_hook('connector_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
register_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron');
+ register_hook('enotify', 'addon/facebook/facebook.php', 'facebook_enotify');
register_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
}
@@ -62,6 +78,7 @@ function facebook_uninstall() {
unregister_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets');
unregister_hook('connector_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
unregister_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron');
+ unregister_hook('enotify', 'addon/facebook/facebook.php', 'facebook_enotify');
unregister_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
// hook moved
@@ -84,7 +101,7 @@ function facebook_init(&$a) {
if (x($_REQUEST, "realtime_cb") && x($_REQUEST, "realtime_cb")) {
logger("facebook_init: Facebook Real-Time callback called", LOGGER_DEBUG);
- if (x($_REQUEST["hub_verify_token"])) {
+ if (x($_REQUEST, "hub_verify_token")) {
// this is the verification callback while registering for real time updates
$verify_token = get_config('facebook', 'cb_verify_token');
@@ -113,7 +130,7 @@ function facebook_init(&$a) {
return;
}
- $affected_users = array("feed" => array(), "friends" => array(), "activities" => array());
+ $affected_users = array("feed" => array(), "friends" => array());
foreach ($js->entry as $entry) {
$fbuser = $entry->uid;
@@ -123,36 +140,43 @@ function facebook_init(&$a) {
continue;
}
if (in_array($fbuser, $affected_users[$field])) continue;
+
+ $r = q("SELECT `uid` FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'self_id' AND `v` = '%s' LIMIT 1", dbesc($fbuser));
+ if(! count($r))
+ continue;
+ $uid = $r[0]['uid'];
+
+ $access_token = get_pconfig($uid,'facebook','access_token');
+ if(! $access_token)
+ return;
+
switch ($field) {
case "feed":
logger('facebook_init: FB-User ' . $fbuser . ' / feed', LOGGER_DEBUG);
- $r = q("SELECT `uid` FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'self_id' AND `v` = '%s' LIMIT 1", dbesc($fbuser));
- if(! count($r))
- continue;
- $uid = $r[0]['uid'];
-
- $access_token = get_pconfig($uid,'facebook','access_token');
- if(! $access_token)
- return;
-
if(! get_pconfig($uid,'facebook','no_wall')) {
$private_wall = intval(get_pconfig($uid,'facebook','private_wall'));
$s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
if($s) {
$j = json_decode($s);
- logger('facebook_init: wall: ' . print_r($j,true), LOGGER_DATA);
- fb_consume_stream($uid,$j,($private_wall) ? false : true);
+ if (isset($j->data)) {
+ logger('facebook_init: wall: ' . print_r($j,true), LOGGER_DATA);
+ fb_consume_stream($uid,$j,($private_wall) ? false : true);
+ } else {
+ logger('facebook_init: wall: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
+ }
}
}
break;
- case "friend":
- // @TODO
- break;
- case "activities":
- //@TODO
+ case "friends":
+ logger('facebook_init: FB-User ' . $fbuser . ' / friends', LOGGER_DEBUG);
+
+ fb_get_friends($uid, false);
+ set_pconfig($uid,'facebook','friend_check',time());
break;
+ default:
+ logger('facebook_init: Unknown callback field for ' . $fbuser, LOGGER_NORMAL);
}
$affected_users[$field][] = $fbuser;
}
@@ -171,8 +195,8 @@ function facebook_init(&$a) {
return;
$uid = $r[0]['uid'];
- $auth_code = (($_GET['code']) ? $_GET['code'] : '');
- $error = (($_GET['error_description']) ? $_GET['error_description'] : '');
+ $auth_code = (x($_GET, 'code') ? $_GET['code'] : '');
+ $error = (x($_GET, 'error_description') ? $_GET['error_description'] : '');
if($error)
@@ -199,7 +223,7 @@ function facebook_init(&$a) {
if(get_pconfig($uid,'facebook','no_linking') === false)
set_pconfig($uid,'facebook','no_linking',1);
fb_get_self($uid);
- fb_get_friends($uid);
+ fb_get_friends($uid, true);
fb_consume_all($uid);
}
@@ -220,116 +244,50 @@ function fb_get_self($uid) {
}
}
-
-
-function fb_get_friends($uid) {
-
- $r = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1",
- intval($uid)
+function fb_get_friends_sync_new($uid, $access_token, $person) {
+ $link = 'http://facebook.com/profile.php?id=' . $person->id;
+
+ $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `url` = '%s' LIMIT 1",
+ intval($uid),
+ dbesc($link)
);
- if(! count($r))
- return;
-
- $access_token = get_pconfig($uid,'facebook','access_token');
-
- $no_linking = get_pconfig($uid,'facebook','no_linking');
- if($no_linking)
- return;
+
+ if (count($r) == 0) {
+ logger('fb_get_friends: new contact found: ' . $link, LOGGER_DEBUG);
+
+ fb_get_friends_sync_full($uid, $access_token, $person);
+ }
+}
- if(! $access_token)
- return;
- $s = fetch_url('https://graph.facebook.com/me/friends?access_token=' . $access_token);
+function fb_get_friends_sync_full($uid, $access_token, $person) {
+ $s = fetch_url('https://graph.facebook.com/' . $person->id . '?access_token=' . $access_token);
if($s) {
- logger('facebook: fb_get_friends: ' . $s, LOGGER_DATA);
- $j = json_decode($s);
- logger('facebook: fb_get_friends: json: ' . print_r($j,true), LOGGER_DATA);
- if(! $j->data)
- return;
- foreach($j->data as $person) {
- $s = fetch_url('https://graph.facebook.com/' . $person->id . '?access_token=' . $access_token);
- if($s) {
- $jp = json_decode($s);
- logger('fb_get_friends: info: ' . print_r($jp,true), LOGGER_DATA);
+ $jp = json_decode($s);
+ logger('fb_get_friends: info: ' . print_r($jp,true), LOGGER_DATA);
- // always use numeric link for consistency
+ // always use numeric link for consistency
- $jp->link = 'http://facebook.com/profile.php?id=' . $person->id;
+ $jp->link = 'http://facebook.com/profile.php?id=' . $person->id;
- // check if we already have a contact
+ // If its a page then set the first name from the username
+ if (!$jp->first_name and $jp->username)
+ $jp->first_name = $jp->username;
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `url` = '%s' LIMIT 1",
- intval($uid),
- dbesc($jp->link)
- );
+ // check if we already have a contact
- if(count($r)) {
-
- // check that we have all the photos, this has been known to fail on occasion
-
- if((! $r[0]['photo']) || (! $r[0]['thumb']) || (! $r[0]['micro'])) {
- require_once("Photo.php");
-
- $photos = import_profile_photo('https://graph.facebook.com/' . $jp->id . '/picture', $uid, $r[0]['id']);
-
- $r = q("UPDATE `contact` SET `photo` = '%s',
- `thumb` = '%s',
- `micro` = '%s',
- `name-date` = '%s',
- `uri-date` = '%s',
- `avatar-date` = '%s'
- WHERE `id` = %d LIMIT 1
- ",
- dbesc($photos[0]),
- dbesc($photos[1]),
- dbesc($photos[2]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- intval($r[0]['id'])
- );
- }
- continue;
- }
- else {
-
- // create contact record
- $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`,
- `name`, `nick`, `photo`, `network`, `rel`, `priority`,
- `writable`, `blocked`, `readonly`, `pending` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
- intval($uid),
- dbesc(datetime_convert()),
- dbesc($jp->link),
- dbesc(normalise_link($jp->link)),
- dbesc(''),
- dbesc(''),
- dbesc($jp->id),
- dbesc('facebook ' . $jp->id),
- dbesc($jp->name),
- dbesc(($jp->nickname) ? $jp->nickname : strtolower($jp->first_name)),
- dbesc('https://graph.facebook.com/' . $jp->id . '/picture'),
- dbesc(NETWORK_FACEBOOK),
- intval(CONTACT_IS_FRIEND),
- intval(1),
- intval(1)
- );
- }
-
- $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($jp->link),
- intval($uid)
- );
+ $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `url` = '%s' LIMIT 1",
+ intval($uid),
+ dbesc($jp->link)
+ );
- if(! count($r)) {
- continue;
- }
+ if(count($r)) {
- $contact = $r[0];
- $contact_id = $r[0]['id'];
+ // check that we have all the photos, this has been known to fail on occasion
+ if((! $r[0]['photo']) || (! $r[0]['thumb']) || (! $r[0]['micro'])) {
require_once("Photo.php");
- $photos = import_profile_photo($r[0]['photo'],$uid,$contact_id);
+ $photos = import_profile_photo('https://graph.facebook.com/' . $jp->id . '/picture', $uid, $r[0]['id']);
$r = q("UPDATE `contact` SET `photo` = '%s',
`thumb` = '%s',
@@ -345,11 +303,102 @@ function fb_get_friends($uid) {
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
- intval($contact_id)
+ intval($r[0]['id'])
);
+ }
+ return;
+ }
+ else {
- }
+ // create contact record
+ $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`,
+ `name`, `nick`, `photo`, `network`, `rel`, `priority`,
+ `writable`, `blocked`, `readonly`, `pending` )
+ VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
+ intval($uid),
+ dbesc(datetime_convert()),
+ dbesc($jp->link),
+ dbesc(normalise_link($jp->link)),
+ dbesc(''),
+ dbesc(''),
+ dbesc($jp->id),
+ dbesc('facebook ' . $jp->id),
+ dbesc($jp->name),
+ dbesc(($jp->nickname) ? $jp->nickname : strtolower($jp->first_name)),
+ dbesc('https://graph.facebook.com/' . $jp->id . '/picture'),
+ dbesc(NETWORK_FACEBOOK),
+ intval(CONTACT_IS_FRIEND),
+ intval(1),
+ intval(1)
+ );
+ }
+
+ $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($jp->link),
+ intval($uid)
+ );
+
+ if(! count($r)) {
+ return;
}
+
+ $contact = $r[0];
+ $contact_id = $r[0]['id'];
+
+ require_once("Photo.php");
+
+ $photos = import_profile_photo($r[0]['photo'],$uid,$contact_id);
+
+ $r = q("UPDATE `contact` SET `photo` = '%s',
+ `thumb` = '%s',
+ `micro` = '%s',
+ `name-date` = '%s',
+ `uri-date` = '%s',
+ `avatar-date` = '%s'
+ WHERE `id` = %d LIMIT 1
+ ",
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ intval($contact_id)
+ );
+
+ }
+}
+
+// if $fullsync is true, only new contacts are searched for
+
+function fb_get_friends($uid, $fullsync = true) {
+
+ $r = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1",
+ intval($uid)
+ );
+ if(! count($r))
+ return;
+
+ $access_token = get_pconfig($uid,'facebook','access_token');
+
+ $no_linking = get_pconfig($uid,'facebook','no_linking');
+ if($no_linking)
+ return;
+
+ if(! $access_token)
+ return;
+ $s = fetch_url('https://graph.facebook.com/me/friends?access_token=' . $access_token);
+ if($s) {
+ logger('facebook: fb_get_friends: ' . $s, LOGGER_DATA);
+ $j = json_decode($s);
+ logger('facebook: fb_get_friends: json: ' . print_r($j,true), LOGGER_DATA);
+ if(! $j->data)
+ return;
+ foreach($j->data as $person)
+ if ($fullsync)
+ fb_get_friends_sync_full($uid, $access_token, $person);
+ else
+ fb_get_friends_sync_new($uid, $access_token, $person);
}
}
@@ -394,7 +443,7 @@ function facebook_post(&$a) {
elseif(intval($no_linking) && intval($linkvalue)) {
// FB linkage is now allowed - import stuff.
fb_get_self($uid);
- fb_get_friends($uid);
+ fb_get_friends($uid, true);
fb_consume_all($uid);
}
@@ -419,13 +468,25 @@ function facebook_content(&$a) {
}
if($a->argc > 1 && $a->argv[1] === 'friends') {
- fb_get_friends(local_user());
+ fb_get_friends(local_user(), true);
info( t('Updating contacts') . EOL);
}
-
- $fb_installed = get_pconfig(local_user(),'facebook','post');
-
+ $o = '';
+
+ $fb_installed = false;
+ if (get_pconfig(local_user(),'facebook','post')) {
+ $access_token = get_pconfig(local_user(),'facebook','access_token');
+ if ($access_token) {
+ $private_wall = intval(get_pconfig($uid,'facebook','private_wall'));
+ $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
+ if($s) {
+ $j = json_decode($s);
+ if (isset($j->data)) $fb_installed = true;
+ }
+ }
+ }
+
$appid = get_config('facebook','appid');
if(! $appid) {
@@ -502,7 +563,7 @@ function facebook_cron($a,$b) {
$poll_interval = intval(get_config('facebook','poll_interval'));
if(! $poll_interval)
- $poll_interval = 3600;
+ $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
if($last) {
$next = $last + $poll_interval;
@@ -537,13 +598,40 @@ function facebook_cron($a,$b) {
if($last_friend_check)
$next_friend_check = $last_friend_check + 86400;
if($next_friend_check <= time()) {
- fb_get_friends($rr['uid']);
+ fb_get_friends($rr['uid'], true);
set_pconfig($rr['uid'],'facebook','friend_check',time());
}
fb_consume_all($rr['uid']);
}
- }
-
+ }
+
+ if (get_config('facebook', 'realtime_active') == 1) {
+ if (!facebook_check_realtime_active()) {
+
+ logger('facebook_cron: Facebook is not sending Real-Time Updates any more, although it is supposed to. Trying to fix it...', LOGGER_NORMAL);
+ facebook_subscription_add_users();
+
+ if (facebook_check_realtime_active())
+ logger('facebook_cron: Successful', LOGGER_NORMAL);
+ else {
+ logger('facebook_cron: Failed', LOGGER_NORMAL);
+
+ if(strlen($a->config['admin_email']) && !get_config('facebook', 'realtime_err_mailsent')) {
+ $res = mail($a->config['admin_email'], t('Problems with Facebook Real-Time Updates'),
+ "Hi!\n\nThere's a problem with the Facebook Real-Time Updates that cannot be solved automatically. Maybe a permission issue?\n\nPlease try to re-activate it on " . $a->config["system"]["url"] . "/admin/plugins/facebook\n\nThis e-mail will only be sent once.",
+ 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
+ . 'Content-type: text/plain; charset=UTF-8' . "\n"
+ . 'Content-transfer-encoding: 8bit'
+ );
+
+ set_config('facebook', 'realtime_err_mailsent', 1);
+ }
+ }
+ } else { // !facebook_check_realtime_active()
+ del_config('facebook', 'realtime_err_mailsent');
+ }
+ }
+
set_config('facebook','last_poll', time());
}
@@ -561,22 +649,60 @@ function facebook_plugin_settings(&$a,&$b) {
function facebook_plugin_admin(&$a, &$o){
+
+
+ $o = '';
- $activated = false;
- $access_token = fb_get_app_access_token();
- if ($access_token) {
- $ret = facebook_subscriptions_get();
- if (is_array($ret)) foreach ($ret as $re) if (is_object($re) && $re->object == "user") $activated = true;
+ $o .= '
' . t('Facebook API Key') . '
';
+
+ $appid = get_config('facebook', 'appid' );
+ $appsecret = get_config('facebook', 'appsecret' );
+ $poll_interval = get_config('facebook', 'poll_interval' );
+ if (!$poll_interval) $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
+
+ $ret1 = q("SELECT `v` FROM `config` WHERE `cat` = 'facebook' AND `k` = 'appid' LIMIT 1");
+ $ret2 = q("SELECT `v` FROM `config` WHERE `cat` = 'facebook' AND `k` = 'appsecret' LIMIT 1");
+ if ((count($ret1) > 0 && $ret1[0]['v'] != $appid) || (count($ret2) > 0 && $ret2[0]['v'] != $appsecret)) $o .= t('Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.
');
+
+ $working_connection = false;
+ if ($appid && $appsecret) {
+ $subs = facebook_subscriptions_get();
+ if ($subs === null) $o .= t('Error: the given API Key seems to be incorrect (the application access token could not be retrieved).') . ' ';
+ elseif (is_array($subs)) {
+ $o .= t('The given API Key seems to work correctly.') . ' ';
+ $working_connection = true;
+ } else $o .= t('The correctness of the API Key could not be detected. Somthing strange\'s going on.') . ' ';
}
- if ($activated) {
- $o = t('Real-Time Updates are activated.') . '