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

Python如何在while循环外使用变量且避免日志重复记录

问题根因

  • 原始代码存在缩进错误:while True是死循环,你把判断逻辑放在循环体外的话,代码会永远卡在循环里反复请求接口,永远执行不到后面的判断代码,这就是放在循环外完全不运行的原因。
  • 当你把判断逻辑移到循环内后,循环会反复请求接口,只要接口返回的最新模型没有更新,每次都会触发打印/写入逻辑,自然就会出现重复日志。

解决思路

新增一个变量存储上一次已经记录过的模型AssetId,每次请求接口后先对比当前返回的AssetId和上一次存储的是否一致,只有不一致且符合过滤规则的时候,才执行打印和写日志操作,同时更新存储的AssetId。

修正后可运行代码

import os
import requests
import sys
from colorama import Fore
import time # 新增:避免请求太频繁被接口限制

os.system('cls')
# 初始化存储上一次已记录的模型ID,避免重复
last_asset_id = None

while True:
    # 请求接口加异常捕获,避免接口报错直接导致脚本崩溃
    try:
        info = requests.get("https://search.roblox.com/catalog/json?CatalogContect=2&Category=6&SortType=3&ResultsPerPage=1", timeout=10).json()
        current_asset = info[0]
        current_id = current_asset['AssetId']
        current_name = current_asset['Name']
    except Exception as e:
        print(f"[{Fore.RED}!{Fore.RESET}] 请求接口出错: {str(e)}")
        time.sleep(2)
        continue

    # 过滤规则 + 去重判断:只有ID和上一次不一样且不是要过滤的名称时才记录
    if current_id != last_asset_id and current_name not in ["DreamGrim", ".gg/Fgj3VRGapz"]:
        log_content = f"[+] Logged model: {current_name} | https://www.roblox.com/library/{current_id}/{current_name}"
        # 打印带颜色的输出
        print(f"[{Fore.LIGHTGREEN_EX}+{Fore.RESET}] Logged model: {current_name} | https://www.roblox.com/library/{current_id}/{current_name}")
        # 写入日志
        with open('logs.txt', 'a', encoding='utf-8') as f:
            f.write(f"\n{log_content}")
        # 更新上一次记录的ID
        last_asset_id = current_id
    
    # 每次请求后加间隔,避免请求频率太高被封禁,可根据需要调整间隔时长
    time.sleep(2)

额外优化说明

  • 新增了接口请求异常捕获,避免接口临时故障导致脚本直接退出
  • 新增了请求间隔,避免短时间大量请求触发平台的反爬限制
  • 统一了字符串拼接写法,用f-string更简洁易读
  • 写文件指定了utf-8编码,避免特殊名称导致写入报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:06:07