From 714818bb1537061f330bf416bae7f6f177eb389a Mon Sep 17 00:00:00 2001 From: break27 Date: Tue, 31 Mar 2026 18:00:39 +0800 Subject: [PATCH] pivot to selenium --- .gitignore | 3 +- README.md | 52 ----- index.html | 48 +++++ main.py | 354 ++++++++++++++++++++++++++++++++++ profiles/profile-example.bat | 4 + profiles/setup-virtualenv.bat | 4 + requirements.txt | Bin 0 -> 816 bytes template.xlsx | Bin 0 -> 10985 bytes 商机数据导出宏.xlsm | Bin 23033 -> 0 bytes 9 files changed, 412 insertions(+), 53 deletions(-) delete mode 100644 README.md create mode 100644 index.html create mode 100644 main.py create mode 100644 profiles/profile-example.bat create mode 100644 profiles/setup-virtualenv.bat create mode 100644 requirements.txt create mode 100644 template.xlsx delete mode 100644 商机数据导出宏.xlsm diff --git a/.gitignore b/.gitignore index 2c69990..8f47547 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.workbooks/ \ No newline at end of file +/.vscode +/venv \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 8f7f6f8..0000000 --- a/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# 商机纸质打印操作步骤 - -1. 导出商机数据 - - -![image.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/yBRq1geYWaXmldv1/img/ac293e62-7aec-42f9-ad40-023cfea9da1e.png) - -2. 筛选数据 - - -![image.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/yBRq1geYWaXmldv1/img/aa73c2fe-3790-4524-8c07-29ad6370b488.png) - -3. 在“导出设置”中设置导出字段 **(字段和顺序必须与图中一致)** - - -![E24B22E1-8621-451a-AADA-973B1730D1E5.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/yBRq1geYWaXmldv1/img/3f0b8ad2-fea1-42e8-b791-a0eb82364038.png) - -4. 导出详细版 - - -![image.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/yBRq1geYWaXmldv1/img/03f57463-5e82-4f7d-9dfc-922e1a03a154.png) - -5. 打开工作簿,点击“启用宏” - - -![image.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/yBRq1geYWaXmldv1/img/878691a5-5c24-4bcf-b352-6e86764f4f75.png) - -6. 选择Config工作表,输入导出位置 **(注意:路径必须以分隔符 “\” 结尾)** - - -![image.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/yBRq1geYWaXmldv1/img/4f0e8d61-11eb-46e3-94dc-228a19fe9228.png) - -7. 运行宏 - - -![image.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/yBRq1geYWaXmldv1/img/c0a439b3-68a2-45bc-b1ab-5902caa3c782.png) - -8. 选择导出的详细版商机数据 - - -![image.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/yBRq1geYWaXmldv1/img/e58b64e0-80c1-48c2-b299-fee264e8fae1.png) - -9. 宏运行完成,Excel会有弹窗提示,在指定文件夹找到导出的商机 - - -![image.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/yBRq1geYWaXmldv1/img/6a7b04ed-fcd9-4da6-8789-5d1a8ce67e68.png) - -10. 全选,右键,选择显示更多选项,点击打印 - - -![image.png](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/yBRq1geYWaXmldv1/img/35d3c5c5-06ba-4c62-b8ab-a09d83cc336c.png) - diff --git a/index.html b/index.html new file mode 100644 index 0000000..28ec225 --- /dev/null +++ b/index.html @@ -0,0 +1,48 @@ + +Opportunity Exporter + + + + + + \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..ea45cd8 --- /dev/null +++ b/main.py @@ -0,0 +1,354 @@ +import argparse +import openpyxl +import logging +import base64 +import json +import csv + +import trio +import trio_websocket as ws + +from selenium.common.exceptions import StaleElementReferenceException, TimeoutException +from selenium.webdriver.chrome.webdriver import WebDriver +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.remote.webelement import WebElement +from selenium.webdriver.common.bidi.network import Request as NetworkRequest + +from io import BytesIO +from enum import Enum +from typing import Self, Callable +from pathlib import Path +from urllib3 import PoolManager +from threading import Thread + +parser = argparse.ArgumentParser(description="Opportunity Exporter") +parser.add_argument('account', type=str) +parser.add_argument('password', type=str) +parser.add_argument('-e', '--encoding', type=str, default="utf-8-sig") +parser.add_argument('-t', '--timeout', type=int, default=60) +parser.add_argument('-r', '--attempts', type=int, default=3) +parser.add_argument('-l', '--log-level', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']) + +WEBURL = "https://crm.xiaoman.cn/business/export" +APIURL = "https://crm.xiaoman.cn/api/opportunityRead/export" + +args = parser.parse_args() +handlers = {} +connection, server = None, None + +class Request[T]: + def __init__(self, method: str, params: T): + if not isinstance(method, str): raise TypeError() + self.method = method + self.params = params + + @classmethod + def load(cls, raw: bytes) -> Self: + data = json.loads(raw) + return cls(**data) + +class Response[T]: + def __init__(self, result: T): + self.result = result + + def __str__(self): + data = { 'result': self.result } + return json.dumps(data) + +class Error(Enum): + PARSE_ERROR = -200 + INVALID_REQUEST = -300 + METHOD_NOT_FOUND = -400 + INTERNAL_ERROR = -500 + + def __str__(self): + data = { 'error': self.value } + return json.dumps(data) + +class History(logging.Handler): + def __init__(self): + super().__init__() + self.records = [] + + def emit(self, record): + self.records.append(record) + + def truncate(self) -> list: + copy = self.records.copy() + self.records.clear() + return copy + +def main(driver: WebDriver, logger = logging.getLogger('main')): + try: + http = PoolManager() + driver.get(str(Path('index.html').resolve())) + endpoint = server.listeners[0] + parameters = vars(args) + driver.execute_script(f"main(...arguments);", f'ws://{endpoint.address}:{endpoint.port}', parameters) + except Exception as e: + logger.critical('Unable to load starup page', exc_info=e) + return 2 + + try: + driver.switch_to.new_window('tab') + driver.set_page_load_timeout(parameters.get('timeout')) + driver.get(WEBURL) + except TimeoutException: + logger.warning('Timeout') + driver.execute_script("window.stop();") + + def until(condition: Callable[[WebDriver], bool], watch=True): + try: + WebDriverWait(driver, parameters.get('timeout')).until(condition) + except (TimeoutException, StaleElementReferenceException): + pass + if watch: WebDriverWait(driver, parameters.get('timeout')).until_not(condition) + return True + + def sleep(seconds: float): + try: WebDriverWait(driver, seconds, seconds).until(lambda _: False) + except: pass + return True + + def locate(selector, wait=True, condition=EC.visibility_of_element_located) -> WebElement: + while True: + try: + locator = (By.CSS_SELECTOR, selector) + if not wait: return driver.find_element(*locator) + + presence = EC.presence_of_element_located(locator) + element = WebDriverWait(driver, parameters.get('timeout')).until(presence, 'Timeout') + driver.execute_script("arguments[0].scrollIntoView({ block: 'center', inline: 'nearest' });", element) + + if condition is not None: + element = WebDriverWait(driver, parameters.get('timeout')).until(condition(locator), 'Timeout') + return element + except StaleElementReferenceException: + continue + + def click(selector: str|WebElement, wait=True, condition=EC.element_to_be_clickable): + element = locate(selector, wait, condition) if isinstance(selector, str) else selector + counter = lambda: int(element.get_attribute('taximeter') or 0) + error = False + + value = counter() + driver.execute_script("arguments[0].addEventListener('click', () => arguments[0].setAttribute('taximeter', arguments[1] + 1));", element, value) + + for _ in range(parameters.get('attempts')): + try: + if not error: element.click() + else: driver.execute_script("arguments[0].click();", element) + except StaleElementReferenceException: + break + except: + error = True + continue + try: + WebDriverWait(driver, parameters.get('interval')).until(lambda _: counter() > value) + break + except TimeoutException: continue + except: break + + try: + until(lambda x: 'loginProgress' in x.find_element(By.TAG_NAME, "body").get_attribute('class'), watch=False) + locate("input.account").send_keys(parameters.get('account')) + locate("input#password").send_keys(parameters.get('password')) + click("input.agree-checkbox") + click("button.login-btn") + except Exception as e: + logger.critical('Unable to login to %s', parameters.get('url'), exc_info=e) + return 3 + + logger.info('Waiting for authentication to complete...') + while True: + try: + locate("#container", False) + logger.info('Done') + break + except: + sleep(3) + + ready = False + sidebar = locate(".new-layout-left", False) + driver.execute_script("arguments[0].remove();", sidebar) + + def handle(request: NetworkRequest): + nonlocal ready + if request.url == APIURL: ready = True + try: request.continue_request() + except Exception as e: logger.debug('Network request error', exc_info=e) + + event = 'before_request' + driver.network.add_request_handler(event, handle) + + while True: + if not ready: + sleep(1) + continue + + try: + locate(".mm-modal-content .mm-modal-body input", wait=False).send_keys(parameters.get('password')) + click(".mm-modal-footer button.okki-btn-primary", wait=False) + except: + pass + + try: + sleep(1) + click(".business-export-wrap section:nth-child(3) h2 svg", wait=False) + cell = locate(".business-export-wrap section:nth-child(3) table tbody tr:first-child td:first-child span", wait=False) + filename = cell.text + except: + continue + + if filename == '--': + sleep(1) + continue + + try: + logger.info('New task: %s', filename) + download = locate(".business-export-wrap section:nth-child(3) table tbody tr:first-child td:last-child a") + href = download.get_attribute('href') + + response = http.request("GET", href) + text = response.data.decode(parameters.get('encoding')).splitlines() + data = csv.reader(text) + logger.info('Read %d line(s) total', len(text)) + except Exception as e: + logger.critical('Unable to load input data', exc_info=e) + return 4 + + try: + file = Path('template.xlsx').resolve() + template = openpyxl.load_workbook(file) + except Exception as e: + logger.critical('Unable to load template excel', exc_info=e) + return 5 + + header = next(data, None) + source = template.active + output = BytesIO() + + def preprocess(data: str): + try: return float(data) + except ValueError: pass + + try: return int(data) + except ValueError: pass + + return data.lstrip("'") + + for row in data: + for index, name in enumerate(header): + names = template.defined_names + if name not in names: continue + + for _, coord in names[name].destinations: + value = preprocess(row[index]) + source[coord] = value + + sheet = template.copy_worksheet(source) + logger.info('New sheet: %s', sheet.title) + + if not len(template.worksheets) > 1: + logger.error('Invalid input') + ready = False + continue + + template.remove(source) + template.save(output) + + data = base64.b64encode(output.getbuffer()) + text = data.decode('ascii') + mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + href = f"data:{mime};base64,{text}" + + driver.switch_to.new_window('tab') + driver.execute_script( + """ + var link = document.createElement('a'); + link.download = arguments[0]; + link.href = arguments[1]; + link.click(); + """, + filename.replace('.csv', '.xlsx'), + href + ) + + driver.close() + driver.switch_to.window(driver.window_handles[1]) + logger.info('Done') + ready = False + +async def handler(request: ws.WebSocketRequest, logger = logging.getLogger('websocket')): + global connection + websocket = await request.accept() + + if connection is None: + connection = websocket + logger.info('Connection established') + else: + await websocket.aclose(code=1000, reason="Non-singular connection prohibited") + return + + while True: + try: + message = await connection.get_message() + inbound = Request.load(message) + + handler = handlers[inbound.method] + results = handler(inbound.params) + response = Response(results) + except json.decoder.JSONDecodeError: + logger.error('Parse error') + response = Error.PARSE_ERROR + except TypeError: + logger.error('Invalid request') + response = Error.INVALID_REQUEST + except KeyError: + logger.error('Method not found: `%s`', inbound.method) + response = Error.METHOD_NOT_FOUND + except Exception as e: + logger.error('Internal error', exc_info=e) + response = Error.INTERNAL_ERROR + + await connection.send_message(str(response)) + +async def backend(listen='127.0.0.1', port=0): + import _thread as t + global server + + listeners = await trio.open_tcp_listeners(port, host=listen) + server = ws.WebSocketServer(handler, listeners, max_message_size=125_000_000) + await server.run() + t.interrupt_main() + +if __name__ == '__main__': + try: + logging.basicConfig(level=logging.INFO, format="[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s", datefmt="%Y-%m-%d %H:%M") + logger = logging.getLogger() + formatter = logger.handlers[0].formatter + history = History() + logger.addHandler(history) + level = logging.getLevelNamesMapping().get(args.log_level, 'INFO') + logger.setLevel(level) + + logger.info('Initializing...') + handlers.setdefault('sync', lambda _: list(map(lambda x: formatter.format(x), history.truncate()))) + thread = Thread(target=lambda: trio.run(backend), daemon=True) + thread.start() + + logger.info('Creating automation instance') + opts = Options() + opts.enable_bidi = True + opts.enable_downloads = True + driver = WebDriver(options=opts) + status = main(driver) + except Exception as e: + logger.critical('Fatal error', exc_info=e) + status = 1 + finally: + driver.quit() + exit(status) diff --git a/profiles/profile-example.bat b/profiles/profile-example.bat new file mode 100644 index 0000000..dfe435b --- /dev/null +++ b/profiles/profile-example.bat @@ -0,0 +1,4 @@ +cd /D .\..\ +set SE_PROXY=http://127.0.0.1:10809 +.\venv\Scripts\pythonw.exe .\main.py "user@example.com" "example" +@pause \ No newline at end of file diff --git a/profiles/setup-virtualenv.bat b/profiles/setup-virtualenv.bat new file mode 100644 index 0000000..f2160c3 --- /dev/null +++ b/profiles/setup-virtualenv.bat @@ -0,0 +1,4 @@ +cd /D .\..\ +python -m venv venv +.\venv\Scripts\pip.exe install -r ./requirements.txt +@pause \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..029c6199eadbc8dc99728b1e2fca4ab2c32798fa GIT binary patch literal 816 zcmZXSYfi#Y5QXQriA#ZSTk!G2J(#!v0u`kZ+J@Qyn^(Ux(~B6>+(J5M&SU0&f3573 z=U}}(@f5bOsm(bvyR{oz+lsTX-B_JkvWH8xqH>_Swl_}n&)~QNQTSOnOGW(`A@0n- zp?hg3+oK@F4#wcQMr~0|{#~8P`NLmruh!sEJ*C%@E4J3b)bKvT9`2()C83hFHlSVc zyB{?Z{lZA2<9km%R5}zY`{4bK$A))!RL+bzgAh)W)Ks#gs6XT51x~TVq@{Mx3BT%5 z_6Gg|N9xuV=G3!BPwnIteM{aQ?7jEJjN1z$@+xbOvi7uLT1wpTf8|N!G;jWT@468+ zNcqq_%5gGc%e9FeVO%@Aa%q)@zZc9)nchb-&1^wo<$!}j|8gQ`VsZl5$ zp&O-%m%hLM+7q$~uPKHT&FPU7j7O9@SX-)pr&Ktj?n#fk!nPoEBXb(5&K>gulxTIc literal 0 HcmV?d00001 diff --git a/template.xlsx b/template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ff8d2db37c37fa3945a2a592c7327a82e24c13f5 GIT binary patch literal 10985 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 literal 0 HcmV?d00001 diff --git a/商机数据导出宏.xlsm b/商机数据导出宏.xlsm deleted file mode 100644 index a7b3b4ad8b207754b65c9a3df28c696b2e7f4593..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23033 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

~`F*Yg*TpZii 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 bDF4;VnXHYb3hr6mIjw5Ls5w)BPjUYTC~L3Z