这段代码是一个使用Flask创建文件下载服务器的脚本,并在文件右键菜单中添加了“分享此文件”的选项。它能够将指定的文件通过HTTP提供下载,并在本地生成一个随机端口的服务器。
以下是代码的主要功能和流程:
- 导入所需的模块:导入了Flask、send_from_directory、os、sys、netifaces、random、pyperclip、winreg等模块。
- 定义启动Flask服务器的函数:
start_flask_server
函数用于启动Flask服务器。该服务器提供文件下载服务。 - 获取物理网卡IP:
get_wired_ip
函数使用netifaces
库获取物理网卡的IP地址。 - 写入注册表项:
write_registry_entry
函数用于写入注册表项,以添加“分享此文件”的右键菜单选项。 - 读取注册表值:
read_registry_value
函数用于读取注册表值,以获取Python的执行路径。 - 主程序入口:在
if __name__ == '__main__':
中,首先获取命令行参数和Python可执行路径,然后写入注册表项。 - 如果没有命令行参数:如果没有传入文件参数,提示用户通过右键菜单运行程序,并等待用户输入回车键退出程序。
- 如果有命令行参数:如果有传入文件参数,获取文件路径、文件名、物理网卡IP和随机端口。然后在终端打印文件下载地址,并将地址复制到剪贴板。
- 启动Flask服务器:调用
start_flask_server
函数启动Flask服务器,提供文件下载服务。
这段代码实现了一个方便的文件分享工具,可以在右键菜单中快速分享指定的文件。用户右键选择文件,点击“分享此文件”,即可在终端获取文件的下载地址,然后可以将下载地址分享给其他人。需要注意的是,此脚本需要在Windows系统上运行。
# -*- coding: utf-8 -*-
from flask import Flask, send_from_directory
import os
import sys
import netifaces
import random
import pyperclip
import winreg
def start_flask_server(p,fol):
app = Flask(__name__)
@app.route('/download/<filename>', methods=['GET'])
def download_file(filename):
file_path = os.path.join(fol, filename)
if not os.path.exists(file_path):
return "文件不存在", 404
return send_from_directory(fol, filename, as_attachment=True, conditional=True)
app.run(host='0.0.0.0', port=p, debug=False, threaded=True)
def get_wired_ip():
try:
interfaces = netifaces.interfaces()
for interface in interfaces:
addresses = netifaces.ifaddresses(interface)
if netifaces.AF_INET in addresses:
for address in addresses[netifaces.AF_INET]:
ip_address = address['addr']
if ip_address != '127.0.0.1':
return ip_address
except (KeyError, IndexError):
pass
return "未找到物理网卡IP"
def write_registry_entry(epath, ico):
reg_path = r"*\shell\Share File"
key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, reg_path)
winreg.SetValue(key, None, winreg.REG_SZ, "分享此文件")
winreg.SetValueEx(key, 'ICON', 0, winreg.REG_SZ, ico)
winreg.CloseKey(key)
command_path = r"*\shell\Share File\command"
command_key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, command_path)
winreg.SetValue(command_key, None, winreg.REG_SZ, epath + ' "%1"')
winreg.CloseKey(command_key)
def read_registry_value():
try:
key = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r"Python.File\Shell\open\command")
value, _ = winreg.QueryValueEx(key, "")
winreg.CloseKey(key)
value = value.split('"')
return value[1]
except OSError:
print("注册表项不存在")
except Exception as e:
print(f"读取注册表值时出现错误: {e}")
if __name__ == '__main__':
args = sys.argv
executable_path = os.path.abspath(sys.executable)
if getattr(sys, 'frozen', False):
exe = icon = '"' + executable_path + '"'
else:
pypath = read_registry_value()
exe = '"' + pypath + '" "' + args[0] + '"'
icon = '"' + pypath + '"'
write_registry_entry(exe,icon)
if len(args) - 1==0:
print("请通过右键菜单运行此程序")
input("按回车键退出程序")
sys.exit(0)
file = args[1]
path = os.path.dirname(file)
filename = os.path.basename(file)
ip = get_wired_ip()
port = random.randint(10000, 65500)
url = "http://" + ip + ":" + str(port) + "/download/" + filename
print("\n↓↓文件下载地址已复制到剪贴板↓↓\n\n " + url + " \n")
print("↑↑文件下载地址已复制到剪贴板↑↑\n\n\n52pojie\n")
pyperclip.copy(url)
start_flask_server(port,path)
最新评论