已安装Box桌面端,如何获取本地目录新建文件的Box URL?
问题描述
我已安装Box桌面应用,本地Box文件夹路径为C:\Users\Thiago.Oliveira\Box\。我编写了如下Python脚本,可实现该文件夹内文件的复制与重命名:
# Providing the folder path origin = r'C:\\Users\\Thiago.Oliveira\\Box\\XXXXXXX.xlsx' target = f'C:\\Users\\Thiago.Oliveira\\Box\\XXXXXXX{datetime.date.today()}.xlsx' # 复制文件 shutil.copy(origin, target) print("Files are copied successfully")
但我还需要获取新建文件的Box URL,以便通过邮件发送。目前未找到可行方法,请问是否可以实现?
解决方案
可以实现,以下是两种实用方法:
方法一:读取本地文件的Box关联属性
Box桌面同步的文件会在Windows系统中存储专属扩展属性,包含Box文件ID,通过这个ID可直接构造文件URL:
import win32api import win32con import os import shutil import datetime # 原脚本逻辑 origin = r'C:\Users\Thiago.Oliveira\Box\XXXXXXX.xlsx' target = f'C:\\Users\\Thiago.Oliveira\\Box\\XXXXXXX{datetime.date.today()}.xlsx' shutil.copy(origin, target) print("Files are copied successfully") # 获取Box URL的函数 def get_box_file_url(local_file_path): try: # 读取Box存储的文件ID属性 file_attrs = win32api.GetFileAttributesEx(local_file_path, win32con.GetFileExInfoStandard) box_item_id = file_attrs[-1].get('BoxItemId') if box_item_id: return f"https://app.box.com/file/{box_item_id}" except Exception as e: print(f"读取属性失败: {str(e)}") return None # 调用获取URL box_url = get_box_file_url(target) if box_url: print(f"Box文件URL:{box_url}") else: print("无法获取URL,请等待文件完成同步到Box云端")
注意:需要先安装pywin32库(pip install pywin32),且必须等待文件完成同步后才能读取到有效属性。
方法二:使用Box Python SDK直接调用云端API
如果本地属性读取不稳定,可通过官方SDK直接从Box云端获取文件URL,步骤如下:
- 安装SDK:
pip install boxsdk - 在Box开发者控制台创建自定义应用,获取JWT认证所需的参数(客户端ID、密钥、企业ID、JWT密钥ID、私钥文件等)
- 编写代码:
import shutil import datetime from boxsdk import Client, JWTAuth # 原脚本逻辑 origin = r'C:\Users\Thiago.Oliveira\Box\XXXXXXX.xlsx' target = f'C:\\Users\\Thiago.Oliveira\\Box\\XXXXXXX{datetime.date.today()}.xlsx' shutil.copy(origin, target) print("Files are copied successfully") # 初始化Box客户端(替换为你的应用参数) auth = JWTAuth( client_id='你的客户端ID', client_secret='你的客户端密钥', enterprise_id='你的企业ID', jwt_key_id='你的JWT密钥ID', rsa_private_key_file_path='私钥文件路径.pem', rsa_private_key_passphrase='私钥密码(如果有)' ) auth.authenticate_instance() client = Client(auth) # 根据本地路径查找云端文件并获取URL def get_box_url_from_cloud(local_path): box_root_path = r'C:\Users\Thiago.Oliveira\Box' # 转换为Box云端的相对路径 relative_path = os.path.relpath(local_path, box_root_path).replace('\\', '/') # 拆分路径为文件夹和文件名 folder_path, file_name = os.path.split(relative_path) # 定位目标文件夹 current_folder = client.folder(folder_id='0') # Box根目录ID为0 if folder_path: for part in folder_path.split('/'): items = current_folder.get_items() current_folder = next(item for item in items if item.name == part and item.type == 'folder') # 查找目标文件 for item in current_folder.get_items(): if item.name == file_name and item.type == 'file': # 获取可共享的URL return item.get_shared_link()['url'] return None # 调用获取URL box_url = get_box_url_from_cloud(target) if box_url: print(f"Box文件URL:{box_url}") else: print("云端未找到对应文件,请确认同步完成或路径正确")
这种方法不受本地同步状态限制,直接从云端获取信息,但需要完成开发者应用的配置。
内容的提问来源于stack exchange,提问作者Thiago De Oliveira Santos
相关产品推荐
相关产品推荐

