<?php

/**
 * Proof of concept, retrieve publicly-available Facebook page event data.
 * Chris Hardie <chris@chrishardie.com>
 *
 * To use, first add Guzzle as a dependency:
 *   $ commposer require guzzlehttp/guzzle
 *
 */

require 'vendor/autoload.php';

use GuzzleHttp\Client;

define( 'FB_UPCOMING_EVENT_DOC_ID', 2343886202319301 );

$facebook_pages = array(
	'50650939390' => array(
		'page_name' => 'Richmond Parks Department',
		'page_url'  => 'https://www.facebook.com/richmondparks/',
		'category'  => 'outdoor',
	),
);

$facebook_base_params = array(
	'fb_api_req_friendly_name' => 'PageEventsTabUpcomingEventsCardRendererQuery',
	'__req'                    => '8',
	'__user'                   => '0',
	'av'                       => '0',
	'__a'                      => '1',
	'__be'                     => '1',
	'dpr'                      => '2',
	'fb_api_caller_class'      => 'RelayModern',
	'__pc:PHASED'              => 'DEFAULT',
	'__comet_req'              => 'false',
);

$client = new Client(
	[
		// Base URI is used with relative requests
		'base_uri' => 'https://www.facebook.com',
		// You can set any number of default request options.
		'timeout'  => 2.0,
	]
);

$headers = [
	'User-Agent'   => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
	'Content-Type' => 'application/x-www-form-urlencoded',
	'Origin'       => 'https://www.facebook.com',
];

foreach ( $facebook_pages as $facebook_page_id => $facebook_page ) {

	$facebook_variable_value = '{"pageID":"' . $facebook_page_id . '"}';

	$facebook_form_params = array_merge(
		$facebook_base_params,
		array(
			'variables' => $facebook_variable_value,
			'doc_id'    => FB_UPCOMING_EVENT_DOC_ID,
		)
	);

	$upcoming_event_response = $client->request(
		'POST',
		'/api/graphql/',
		[
			'headers'     => $headers,
			'form_params' => $facebook_form_params,
		]
	);

	$response_code = $upcoming_event_response->getStatusCode();

	if ( ! empty( $response_code ) && ( 200 === $response_code ) ) {
		$body = $upcoming_event_response->getBody();

		if ( null !== $body ) {
			$fb_response = json_decode( $body, true );
			$fb_events   = $fb_response['data']['page']['upcoming_events']['edges'];
		}
	}

	if ( ! empty( $fb_events ) && ( 0 < count( $fb_events ) ) ) {
		foreach ( $fb_events as $fb_event ) {
			$event = $fb_event['node'];

			echo $event['id'] . PHP_EOL;
			echo $event['name'] . PHP_EOL;
			echo $event['time_range']['start'] . PHP_EOL;
			echo $event['event_place']['contextual_name'] . PHP_EOL;
			echo $event['event_place']['city']['contextual_name'] . PHP_EOL;
			echo $event['event_buy_ticket_url'] . PHP_EOL;
			echo PHP_EOL;

		}
	}
}

exit;