|
|
- <?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;
- }
- }
|