我是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上测试它。
答案 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');
然后你去。