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()