内容目录
演示网址
-
表格显示:清晰展示文件名、磁力链接、操作按钮
-
复制按钮:每条链接都有独立复制按钮
-
批量复制:如果上传多个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;
}
}
宝塔图形化反向代理配置