从抖音解析到 HTTP 代理:几个 Python 小工具的工程笔记

前言

不是每个项目都需要写 README 和 CHANGELOG。有时候就是遇到一个问题,打开编辑器,半小时撸一个脚本解决掉。但这些"随手写的"小工具里,也有一些有意思的设计。

一、抖音视频解析

核心思路:捕获分享链接 → 提取视频 ID → 请求无水印视频地址。

from flask import Flask, request

app = Flask(__name__)

@app.route('/parse')
def parse():
    share_url = request.args.get('url')
    # 301 重定向获取真实 URL → 提取 video_id
    real_url = requests.get(share_url, allow_redirects=False).headers['Location']
    video_id = re.search(r'/video/(\d+)', real_url).group(1)
    # 调用解析 API 获取无水印地址
    # ...
    return render_template('player.html', video_url=no_watermark_url)

Flask 渲染一个播放页面,嵌入 video 标签直接播放。整个流程不到 100 行。

二、HTTP 中间人代理

需求:拦截某个 API 的响应,把里面的 msg 字段改成自定义内容。

import socket

def proxy_handler(client_socket, target_host, target_port):
    # 转发客户端请求到目标服务器
    server_socket = socket.socket()
    server_socket.connect((target_host, target_port))
    server_socket.send(client_request)
    
    # 接收响应
    response = server_socket.recv(4096)
    
    # 修改 JSON 响应中的 msg 字段
    body_start = response.find(b'\r\n\r\n') + 4
    headers = response[:body_start]
    body = json.loads(response[body_start:])
    body['msg'] = '自定义消息'
    
    modified = headers + json.dumps(body).encode()
    client_socket.send(modified)

纯 socket 实现,不依赖任何 HTTP 库。适合需要精细控制每个字节的场景。

三、系统资源监控仪表盘

用 Tkinter + psutil 写了个桌面小组件,圆环仪表盘显示 CPU / 内存 / 磁盘 / 网络:

class CircularGauge(tk.Canvas):
    def __init__(self, parent, color='#00ffff', title='CPU'):
        super().__init__(parent, width=200, height=200, bg='#1e1e1e')
        self.color = color
        self.title = title
        # 绘制背景圆环和前景弧线
        # ...
    
    def set_value(self, value):
        # 用圆弧角度表示数值
        angle = (value / self.max_value) * 360
        self.itemconfig(self.arc, extent=angle)

深色背景 + 霓虹配色,有点赛博朋克的感觉。

四、随机数 API 服务

有时候需要一个简单的随机数接口,不想为这个单独部署服务。

from http.server import HTTPServer, BaseHTTPRequestHandler

class Random7Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        num = f"{random.randint(0, 9999999):07d}"
        self._send_json({"number": num})

HTTPServer(('0.0.0.0', 8080), Random7Handler).serve_forever()

30 行代码,自带 CORS 头,部署到 VPS 上就能用。

总结

小工具的价值不在于代码量,而在于:

  • 解决真实问题:不是为了写而写
  • 低心智负担:不需要考虑扩展性、测试覆盖率
  • 快速验证想法:半小时能跑起来比"完美设计"重要得多

如果你也有随手写工具的习惯,不妨整理一下——你会发现这些碎片里藏着很多可以深挖的 idea。