Я делаю приложение с открытым исходным кодом, где пользователь может создавать резервные копии своих альбомов в Facebook на диске Google, используя PHP SDK. Я закончил с частью Facebook и теперь застрял с ужасно написанной документацией Google. Итак, вот как я работаю, шаг за шагом:
аутентификация пользователя: Все мои запросы и обратные вызовы обрабатываются в одном файле PHP, который работает как API. Так что это блок кода, который обрабатывает запрос на загрузку документов в Google:
<?php
session_start();
require_once __DIR__.'/classes/facebook.class.php';
require_once __DIR__.'/classes/drive.class.php';
$fb = new Facebook();
$google = Drive::getInstance();
$query = $_REQUEST['i'];
switch($query){
case "backup_req":
$agent = $google->getAgent();
if(!isset($_SESSION['google_access_token'])){
$_SESSION['album_temp'] = $_REQUEST['album'];
header("location: ".filter_var($agent->createAuthUrl(), FILTER_SANITIZE_URL));
} else{
$google->uploadAlbum($fb, $_REQUEST['album']);
}
break;
case "google_callback":
$agent = $google->getAgent();
if(!isset($_SESSION['google_access_token'])){
$code = $_GET['code']; // just to keep the code neat.. no need to store in other var!
$res = $google->getAgent()->authenticate($code); // hope this works
$_SESSION['google_access_token'] = $agent->getAccessToken();
}
$google->uploadAlbum($fb, $_SESSION['album_temp']);
break;
}
Вот что я пытаюсь сделать: если в сеансе нет маркера доступа Google, мы перенаправляем пользователя на страницу входа Google. который после завершения перенаправляет в тот же файл, но на этот раз запрашивая google_callback
вместе с кодом. Затем он сохраняется на сессии, и мы приступаем к uploadAlbum
метод.
ПРИМЕЧАНИЕ, я повторил содержимое сервера, и да, я получаю токен доступа и обновляю токен
Теперь для загрузки альбома есть 4 метода в классе Drive, который является одиночным. вот код:
class Drive{
private static $instance;
private $fileRequest;
private $mimeType;
private $filename;
private $path;
private $client;
private $clientId = "<client-id>";
private $clientSecret = "<client-secret>";
private final function __construct(){
$this->client = new Google_Client();
$this->client->setApplicationName("fb album backup tool");
$this->client->setClientId($this->clientId);
$this->client->setClientSecret($this->clientSecret);
$this->client->setRedirectUri("https://fbrtc.sameer-manek.com/fb_caller.php?i=google_callback");
$this->client->setScopes(array('https://www.googleapis.com/auth/drive.file'));
$this->client->setAccessType("offline");
$this->client->setApprovalPrompt('force');
}
public static function getInstance(){
if(self::$instance == null) {
self::$instance = new Drive();
}
return self::$instance;
}
public function getAgent(){
return $this->client;
}
public function uploadAlbum($fb, $album){
$nodes = $fb->get_photos($album);
$client = new GearmanClient();
$client->addServer();
foreach ($nodes as $node) {
//$client->addTask('init', $node['picture']);
try{
$data = file_get_contents($node['picture']);
$saveto = __DIR__."/../scripts/tmp/".rand().".jpg";
$file = fopen($saveto, "w+");
fwrite($file, $data);
fclose($file);
$this->init($saveto);
echo "uploaded ".$saveto."\n";
} catch(Exception $e) {
return false;
}
}
return true;
//$client->runTasks();
}
public function init($file){
$at = $_SESSION['google_access_token']['access_token'];
$this->client->setAccessToken($at);
$this->fileRequest = $file;
$client = $this->client;
//$client->refreshToken($_SESSION['google_access_token']['refreshToken']);
$tokens = $client->getAccessToken();
$client->setAccessToken($tokens);
$client->setDefer(true);
$this->client->setAccessToken($at);
$this->processFile();
}
public function processFile(){
$fileRequest = $this->fileRequest;
$path_parts = pathinfo($this->fileRequest);
$this->path = $path_parts['dirname'];
$this->fileName = $path_parts['basename'];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$this->mimeType = finfo_file($finfo, $fileRequest);
finfo_close($finfo);
$this->upload();
}
public function upload(){
$client = $this->client;
$service = new Google_Service_Drive($this->client);
//Insert a file
$file = new Google_Service_Drive_DriveFile();
$file->setName($this->fileName.'.jpg');
$file->setDescription('A test document');
$file->setMimeType('image/jpeg');
$data = file_get_contents($this->fileRequest);
$createdFile = $service->files->create($file, array(
'data' => $data,
'mimeType' => 'image/jpeg',
'uploadType' => 'multipart'
));
}
}
uploadAlbum()
Метод извлечения изображений из запрошенного альбома.
init()
метод подготавливает объект для загрузки этого изображения (здесь мы используем маркер назначения доступа к объекту)
processFile()
Метод извлечения и хранения информации об изображении.
upload()
Метод на самом деле загрузки изображений на пользовательский диск Google.
после того, как это было выполнено, не генерируются никакие исключения, не генерируется ни одна ошибка, но изображение не загружается на диск при перекрестной проверке.
Я не могу точно определить, в чем проблема, пожалуйста, помогите мне решить эту ошибку. Благодарю.
[EDIT] я var_dumped содержимое$createdFile
и на экране появилось следующее:
object(GuzzleHttp\Psr7\Request)#73 (7) { ["method":"GuzzleHttp\Psr7\Request":private]=> string(4) "POST" ["requestTarget":"GuzzleHttp\Psr7\Request":private]=> NULL ["uri":"GuzzleHttp\Psr7\Request":private]=> object(GuzzleHttp\Psr7\Uri)#69 (7) { ["scheme":"GuzzleHttp\Psr7\Uri":private]=> string(5) "https" ["userInfo":"GuzzleHttp\Psr7\Uri":private]=> string(0) "" ["host":"GuzzleHttp\Psr7\Uri":private]=> string(18) "www.googleapis.com" ["port":"GuzzleHttp\Psr7\Uri":private]=> NULL ["path":"GuzzleHttp\Psr7\Uri":private]=> string(22) "/upload/drive/v3/files" ["query":"GuzzleHttp\Psr7\Uri":private]=> string(20) "uploadType=multipart" ["fragment":"GuzzleHttp\Psr7\Uri":private]=> string(0) "" } ["headers":"GuzzleHttp\Psr7\Request":private]=> array(3) { ["Host"]=> array(1) { [0]=> string(18) "www.googleapis.com" } ["content-type"]=> array(1) { [0]=> string(37) "multipart/related; boundary=344323595" } ["X-Php-Expected-Class"]=> array(1) { [0]=> string(30) "Google_Service_Drive_DriveFile" } } ["headerNames":"GuzzleHttp\Psr7\Request":private]=> array(3) { ["content-type"]=> string(12) "content-type" ["host"]=> string(4) "Host" ["x-php-expected-class"]=> string(20) "X-Php-Expected-Class" } ["protocol":"GuzzleHttp\Psr7\Request":private]=> string(3) "1.1" ["stream":"GuzzleHttp\Psr7\Request":private]=> object(GuzzleHttp\Psr7\Stream)#67 (7) { ["stream":"GuzzleHttp\Psr7\Stream":private]=> resource(11) of type (stream) ["size":"GuzzleHttp\Psr7\Stream":private]=> NULL ["seekable":"GuzzleHttp\Psr7\Stream":private]=> bool(true) ["readable":"GuzzleHttp\Psr7\Stream":private]=> bool(true) ["writable":"GuzzleHttp\Psr7\Stream":private]=> bool(true) ["uri":"GuzzleHttp\Psr7\Stream":private]=> string(10) "php://temp" ["customMetadata":"GuzzleHttp\Psr7\Stream":private]=> array(0) { } } } uploaded /sites/facebook_backup/classes/../scripts/tmp/264708337.jpg
вот ссылка на GitHub репо для справки.
Задача ещё не решена.
Других решений пока нет …