launch: auto port discovery; simphtml: init newTabs; SOP docs update
This commit is contained in:
14
launch.pyw
14
launch.pyw
@@ -1,7 +1,14 @@
|
|||||||
import webview, threading, subprocess, sys, time, os, ctypes, atexit, socket
|
import webview, threading, subprocess, sys, time, os, ctypes, atexit, socket, random
|
||||||
|
|
||||||
WINDOW_WIDTH, WINDOW_HEIGHT, RIGHT_PADDING, TOP_PADDING = 600, 900, 0, 300
|
WINDOW_WIDTH, WINDOW_HEIGHT, RIGHT_PADDING, TOP_PADDING = 600, 900, 0, 300
|
||||||
|
|
||||||
|
def find_free_port(lo=8501, hi=8599):
|
||||||
|
ports = list(range(lo, hi+1)); random.shuffle(ports)
|
||||||
|
for p in ports:
|
||||||
|
try: s = socket.socket(); s.bind(('127.0.0.1', p)); s.close(); return p
|
||||||
|
except OSError: continue
|
||||||
|
raise RuntimeError(f'No free port in {lo}-{hi}')
|
||||||
|
|
||||||
def get_screen_width():
|
def get_screen_width():
|
||||||
try: return ctypes.windll.user32.GetSystemMetrics(0)
|
try: return ctypes.windll.user32.GetSystemMetrics(0)
|
||||||
except: return 1920
|
except: return 1920
|
||||||
@@ -55,12 +62,13 @@ def idle_monitor():
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import argparse
|
import argparse
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('port', nargs='?', default='8501');
|
parser.add_argument('port', nargs='?', default='0');
|
||||||
parser.add_argument('--no-tg', action='store_true', help='不启动 Telegram Bot');
|
parser.add_argument('--no-tg', action='store_true', help='不启动 Telegram Bot');
|
||||||
parser.add_argument('--no-sched', action='store_true', help='不启动计划任务调度器')
|
parser.add_argument('--no-sched', action='store_true', help='不启动计划任务调度器')
|
||||||
parser.add_argument('--llm_no', type=int, default=0, help='LLM编号')
|
parser.add_argument('--llm_no', type=int, default=0, help='LLM编号')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
port = args.port
|
port = str(find_free_port()) if args.port == '0' else args.port
|
||||||
|
print(f'[Launch] Using port {port}')
|
||||||
threading.Thread(target=start_streamlit, args=(port,), daemon=True).start()
|
threading.Thread(target=start_streamlit, args=(port,), daemon=True).start()
|
||||||
|
|
||||||
if not args.no_tg:
|
if not args.no_tg:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# ljqCtrl 使用与坐标转换 SOP
|
# ljqCtrl 使用与坐标转换 SOP
|
||||||
|
|
||||||
> **must call update_working_memory**:`ljqCtrl一律使用物理坐标|禁pyautogui|操作前先gw激活窗口`
|
> **must call update working ckp**:`ljqCtrl一律使用物理坐标|禁pyautogui|操作前先gw激活窗口`
|
||||||
|
|
||||||
## 0. API 快速参考 (Signatures)
|
## 0. API 快速参考 (Signatures)
|
||||||
- `ljqCtrl.dpi_scale`: float (缩放系数 = 逻辑宽度 / 物理宽度)
|
- `ljqCtrl.dpi_scale`: float (缩放系数 = 逻辑宽度 / 物理宽度)
|
||||||
|
|||||||
@@ -56,8 +56,12 @@ browser = "chrome" if shutil.which("chrome") else "msedge" # Edge内置必存
|
|||||||
### 方案A(自动化,优先)
|
### 方案A(自动化,优先)
|
||||||
本地 HTTP 服务器 + TM 中间页,用 `start` 命令打开:
|
本地 HTTP 服务器 + TM 中间页,用 `start` 命令打开:
|
||||||
1. Python 启动 `http.server` 托管脚本(Content-Type: text/javascript)
|
1. Python 启动 `http.server` 托管脚本(Content-Type: text/javascript)
|
||||||
|
- ⚠️ 必须用 `Popen(..., stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)` 丢弃输出
|
||||||
|
- ❌ 禁用 `stdout=PIPE` 或 `stderr=PIPE`,会导致缓冲区满后服务器阻塞返回空响应
|
||||||
|
- Windows 可加 `creationflags=subprocess.CREATE_NO_WINDOW` 避免弹窗
|
||||||
2. `start "" "https://www.tampermonkey.net/script_installation.php#url=http://127.0.0.1:{port}/ljq_web_driver.user.js"`
|
2. `start "" "https://www.tampermonkey.net/script_installation.php#url=http://127.0.0.1:{port}/ljq_web_driver.user.js"`
|
||||||
- ⚠️ 以上步骤均须用 `Popen` 非阻塞执行,禁止 `subprocess.run`,否则阻塞 agent
|
- ⚠️ 以上步骤均须用 `Popen` 非阻塞执行,禁止 `subprocess.run`(会等待进程结束)
|
||||||
|
- 服务器需持续运行直到用户完成安装,用 `Popen` 启动后立即返回继续执行
|
||||||
3. TM 秒弹安装确认,用户点"安装"即可
|
3. TM 秒弹安装确认,用户点"安装"即可
|
||||||
|
|
||||||
### 方案B(手动 fallback)
|
### 方案B(手动 fallback)
|
||||||
|
|||||||
@@ -862,7 +862,7 @@ def get_html(driver, cutlist=False, maxchars=28000, instruction="", extra_js="")
|
|||||||
def execute_js_rich(script, driver):
|
def execute_js_rich(script, driver):
|
||||||
try: last_html = get_html(driver, cutlist=False, extra_js=temp_monitor_js)
|
try: last_html = get_html(driver, cutlist=False, extra_js=temp_monitor_js)
|
||||||
except: last_html = None
|
except: last_html = None
|
||||||
result = None; error_msg = None; reloaded = False
|
result = None; error_msg = None; reloaded = False; newTabs = []
|
||||||
before_sids = set(driver.get_session_dict().keys())
|
before_sids = set(driver.get_session_dict().keys())
|
||||||
try:
|
try:
|
||||||
print(f"Executing: {script[:250]} ...")
|
print(f"Executing: {script[:250]} ...")
|
||||||
|
|||||||
Reference in New Issue
Block a user