Google Drive API - 获取共享文件下载链接

时间:2014-02-24 06:04:07

标签: php google-api google-drive-api google-api-php-client

我是Google云端硬盘新手并上传了许多文件。如果已知下载链接,我已更改要共享的所有文件的状态。

我想使用PHP生成文件的所有直接下载链接的列表。 PHP脚本在我的localhost上运行,我只需要将数组保存到文本文件中以便以后使用。

我在努力让Oauth工作时非常困难,但遇到了这个看起来像我需要的脚本。我设置了我的服务帐户并拥有我的服务帐户电子邮件和.p12文件。

我下载了Google PHP客户端代码库,并在我的localhost上设置了测试脚本。这就是我所拥有的

require_once "Google/Client.php";
require_once "Google/Service/Drive.php";
require_once "Google/Service/Oauth2.php";
require_once "Google/Auth/AssertionCredentials.php";

session_start();


function buildService($userEmail) {

$SERVICE_ACCOUNT_EMAIL = '12345@developer.gserviceaccount.com';
$SERVICE_ACCOUNT_PKCS12_FILE_PATH = '12345-privatekey.p12';

$key = file_get_contents($SERVICE_ACCOUNT_PKCS12_FILE_PATH);
$auth = new Google_AssertionCredentials(
$SERVICE_ACCOUNT_EMAIL,
array('https://www.googleapis.com/auth/drive'),
$key);
$auth->sub = $userEmail;
$client = new Google_Client();
$client->setUseObjects(true);
$client->setAssertionCredentials($auth);

return new Google_DriveService($client);
}

//... function retrieveAllFiles($service)

$service = buildService("myemail@gmail.com");
$allFiles = retrieveAllFiles($service);
print_r($allFiles);

我正在处理这个例子

http://stackoverflow.com/questions/21046631/google-drive-api-php-cant-list-files

和这个

https://developers.google.com/drive/web/delegation#instantiate_a_drive_service_object

我不确定该怎么做,我已经添加了所需的库,但是以下函数在PHP脚本中是未知的

Google_AssertionCredentials

setUseObjects

Google_DriveService

retrieveAllFiles

我错过了一个明显的图书馆吗?它们在示例中的名称不同,但我猜测基础名称已更改,因为有更新...我花了很多时间在Google Drive和Oauth上阅读,没有任何运气。此脚本的唯一目标是获取直接下载链接的列表。我可以手动完成,但文件太多了。

任何帮助都会很棒。

感谢。


*编辑:*


所以我这就是我试图获取我的令牌:

我正在关注此快速入门指南:

https://developers.google.com/drive/web/quickstart/quickstart-php

这是我的代码

<?php

require_once 'Google/client.php';
require_once 'Google/Service/drive.php';

defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); //I had to add this part as I was getting an undefined error for STDIN 

$client = new Google_Client();
// Get your credentials from the console
$client->setClientId('xxx.apps.googleusercontent.com');
$client->setClientSecret('xxx');
$client->setRedirectUri('http://localhost/test/fetch.php'); //same as registered one
$client->setScopes(array('https://www.googleapis.com/auth/drive'));

$service = new Google_Service_Drive($client);

$authUrl = $client->createAuthUrl();

//Request authorization
print "Please visit:\n$authUrl\n\n";
print "Please enter the auth code:\n";
$authCode = trim(fgets(STDIN));

// Exchange authorization code for access token
$accessToken = $client->authenticate($authCode);
$client->setAccessToken($accessToken);

这会导致错误

Fatal error: Uncaught exception 'Google_Auth_Exception' with message 'Invalid code' in C:\Apache24\htdocs\test\Google\Auth\OAuth2.php:95 Stack trace: #0 C:\Apache24\htdocs\test\Google\Client.php(135): Google_Auth_OAuth2->authenticate('') #1 C:\Apache24\htdocs\test\new.php(26): Google_Client->authenticate('') #2 {main} thrown in C:\Apache24\htdocs\test\Google\Auth\OAuth2.php on line 95

有什么想法吗?

感谢。


另一个编辑


所以我已经恢复到旧的Drive PHP库,因为新的Drive PHP库没有文档或示例。

这是我尝试获取令牌并获取直接下载文件链接

require_once 'google-old/google-api-php-client/src/Google_Client.php';
require_once 'google-old/google-api-php-client/src/contrib/Google_DriveService.php';

$client = new Google_Client();
// Get your credentials from the console
$client->setClientId('xx.apps.googleusercontent.com');
$client->setClientSecret('xx');
$client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');

$client->setScopes(array('https://www.googleapis.com/auth/drive'));

$service = new Google_DriveService($client);

$authUrl = $client->createAuthUrl();

//Request authorization
print "Please visit:\n$authUrl\n\n";
print "Please enter the auth code:\n";
$authCode = trim(fgets(STDIN));

// Exchange authorization code for access token
$accessToken = $client->authenticate($authCode);
$client->setAccessToken($accessToken);

$getAll = retrieveAllFiles($service);

print "<pre>";
print_r($getAll);
print "</pre>";

/**
 * Retrieve a list of File resources.
 *
 * @param Google_DriveService $service Drive API service instance.
 * @return Array List of Google_DriveFile resources.
 */
function retrieveAllFiles($service) {
$result = array();
$pageToken = NULL;

do {
    try {
        $parameters = array();
        if ($pageToken) {
            $parameters['pageToken'] = $pageToken;
        }
        $files = $service->files->listFiles($parameters);

        $result = array_merge($result, $files->getItems());
        $pageToken = $files->getNextPageToken();
    } catch (Exception $e) {
        print "An error occurred: " . $e->getMessage();
        $pageToken = NULL;
    }
} while ($pageToken);
return $result;
}

我现在面临的问题是我被困在“将代码粘贴到您的应用中”部分。

$authCode = trim(fgets(STDIN));

似乎不想执行。

另外我相信文件提取代码只会获取文件名,而不是直接下载链接。我找不到这样的例子。

我们非常感谢任何建议。

感谢。

我正在我的localhost上测试它。

2 个答案:

答案 0 :(得分:0)

首先,将您对OAuth的了解与您对Drive的了解区分开来。作为一个综合问题,它很难,但作为两个独立的问题,它非常简单。

对于OAuth,您需要知道的一切都在这一个网页上https://developers.google.com/accounts/docs/OAuth2WebServer

读完该页并理解后,如果您想使用库来拨打电话,请继续。恕我直言,OAuth库并没有做得很好,但是ymmv。无论是否有图书馆,您都必须了解正在发生的事情。

破解OAuth之后,您最终会得到一个闪亮的access_token,您可以将其放入Drive API,如果您正在调用rar API,则作为http标头,如果您使用其中一个库,则将其包装在凭证对象中。

答案 1 :(得分:0)

替换STDIN东西。

改为:

if (!isset($_GET['code'])) {
    print "Please visit:\n$authUrl\n\n";
    print "Please enter the auth code:\n";
} else { $authCode = ''; }
//$authCode = trim(fgets(STDIN));

$authCode = $_GET['code'];

谷歌的代码就他们的问题而言是错误的。这样做之后我就会创建文件(它仍然会发出错误,但它会生成文件)。

将其file_get_contents行替换为:

$data = 'blahblah blah';//file_get_contents('document.txt');

然后你去。