该项目的主要功能是实现从一个包含多个 URL 的文本文件中随机选择一个 URL 并进行重定向。以下是该脚本各部分的详细解析:
- 文件路径:
file = 'images.txt'
指定了包含 URL 列表的文本文件。 - 缓存文件路径:
cache_file = 'cache.txt'
指定了用于存储文件内容缓存的文件。 - 缓存时间:
cache_time = 3600
设置了缓存的有效时间(以秒为单位),默认为 1 小时。
- handle_error 函数: 接受错误代码和错误信息作为参数,设置 HTTP 响应状态码并输出错误信息,之后终止脚本执行。
- generate_cache 函数:
- 使用
@file()
函数读取文件内容,忽略空行和新行。 - 如果读取失败或文件为空,调用
handle_error
函数返回 500 错误。 - 否则,将文件内容编码为 JSON 格式并写入缓存文件。
- 使用
- 检查缓存文件是否存在且未过期(当前时间减去缓存文件修改时间小于缓存时间)。
- 如果缓存有效,直接从缓存文件中解码获取 URL 列表。
- 否则,调用
generate_cache
函数生成新的缓存文件并获取 URL 列表。
- 使用
array_rand
函数从 URL 列表中随机选择一个 URL。 - 使用
filter_var
函数验证所选 URL 是否符合 URL 格式。- 如果不符合格式,调用
handle_error
函数返回 500 错误。
- 如果不符合格式,调用
- 使用
header
函数设置 HTTP Location 头部,实现对随机选择 URL 的重定向。 - 最后,使用
exit
函数确保脚本在重定向后立即终止执行。
- 功能: 计算给定文件的CRC32校验和。
- 参数:
file_path
: 字符串类型,表示要计算CRC32的文件的绝对路径。
- 内部工作流程:
- 使用
with open(file_path, 'rb') as f:
语句以二进制模式打开文件,确保文件正确关闭。 - 读取整个文件内容到
file_data
变量中。 - 使用
zlib.crc32(file_data)
计算文件的CRC32校验和。 - 由于
zlib.crc32
返回的是一个有符号32位整数,通过& 0xFFFFFFFF
操作将其转换为无符号32位整数。 - 最终结果使用
format
函数转换为8位十六进制字符串,格式化为'08x'
,即保证字符串长度至少为8位,不足部分用0填充。
- 使用
- 返回值: 字符串类型的CRC32校验和。
- 功能: 在指定目录下遍历所有文件,计算每个文件的CRC32值,重命名文件,并将重命名后的文件对应的URL保存到指定的文本文件中。
- 参数:
directory
: 字符串类型,表示要遍历的目录路径。base_url
: 字符串类型,表示URL的基础部分,用于拼接重命名后的文件名。output_file
: 字符串类型,表示保存URL列表的输出文本文件路径。
- 内部工作流程:
- 使用
with open(output_file, 'w', encoding='utf-8') as txt_file:
语句以写入模式打开输出文件。 - 使用
os.walk(directory)
遍历directory
目录下的所有文件和子目录。 - 对于每个文件:
- 获取文件的完整路径。
- 调用
calculate_crc32
函数计算文件的CRC32值。 - 将CRC32值与文件的扩展名组合成新的文件名。
- 检查新文件名是否已存在,如果存在,则在CRC32值后添加递增计数器,直到找到一个唯一的文件名。
- 使用
os.rename
函数将文件重命名为新文件名。 - 拼接
base_url
和新文件名,形成完整的URL。 - 将完整的URL写入
txt_file
。 - 打印重命名前后文件的信息和保存的URL。
- 使用
此脚本主要用于批量重命名目录下的所有文件,重命名规则为文件的CRC32校验和加原始文件扩展名,同时将重命名后的文件URL保存到一个文本文件中。这在文件管理、数据备份或需要唯一标识符的场景中非常有用。