当我尝试使用 Linux bash 脚本和curl 删除 Google 云端硬盘中的文件时,我收到在服务器上找不到的响应网址

问题描述 投票:0回答:1

我正在尝试使用 bash shell 脚本删除文件,该文件是我使用不同的 shell 脚本上传到共享谷歌驱动器的。我能够列出文件所在文件夹的内容并返回文件名和文件 ID。但是,当我尝试删除该文件时,响应显示在服务器上找不到请求的 url。 我从 shell 脚本中调用的函数如下。文件 ID 必须有效,因为它已正确回显并与通过 Google Drive 本身获取的文件的链接匹配。我正确设置了访问令牌。

我尝试了各种方法来指定应该删除/删除的文件,例如使用 DELETE 而不是 POST,并通过添加来自 Google Drive 的完整链接和其他含义来使用文件 ID,但没有成功。我原以为响应会成功! #!/bin/bash

set -e

# Function to get a new access token using the refresh token

get_access_token() {
    RESPONSE=$(curl -s -X POST https://oauth2.googleapis.com/token \
        -d client_id=${CLIENT_ID} \
        -d client_secret=${CLIENT_SECRET} \
        -d refresh_token=${REFRESH_TOKEN} \
        -d grant_type=refresh_token)

    ACCESS_TOKEN=$(echo ${RESPONSE} | jq -r '.access_token')
    echo -e "Access token acquired '${ACCESS_TOKEN}'"
}

get_drive_contents () {

    DRIVE_CONTENTS=$(curl -s GET \
        "https://www.googleapis.com/drive/v3/files?q='${DRIVE_ID}'+in+parents+and+trashed=false&includeItemsFromAllDrives=true&supportsAllDrives=true&fields=files(id,name,mimeType)" \
        -H "Authorization: Bearer $ACCESS_TOKEN" \
        -H "Accept: application/json")

    echo -e ${DRIVE_CONTENTS}   
}

delete_files () {
    echo $DRIVE_CONTENTS | jq -c -r '.files[]' | while read item; do
        FILE_ID=$(echo ${item} | jq -r '.id')
        FILENAME=$(echo ${item} | jq -r '.name')
        echo "fileid=$FILE_ID filename=$FILENAME"

    echo -e "Delete file request"
    DELETE_RESPONSE=$(curl -s -X POST "https://www.googleapis.com/drive/v3/files/'${FILE_ID}'?supportsAllDrives=true" \
        -H "Authorization: Bearer $ACCESS_TOKEN" \
        -H "Content-Type: application/json" \
        -d '{"trashed": true}')

    echo -e "DELETE url response: $DELETE_RESPONSE"

    exit
done

}   

if [ $# -ne 1 ]; then
    echo "Error: list_gdrive.sh requires 1 parameter"
    echo -e "Usage: $0 gdrive_full_path"
    echo -e "Example gdrive full path :https://drive.google.com/drive/folders/1Jm4UDqJDDo4-frwjoHsK_qqcDHRZjDkD"
    exit 1
fi

DRIVE_URL=$1

echo -e "Gdrive: $DRIVE_URL"

CLIENT_ID="xxxxxxx.apps.googleusercontent.com"
CLIENT_SECRET="xxxxxxxxxx"
REFRESH_TOKEN="xxxxxxxxxxx}

get_access_token

ACCESS_TOKEN=$(echo $RESPONSE | jq -r '.access_token')

echo -e "Access Token initialized"

get_drive_contents

delete_files

echo -e "All processing complete"

exit 0
linux shell curl google-drive-api
1个回答
0
投票

修改要点:

  • 如果您想使用Drive API v3的“方法:files.update”,请使用PATCH方法而不是POST方法。 参考
  • https://www.googleapis.com/drive/v3/files/'${FILE_ID}'?supportsAllDrives=true
    应该是
    https://www.googleapis.com/drive/v3/files/${FILE_ID}?supportsAllDrives=true

当这些点反映在您的脚本中时,请按如下方式修改您的脚本并再次测试。

来自:

DELETE_RESPONSE=$(curl -s -X POST "https://www.googleapis.com/drive/v3/files/'${FILE_ID}'?supportsAllDrives=true" \
    -H "Authorization: Bearer $ACCESS_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"trashed": true}')

致:

DELETE_RESPONSE=$(curl -s -X PATCH "https://www.googleapis.com/drive/v3/files/${FILE_ID}?supportsAllDrives=true" \
    -H "Authorization: Bearer $ACCESS_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"trashed": true}')
  • 通过此修改,文件
    ${FILE_ID}
    被移动到垃圾箱。
  • 当我测试这个修改后的脚本时,我确认该文件已移至垃圾箱。

注:

  • 此修改假设值
    ${FILE_ID}
    $ACCESS_TOKEN
    是有价值的值。请注意这一点。

参考:

© www.soinside.com 2019 - 2024. All rights reserved.