搭建instagram照片下载站

搭建环境准备

  • instaloader用于下载 Instagram 内容
  • Flask构建 Web 服务
  • python3-venv构建虚拟环境用于安装 instaloaderflask
  • nohup用于脚本在后台运行

编写Flask脚本

创建一个目录,并在其中创建 app.py 文件:

1mkdir instagram-downloade/
2cd instagram-downloade/
3nano app.py

app.py 文件代码如下:

 1import os
 2from flask import Flask, request, render_template, send_file, url_for
 3import instaloader
 4import requests
 5from datetime import datetime
 6
 7app = Flask(__name__)
 8loader = instaloader.Instaloader()
 9
10@app.route('/')
11def index():
12    return render_template('index.html')
13
14@app.route('/download', methods=['POST'])
15def download():
16    url = request.form.get('url')
17    if not url:
18        return "错误:未提供链接", 400
19    
20    try:
21        # 获取 Instagram 帖子的 shortcode
22        shortcode = url.split("/")[-2]
23
24        # 获取帖子的 Post 对象
25        post = instaloader.Post.from_shortcode(loader.context, shortcode)
26
27        # 确保创建 downloads 文件夹
28        target_dir = os.path.join(app.static_folder, 'downloads')
29        if not os.path.exists(target_dir):
30            os.makedirs(target_dir)
31
32        filenames = []
33
34        # 获取当前时间戳,用于确保文件名唯一
35        timestamp = datetime.utcnow().strftime('%Y-%m-%d_%H-%M-%S_UTC')
36
37        # 下载单张图片
38        filename = os.path.join(target_dir, f"{timestamp}_{post.shortcode}.jpg")
39        download_file(post.url, filename)  # 下载单张图片
40        filenames.append(filename)
41
42        # 如果是多图帖,下载所有图片
43        if post.typename == 'GraphSidecar':  # 如果是包含多个图片的帖子
44            for index, node in enumerate(post.get_sidecar_nodes()):
45                high_res_url = node.display_url  # 获取高分辨率图片 URL
46                filename = os.path.join(target_dir, f"{timestamp}_{post.shortcode}_{index + 1}.jpg")
47                download_file(high_res_url, filename)
48                filenames.append(filename)
49
50        # 渲染下载完成页面,显示所有下载文件的链接和图片
51        return render_template('download_page.html', filenames=filenames)
52
53    except Exception as e:
54        return f"下载失败:{str(e)}", 500
55
56def download_file(url, filename):
57    """下载文件并保存到指定路径"""
58    # 如果文件已存在,重新命名文件
59    if os.path.exists(filename):
60        filename = generate_unique_filename(filename)
61    
62    # 使用 requests 下载文件
63    try:
64        img_data = requests.get(url).content
65        with open(filename, 'wb') as f:
66            f.write(img_data)
67    except Exception as e:
68        print(f"下载文件时出错: {e}")
69
70def generate_unique_filename(filename):
71    """生成一个唯一的文件名,如果文件已存在。"""
72    basename, ext = os.path.splitext(filename)
73    counter = 1
74    while os.path.exists(filename):
75        filename = f"{basename}_{counter}{ext}"
76        counter += 1
77    return filename
78
79if __name__ == '__main__':
80    app.run(host='0.0.0.0', port=5000)

编写前端页面

templates文件夹中创建 index.html

 1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6    <title>Instagram Downloader</title>
 7</head>
 8<body>
 9    <h1>Instagram 照片下载工具</h1>
10    <form method="POST" action="/download">
11        <label for="url">输入 Instagram 链接:</label>
12        <input type="text" id="url" name="url" required>
13        <button type="submit">下载</button>
14    </form>
15</body>
16</html>

templates文件夹中再创建 download_page.html页面:

 1<!DOCTYPE html>
 2<html lang="en">
 3<head>
 4    <meta charset="UTF-8">
 5    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6    <title>下载完成</title>
 7</head>
 8<body>
 9    <h1>下载完成</h1>
10    <ul>
11        {% for filename in filenames %}
12            <li>
13                <div>
14                    <!-- 展示图片 -->
15                    <img src="{{ url_for('static', filename='downloads/' + filename.split('/')[-1]) }}" alt="{{ filename }}" width="200" />
16                </div>
17                <div>
18                    <!-- 提供下载链接 -->
19                    <a href="{{ url_for('static', filename='downloads/' + filename.split('/')[-1]) }}" download>下载 {{ filename.split('/')[-1] }}</a>
20                </div>
21            </li>
22        {% endfor %}
23    </ul>
24</body>
25</html>

安装运行环境

安装虚拟环境工具python3-venv

 1sudo apt install python3-venv
 2#创建虚拟环境
 3python3 -m venv myenv
 4#激活虚拟环境
 5source myenv/bin/activate
 6#安装 instaloader 和 flask
 7pip install instaloader flask
 8#后台运行app.py
 9nohup python app.py &
10#退出虚拟环境
11deactivate

最后项目结构如下

instagram-download/
├── app.py                  # Flask 应用主文件
├── static/                  # Flask 静态文件目录
│   └── downloads/           # 存储下载文件的文件夹
│       ├── 12345_1.jpg     # 下载的第一张图片
│       ├── 12345_2.jpg     # 下载的第二张图片
│       ├── 12345_3.jpg     # 下载的第三张图片
│       └── ...             # 其他下载文件
├── templates/               # 存放 HTML 模板的目录
│   ├── index.html           # 首页,用户输入链接的表单页面
│   └── download_page.html   # 下载完成页面,展示文件下载链接
└── venv/                    # 虚拟环境(如果你使用了虚拟环境)

使用下载站

打开浏览器,访问 http://localhost:5000,输入 Instagram 链接并提交

使用 Hugo 构建
主题 StackJimmy 设计