OneDrive memiliki fitur untuk mendapatkan share link onedrive setiap file yang diupload di sana. Namun fitur ini dapat dilakukan secara satuan atau mendapatkan share link satu per satu. Lalu bagaimana jika kita memiliki ratusan ribu atau bahkan jutaan file dan ingin mendapatkan list share link dari semua file tersebut? Apakah juga harus dilakukan satu persatu?
Ternyata kita bisa mendapatkan link share dari semua file yang ada di dalam suatu folder tertentu secara otomatis menggunakan bantuan script python sederhana. Kenapa menggunakan python? Sebelumnya, uji coba menggunakan PHP terkena batasan timeout sehingga eksekusi script terhenti di tengah jalan dan belum mendapatkan semua link share dari file yang ada di dalam folder.
Persiapan
Beberapa hal yang dibutuhkan sebelum menjalankan script ini perlu menyiapkan hal-hal berikut yaitu:
Pertama, buat Aplikasi terlebih dahulu jika belum membuat sebelumnya pada Microsoft Entra yang dapat diakses melalui entra.microsoft.com. Setelah aplikasi berhasil dibuat, selanjutnya adalah mendapatkan Tenant ID, Client ID, dan Client Secret.
- Tenant ID diambil dari Overview aplikasi yang telah dibuat sebelumnya.
- Client ID dan Client Secret diambil dari sub menu menu Certificates & Secrets yang ada di dalam App Registrations. Buat Client Secret baru jika belum memiliki untuk mendapatkan Client ID dan Client Secret.
Buat Project Python
Langkah selanjutnya adalah buat project python untuk menjalankan script. Buat virtual environment atau gunakan yang lama untuk menjalankan project tersebut. Dalam artikel ini, tidak dijelaskan langkah demi langkah pembuatan project python karena diasumsikan pembaca sudah bisa membuatnya secara mandiri.
Inisiasi Client Service Microsoft Graph
Pertama, kita buat variabel untuk menyimpan Tenant ID, Client ID, dan Client Secret.
tenant_id = "TENANT_ID_ANDA"
client_id = "CLIENT_ID_ANDA"
client_secret = "CLIENT_SECRET_ANDA"
Setelah ketiganya kita definisikan dalam variabel, selanjutnya kita bisa menggunakannya untuk membuat credential seperti berikut ini:
credential = ClientSecretCredential(
tenant_id,
client_id,
client_secret
)
Selanjutnya, kita bisa inisiasi Client Service Microsoft Graph menggunakan Scope Default seperti di bawah ini:
scopes = ['https://graph.microsoft.com/.default']
client = GraphServiceClient(credentials=credential, scopes=scopes)
Selain itu, kita juga perlu mendefinisikan ID Drive dan id Folder yang ingin diambil share linknya. Perlu diketahui bahwa ID Drive berbeda dengan ID Folder. ID Drive adalah ID OneDrive yang dimiliki suatu akun. Di dalam satu OneDrive bisa memiliki banyak folder yang memiliki ID masing-masing.
Mendapatkan Drive ID
Gunakan script berikut ini untuk mendapatkan Drive ID yang akan digunakan pada tahap selanjutnya:
from tqdm.asyncio import tqdm_asyncio
async def get_drive_id_by_email(email):
try:
user = await client.users.by_user_id(email).get()
if user:
user_drive = await client.users.by_user_id(email).drive.get()
print(f"Drive ID for user {email}: {user_drive.id}")
else:
print(f"No user found with email: {email}")
except Exception as e:
print(f"Failed to get drives: {e}")
Gunakan script tersebut dengan menambahkan email sebagai parameter seperti berikut:
asyncio.run(get_drive_id_by_email("[email protected]"))
Mendapatkan Folder ID
Kita bisa mendapatkan daftar folder yang ada di dalam Drive tersebut menggunakan Script di bawah ini:
from tqdm.asyncio import tqdm_asyncio
async def list_folders_in_drive():
try:
drive = await client.drives.by_drive_id(drive_id).root.get()
drive_items = await client.drives.by_drive_id(drive_id).items.by_drive_item_id(drive.id).children.get()
for item in drive_items.value:
if item.folder:
print(f"Folder: {item.name} - {item.id}")
except Exception as e:
print(f"Failed to get drives: {e}")
Cara menggunakannya sebagai berikut:
asyncio.run(list_folders_in_drive())
Dari output script tersebut, kita bisa melihat nama-nama folder beserta id masing-masing yang dapat kita gunakan pada tahap selanjutnya. Pilih salah satu id folder yang ingin diambil link share semua file yang ada di dalamnya.
Mendapatkan Share Link OneDrive
Setelah Drive id dan ID Folder didapatkan, selanjutnya kita bisa mendapatkan share link dari semua file yang ada di salah satu folder yang kita pilih menggunakan ID Folder. Script ini secara otomatis akan mendapatkan share link dari file yang ada di sub direktori paling akhir atau paling dalam sehingga kita hanya perlu menentukan ID folder paling atas (parent) saja.
Scripnya adalah sebagai berikut:
import asyncio
import json
import os
from azure.identity.aio import ClientSecretCredential
from msgraph import GraphServiceClient
from tqdm.asyncio import tqdm_asyncio
drive_id = "DRIVE_ID_ANDA"
folder_id = "FOLDER_ID_YANG_DIPILIH"
credential = ClientSecretCredential(
tenant_id,
client_id,
client_secret
)
scopes = ['https://graph.microsoft.com/.default']
client = GraphServiceClient(credentials=credential, scopes=scopes)
async def list_files_in_folder(file_path):
files = []
try:
drive_items = await client.drives.by_drive_id(drive_id).items.by_drive_item_id(folder_id).children.get()
for item in tqdm_asyncio(drive_items.value, desc=f"Processing folder {folder_id}"):
if item.folder:
files.extend(await list_files_in_folder(file_path))
else:
file_info = {"name": item.name, "id": item.id, "link": item.web_url}
files.append(file_info)
with open(file_path, 'a') as f:
f.write(json.dumps(file_info) + '\n')
except Exception as e:
print(f"Failed to process folder {folder_id}: {e}")
return files
async def main():
script_dir = os.path.dirname(__file__)
file_path = os.path.join(script_dir, 'files.json')
# Clear the file before starting
open(file_path, 'w').close()
files = await list_files_in_folder(file_path)
print(f"Total number of files: {len(files)}")
Cara menggunakannya adalah sebagi berikut:
asyncio.run(main())
Demikian artikel mengenai cara mengambil share link onedrive secara massal. Semoga bermanfaat,