client = new Client([ 'http_errors' => false, 'base_uri' => $this->baseUri ]); } public function getType(): string { return 'facebook'; } public function posts(): Generator { $response = $this->client->get("/{$this->version}/{$this->page->remote_id}/published_posts", [ 'query' => [ 'access_token' => $this->page->access_token, 'fields' => 'id,created_time,full_picture,message,attachments' ], ]); $posts = data_get(json_decode((string) $response->getBody(), true), 'data', []); foreach ($posts as $post) { if (!data_get($post, 'message')) { continue; } if (!data_get($post, 'attachments')) { continue; } yield [ 'message' => $post['message'], 'remote_id' => $post['id'], 'href' => data_get($post, 'attachments.data.0.target.url'), 'created_at' => Carbon::parse($post['created_time']), 'attachments' => $this->getAttachments(data_get($post, 'attachments.data')), ]; } } private function getAttachments(array $data): Generator { foreach($data as $i => $attachment) { $fid = null; switch($attachment['type']) { case 'photo': case 'video_inline': $href = $this->saveUrl(data_get($attachment, 'media.image.src')); break; case 'share': case 'event': $fid = data_get($attachment, '0.target.id', data_get($attachment, 'target.id', substr(base64_encode(json_encode($attachment)), 0, 20))); if (!data_get($attachment, 'media.image.src')) { continue 2; } $href = $this->saveUrl(data_get($attachment, 'media.image.src'), $fid.'.jpg'); break; case 'album': $href = $this->saveUrl(data_get($attachment, 'subattachments.data.0.media.image.src')); break; case 'multi_share': $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', ''); yield [ 'type' => $attachment['type'], 'href' => $href, 'remote_id' => $fid, ]; } } }