Google Drive Shared Link – DarkCorners

Date: 16/12/2025

Category: Python

  • Phần mềm hỗ trợ lấy link tải xuống từ thư mục google drive.
  • Chỉ cần nhập link thư mục. Phần mềm sẽ giúp bạn những việc còn lại.
  • Cần chuẩn bị sẵn API Key tương ứng Google Drive API.
  1. Khởi động phần mềm.
  2. Chọn thư mục chứa tệp được xuất ra.
  3. Điền liên kết của thư mục google drive cần lấy link các tệp.
  4. Chọn loại tệp xuất ra.
  5. Nhấn nút [Quét].
  6. Theo dõi lịch trình xử lý.
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
import threading
import os
import csv
import requests
import time

API_KEY = "AIzaSyCxU-ulIXQAQjjnW1BJys7Ob3xdSBJfuEo"

def center_window(master, width=900, height=600):
    # Lấy kích thước màn hình
    screen_width = master.winfo_screenwidth()
    screen_height = master.winfo_screenheight()
    # Tính vị trí bắt đầu trục ngang và trục đứng
    aaaxxx = (screen_width // 2) - (width // 2)
    bbbyyy = (screen_height // 2) - (height // 2) - (40)
    # Đặt geometry
    master.geometry(f"{width}x{height}+{aaaxxx}+{bbbyyy}")

class GoogleDriveLinkExtractor:
    def __init__(self, master):
        self.master = master
        master.title("Google Drive Shared Link - DarkCorners")
        master.resizable(False, False)
        center_window(self.master, 900, 600)
        self.running = False
        self.files_count = 0

        # Hàng 1: Tên phần mềm
        self.label_title = tk.Label(master, text="Google Drive Shared Link - DarkCorners", font=("Arial", 16, "bold"), fg="red")
        self.label_title.pack(pady=10)

        # Hàng 2: Chọn thư mục & link Google
        self.frame_row2 = tk.Frame(master)
        self.frame_row2.pack(fill=tk.X, padx=10, pady=5)
        # THƯ MỤC XUẤT FILE
        self.left_frame = tk.LabelFrame(self.frame_row2, text="THƯ MỤC XUẤT FILE", fg="blue", font=("Arial", 10, "bold"))
        self.left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5)
        self.frame_folder = tk.Frame(self.left_frame)
        self.frame_folder.pack(fill=tk.X, pady=5)
        self.entry_folder = tk.Entry(self.frame_folder)
        self.entry_folder.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)
        self.btn_browse = tk.Button(self.frame_folder, text="Chọn", command=self.browse_folder, width=5)
        self.btn_browse.pack(side=tk.LEFT, padx=5)
        # GOOGLE FOLDER LINKS
        self.right_frame = tk.LabelFrame(self.frame_row2, text="LINK - GOOGLE DRIVE", fg="blue", font=("Arial", 10, "bold"))
        self.right_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5)
        self.entry_link = tk.Entry(self.right_frame)
        self.entry_link.pack(fill=tk.X, padx=5, pady=5)

        # Hàng 3: Điều khiển & Thống kê
        self.frame_row3 = tk.Frame(master)
        self.frame_row3.pack(fill=tk.X, padx=10, pady=5)
        # ĐIỀU KHIỂN
        self.ctrl_frame = tk.LabelFrame(self.frame_row3, text="ĐIỀU KHIỂN", fg="blue", font=("Arial", 10, "bold"))
        self.ctrl_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5)
        # Dãy nút điều khiển
        self.frame_buttons = tk.Frame(self.ctrl_frame)
        self.frame_buttons.pack(padx=10, pady=5)
        self.file_type_var = tk.StringVar(value="TXT")
        self.rb_txt = tk.Radiobutton(self.frame_buttons, text="TXT", variable=self.file_type_var, value="TXT")
        self.rb_txt.pack(side=tk.LEFT, padx=0)
        self.rb_csv = tk.Radiobutton(self.frame_buttons, text="CSV", variable=self.file_type_var, value="CSV")
        self.rb_csv.pack(side=tk.LEFT, padx=0)
        self.rb_both = tk.Radiobutton(self.frame_buttons, text="TXT & CSV", variable=self.file_type_var, value="BOTH")
        self.rb_both.pack(side=tk.LEFT, padx=0)
        self.btn_start = tk.Button(self.frame_buttons, text="Quét", width=6, command=self.start)
        self.btn_start.pack(side=tk.LEFT, padx=5)
        self.btn_pause = tk.Button(self.frame_buttons, text="Dừng", width=6, command=self.pause)
        self.btn_pause.pack(side=tk.LEFT, padx=5)
        self.btn_exit = tk.Button(self.frame_buttons, text="Thoát", width=6, command=master.quit)
        self.btn_exit.pack(side=tk.LEFT, padx=5)
        # THỐNG KÊ
        self.stats_frame = tk.LabelFrame(self.frame_row3, text="THỐNG KÊ", fg="blue", font=("Arial", 10, "bold"))
        self.stats_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5)
        self.stats_label = tk.Label(self.stats_frame, text="Số Files Đã Lấy Link Chia Sẻ : 0", font=("Arial", 10, "bold"), fg="green")
        self.stats_label.pack(padx=69, pady=10)

        # Hàng 4: TIẾN TRÌNH THỰC HIỆN
        self.logs_frame = tk.LabelFrame(master, text="TIẾN TRÌNH THỰC HIỆN", fg="blue", font=("Arial", 10, "bold"))
        self.logs_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
        self.text_logs = tk.Text(self.logs_frame)
        self.text_logs.pack(fill=tk.BOTH, expand=True)

    def log(self, msg):
        self.text_logs.insert(tk.END, f"{time.strftime('%H:%M:%S')} - {msg}\n")
        self.text_logs.see(tk.END)

    def browse_folder(self):
        folder_selected = filedialog.askdirectory()
        if folder_selected:
            self.entry_folder.delete(0, tk.END)
            self.entry_folder.insert(0, folder_selected)

    def start(self):
        if not self.entry_link.get().strip():
            messagebox.showwarning("Cảnh báo", "Vui lòng nhập link Google Drive Folder!")
            return
        if not self.entry_folder.get().strip():
            messagebox.showwarning("Cảnh báo", "Vui lòng chọn thư mục xuất file!")
            return
        if not self.running:
            self.running = True
            threading.Thread(target=self.run_extraction, daemon=True).start()

    def pause(self):
        self.running = False

    def run_extraction(self):
        self.files_count = 0
        self.update_stats()
        folder_url = self.entry_link.get().strip()
        output_folder = self.entry_folder.get().strip()
        file_type = self.file_type_var.get()
        self.log("Bắt đầu lấy file từ folder...")
        folder_id = self.extract_folder_id(folder_url)
        if not folder_id:
            self.log("Không xác định được folder ID.")
            self.running = False
            return
        files = self.get_files_from_api(folder_id)
        self.log(f"Đã lấy danh sách {len(files)} file")
        if not files:
            self.log("Không có file nào.")
            self.running = False
            return
        txt_file = os.path.join(output_folder, "google_drive_links.txt")
        csv_file = os.path.join(output_folder, "google_drive_links.csv")
        if file_type in ["TXT", "BOTH"]:
            with open(txt_file, "w", encoding="utf-8") as f:
                for name, link in files:
                    if not self.running:
                        break
                    f.write(f"{name}|{link}\n")
                    self.files_count += 1
                    self.update_stats()
        if file_type in ["CSV", "BOTH"]:
            with open(csv_file, "w", newline="", encoding="utf-8") as f:
                writer = csv.writer(f)
                writer.writerow(["Filename", "Link"])
                for name, link in files:
                    if not self.running:
                        break
                    writer.writerow([name, link])
                    self.files_count += 1
                    self.update_stats()
        self.log("Hoàn tất!")
        self.running = False

    def update_stats(self):
        self.stats_label.config(text=f"Số Files Đã Lấy Link Chia Sẻ : {self.files_count}")

    def extract_folder_id(self, url):
        try:
            if "/folders/" in url:
                return url.split("/folders/")[1].split("?")[0]
        except:
            return None

    def get_files_from_api(self, folder_id):
        files = []
        page_token = None
        while True:
            if not self.running:
                break
            url = ("https://www.googleapis.com/drive/v3/files"
                   f"?q='{folder_id}'+in+parents&key={API_KEY}&fields=nextPageToken,files(id,name)&pageToken={page_token if page_token else ''}")
            r = requests.get(url)
            if r.status_code != 200:
                self.log(f"Lỗi API: {r.text}")
                break
            data = r.json()
            for f in data.get("files", []):
                files.append((f["name"], f"https://drive.google.com/file/d/{f['id']}/view?usp=sharing"))
            page_token = data.get("nextPageToken")
            if not page_token:
                break
        return files

if __name__ == "__main__":
    root = tk.Tk()
    app = GoogleDriveLinkExtractor(root)
    root.mainloop()
pyinstaller --noconsole --onefile --windowed --add-data "1-GoogleDriveSharedLink-icon.ico;." --icon=1-GoogleDriveSharedLink-icon.ico 1-GoogleDriveSharedLink-Source.py

Để lại một bình luận