You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask/Heroku环境下如何抓取运行中秒表的sec变量或控制台输出?

解决Flask秒表webhook获取实时值的方案

为什么BeautifulSoup拿不到实时值?

BeautifulSoup只能解析静态HTML源码,也就是Flask返回给浏览器的初始页面内容,里面的秒表值是默认的00:00:00,sec变量初始值为0。而秒表的实时更新是前端JS在浏览器内存里完成的,动态修改的DOM和变量值不会体现在静态源码里,所以静态抓取根本拿不到运行中的实时值。

方案一:后端维护秒表状态(最靠谱,生产环境推荐)

把秒表的计时逻辑从前端移到Flask后端,用后端存储状态,这样两个webhook直接操作后端状态即可:

  1. 核心思路:用后端记录秒表的启动时间戳(或累计时长),启动webhook触发计时开始,获取值的webhook计算当前时长并返回。
  2. 代码示例(单实例版本):
from flask import Flask, jsonify
import time

app = Flask(__name__)

# 用全局变量存储秒表状态,单实例Heroku应用可用;多实例建议用Redis共享状态
stopwatch_active = False
start_timestamp = 0

@app.route('/webhook/start', methods=['POST'])
def start_stopwatch():
    global stopwatch_active, start_timestamp
    stopwatch_active = True
    start_timestamp = time.time()
    return jsonify({"status": "success", "message": "秒表已启动"})

@app.route('/webhook/get-seconds', methods=['GET'])
def get_seconds():
    global stopwatch_active, start_timestamp
    if not stopwatch_active:
        return jsonify({"sec": 0, "min": 0, "ms": 0})
    
    elapsed_total = time.time() - start_timestamp
    ms = int(elapsed_total * 1000) % 1000
    sec = int(elapsed_total) % 60
    min = int(elapsed_total) // 60
    
    return jsonify({
        "sec": sec,
        "min": min,
        "ms": ms,
        "formatted": f"{min:02d}:{sec:02d}:{ms:03d}"
    })
  1. 多实例适配:如果Heroku用了多个dyno,全局变量无法共享状态,需要用Redis存储启动时间戳和运行状态,安装redis库后替换全局变量即可。

方案二:用无头浏览器抓取前端动态值(仅测试用,不推荐生产)

如果一定要保留前端计时逻辑,只能用无头浏览器加载页面并执行JS获取sec变量,但这个方案资源消耗大、响应慢,仅适合测试场景:

  1. 依赖安装:在Heroku上安装Playwright或Selenium,比如Playwright需要添加构建脚本安装浏览器依赖。
  2. 代码示例:
from flask import Flask, jsonify
from playwright.sync_api import sync_playwright

app = Flask(__name__)

@app.route('/webhook/get-seconds', methods=['GET'])
def get_seconds():
    with sync_playwright() as p:
        # 启动无头浏览器
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        # 加载你的Flask秒表页面
        page.goto("https://your-heroku-app-url.com/stopwatch")
        # 执行JS获取当前sec变量值
        current_sec = page.evaluate("parseInt(sec)")
        browser.close()
        return jsonify({"sec": current_sec})

⚠️ 注意:这个方案中,无头浏览器打开的是新会话,默认秒表未启动,需要确保页面加载时自动启动秒表,或者通过JS触发启动逻辑。

方案三:抓取前端控制台输出?不可行

你提到的抓取控制台输出完全不可行——前端的console.log(sec)是在用户本地浏览器的控制台打印,不会发送到Heroku后端的日志系统,后端根本无法获取这些输出。

内容的提问来源于stack exchange,提问作者MouseWarrior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:50:44