diff --git a/run_monitor.bat b/run_monitor.bat new file mode 100644 index 0000000..c856fc0 --- /dev/null +++ b/run_monitor.bat @@ -0,0 +1,12 @@ +@echo off +title Fengxiang Order Monitor +cd /d d:\coding\fengxiang +echo ========================================= +echo Fengxiang Order Monitor v3 +echo %date% %time% +echo ========================================= +echo. +python order_monitor.py +echo. +echo Monitor stopped. Press any key to close... +pause >nul diff --git a/setup_autostart.ps1 b/setup_autostart.ps1 new file mode 100644 index 0000000..ed43d19 --- /dev/null +++ b/setup_autostart.ps1 @@ -0,0 +1,31 @@ +# 设置丰享订单监控开机自启 +# 右键此文件 → "使用 PowerShell 运行",或在管理员 PowerShell 中执行 + +$taskName = "丰享订单监控" +$scriptPath = "d:\coding\fengxiang\run_monitor.bat" +$taskExists = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue + +if ($taskExists) { + Write-Host "检测到已有任务,正在更新..." + Unregister-ScheduledTask -TaskName $taskName -Confirm:$false +} + +# 创建任务:用户登录时自动运行 +$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c `"$scriptPath`"" +$trigger = New-ScheduledTaskTrigger -AtLogOn +$principal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" -LogonType Interactive -RunLevel Highest +$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -MultipleInstances IgnoreNew + +Register-ScheduledTask -TaskName $taskName ` + -Action $action ` + -Trigger $trigger ` + -Principal $principal ` + -Settings $settings ` + -Description "丰享订单监控 - 开机自动启动,监控新订单并推送到企业微信和小爱音箱" + +Write-Host "✓ 开机自启设置成功!" +Write-Host " 任务名称: $taskName" +Write-Host " 下次登录 Windows 时将自动运行" +Write-Host "" +Write-Host "立即测试运行?运行以下命令:" +Write-Host " Start-ScheduledTask -TaskName '$taskName'" diff --git a/test_push.py b/test_push.py new file mode 100644 index 0000000..eed318a --- /dev/null +++ b/test_push.py @@ -0,0 +1,128 @@ +""" +测试脚本:验证企业微信推送 + 小爱音箱播报 +- 拉取最新订单,推送到企业微信和小爱音箱 +- 显示 API 返回结果,方便排查问题 +""" + +import json +import time +import requests +import asyncio +from pathlib import Path +from aiohttp import ClientSession +from miservice import MiAccount, MiNAService + +WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=644ab6d9-3b66-4166-88e9-5a8a89e3731d" +DATA_API = "https://fs.szfx.com/saasmerchant/pcweb/order/quickpayorder/list" +SHOP_ID = "20434543575189" + +XIAOMI_USER_ID = "1136458602" +XIAOMI_TOKEN_PATH = str(Path.home() / ".mi.token") +XIAOMI_SPEAKER_DID = "3ba2c1e8-d8cb-45c5-b88a-15624e7a02f3" + + +def fmt_money(cents): + return f"{cents / 100:.2f}元" if cents else "0.00元" + + +def fmt_ts(ts): + import datetime + return datetime.datetime.fromtimestamp(ts).strftime("%Y-%m-%d %H:%M:%S") if ts else "-" + + +def load_cookies(): + with open("cookies.json", "r", encoding="utf-8") as f: + return json.load(f) + + +def fetch_latest_order(): + """使用 cookies.json 拉取最新订单""" + cookies = load_cookies() + headers = { + "Content-Type": "application/json", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + "Referer": "https://fs.szfx.com/MMS", + "Origin": "https://fs.szfx.com", + } + payload = {"shopId": SHOP_ID, "page": 1, "pageSize": 1} + resp = requests.post(DATA_API, json=payload, headers=headers, cookies=cookies, timeout=30) + data = resp.json() + if data.get("errno") != 0: + print(f"[FAIL] API error: errno={data.get('errno')}, errmsg={data.get('errmsg')}") + return None + return data["data"]["list"][0] + + +def test_wecom(msg): + """发送到企业微信""" + print("\n--- Test: WeChat Work ---") + payload = {"msgtype": "text", "text": {"content": msg}} + try: + resp = requests.post(WEBHOOK_URL, json=payload, timeout=10) + result = resp.json() + print(f" Response: {json.dumps(result, ensure_ascii=False)}") + if result.get("errcode") == 0: + print(" [OK] WeChat push success") + else: + print(" [FAIL] WeChat push failed") + except Exception as e: + print(f" [FAIL] Exception: {e}") + + +async def _tts(text): + async with ClientSession() as session: + account = MiAccount(session, XIAOMI_USER_ID, None, XIAOMI_TOKEN_PATH) + mina = MiNAService(account) + return await mina.text_to_speech(XIAOMI_SPEAKER_DID, text) + + +def test_speaker(msg): + """发送到小爱音箱""" + print("\n--- Test: Xiaomi Speaker ---") + print(f" Text: {msg}") + try: + result = asyncio.run(_tts(msg)) + print(f" Response: {json.dumps(result, ensure_ascii=False)}") + if result and result.get("code") == 0: + print(" [OK] Speaker TTS success") + else: + print(" [FAIL] Speaker TTS failed - token may be expired, run setup_xiaomi.py") + except Exception as e: + print(f" [FAIL] Exception: {e}") + + +def main(): + print("=" * 50) + print(" Fengxiang Order Monitor - Test Script") + print("=" * 50) + + # 1. Fetch latest order + print("\n1. Fetch latest order...") + order = fetch_latest_order() + if not order: + print("[FAIL] Cannot fetch order, check cookies.json") + return + + print(f" orderId: {order['orderId']}") + print(f" shopName: {order['shopName']}") + print(f" allPrice: {fmt_money(order['allPrice'])}") + print(f" amountPayable: {fmt_money(order['amountPayable'])}") + print(f" payTime: {fmt_ts(order['payTime'])}") + + # 2. Format message + msg = f"【丰享丰食】订单收款成功,收款{fmt_money(order['amountPayable'])}" + print(f"\n2. Message to send:\n {msg}") + + # 3. Test WeChat and Speaker + test_wecom(msg) + test_speaker(msg) + + print("\n" + "=" * 50) + print(" Test complete. Check:") + print(" - WeChat: open the enterprise WeChat group") + print(" - Speaker: the L15A speaker in the shop") + print("=" * 50) + + +if __name__ == "__main__": + main()