Hiện tại có vô số phần mềm hỗ trợ tải (Download video) trên facebook online có, offline có và mỗi phần mềm đều có những ưu nhược điểm khác nhau. Sau một thời gian tìm hiểu mình đã tự code ra cho mình một phần mềm tải video trên Facebook và sau đâu mình sẽ giới thiệu qua về tư duy lập trình của mình:
Mình mong muốn phần mềm tải video trên Facebook có các chức năng:
- Tải video mà không cần đăng nhập vào tài khoản
- Có thể tải video riêng lẻ hoặc tải hàng loạt video ở một fanpage nào đó
- Tải video chất lượng tốt nhất
- Vừa tải vừa render lại video theo các kiểu tùy chọn
Về mặt ngôn ngữ mình chọn python vì nó là ngôn ngữ mã nguồn mở và nó hỗ trợ nhiều modul
1. Về giao diện mình dùng Tkinter
Và đây là giao diện phần mềm mình đã thiết kế
Tổng quan giao diện mình dùng (1 – Combobox để lựa chọn loai render; 2- 3 – text box để nhập list link video và text cần add vào video khi render; và 4 là nút bấm để chạy chương trình)
Code về giao diện bạn có thể tham khảo ở đây:
#0. Tạo cửa sổ giao diện
root = tk.Tk()
root.title(“AUTO DOWNLOAD FACEBOOK V1.0 – Linda2703 – Zalo: 0906070291 – Telegram: @nguyencuong2703″)
root.geometry(‘800×500’)#1. Chọn loại render
lbl = tk.Label(root, text=”Chọn loại Render”, font=(“Arial Bold”, 10))
#Xác định vị trí của label
lbl.place(x=45, y=2)
# Tạo Combobox hiển thị các dạng render
combo_box = ttk.Combobox(root, textvariable=selected_value, state=”readonly”)
combo_box[“values”] = (“Add Text”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “10”, “11”, “12”, “13”, “14”, “15”, “16”, “17”, “18”, “19”, “20”)
combo_box.grid(row=0, column=1)
combo_box.place(x=25, y=25)#2. hiện thị link video facebook
lbl1 = tk.Label(root, text=”Page videos List”, font=(“Arial Bold”, 10))
#Xác định vị trí của label
lbl1.place(x=300, y=2)data = tk.Text(root, width=35, height=25)
data.pack()
data.place(x=200, y=25)#3. Hiển thị text
lbl2 = tk.Label(root, text=”Text”, font=(“Arial Bold”, 10))
#Xác định vị trí của label
lbl2.place(x=620, y=2)proxy = tk.Text(root, width=35, height=1)
proxy.pack()
proxy.place(x=500, y=25)#4. Gọi hàm chạy tool
btn2 = tk.Button(root, text=”Chạy Tool”, width = 10, height = 2, bg=”Yellow”, font=(“Times New Roman”,13), command=run)
btn2.place(x=45, y=150)# Hướng dẫn sử dụng
hd = tk.Label(root, text=”Chú ý:”, font=(“Arial Bold”, 10))
#Xác định vị trí của label
hd.place(x=5, y=420)
hd1 = tk.Label(root, text=”- Cấu trúc Page videos list : https://www.facebook.com/xxxxx/videos – Mỗi link trên một hàng”, font=(“Arial Italic”, 10))
#Xác định vị trí của label
hd1.place(x=45, y=445)hd2 = tk.Label(root, text=”- Cấu trúc videos list : https://www.facebook.com/xxxxxx/videos/1037963390668808 – Mỗi link trên một hàng”, font=(“Arial Italic”, 10))
#Xác định vị trí của label
hd2.place(x=45, y=465)# Main loop để chạy ứng dụng
root.mainloop()
Sau đó mình viết hàm run cho sự kiện click vào button “Chạy Tool”
Bước đầu tiên mình sẽ phải đọc toàn bộ dữ liệu từ textbox “data” sau đó duyệt từng link một bằng vòng lặp for.
luong=combo_box.get()
link_page = data.get(“1.0”, tk.END) # Lấy toàn bộ nội dung trong Textbox#Kiểm tra các trường đã điền đầy đủ thông tin chưa
if (len(luong)>0 and len(link_page)>1 and len(add_text)>1):
messagebox.showinfo(‘Thông báo’, f’Bạn đã chọn ‘+luong)
Link_video_page=link_page.split(“\n”)for l in range(0,len(Link_video_page)-1):
Trong link đưa vào tool yêu cầu download video gồm có link video đơn dạng “https://www.facebook.com/XXXXXX/videos/XXXXXXXX/” hoặc là cả fanpage video dạng “https://www.facebook.com/profile.php?id=XXXXXXXXXX&sk=videos” do vậy ta phải check trước:
Quan sát giữa link video đơn và link của cả fanpage thì ta thấy có sự khác nhau: link fanpage thì chứa “sk=videos” hoặc “/videos” còn link video đơn thì chứa “/videos/” hoặc “/watch/” vậy ta chỉ cần chọn một trong 2 trường hợp để lọc ra 1 trường hợp, và cho tất cả các trường hợp còn lại là trường hợp thứ 2
vi_tri = Link_video_page[l].find(‘/videos/’)
# Hàm này trả về giá trị bằng -1 là không thấy
if vi_tri == -1: #Không tìm thấy
Khi đã phân biệt được 2 trường hợp rồi thì ta đi vào code download video cho 2 trường hợp:
Trường hợp 1: Link là video
Để làm các việc đó mình đã dùng selenium giải lập trình duyệt chrome – Không dùng được request thông thường. Mình mở video lên rồi view source của video đó. sau đó get lấy toàn bộ format mà video đó, rồi chọn lấy link của chất lượng tốt nhất và thực hiện render và lưu về máy
chrome_options = Options()
chrome_options.add_argument(‘–headless’)
#chrome_options.add_argument(“user-data-dir=”+current_path+”/profile”)
chrome_options.add_argument(‘–start-maximized’)
driver = webdriver.Chrome(options=chrome_options)
driver.get(Link_video_page[l])
idvideo=Link_video_page[l].split(‘/videos/’)
time.sleep(5)
# Bỏ qua cảnh báo đăng nhập
try:
driver.find_element(By.XPATH, ‘/html/body/div[1]/div/div[1]/div/div[5]/div/div/div[1]/div/div[2]/div/div/div/div/div/div/div/div[1]/div/div[2]/div’).click()
except:
print (“”)
time.sleep(5)
md = html.unescape(driver.page_source)
chatluong=md.split(‘FBQualityLabel’)
print(“Số format: “+str(len(chatluong)))
link_dl=””
link_format=””
tg=0
for i in range(1,len(chatluong)):#console.log(chatluong[i]+”++++++++++++++++++++++++++++++”)
format=chatluong[i].split(‘”‘)
format=format[1].split(‘\\’)
format=format[0].replace(‘p’,”)
linkf=chatluong[i].split(‘BaseURL>’)
linkf=linkf[1].split(‘\\u003C\\’)
linkf=linkf[0].replace(‘\\’,”)
#linkf=linkf.replaceAll(‘\\’,”)if tg < int(format):
tg=int(format)
link_format=format
video_url=linkfprint(link_format)
print(video_url)
text_to_add = add_text
output_video = current_path+”/video/”+idvideo[1]+”.mp4″
# Đoạn code ffmpeg vừa download vừa rend video
ffmpeg_cmd = [
‘ffmpeg’,
‘-i’, video_url,
‘-vf’, f”drawtext=text='{text_to_add}’:fontfile=/path/to/font.ttf:fontsize=24:fontcolor=white:x=(w-text_w)/2:y=h-150″,
‘-c:a’, ‘copy’,
output_video
]subprocess.run(ffmpeg_cmd)
driver.quit()
Trường hợp 2: Link là fanpage – Yêu cầu download toàn bộ video của fanpage đó
– Chúng ta vẫn phải mở fanpage đó lên, duyệt cho bằng hết video của fanpage, get lấy link của video, sau đó download giống như trường hợp video đơn
chrome_options = Options()
chrome_options.add_argument(‘–headless’)
#chrome_options.add_argument(“user-data-dir=”+current_path+”/profile”)
chrome_options.add_argument(‘–start-maximized’)
driver = webdriver.Chrome(options=chrome_options)
driver.get(Link_video_page[l])
time.sleep(5)
# Bỏ đăng nhập
try:
driver.find_element(By.XPATH, ‘/html/body/div[1]/div/div[1]/div/div[5]/div/div/div[1]/div/div[2]/div/div/div/div[1]/div’).click()
except:
print (“”)
# cuộn từ đầu trang tới cuối trang
for p in range(1,2):
try:
driver.find_element(By.TAG_NAME,’body’).send_keys(Keys.END)
time.sleep(1)
except:
print (‘Hết trang!’)time.sleep(5)
# lấy vùng chỉ có video
for pp in range(2,5):
try:
scroll = driver.find_element(By.XPATH, ‘/html/body/div[1]/div/div[1]/div/div[3]/div/div/div/div[1]/div[1]/div/div/div[4]/div/div[‘+str(pp)+’]’)
nd=scroll.get_attribute(“innerHTML”)
break
except:
print (“Tray again!”)
idvideo=nd.split(‘/videos/’)
trung=””
for v in idvideo:
#try:
idvideo=v.split(‘/’)
#print (“ID video: “+idvideo[0])
if(trung !=idvideo[1] and len(idvideo[1])>5 and len(idvideo[1])< 50):
print (idvideo[1])
trung =idvideo[1]
link_video=”https://www.facebook.com/watch/?v=”+idvideo[1]
driver.get(link_video)
time.sleep(2)
# Bỏ qua cảnh báo đăng nhập
try:
driver.find_element(By.XPATH, ‘/html/body/div[1]/div/div[1]/div/div[5]/div/div/div[1]/div/div[2]/div/div/div/div/div/div/div/div[1]/div/div[2]/div’).click()
except:
print (“”)
time.sleep(5)
md = html.unescape(driver.page_source)
chatluong=md.split(‘FBQualityLabel’)
print(“Số format: “+str(len(chatluong)))
link_dl=””
link_format=””
tg=0
for i in range(1,len(chatluong)):#console.log(chatluong[i]+”++++++++++++++++++++++++++++++”)
format=chatluong[i].split(‘”‘)
format=format[1].split(‘\\’)
format=format[0].replace(‘p’,”)
linkf=chatluong[i].split(‘BaseURL>’)
linkf=linkf[1].split(‘\\u003C\\’)
linkf=linkf[0].replace(‘\\’,”)
#linkf=linkf.replaceAll(‘\\’,”)if tg < int(format):
tg=int(format)
link_format=format
video_url=linkfprint(link_format)
print(video_url)
text_to_add = add_text
output_video = current_path+”/video/”+idvideo[1]+”.mp4″
# Run ffmpeg command to add text to the video
ffmpeg_cmd = [
‘ffmpeg’,
‘-i’, video_url,
‘-vf’, f”drawtext=text='{text_to_add}’:fontfile=/path/to/font.ttf:fontsize=24:fontcolor=white:x=(w-text_w)/2:y=h-150″,
‘-c:a’, ‘copy’,
output_video
]subprocess.run(ffmpeg_cmd)
driver.quit()
Để phần mềm thông minh hơn chúng ta cần phải lập trình thêm nhiều trường hợp nữa, trên đây là tư duy của mình khi viết phần mềm download video facebook, các bạn có thể tham khảo để tạo ra cho mình một chương trình đa năng hơn, thông minh hơn.
Hướng dẫn cài đặt và chạy chương trình:
1. Cài đặt Python phiên bản mới nhất – https://www.python.org/downloads/
2. Cài đặt selenium: Mở cửa số CMD lên rồi nhập lệnh sau vào
pip install selenium
3. Tải phần mềm tải video facebook miễn phí tại đây: https://github.com/hdfun1211/Software-download-videos-Facebook-Free/
4. Video hướng dẫn sử dụng phần mềm: https://www.youtube.com/watch?v=9-oIlM7GCII