树莓派Python调用wget获取FritzBox日志返回HTML而非JSON
问题分析与解决建议
可能的原因
- wget版本差异:Raspbian Bullseye默认的wget版本(通常为1.21.x)较旧,和ArchLinux上的新版wget在POST请求处理、URL参数解析上存在行为差异,导致FritzBox返回HTML而非预期的JSON。
- User-Agent识别:FritzBox可能根据请求的User-Agent头返回不同内容,Raspbian的wget默认User-Agent与Arch的不同,触发了网页版界面的返回逻辑。
- 会话Cookie未传递:虽然POST参数中携带了SID,但FritzBox可能同时需要会话Cookie验证身份,旧版wget未自动处理Cookie,导致请求被重定向到登录引导页面。
解决步骤
1. 统一请求头与Cookie处理
修改download_log函数中的wget命令,添加User-Agent、Accept头,并强制处理会话Cookie:
def download_log(sid: str) -> str: cmd = '''wget -q -O - \ --user-agent="Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" \ --header="Accept: application/json" \ --keep-session-cookies \ --save-cookies=/tmp/fritz_cookies.txt \ --load-cookies=/tmp/fritz_cookies.txt \ --post-data="sid={sid}&lang=de&page=wSet&no_sidrenew=" \ http://fritz.box/data.lua?version=2'''.format(sid=sid) return subprocess.check_output(cmd, shell=True, executable="/bin/bash", text=True)
注意:获取SID的登录步骤也需要添加相同的Cookie参数,确保会话Cookie被保存和复用。
2. 替换wget为Python原生请求库(推荐)
彻底避免依赖系统wget的版本差异,改用requests库直接发送请求,跨环境稳定性更强:
先安装requests:
pip install requests
再修改代码:
import requests def download_log(sid: str) -> str: url = "http://fritz.box/data.lua?version=2" data = { "sid": sid, "lang": "de", "page": "wSet", "no_sidrenew": "" } headers = { "User-Agent": "Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Accept": "application/json" } # 若登录时使用了session对象,直接复用可进一步保证会话一致性 response = requests.post(url, data=data, headers=headers) response.raise_for_status() return response.text
3. 验证并更新wget版本
在两台机器上执行wget --version对比版本号,若Raspbian的wget版本过旧,可尝试更新:
sudo apt update && sudo apt install --only-upgrade wget
内容的提问来源于stack exchange,提问作者tinkertoadie
相关产品推荐
相关产品推荐

