2

ユーザーのウェブサイトのバックアップをGoogleドライブにアップロードするプログラムを実装しようとしています。それらのすべてが私のドメインにアカウントを持っているので、ここで説明されているように、私のアプリの権限のドメインwde委任を付与する手順を実行しました:https ://developers.google.com/drive/delegation

残念ながら、ドライブサービスオブジェクトをインスタンス化するためのサンプルコードは、多くのレベルで失敗します。ここにあります:

<?php

require_once "google-api-php-client/src/Google_Client.php";
require_once "google-api-php-client/src/contrib/Google_DriveService.php";
require_once "google-api-php-client/src/contrib/Google_Oauth2Service.php";
session_start();

$DRIVE_SCOPE = 'https://www.googleapis.com/auth/drive';
$SERVICE_ACCOUNT_EMAIL = '<some-id>@developer.gserviceaccount.com';
$SERVICE_ACCOUNT_PKCS12_FILE_PATH = 'privatekey.p12';

/**
 * Build and returns a Drive service object 
 * authorized with the service accounts
 * that acts on behalf of the given user.
 *
 * @param userEmail The email of the user.
 * @return Google_DriveService service object.
 */
function buildService($userEmail) {
  $key = file_get_contents(KEY_FILE);
  $auth = new Google_AssertionCredentials(
      SERVICE_ACCOUNT_EMAIL,
      array(DRIVE_SCOPE),
      $key);
  $auth->setPrn($userEmail);
  $client = new Google_Client();
  $client->setUseObjects(true);
  $client->setAssertionCredentials($auth);
  return new Google_DriveService($client);
}

?>

最初の明らかなエラーは、変数を設定しているのに、関数が定数を使用していることです。そのため、定数(KEY_FILE、SERVICE_ACCOUNT_EMAILなど)が機能するかどうかを確認するために、そこにあるべきものをハードコーディングすると、次のエラーが発生します。

Fatal error: Call to undefined method Google_AssertionCredentials::setPrn()

誰かがこれを修正する方法について何か提案やコメントがありますか?これらの問題をグーグルで検索すると、グーグルは自分のドキュメントへのリンクを次々と表示しますが、上記のように、まったく機能しません。

基本的に、ドメイン全体のアクセス権が付与されている「サービスアカウント」を使用して、ドライブサービスオブジェクトをインスタンス化する方法の例を見たいと思っていました。

4

1 に答える 1

4

ドキュメントにいくつかのタイプミスがあるようです (ドキュメントを書いた場合、それはバグと呼ばれるべきです:))。

<?php

require_once "google-api-php-client/src/Google_Client.php";
require_once "google-api-php-client/src/contrib/Google_DriveService.php";
require_once "google-api-php-client/src/contrib/Google_Oauth2Service.php";
session_start();

function buildService($userEmail) {

  $DRIVE_SCOPE = 'https://www.googleapis.com/auth/drive';
  $SERVICE_ACCOUNT_EMAIL = '<some-id>@developer.gserviceaccount.com';
  $SERVICE_ACCOUNT_PKCS12_FILE_PATH = 'privatekey.p12';

  $key = file_get_contents($SERVICE_ACCOUNT_PKCS12_FILE_PATH);

  $auth = new Google_AssertionCredentials($SERVICE_ACCOUNT_EMAIL, array($DRIVE_SCOPE), $key); // Changed!

  $auth->prn = $userEmail; // Changed!

  $client = new Google_Client();
  $client->setUseObjects(true);
  $client->setAssertionCredentials($auth);
  return new Google_DriveService($client);
}

$service = buildService('email@yourdomain.com');


$file = new Google_DriveFile();
$file->setTitle('My document');
$file->setDescription('A test document');
$file->setMimeType('text/plain');

$data = "contents";

$createdFile = $service->files->insert($file, array('data' => $data,'mimeType' =>'text/plain',));

print_r($createdFile);
  1. 彼らは 3 つの変数を定義しましたが、3 つの定数を使用しました。contsnt を削除し、代わりに変数を使用しました。

  2. 方法はありませんGoogle_AssertionCredentials::setPrn()。プロパティprnの可視性は public です。したがって、次のように設定できます $auth->prn = $userEmail;

于 2012-11-15T11:19:05.940 に答える