python百度文库免券下载

首先,看一下程序截图:

接着,再看一下下载的整个过程:

项目源码及exe文件https://github.com/xiexupang/free_wenku

简要介绍这个项目的完成过程:

1.构建爬虫,模拟浏览器头信息

2.向漏洞提交链接及邮箱信息,实现下载并发送到邮箱的过程。

3.核心部分完成后,加上一个简单的UI界面,大功告成。

源码如下:

注意:运行源码时,会用到一张名为logo的png图片,该图片在上面github链接中。

import requests
import tkinter as tk
from tkinter import messagebox  # import this to fix messagebox error
import threading  # 引入多线程,使程序能同时进行爬虫和进度条显示
import time


# 创建主窗口
window = tk.Tk()
window.title('百度文库下载神器')
window.geometry('630x250')


# 添加背景图
canvas = tk.Canvas(window, height=200, width=600)  # 创建画布
image_file = tk.PhotoImage(file='logo.png')  # 加载图片文件
image = canvas.create_image(130, 20, anchor='nw', image=image_file)  # 将图片置于画布上
canvas.pack()  # 放置画布


# 设置文档链接输入框
tk.Label(window, text='文档链接:').place(x=50, y=80)
var_doc_url = tk.StringVar()  # 定义变量,用于输入用户名
entry_doc_url = tk.Entry(window, width=66, textvariable=var_doc_url)
entry_doc_url.place(x=110, y=80)


# 设置邮箱输入框
tk.Label(window, text='收件邮箱:').place(x=50, y=120)
var_mailbox = tk.StringVar()  # 定义变量,用于输入用户名
entry_mailbox = tk.Entry(window, width=66, textvariable=var_mailbox).place(x=110, y=120)


# 设置下载进度条
tk.Label(window, text='下载进度:', ).place(x=50, y=160)
canvas = tk.Canvas(window, width=465, height=22, bg="white")
canvas.place(x=110, y=160)


# 显示下载进度
def progress():
    # 填充进度条
    fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="green")
    x = 500  # 未知变量,可更改
    n = 465 / x  # 465是矩形填充满的次数
    for i in range(x):
        n = n + 465 / x
        canvas.coords(fill_line, (0, 0, n, 60))
        window.update()
        time.sleep(0.02)  # 控制进度条流动的速度

    tk.messagebox.showinfo(  # 通知型弹窗
        title='下载成功',  # 窗口标题
        message='文档已发送,邮箱可能会对其进行拦截,请注意查看垃圾箱',
    )

    # 清空进度条
    fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="white")
    x = 500  # 未知变量,可更改
    n = 465 / x  # 465是矩形填充满的次数

    for t in range(x):
        n = n + 465 / x
        # 以矩形的长度作为变量值更新
        canvas.coords(fill_line, (0, 0, n, 60))
        window.update()
        time.sleep(0)  # 时间为0,即飞速清空进度条


# 清空框内的文档链接
def clear_url():
    entry_doc_url.delete(0, tk.END)


# 检查文档链接与邮箱是否均已输入
def check():
    # 获取输入的文档链接和邮箱
    doc_url = str(var_doc_url.get())
    mailbox = str(var_mailbox.get())

    if doc_url == '':

        tk.messagebox.showwarning(title='填写不完整', message='文档链接还没输入')

    elif mailbox == '':
        tk.messagebox.showwarning(title='填写不完整', message='邮箱还没输入')

    else:  # 当链接与邮箱均已输入后,启动双线程
        two_threading()


# 下载文档
def download_doc():
    # 获取输入的文档链接和邮箱
    doc_url = str(var_doc_url.get())
    mailbox = str(var_mailbox.get())

    # 构建并伪装爬虫,让对方以为这是来自一般用户的正常访问
    header = {'Accept': 'text/plain, */*; q=0.01',
              'Accept-Encoding': 'gzip, deflate',
              'Accept-Language': 'zh-CN,zh;q=0.9',
              'Connection': 'keep-alive',
              'Content-Length': '135',
              'Content-Type': 'application/x-www-form-urlencoded',
              'Host': '39.108.149.27:9999',
              'Origin': 'http://39.108.149.27:9999',
              'Referer': 'http://39.108.149.27:9999/',
              'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
              'X-Requested-With': 'XMLHttpRequest'
              }

    # 漏洞
    url = 'http://39.108.149.27:9999/default.aspx'
    # 爬虫要向该漏洞提交的数据
    datas = {
        'username': '',
        'password': '',
        'txtUrl': doc_url,
        'mail': mailbox,
    }
    # 爬虫访问该漏洞,提交携带的数据
    response = requests.request("POST", url, data=datas, headers=header)

# 双线程
def two_threading():
    threads = []
    t1 = threading.Thread(target=progress)
    threads.append(t1)
    t2 = threading.Thread(target=download_doc)
    threads.append(t2)

    for t in threads:
        t.setDaemon(True)
        t.start()


# 设置清空链接和一键下载按钮
btn_clear = tk.Button(window, text='清空链接', command=clear_url)
btn_clear.place(x=150, y=205)
btn_download = tk.Button(window, text='一键下载', command=check)
btn_download.place(x=400, y=205)


window.mainloop()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章