使用windsurf让他帮我们写一个随机图库程序,使用户访问该程序时每次能获取到不同的图片

图片源我没有放在本地images文件夹里,而是放在alist上,存储在云上。这样程序本身不会那么臃肿,获取图片时也不会占用服务器本身的性能(忽略不计)和带宽。图片以链接的形式储存在image_links.txt文件里,一行一个链接。

以下是windsurf写的程序本体app.py

这里有个重要的参数maxlen=6,如果只是生成一个随机图片的程序,会有一个问题。客户端每次的请求 都是一次独立的访问,服务器并不知道之前分配过哪张图片。所以客户端连续访问的时候很容易出现重复图片。

解决方法就是,让python能记住已经分配出去的图片,我这里设置的间隔是6,python会记住最近分配的6张图片,不会重复。

from flask import Flask, redirect, render_template_string
import random
import os
from collections import deque

app = Flask(__name__)

# 用于存储最近显示过的图片链接
recent_images = deque(maxlen=6)  # 记住最近的3张图片

def load_image_links():
    """从配置文件加载图片链接"""
    links = []
    current_dir = os.path.dirname(os.path.abspath(__file__))
    image_links_path = os.path.join(current_dir, 'image_links.txt')
    
    try:
        with open(image_links_path, 'r', encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                if line and not line.startswith('#'):
                    links.append(line)
        print(f"Successfully loaded {len(links)} links")
        for link in links:
            print(f"Found link: {link}")
    except Exception as e:
        print(f"Error loading links: {str(e)}")
    return links

def get_random_image(images):
    """获取一个随机图片,避免重复"""
    # 如果可用图片数量太少,清空历史记录
    if len(images) <= len(recent_images):
        recent_images.clear()
    
    # 获取未最近显示过的图片列表
    available_images = [img for img in images if img not in recent_images]
    
    # 如果没有可用图片(理论上不会发生),使用所有图片
    if not available_images:
        available_images = images
    
    # 随机选择一张图片
    chosen_image = random.choice(available_images)
    
    # 添加到最近显示列表
    recent_images.append(chosen_image)
    
    return chosen_image

@app.route('/')
def random_image():
    image_links = load_image_links()
    if not image_links:
        return render_template_string("""
            <h1>错误</h1>
            <p>没有找到任何图片链接。请确保 image_links.txt 文件存在并包含有效的图片链接。</p>
            <p>当前内容:{{ links }}</p>
        """, links=load_image_links())
    
    random_link = get_random_image(image_links)
    print(f"Redirecting to: {random_link}")
    print(f"Recent images: {list(recent_images)}")
    return redirect(random_link)

if __name__ == '__main__':
    print("\n=== 启动随机图片服务 ===")
    print("当前工作目录:", os.getcwd())
    print("图片链接文件路径:", os.path.join(os.path.dirname(os.path.abspath(__file__)), 'image_links.txt'))
    print("加载图片链接...")
    initial_links = load_image_links()
    print(f"找到 {len(initial_links)} 个图片链接")
    print("=== 服务启动完成 ===\n")
    app.run(host='0.0.0.0', port=5000, debug=True)

运行该程序(linux)

安装环境

安装 Python 3

# 1. 安装 EPEL 仓库
sudo yum install epel-release

# 2. 安装 IUS 仓库(用于获取新版本的软件包)
sudo yum install https://repo.ius.io/ius-release-el7.rpm

# 3. 安装 Python 3
sudo yum install python36 python36-devel python36-pip

# 4. 验证安装
python3.6 --version

升级 pip

python3 -m pip install --upgrade pip

安装依赖

yum install python3-flask

运行程序

python3 app.py

运行程序

1.创建并进入 /root/random-image目录

mkdir /root/random-image
cd /root/random-image

app.pyimage_links.txt文件传入到该目录下

2.创建 systemd 服务文件(针对 CentOS 7 的配置)

vi /etc/systemd/system/random-image.service

将以下内容复制到文件中

[Unit]
Description=Random Image Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/random-image
Environment=PYTHONUNBUFFERED=1
ExecStart=/usr/bin/python3 /root/random-image/app.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

保存并退出(按 ESC,然后输入 :wq 回车)

3.设置文件权限

chmod 644 /etc/systemd/system/random-image.service

4.配置防火墙(根据实际情况配置)

sudo firewall-cmd --permanent --add-port=5000/tcp
sudo firewall-cmd --reload

5.启动并设置开机自启

# 重新加载 systemd 配置
systemctl daemon-reload

# 启用服务(设置开机自启)
systemctl enable random-image

# 启动服务
systemctl start random-image

# 检查状态
systemctl status random-image

6.检查服务是否正常运行

# 查看服务状态
systemctl status random-image

# 查看日志
journalctl -u random-image -f

常用的 CentOS 7 特定命令

# 查看服务是否在运行
systemctl is-active random-image

# 查看是否设置了开机自启
systemctl is-enabled random-image

# 如果需要停止服务
systemctl stop random-image

# 如果需要禁用开机自启
systemctl disable random-image

# 查看最后100行日志
journalctl -u random-image -n 100

如果修改了代码需要重启服务

systemctl restart random-image

运行后,我们访问http://<服务器ip>:5000 就会随机获取图片

实际效果如下:

将随机图片应用到halo博客上

打开Nginx Proxy Manager,将本地的5000端口 添加一条解析 启用https

为什么要启用https?

使用http时,过了一段时间后 发现图片都404了,看控制台发现 是因为浏览器默认不支持在https的页面中访问http的资源。

以下是ChatGPT的回答

这个问题的解决方法有两个

1.将页面改成https

2.在浏览器中设置允许加载混合内容(这只能解决某一台终端访问的问题。不能解决问题本身)

在博客上绑定刚刚创建的https域名网址

刷新网页,发现图片都正常显示了