torrent种子文件转magnet磁力链python脚本

torrent种子文件转magnet磁力链python脚本
内容目录

演示网址

https://tools.ku0.cc/t2m

  • 表格显示:清晰展示文件名、磁力链接、操作按钮

  • 复制按钮:每条链接都有独立复制按钮

  • 批量复制:如果上传多个torrent文件,显示“全部复制”按钮

  • 响应式布局:输入框自动撑满单元格,便于长磁力链接复制

  • 视觉效果:悬停高亮、按钮颜色区分、阴影效果

    1.环境

    ubuntu 24.04 x64

    2.文件结构

    mkdir -p /opt/torrent2magnet/templates
    mkdir -p /opt/torrent2magnet/uploads
    
    torrent2magnet/
    ├─ app.py
    ├─ templates/
    │  └─ index.html
    ├─ uploads/
### 2.1 app.py
```bash
import os
import libtorrent as lt
from flask import Flask, request, render_template

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)

def torrent_to_magnet(file_path):
    # 2.x 版本使用 lt.torrent_info(file_path)
    info = lt.torrent_info(file_path)
    magnet = lt.make_magnet_uri(info)
    return magnet

@app.route('/', methods=['GET', 'POST'])
def index():
    magnet_links = []
    if request.method == 'POST':
        files = request.files.getlist('torrents')
        for file in files:
            if file and file.filename.endswith('.torrent'):
                save_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
                file.save(save_path)

                # 生成磁力链接
                magnet = torrent_to_magnet(save_path)
                magnet_links.append({'name': file.filename, 'magnet': magnet})

                # 删除上传的文件,防止占用空间
                os.remove(save_path)

    return render_template('index.html', magnet_links=magnet_links)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=40001)

2.2 index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>种子转磁力链接</title>
    <style>
        body {
            font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
            margin: 20px;
            background: #f9f9f9;
        }
        h2 { color: #333; }
        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
            background: #fff;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }
        th, td {
            border: 1px solid #ddd;
            padding: 8px 12px;
            text-align: left;
        }
        th { background: #f0f0f0; }
        tr:hover { background: #f5f5f5; }
        button.copy-btn {
            padding: 4px 10px;
            cursor: pointer;
            background: #4CAF50;
            color: white;
            border: none;
            border-radius: 3px;
        }
        button.copy-all-btn {
            margin-top: 15px;
            padding: 8px 16px;
            cursor: pointer;
            background: #2196F3;
            color: white;
            border: none;
            border-radius: 3px;
        }
        input.link-input {
            width: 100%;
            border: none;
            background: transparent;
            font-family: monospace;
        }
        input.link-input:focus {
            outline: none;
        }
    </style>
</head>
<body>
    <h2>种子转磁力链接(支持多选)</h2>
    <form method="post" enctype="multipart/form-data">
        <input type="file" name="torrents" multiple>
        <button type="submit">生成磁力链接</button>
    </form>

    {% if magnet_links %}
        <table>
            <thead>
                <tr>
                    <th>#</th>
                    <th>文件名</th>
                    <th>磁力链接</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
            {% for item in magnet_links %}
                <tr>
                    <td>{{ loop.index }}</td>
                    <td>{{ item.name }}</td>
                    <td>
                        <input type="text" readonly class="link-input" value="{{ item.magnet }}" id="link-{{ loop.index }}">
                    </td>
                    <td>
                        <button class="copy-btn" onclick="copyToClipboard('link-{{ loop.index }}')">复制</button>
                    </td>
                </tr>
            {% endfor %}
            </tbody>
        </table>

        {% if magnet_links|length > 1 %}
            <button class="copy-all-btn" onclick="copyAll()">全部复制</button>
        {% endif %}
    {% endif %}

    <script>
        function copyToClipboard(id) {
            const input = document.getElementById(id);
            input.select();
            input.setSelectionRange(0, 99999);
            navigator.clipboard.writeText(input.value).then(() => {
                alert('已复制: ' + input.value);
            });
        }

        function copyAll() {
            let allText = "";
            {% for item in magnet_links %}
                allText += "{{ item.magnet }}\n";
            {% endfor %}
            navigator.clipboard.writeText(allText).then(() => {
                alert('已复制全部磁力链接!');
            });
        }
    </script>
</body>
</html>

3. 安装依赖

python3 -m venv venv
pip install flask libtorrent

4. 测试运行

python -m flask run --host=0.0.0.0 --port=40001

访问上传种子文件测试转换

5. 配置开机启动服务

5.1 创建 systemd 服务文件

sudo vim /etc/systemd/system/torrent2magnet.service
[Unit]
Description=Torrent to Magnet Web Service
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/torrent2magnet
ExecStart=/opt/torrent2magnet/venv/bin/python /opt/torrent2magnet/app.py
Restart=always
User=root
Environment="PATH=/opt/torrent2magnet/venv/bin"

[Install]
WantedBy=multi-user.target

5.2 设置开机启动

sudo systemctl daemon-reload
sudo systemctl enable torrent2magnet
sudo systemctl start torrent2magnet

nginx反向代理配置示例

server {
    listen 80;
    server_name yourdomain.com;

    location /torrent2magnet/ {
        proxy_pass http://127.0.0.1:40001/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

宝塔图形化反向代理配置
file

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注