跳转到内容

GoogleDriveAPI开发

Google Drive 是一款 Google 提供的在线文件存储与共享服务。

  • 创建文件
from googleapiclient.http import MediaFileUpload
def create_file(self, name=None, file_path=None, file_metadata=None, fields=None):
"""
创建文件
"""
media = MediaFileUpload(file_path, mimetype='image/jpeg', resumable=True)
file = self.service.files().create(body=file_metadata, media_body=media, fields=fields).execute()
return file
  • 创建文件夹
def create_dir(self, name=None, fields=None):
"""
创建文件夹
"""
file_metadata = {
'name': name,
'mimeType': 'application/vnd.google-apps.folder'
}
file = self.service.files().create(body=file_metadata, fields=fields).execute()
return file
  • 复制文件
def copy_file(self, file_id=None, fields=None):
"""
复制文件
"""
file = self.service.files().copy(fileId=file_id, fields=fields).execute()
return file
  • 删除文件
def remove_file(self, file_id=None, fields=None):
"""
删除文件(注意:此操作是彻底删除,而非移动到回收站)
"""
file = self.service.files().delete(fileId=file_id, fields=fields).execute()
return file
  • 获取文件
def get_file(self, file_id=None, fields=None):
"""
获取文件元数据
"""
file = self.service.files().get(fileId=file_id, fields=fields).execute()
return file
  • 查询文件
def search_file(self, query=None, fields=None):
"""
查询文件,fields 示例: "files(parents,id,name)"
"""
files = []
page_token = None
while True:
response = self.service.files().list(q=query, fields=fields, pageToken=page_token).execute()
for file in response.get('files', []):
print(f'Found file: {file.get("name")}, {file.get("id")}, {file.get("parents")}')
files.extend(response.get('files', []))
page_token = response.get('nextPageToken', None)
if page_token is None:
break
return files
  • 下载文件
import urllib.request
slide_url = f"https://docs.google.com/presentation/d/{file_id}"
url = f"https://docs.google.com/presentation/d/{file_id}/export/pptx?access_token={self.credentials.token}"
urllib.request.urlretrieve(url, save_path)
return slide_url
  • 更新文件
def update_file(self, file_id=None, file_metadata=None, fields=None):
"""
更新文件元数据
"""
file = self.service.files().update(fileId=file_id, body=file_metadata, fields=fields).execute()
return file
  • 移动文件
def move_file(self, file_id, folder_id, old_folder_id, fields=None):
"""
移动文件(实质是通过修改父级目录实现)
"""
file = self.service.files().update(
fileId=file_id,
addParents=folder_id,
removeParents=old_folder_id,
fields=fields
).execute()
return file.get('id', None), file.get('parents', None)
  • 导出文件
import io
from googleapiclient.http import MediaIoBaseDownload
def export_file(self, file_id, mime_type):
"""
导出文档内容
"""
request = self.service.files().export_media(fileId=file_id, mimeType=mime_type)
file = io.BytesIO()
downloader = MediaIoBaseDownload(file, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print(f'Download {int(status.progress() * 100)}%.')
return file.getvalue()

  • 返回文件的特定字段:可以通过 fields 参数指定返回字段。
    • 默认返回 id, name, mimeType
    • 语法:, 代表分割选择;/ 表示嵌套字段;* 代表通配符;() 代表一组子选择器。具体可 参考官方字段参数文档