<?php
|
|
namespace p3k\XRay\Formats;
|
|
|
|
use DOMDocument, DOMXPath;
|
|
use DateTime, DateTimeZone;
|
|
|
|
class Facebook extends Format {
|
|
|
|
public static function matches_host($url) {
|
|
$host = parse_url($url, PHP_URL_HOST);
|
|
// TODO: match hosts like 'm.facebook.com' and 'mbasic.facebook.com'
|
|
return in_array($host, ['www.facebook.com','facebook.com']);
|
|
}
|
|
|
|
public static function matches($url) {
|
|
return self::matches_host($url);
|
|
}
|
|
|
|
public static function parse($fbObject, $url) {
|
|
if(is_string($fbObject)) $fbObject = json_decode($fbObject, true);
|
|
|
|
$parts = self::extract_url_parts($url);
|
|
|
|
if($parts['type'] == 'event') {
|
|
|
|
$event = array(
|
|
'type' => 'event',
|
|
'url' => $url,
|
|
'name' => $fbObject['name'],
|
|
'start' => $fbObject['start_time']
|
|
);
|
|
|
|
if(isset($fbObject['end_time'])) $event['end'] = $fbObject['end_time'];
|
|
if(isset($fbObject['description'])) $event['summary'] = $fbObject['description'];
|
|
|
|
// Is the event linked to a Page?
|
|
if(isset($fbObject['place']['id'])) {
|
|
|
|
$card = array(
|
|
'type' => 'card',
|
|
'url' => 'https://facebook.com/'.$fbObject['place']['id'],
|
|
'name' => $fbObject['place']['name']
|
|
);
|
|
|
|
if(isset($fbObject['place']['location'])) {
|
|
|
|
$location = $fbObject['place']['location'];
|
|
|
|
if(isset($location['zip'])) $card['postal-code'] = $location['zip'];
|
|
if(isset($location['city'])) $card['locality'] = $location['city'];
|
|
if(isset($location['state'])) $card['region'] = $location['state'];
|
|
if(isset($location['street'])) $card['street-address'] = $location['street'];
|
|
if(isset($location['country'])) $card['country'] = $location['country'];
|
|
if(isset($location['latitude'])) $card['latitude'] = (string)$location['latitude'];
|
|
if(isset($location['longitude'])) $card['longitude'] = (string)$location['longitude'];
|
|
|
|
}
|
|
|
|
$event['location'] = $card['url'];
|
|
$event['refs'] = array($card);
|
|
|
|
// If we only have a name, use that
|
|
} elseif(isset($fbObject['place']['name'])) {
|
|
$event['location'] = $fbObject['place']['name'];
|
|
}
|
|
|
|
return [
|
|
'data' => $event,
|
|
'original' => $fbObject
|
|
];
|
|
}
|
|
}
|
|
|
|
public static function fetch($url, $creds) {
|
|
|
|
$parts = self::extract_url_parts($url);
|
|
|
|
if(!$parts or $parts['api_uri'] == false) {
|
|
return [
|
|
'error' => 'unsupported_url',
|
|
'error_description' => 'This Facebook URL is not supported',
|
|
'error_code' => 400,
|
|
];
|
|
}
|
|
|
|
$fb = new \Facebook\Facebook(array(
|
|
'app_id' => $creds['facebook_app_id'],
|
|
'app_secret' => $creds['facebook_app_secret'],
|
|
'default_graph_version' => 'v2.9',
|
|
));
|
|
|
|
$fbApp = new \Facebook\FacebookApp($creds['facebook_app_id'], $creds['facebook_app_secret']);
|
|
$token = $fbApp->getAccessToken();
|
|
|
|
$request = new \Facebook\FacebookRequest($fbApp, $token, 'GET', $parts['api_uri']);
|
|
|
|
try {
|
|
$response = $fb->getClient()->sendRequest($request);
|
|
} catch(\Facebook\Exceptions\FacebookResponseException $e) {
|
|
return [
|
|
'error' => 'facebook_graph_error',
|
|
'error_description' => 'Graph returned an error: ' . $e->getMessage(),
|
|
'error_code' => 400,
|
|
];
|
|
} catch(\Facebook\Exceptions\FacebookSDKException $e) {
|
|
return [
|
|
'error' => 'facebook_sdk_error',
|
|
'error_description' => 'Facebook SDK returned an error: ' . $e->getMessage(),
|
|
'error_code' => 400,
|
|
];
|
|
}
|
|
|
|
return [
|
|
'code' => 200,
|
|
'body' => $response->getDecodedBody(),
|
|
'url' => $url
|
|
];
|
|
}
|
|
|
|
private static function extract_url_parts($url) {
|
|
$response = false;
|
|
|
|
if(preg_match('~https://(.*?).?facebook.com/([^/]+)/posts/(\d+)/?$~', $url, $match)) {
|
|
// TODO: how do we get these?
|
|
// $response['type'] = 'entry';
|
|
// $response['api_uri'] = false;
|
|
|
|
} elseif(preg_match('~https://(.*?).?facebook.com/events/(\d+)/?$~', $url, $match)) {
|
|
$response['type'] = 'event';
|
|
$response['api_uri'] = '/'.$match[2];
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
}
|