简体   繁体   English

使用驱动器api从appdatafolder下载文件

[英]download file from appdatafolder with drive api php

The Drive API explains how to SAVE and LIST "appdata" files in the hidden "appdatafolder". Drive API说明了如何在隐藏的“ appdatafolder”中保存和列出“ appdata”文件。 SEE LINK . 查看链接 But how do i download one of them? 但是,我该如何下载其中之一? I can list them and get the file id but then, how do i download it? 我可以列出它们并获取文件ID,但是如何下载? how do i save it as a local file. 我如何将其另存为本地文件。 Thanks 谢谢

LINK: https://developers.google.com/drive/v3/web/appdata LINK: https : //developers.google.com/drive/v3/web/appdata

What i tried: 我试过的

--download as a regular file - 404 error -下载为常规文件-404错误

--getting content and saving in new file - file has 0 bytes -获取内容并保存在新文件中-文件有0个字节

The Code: (this only list file names but does not download the files) 代码:(仅列出文件名,但不下载文件)

<?php require __DIR__ . '/vendor/autoload.php'; // Google Drive API

// HTTPS Authentication
$masterToken = getMasterTokenForAccount("example@gmail.com", "examplepass");
$appSignature = '38a0f7d505fe18fec64fbf343ecaaaf310dbd799';
$appID = 'com.whatsapp';
$accessToken = getGoogleDriveAccessToken($masterToken, $appID, $appSignature);

if ($accessToken === false) return;

// Initializing the Google Drive Client
$client = new Google_Client();
$client->setAccessToken($accessToken);
$client->addScope(Google_Service_Drive::DRIVE_APPDATA);
$client->addScope(Google_Service_Drive::DRIVE_FILE);
$client->setClientId("");    // client id and client secret can be left blank
$client->setClientSecret(""); // because we're faking an android client
$service = new Google_Service_Drive($client);

// Print the names and IDs for up to 10 files.
$optParams = array(
    'spaces' => 'appDataFolder',
    'fields' => 'nextPageToken, files(id, name)',
    'pageSize' => 10
);
$results = $service->files->listFiles($optParams);

if (count($results->getFiles()) == 0) 
{
    print "No files found.\n";
} 
else 
{
    print "Files:\n";
    foreach ($results->getFiles() as $file) 
    {
        print $file->getName() . " (" . $file->getId() . ")\n";

    }

    $content = $service->files->get('1BjeIaTO_eMxJ-XrLFhxGujpjUzXOYpi_EcVOjjOG03JW', array(
  'alt' => 'media' ));
    echo var_dump($content);
}



function getGoogleDriveAccessToken($masterToken, $appIdentifier, $appSignature)
{
    if ($masterToken === false) return false;

    $url = 'https://android.clients.google.com/auth';
    $deviceID = '0000000000000000';
    $requestedService = 'oauth2:https://www.googleapis.com/auth/drive.appdata https://www.googleapis.com/auth/drive.file';
    $data = array('Token' => $masterToken, 'app' => $appIdentifier, 'client_sig' => $appSignature, 'device' => $deviceID, 'google_play_services_version' => '8703000', 'service' => $requestedService, 'has_permission' => '1');

    $options = array(
        'http' => array(
            'header' => "Content-type: application/x-www-form-urlencoded\r\nConnection: close",
            'method' => 'POST',
            'content' => http_build_query($data),
            'ignore_errors' => TRUE,
            'protocol_version'=>'1.1',
             //'proxy' => 'tcp://127.0.0.1:8080', // optional proxy for debugging
             //'request_fulluri' => true
        )
    );
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    if (strpos($http_response_header[0], '200 OK') === false) 
    { 
        /* Handle error */
        print 'An error occured while requesting an access token: ' . $result . "\r\n";
        return false;
    }

    $startsAt = strpos($result, "Auth=") + strlen("Auth=");
    $endsAt = strpos($result, "\n", $startsAt);
    $accessToken = substr($result, $startsAt, $endsAt - $startsAt);

    return "{\"access_token\":\"" . $accessToken . "\", \"refresh_token\":\"TOKEN\", \"token_type\":\"Bearer\", \"expires_in\":360000, \"id_token\":\"TOKEN\", \"created\":" . time() . "}";
}

function getMasterTokenForAccount($email, $password) 
{
    $url = 'https://android.clients.google.com/auth';
    $deviceID = '0000000000000000';
    $data = array('Email' => $email, 'Passwd' => $password, 'app' => 'com.google.android.gms', 'client_sig' => '38918a453d07199354f8b19af05ec6562ced5788', 'parentAndroidId' => $deviceID);

    $options = array(
        'http' => array(
            'header' => "Content-type: application/x-www-form-urlencoded\r\nConnection: close",
            'method' => 'POST',
            'content' => http_build_query($data),
            'ignore_errors' => TRUE,
            'protocol_version'=>'1.1',
             //'proxy' => 'tcp://127.0.0.1:8080', // optional proxy for debugging
             //'request_fulluri' => true
        )
    );
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    if (strpos($http_response_header[0], '200 OK') === false) 
    { 
        /* Handle error */
        print 'An error occured while trying to log in: ' . $result . "\r\n";
        return false;
    }

    $startsAt = strpos($result, "Token=") + strlen("Token=");
    $endsAt = strpos($result, "\n", $startsAt);
    $token = substr($result, $startsAt, $endsAt - $startsAt);

    return $token;
}

This might help you to understand the basic Listing from AppData: 这可以帮助您了解AppData的基本清单:

$response = $driveService->files->listFiles(array(
  'spaces' => 'appDataFolder',
  'fields' => 'nextPageToken, files(id, name)',
  'pageSize' => 10
));
foreach ($response->files as $file) {
    printf("Found file: %s (%s)", $file->name, $file->id);
}

You can document yourself more here: https://developers.google.com/drive/v3/web/appdata#inserting_a_file_into_the_application_data_folder 您可以在以下位置进一步记录自己: https : //developers.google.com/drive/v3/web/appdata#inserting_a_file_into_the_application_data_folder

Also, you need to request authorization to be able to access user's AppData folder. 另外,您需要请求授权才能访问用户的AppData文件夹。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM