oc-social-plugin/classes/FacebookService.php

117 lines
3.7 KiB
PHP
Raw Normal View History

2021-10-28 22:35:15 +02:00
<?php
namespace Zoomyboy\Social\Classes;
use Carbon\Carbon;
use GuzzleHttp\Client;
use Zoomyboy\Social\Models\Page;
use Zoomyboy\Social\Models\Post;
2021-10-30 12:16:27 +02:00
class FacebookService extends SocialService {
2021-10-28 22:35:15 +02:00
2021-10-30 12:16:27 +02:00
private $baseUri = 'https://graph.facebook.com';
2021-10-28 22:35:15 +02:00
protected $client;
protected $page;
protected $version = 'v11.0';
protected $media;
2021-10-30 12:16:27 +02:00
public function __construct() {
parent::__construct();
2021-10-28 22:35:15 +02:00
2021-10-30 12:16:27 +02:00
$this->client = new Client([ 'http_errors' => false, 'base_uri' => $this->baseUri ]);
2021-10-28 22:35:15 +02:00
}
2021-10-30 12:16:27 +02:00
public function getType(): string
{
return 'facebook';
2021-10-28 22:35:15 +02:00
}
public function posts(): array
{
return $this->get(
"{$this->page->remote_id}/published_posts",
['fields' => 'id,created_time,full_picture,message,attachments'],
'data',
);
}
public function saveAttachments(Post $post, $data) {
foreach($data as $i => $attachment) {
$fid = null;
switch($attachment['type']) {
case 'photo':
case 'video_inline':
$payload = [ 'href' => $this->saveUrl(data_get($attachment, 'media.image.src')) ]; break;
case 'share':
case 'event':
$fid = $post->id.'-attachment-'.$i;
if (!data_get($attachment, 'media.image.src')) {
continue 2;
}
$payload = [ 'href' => $this->saveUrl(data_get($attachment, 'media.image.src'), $fid.'.jpg') ];
break;
case 'album':
$payload = [ 'href' => $this->saveUrl(data_get($attachment, 'subattachments.data.0.media.image.src')) ]; break;
case 'multi_share':
$payload = [ 'href' => $this->saveUrl(data_get($attachment, 'subattachments.data.0.media.image.src')) ]; break;
case 'native_templates': continue 2;
default:
throw new \Exception('I dont know how to parse attachment of type '.$attachment['type']);
}
$fid = $fid ?: data_get($attachment, 'target.id', '');
2021-10-30 12:16:27 +02:00
$post->attachments()->updateOrCreate(['remote_id' => $fid], array_merge($payload, [
'remote_id' => $fid,
2021-10-28 22:35:15 +02:00
'type' => $attachment['type'],
]));
}
}
public function sync(): void
{
foreach ($this->posts() as $post) {
if (!data_get($post, 'message')) {
continue;
}
if (!data_get($post, 'attachments')) {
continue;
}
$payload = [
'message' => $post['message'],
2021-10-30 12:16:27 +02:00
'remote_id' => $post['id'],
2021-10-28 22:35:15 +02:00
'href' => data_get($post, 'attachments.data.0.target.url'),
'created_at' => Carbon::parse($post['created_time']),
];
2021-10-30 12:16:27 +02:00
$existing = $this->page->posts()->where('remote_id', $post['id'])->first();
2021-10-28 22:35:15 +02:00
if ($existing) {
$existing->update($payload);
} else {
$existing = $this->page->posts()->create($payload);
}
$this->saveAttachments($existing, data_get($post, 'attachments.data'));
}
2021-10-30 13:32:09 +02:00
$this->cleanOutdated();
2021-10-28 22:35:15 +02:00
}
private function get(string $url, array $query = [], ?string $return = null): array
{
$response = $this->client->get("/{$this->version}/$url", [
2021-10-30 12:16:27 +02:00
'query' => array_merge($query, ['access_token' => $this->page->access_token]),
2021-10-28 22:35:15 +02:00
]);
$data = json_decode((string) $response->getBody(), true);
return $return === null
? $data
: data_get($data, $return);
}
}