通过Google Drive API获取共享链接

26

我正在开发一个使用 Google Drive 的应用程序。我希望用户能够通过链接共享文件,并将权限设置为“任何人”和“具有链接”,如Google Developers 文档中所述。

然而,我无法弄清楚要分享哪个链接。当我在 Google Drive 浏览器界面中共享文件时,我看到的链接格式为:Link to share

https://docs.google.com/presentation/d/[...]/edit?usp=sharing

这种格式的链接既不是文件资源对象的一部分,也不是通过设置权限的 http 调用返回的。我希望有人能解释一下如何通过 REST API 获取此链接。

5个回答

26

谢谢提供链接。我有点困惑如何从Drive应用程序共享的意图中创建此File对象? - android_student
3
aleternateLink 在 Google Drive API v3 中已不再可用。 - abggcv
6
针对 Google Drive API v3,Google 建议使用 webViewLink 属性替代其他属性。 - JaykeBird
1
有没有可能获取视图链接而不是编辑链接?我们有没有办法指定这个? - Skywalker

16

要实际启用使用Google Drive API的链接共享:

drive.permissions.create({
  fileId: '......',
  requestBody: {
    role: 'reader',
    type: 'anyone',
  }
});

使用以下代码获取 webLinkView 值:

const webViewLink = await drive.files.get({
    fileId: file.id,
    fields: 'webViewLink'
}).then(response => 
    response.data.webViewLink
);


1
这对我帮助很大。请记住,您可以将该权限应用于整个文件夹,以便每个单独的文件都可以通过webViewLink共享。 - Gonzo345

4
在我使用PHP Api v3的情况下,如果您想让链接不为空,您必须定义请求该字段...并且如果您拥有正确的权限:
像这样:
$file =self::$service->files->get("1ogXyGxcJdMXt7nJddTpVqwd6_G8Hd5sUfq4b4cxvotest",array("fields"=>"webViewLink"));

我也在使用API v3(PHP)。我确实在API的响应中获得了“webViewLink”。但是,在隐身模式下打开该链接会带我到登录页面。在文件请求中是否有一种方法可以说“给我一个对世界公开的链接,只能访问1次”?(我正在将图像存储在不是Web用户的帐户中。) - jbobbins
1
是的,在获取文件ID后,您应该更改文件权限。 - Miguel

3

以下是一个关于如何获取WebViewLink文件属性(又称文件编辑链接)的实际示例:

$file = $service->files->get($file_id, array('fields' => 'webViewLink'));
$web_link_view = $file->getWebViewLink();

或者

$sheetsList = $drive_service->files->listFiles([
  'fields' => 'files(id, name, webViewLink, webContentLink)',
]);

$web_link_view = $sheetsList->current()->getWebViewLink();

请注意,您应该加载文件并指定要带有的字段(在此情况下是webViewLink)。如果您不这样做,只有idname将可用。

如果您需要调整文件共享设置,可以按照以下步骤操作:

$permissions = new \Google_Service_Drive_Permission();
$permissions->setRole('writer');
$permissions->setType('anyone');

$drive_service->permissions->create($file_id, $permissions);

可以在这里找到setRole()setType()可能的取值:https://developers.google.com/drive/api/v3/reference/permissions/create

1

对于Python,我只需要获取文件“id”。然后像这样“创建”链接:

def create_folder(folder_name, folder_id):
    """Create a folder and prints the folder ID and Folder link
    Returns : Folder Id

    """

    try:
        # create drive api client
        service = build("drive", "v3", credentials=creds)
        file_metadata = {
            "name": folder_name,
            "mimeType": "application/vnd.google-apps.folder",
            "parents": [folder_id],
        }

        file = (
            service.files().create(body=file_metadata, fields="id").execute()
        )
        id = file.get("id")
        print(
            f'Folder ID: "{id}".',
            f'https://drive.google.com/drive/u/0/folders/{id}',
        )
        return id

    except HttpError as error:
        print(f"An error occurred: {error}")
        return None

感谢您的快速修复。需要注意的是,此URL可能会随时更改,因此如果硬编码了它,更改将导致程序崩溃。因此,从程序中动态获取该值是长期最佳选择。 - ingyhere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接