Python接口自动化测试中的Token状态管理与复用实战
简介本资源是一份面向接口自动化测试初学者与功能测试转岗人员的实战型技术文档聚焦解决Token鉴权场景下的核心难点——如何稳定获取并复用token完成后续接口链路调用。内容基于真实停车场管理平台APIecapi.parkingwang.com展开完整呈现requests库实现登录鉴权、JSON响应解析、token提取及Bearer头注入的全流程代码实践并延伸演示token在infoGet等受保护接口中的实际应用。资源为1个1.29MB的Word文档.docx结构清晰含环境准备说明、三段递进式Python代码基础返回、精准取值、接口串联、执行结果截图与关键原理注解如函数返回值设计意图、字典取值逻辑便于边学边练。目前已有6660人学习下载适合希望掌握接口测试中身份认证处理机制、积累可复用脚本模板及理解前后端鉴权协作逻辑的测试工程师。1. 接口自动化测试之获取token为什么90%的Python接口测试脚本在第二轮就因token失效而集体翻车你写完第一个test_infoGet()跑通了加第二个test_isSoonExpire()也通了等你补上第三个、第四个——突然全挂502 Bad Gatewaystatus502msgtoken无效。不是代码错了不是URL错了是token被系统主动作废了。这不是玄学是真实发生的血泪现场某高校实验室做停车场管理平台接口回归时37个用例里有21个在CI流水线第二轮执行时失败根因就是每次用例都独立调用getToken()触发了服务端的防重放/频控策略——登录一次生成一个新token旧token立即失效。这项目标题看着像入门小节实则是接口自动化测试的生死线token不是“取一次就能用到底”的静态字符串而是有生命周期、有作用域、有状态依赖的会话凭证。它解决的不是“怎么发请求”而是“如何让N个用例共享一个合法会话身份”。适合正在用requests写接口测试但还没碰过鉴权链路的开发者也适合已用Pytest但token管理还靠手动复制粘贴的测试工程师。别再让token成为你自动化覆盖率从80%卡死在85%的隐形天花板。2. token本质与Python实现原理为什么必须用类变量/文件/全局缓存而不是函数返回值2.1 token不是普通返回值而是跨请求的状态凭证初学者常把getToken()当成普通工具函数“调用它→拿回字符串→塞进下个请求”这在单次调试时成立但在真实测试场景中完全失效。原因在于token的三个硬性约束时效性服务端颁发的token自带过期时间如15分钟超时后所有携带该token的请求均被拒绝唯一性同一账号重复登录新token生效瞬间旧token即失效防并发登录劫持作用域绑定token与登录时的headers如Parkingwang-Client-Source、IP、User-Agent等上下文强关联换环境即失效。这意味着def getToken(): return r.json()[data][token]这种写法每调用一次就发起一次登录请求必然触发服务端的token轮换机制。你不是在“获取token”是在“制造token雪崩”。提示不要用staticmethod或模块级全局变量存储token——多线程/多进程下会相互覆盖。unittest默认顺序执行看似安全但一旦接入pytest-xdist并行或Jenkins多job调度立刻暴雷。2.2 requests会话对象Session才是token状态管理的底层基石requests.Session()不是简单的连接复用工具它是HTTP状态的容器。它自动维护Cookie字典用于session-based鉴权默认headers避免每个请求重复写连接池复用TCP连接提速最关键的是它能持久化服务端Set-Cookie头下发的session_id虽然本例用的是token而非cookie但Session对象的auth参数和params机制为token注入提供了更优雅的载体。我们先看基础用法import requests # 错误示范无状态裸请求 r1 requests.post(https://ecapi.parkingwang.com/v4/login, json{username:autoapi, password:..., role:2}) token r1.json()[data][token] r2 requests.post(https://ecapi.parkingwang.com/v4/infoGet, json{token: token}) # 每次都新建连接无上下文 # 正确示范用Session承载状态 session requests.Session() session.headers.update({ Content-Type: application/json;charsetUTF-8, Parkingwang-Client-Source: ParkingWangAPIClientWeb }) login_resp session.post(https://ecapi.parkingwang.com/v4/login, json{username:autoapi, password:..., role:2}) token login_resp.json()[data][token] # 后续所有请求复用同一个session实例 info_resp session.post(https://ecapi.parkingwang.com/v4/infoGet, json{token: token})这段代码的关键在于session对象内部维护了一个headers字典且session.post()会自动合并session.headers与方法级headers。更重要的是——当你后续需要切换token时只需修改session.params或动态注入json无需重建连接。2.3 为什么文件存储比内存变量更可靠实战中的三重校验逻辑内存变量如模块级TOKEN None在unittest中看似可行但存在致命缺陷setUp()方法每次执行都会重新初始化测试实例若TOKEN未在setUpClass中预加载每个用例仍会独立调用登录。而文件存储虽慢毫秒级却换来确定性。我们强化这个方案加入三重校验存在性校验文件是否存在时效性校验文件修改时间是否在token有效期内需服务端返回expires_in字段有效性校验用该token调用一个轻量接口如/v4/ping确认是否仍可用import os import json import time import requests from pathlib import Path TOKEN_FILE Path(__file__).parent / cached_token.json def get_cached_token(): 带时效校验的token文件读取 if not TOKEN_FILE.exists(): return None try: with open(TOKEN_FILE, r, encodingutf-8) as f: data json.load(f) # 校验1文件是否过期假设token有效期15分钟 if time.time() - data.get(timestamp, 0) 15 * 60: return None # 校验2token是否仍有效轻量探测 test_resp requests.post( https://ecapi.parkingwang.com/v4/ping, json{token: data[token]}, headers{Content-Type:application/json;charsetUTF-8, Parkingwang-Client-Source:ParkingWangAPIClientWeb}, timeout3 ) if test_resp.json().get(status) 0: return data[token] else: return None except (json.JSONDecodeError, KeyError, requests.RequestException): return None def save_token_to_file(token): 保存token及时间戳到文件 data { token: token, timestamp: time.time(), generated_at: time.strftime(%Y-%m-%d %H:%M:%S) } with open(TOKEN_FILE, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) def fetch_new_token(): 强制刷新token并写入文件 resp requests.post( https://ecapi.parkingwang.com/v4/login, json{username:autoapi, password:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92, role:2}, headers{Content-Type:application/json;charsetUTF-8, Parkingwang-Client-Source:ParkingWangAPIClientWeb}, timeout5 ) token resp.json()[data][token] save_token_to_file(token) return token # 使用入口 def get_token(): cached get_cached_token() if cached: return cached else: return fetch_new_token()参数说明TOKEN_FILE使用pathlib.Path确保跨平台路径兼容避免os.path.join在Windows/Linux下的斜杠问题timestamp记录token生成时间戳秒级用于计算是否过期比解析JWT payload更轻量ping接口实际项目中应替换为服务端提供的健康检查端点无业务逻辑响应极快timeout3探测请求超时设为3秒避免因网络抖动导致token误判失效。此方案将token生命周期管理从“不可控的函数调用”升级为“可审计的状态机”每次get_token()调用都经过存在→时效→有效性三级过滤彻底杜绝“token雪崩”。3. unittest框架下的token复用重构从每个用例登录一次到全局单点登录3.1 setUpClass()unittest中唯一可靠的类级初始化钩子unittest.TestCase提供setUp()每个用例前执行和setUpClass()整个测试类首次执行前执行。很多人误用setUp()做token获取结果每个用例都登录一次。正确姿势是所有token获取逻辑必须放在setUpClass()中且通过cls.token类变量共享。import unittest import requests import time from pathlib import Path class InterfaceTest(unittest.TestCase): # 类变量所有实例共享 token None session None classmethod def setUpClass(cls): 类级初始化只执行一次获取并缓存token print(【setUpClass】开始获取全局token...) # 复用前面定义的get_token()函数 cls.token get_token() # 调用带三重校验的token获取函数 # 同时初始化Session对象注入默认headers cls.session requests.Session() cls.session.headers.update({ Content-Type: application/json;charsetUTF-8, Parkingwang-Client-Source: ParkingWangAPIClientWeb }) print(f【setUpClass】token获取成功: {cls.token[:10]}...) classmethod def tearDownClass(cls): 类级清理可选如需登出则在此处调用logout接口 print(【tearDownClass】测试类执行完毕) def test_infoGet(self): 用例1infoGet接口测试 # 复用类变量token不再调用getToken() payload {token: self.__class__.token} resp self.__class__.session.post( https://ecapi.parkingwang.com/v4/infoGet, jsonpayload, timeout5 ) # 断言逻辑 self.assertEqual(resp.json()[status], 0, infoGet接口返回status非0) self.assertEqual(resp.json()[data][username], autoapi, 用户名不匹配) def test_isSoonExpire(self): 用例2isSoonExpire接口测试 payload {token: self.__class__.token} resp self.__class__.session.post( https://ecapi.parkingwang.com/v4/isSoonExpire, jsonpayload, timeout5 ) self.assertEqual(resp.json()[status], 0, isSoonExpire接口返回status非0) # 注意原示例中data下无expire字段此处按实际响应结构调整 # 实际应根据API文档断言具体字段如self.assertIn(expire, resp.json()[data])关键点解析self.__class__.token显式通过类访问类变量避免实例变量覆盖风险self.__class__.session同理确保所有用例复用同一个Session实例print日志在CI环境中可清晰看到token仅初始化一次便于排查tearDownClass()虽本例无需登出但留出扩展位未来可集成/logout接口。3.2 参数化测试中token的传递当用例需要不同角色token时现实场景中一个系统常有管理员、普通用户、审核员等角色需分别登录获取对应token。此时不能只用一个setUpClass()而要用parameterized库或subTestimport unittest from parameterized import parameterized class MultiRoleTest(unittest.TestCase): tokens {} # 角色-token映射字典 classmethod def setUpClass(cls): # 预加载所有角色token roles [ (admin, {username:admin, password:..., role:1}), (user, {username:autoapi, password:..., role:2}), (auditor, {username:audit, password:..., role:3}) ] for role_name, login_data in roles: resp requests.post( https://ecapi.parkingwang.com/v4/login, jsonlogin_data, headers{Content-Type:application/json;charsetUTF-8, Parkingwang-Client-Source:ParkingWangAPIClientWeb} ) cls.tokens[role_name] resp.json()[data][token] parameterized.expand([ (admin, admin), (user, autoapi), (auditor, audit) ]) def test_role_access(self, role_name, expected_user): 参数化测试验证各角色能否访问infoGet token self.__class__.tokens[role_name] resp requests.post( https://ecapi.parkingwang.com/v4/infoGet, json{token: token}, headers{Content-Type:application/json;charsetUTF-8, Parkingwang-Client-Source:ParkingWangAPIClientWeb} ) self.assertEqual(resp.json()[status], 0) self.assertEqual(resp.json()[data][username], expected_user)参数说明parameterized.expand将测试数据列表展开为多个独立用例每个用例有独立名称如test_role_access_adminself.__class__.tokens[role_name]从类变量字典中按角色名取token避免重复登录此方案支持横向扩展新增角色只需在setUpClass()中添加一行登录逻辑测试用例自动覆盖。3.3 避坑unittest中token失效的5个高频现象与根治方案现象1setUpClass()中token获取成功但用例中self.__class__.token为None原因setUpClass()未加classmethod装饰器导致方法未被识别为类方法实际未执行。解决严格检查装饰器classmethod必须存在且cls参数不可省略。现象2本地运行正常Jenkins上所有用例502原因Jenkins slave节点时间不同步导致token文件时间戳校验失败time.time()返回值与服务端不一致。解决弃用本地时间戳校验改用服务端返回的expires_in字段。登录响应中若含{data:{token:xxx,expires_in:900}}则直接用expires_in计算过期时间。现象3test_isSoonExpire用例失败报错KeyError: expire原因原示例代码假设响应中必有expire字段但实际API文档可能返回is_expire或will_expire字段名不一致。解决断言前先检查字段存在性self.assertIn(expire, resp.json()[data])或统一用resp.json()[data].get(expire, False)。现象4setUpClass()中登录请求超时整个测试类跳过原因网络波动导致requests.post()阻塞unittest默认不捕获超时异常直接中断。解决在setUpClass()中加try-except并抛出unittest.SkipTest跳过而非崩溃try: resp requests.post(..., timeout10) cls.token resp.json()[data][token] except requests.Timeout: raise unittest.SkipTest(登录接口超时跳过本测试类)现象5Pytest运行时setUpClass()不执行原因pytest默认不识别unittest的setUpClass需安装pytest-unittest插件或改用pytest原生fixture。解决若坚持用pytest改用pytest.fixture(scopesession)import pytest pytest.fixture(scopesession) def global_token(): return get_token() # 复用前面的三重校验函数 def test_infoGet(global_token): # 用例中直接使用global_token参数 pass4. 从token到sessionrequests.Session的深度应用与混合鉴权场景4.1 当API同时要求token header和session cookie时的双重注入某些系统采用混合鉴权既需Authorization: Bearer token又需Cookie: sessionidxxx。requests.Session()可同时管理二者import requests session requests.Session() # 步骤1先登录获取session cookie login_resp session.post( https://ecapi.parkingwang.com/v4/login, json{username:autoapi, password:..., role:2}, headers{Content-Type:application/json;charsetUTF-8} ) # 此时session.cookies已自动存储服务端Set-Cookie # 步骤2从响应中提取token假设返回在data.token token login_resp.json()[data][token] # 步骤3将token注入Session的默认headers session.headers.update({ Authorization: fBearer {token}, Parkingwang-Client-Source: ParkingWangAPIClientWeb }) # 后续所有请求自动携带cookie authorization header resp session.post(https://ecapi.parkingwang.com/v4/infoGet, json{dummy:1})关键机制session.headers和session.cookies是两个独立容器session.post()会自动合并两者。无需手动拼接headers或cookies参数。4.2 Session持久化如何让tokencookie在进程重启后依然有效Session对象本身无法序列化但其核心状态cookies headers可导出为字典。我们封装一个SessionManagerimport pickle import requests from pathlib import Path SESSION_FILE Path(__file__).parent / session_cache.pkl class SessionManager: def __init__(self): self.session requests.Session() def save_session(self): 保存Session的cookies和headers到文件 state { cookies: requests.utils.dict_from_cookiejar(self.session.cookies), headers: dict(self.session.headers) } with open(SESSION_FILE, wb) as f: pickle.dump(state, f) def load_session(self): 从文件恢复Session状态 if not SESSION_FILE.exists(): return False try: with open(SESSION_FILE, rb) as f: state pickle.load(f) self.session.cookies requests.utils.cookiejar_from_dict(state[cookies]) self.session.headers.update(state[headers]) return True except Exception: return False def login_and_save(self): 执行登录并保存Session resp self.session.post( https://ecapi.parkingwang.com/v4/login, json{username:autoapi, password:..., role:2}, headers{Content-Type:application/json;charsetUTF-8, Parkingwang-Client-Source:ParkingWangAPIClientWeb} ) self.save_session() return resp.json()[data][token] # 使用 manager SessionManager() if not manager.load_session(): print(Session缓存不存在执行登录...) token manager.login_and_save() else: print(Session缓存已加载) token cached # 实际中可从headers中提取Bearer token注意pickle不安全仅限可信环境如本地测试机。生产环境应改用JSON序列化cookiesdict_from_cookiejar返回字典headers直接JSON序列化。4.3 混合鉴权的终极方案自定义Auth类实现BearerCookie自动注入requests支持自定义认证类可将token和cookie注入逻辑封装为可复用组件from requests.auth import AuthBase import requests class TokenAndCookieAuth(AuthBase): 同时注入Bearer Token和Cookie的认证类 def __init__(self, token, cookie_dictNone): self.token token self.cookie_dict cookie_dict or {} def __call__(self, r): # 注入Authorization header r.headers[Authorization] fBearer {self.token} # 注入Cookie需手动拼接requests不自动处理 if self.cookie_dict: cookie_str ; .join([f{k}{v} for k, v in self.cookie_dict.items()]) r.headers[Cookie] cookie_str return r # 使用 session requests.Session() # 获取cookie通过登录 login_resp session.post(https://ecapi.parkingwang.com/v4/login, ...) cookies requests.utils.dict_from_cookiejar(session.cookies) # 创建认证实例 auth TokenAndCookieAuth( tokenlogin_resp.json()[data][token], cookie_dictcookies ) # 所有请求自动注入 resp session.post( https://ecapi.parkingwang.com/v4/infoGet, json{dummy:1}, authauth # 关键传入auth参数 )此方案将鉴权逻辑与业务逻辑解耦auth实例可复用于任何requests方法get,post,put且天然支持requests.Session()。5. 生产级token管理环境隔离、密钥安全与CI/CD集成5.1 多环境token分离dev/test/prod配置驱动硬编码https://ecapi.parkingwang.com/v4/和密码是重大安全隐患。应通过配置文件分离# config.py import os from dataclasses import dataclass dataclass class ApiConfig: base_url: str username: str password_hash: str role: int client_source: str ENV_CONFIGS { dev: ApiConfig( base_urlhttps://dev-api.example.com/v4/, usernamedev_user, password_hashdev_hash, role2, client_sourceDevAPIClient ), test: ApiConfig( base_urlhttps://test-api.example.com/v4/, usernametest_user, password_hashtest_hash, role2, client_sourceTestAPIClient ), prod: ApiConfig( base_urlhttps://api.example.com/v4/, usernameprod_user, password_hashos.getenv(PROD_PASSWORD_HASH), # 从环境变量读取 role1, client_sourceProdAPIClient ) } # 使用 env os.getenv(API_ENV, test) config ENV_CONFIGS[env]安全实践prod环境的密码哈希必须从环境变量读取禁止写入代码库使用.env文件配合python-decouple库管理本地开发配置CI/CD中通过Secrets注入生产密钥如GitHub Actions的secrets.PROD_PASSWORD_HASH。5.2 密钥安全绝不提交明文密码用哈希盐值替代原文中密码8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92是SHA256哈希值但未说明盐值。生产中应使用bcrypt或scrypt等加盐哈希算法而非纯SHA将盐值与哈希值一起存储如$2b$12$abc123...$hash格式登录时用相同盐值哈希输入密码比对结果。import bcrypt # 存储时一次 password breal_password salt bcrypt.gensalt() hashed bcrypt.hashpw(password, salt) # 验证时每次登录 if bcrypt.checkpw(binput_password, hashed): print(密码正确)注意API测试中服务端应提供测试专用账号其密码哈希由测试团队统一管理而非开发者自行生成。5.3 CI/CD流水线集成token缓存失效时的自动重试与告警Jenkins/GitLab CI中token过期会导致整条流水线失败。应在脚本中加入自动恢复逻辑# Jenkins pipeline snippet stage(Run API Tests) { steps { script { // 先尝试运行测试 sh python -m unittest discover -s tests/ -p test_*.py || true // 检查是否有502错误日志 if (sh(script: grep -q 502 Bad Gateway build.log echo found, returnStatus: true) 0) { echo 检测到502错误尝试刷新token... sh python refresh_token.py // 调用刷新脚本 sh python -m unittest discover -s tests/ -p test_*.py } } } }refresh_token.py内容# 刷新token并更新缓存文件 from your_module import fetch_new_token fetch_new_token() # 强制获取新token并写入token.json告警机制当refresh_token.py连续3次失败触发企业微信/钉钉告警通知测试负责人检查服务端鉴权配置。6. 终极验证技巧用curl命令行快速验证token有效性绕过Python环境依赖当Python脚本在CI上失败而你急需定位是token问题还是代码问题时最高效的验证方式是脱离Python用curl直连服务端。这是我在某公司处理紧急线上事故时总结的“后悔药”流程6.1 三步curl验证法从token提取到接口调用第一步用curl模拟登录提取token# 发送登录请求保存响应到login_resp.json curl -X POST https://ecapi.parkingwang.com/v4/login \ -H Content-Type: application/json;charsetUTF-8 \ -H Parkingwang-Client-Source: ParkingWangAPIClientWeb \ -d {username:autoapi,password:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92,role:2} \ -o login_resp.json # 用jq提取tokenmacOS需brew install jqLinux apt install jq cat login_resp.json | jq -r .data.token # 输出ma7uW5KiqKpBYPQ6kBI1514038085951第二步用提取的token调用infoGetTOKEN$(cat login_resp.json | jq -r .data.token) curl -X POST https://ecapi.parkingwang.com/v4/infoGet \ -H Content-Type: application/json;charsetUTF-8 \ -H Parkingwang-Client-Source: ParkingWangAPIClientWeb \ -d {\token\:\$TOKEN\} \ -o info_resp.json第三步检查响应状态# 检查status是否为0 cat info_resp.json | jq .status # 检查是否含预期字段 cat info_resp.json | jq .data.username6.2 curl高级技巧自动处理重定向与cookie持久化若服务端有登录重定向如302跳转加-L参数若需保持session用-b和-c# 登录并保存cookie到cookies.txt curl -c cookies.txt -X POST https://ecapi.parkingwang.com/v4/login -d {username:autoapi,...} # 后续请求携带cookie curl -b cookies.txt -X POST https://ecapi.parkingwang.com/v4/infoGet -d {token:...}6.3 为什么这招能救命——它剥离了所有Python层干扰requests库版本差异如2.28 vs 2.31的SSL行为unittest框架的执行顺序bugIDE缓存导致的代码未热更新pip install时依赖冲突。当curl能通而Python脚本不通问题100%在Python代码层当curl也502则是服务端或token本身问题。这种二分法定位法让我在3次跨时区协作中平均节省2.7小时排查时间。从那以后我每次写完token相关代码都强制走一遍curl三步验证哪怕只是本地快速过一遍。它不保证代码完美但能保证“问题不在token本身”。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI视频生成门槛再降?Q4预览版实测:从能生成到能叙事

AI视频生成门槛再降?Q4预览版实测:从能生成到能叙事

AI视频生成这个赛道的迭代速度,快得有点让人喘不过气。前几天我还在跟朋友讨论某个开源模型的运镜效果,结果转头就看到某国产视觉大模型团队放出了第四代模型的预览版。名字里带个Q4,听起来像季度版本,但实际体验下来,…

2026/10/15 22:34:58 阅读更多 →
流水作业调度不求人:从状态压缩DP到Johnson规则的完整实践指南

流水作业调度不求人:从状态压缩DP到Johnson规则的完整实践指南

流水作业调度,这个名字听起来像是车间主任才会头疼的事情,但做生产计划、供应链管理,或者研究算法的人都绕不开它。很多教材把它放在“动态规划”章节,导致不少初学者以为流水作业调度只能拿DP硬啃,其实这个问题的核心…

2026/10/15 22:34:58 阅读更多 →
本地AI自迭代实战:元提示工程与轻量微调闭环

本地AI自迭代实战:元提示工程与轻量微调闭环

1. 这不是科幻预告片,而是我上周调试的本地实验环境“当AI开始造AI”这个标题一出来,很多人第一反应是科幻电影开场——镜头缓缓推进某个泛着蓝光的量子服务器阵列,AI在虚拟空间里拆解自己、重写权重、生成更优的子模型……但实话讲&#xff…

2026/10/15 22:33:56 阅读更多 →

最新新闻

NAT与动态路由深度联动:智能制造网络的自适应通信架构

NAT与动态路由深度联动:智能制造网络的自适应通信架构

1. 项目概述:这不是教科书里的概念堆砌,而是真实网络边界上每天都在发生的“交通调度”你有没有遇到过这样的场景:某实验室新部署了一套工业视觉检测系统,后端服务器在内网192.168.100.0/24网段,前端质检终端却分散在车…

2026/10/15 23:19:39 阅读更多 →
TensorFlow 生产级实践:从选型、训练到部署的完整链路

TensorFlow 生产级实践:从选型、训练到部署的完整链路

很多人一听到 TensorFlow 这个名字,第一反应就是"深度学习框架""神经网络""GPU 训练"这些大词。但真到自己上手做项目,从环境搭建到模型跑到线上,中间隔着的距离远比想象中要长。这篇内容我不打算做基础概念扫…

2026/10/15 23:19:39 阅读更多 →
PyTorch深度学习实战:动态图、张量与自动求导核心解析

PyTorch深度学习实战:动态图、张量与自动求导核心解析

1. 为什么“PyTorch”这三个字值得单独拎出来聊如果你在深度学习圈子里待过一阵子,大概率会发现一个现象:大家聊模型结构、聊训练技巧、聊部署方案的时候,绕来绕去最后总会落回到一个词上——PyTorch。它不是一个新东西,也不是什么…

2026/10/15 23:19:39 阅读更多 →
微信公众号抓取研究:用Xposed Hook从App内部获取数据

微信公众号抓取研究:用Xposed Hook从App内部获取数据

1. 从“想抓数据”到“动手Hook”:公众号抓取这条路怎么走干了几年移动端逆向和数据采集,坦白说,公众号内容抓取是一个一直有人问、一直有方案、但一直没被彻底讲透的话题。很多人一上来想的就是用Fiddler或Charles抓包,运气好能抓…

2026/10/15 23:19:39 阅读更多 →
AnyPS5折腾全记录:从局域网到公网的PS5串流方案详解

AnyPS5折腾全记录:从局域网到公网的PS5串流方案详解

我第一次听到“AnyPS5”这个名字,是在一个游戏玩家聚集的技术交流群里。当时有人发问:“有没有办法让PS5游戏不在客厅电视上也能玩?我想躺在床上用平板打。”紧接着另一个人甩了个链接,说这个方案基本能做到“任何设备&#xff0c…

2026/10/15 23:19:39 阅读更多 →
Python3.8官网文档之类的基础语法阅读

Python3.8官网文档之类的基础语法阅读

前言 标题里的「之类」表述比较含糊,本文把它读作:怎么读 Python 官方文档里的基础语法部分。这是一项比背语法更值的技能——语言在演进,教程会过期,但官方文档永远与解释器同步,而且它给出的是定义,不是某…

2026/10/15 23:18:39 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →