# 生产 finder:登录一次,按合同号搜返利中心。Callable[[str], bool]。 from __future__ import annotations import os from rebate_flow_steps import ( DEFAULT_URL, RebateFlowContext, enter_purchase_agreement, login_rebate_center, open_rebate_center, search_contract, ) # 按合同号查返利中心。一次班次只登录一次,后面的合同号复用这个会话。 class RebateFinder: # 记下浏览器和地址账密。还没登录。 def __init__(self, browser, ctx: RebateFlowContext | None = None, **kwargs): self._browser = browser self._ctx = ctx or RebateFlowContext( rebate_url=kwargs["rebate_url"], username=kwargs["username"], password=kwargs["password"], ) self._ready = False # 搜这个合同号。表里出现该号才是 True,输入框回显不算。 def __call__(self, contract_no: str) -> bool: self._ensure_session() return search_contract(self._browser, contract_no) # 第一次搜之前打开返利中心、登录、进入采购协议。 def _ensure_session(self) -> None: if self._ready: return open_rebate_center(self._browser, self._ctx) login_rebate_center(self._browser, self._ctx) enter_purchase_agreement(self._browser) self._ready = True # 从 REBATE_URL / 账号环境变量拼页面会话。没配地址时用默认内网地址。 def context_from_env() -> RebateFlowContext: return RebateFlowContext( rebate_url=(os.getenv("REBATE_URL") or DEFAULT_URL).strip(), username=(os.getenv("REBATE_USERNAME") or "").strip(), password=os.getenv("REBATE_PASSWORD") or "", ) # 按环境变量打开浏览器,做成班次用的查号器。 def production_finder() -> RebateFinder: from apa_browser_adapter import ApaBrowserAdapter ctx = context_from_env() browser = ApaBrowserAdapter(url=ctx.rebate_url, flow="REBATE_FIND") return RebateFinder(browser, ctx)