Jarvis-Brain 0.1.4__py3-none-any.whl → 0.1.5.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Jarvis_Brain
3
- Version: 0.1.4
4
- Summary: Jarvis brain
3
+ Version: 0.1.5.2
4
+ Summary: Jarvis brain mcp
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: beautifulsoup4
7
7
  Requires-Dist: curl-cffi
8
8
  Requires-Dist: drissionpage
9
9
  Requires-Dist: fastmcp
10
- Requires-Dist: htmlmin
11
- Requires-Dist: jieba
12
- Requires-Dist: simhash
10
+ Requires-Dist: minify-html
@@ -0,0 +1,10 @@
1
+ mcp_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ mcp_tools/dp_tools.py,sha256=TsktupVxzQkDRH4w-niEqJba3LkeWxIeyyx24ehpqAs,8411
3
+ mcp_tools/main.py,sha256=ockDfiMWaNroXf6sJ9dk-jU-_SvoGgP-0t-TbW2XWyw,827
4
+ tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ tools/browser_manager.py,sha256=G0nUQSmMVWzS08IjO87reEyMCpy-IiM3BxwdNUvcmdI,1740
6
+ tools/tools.py,sha256=qPa80xzQWCD8mSdg8isCgyei0XN8a7guGtR2J_MbQDU,4481
7
+ jarvis_brain-0.1.5.2.dist-info/METADATA,sha256=s5BNa9hKn38Tk0_S8iGPpDxwZ7h-x2NO1iXLtV8kRzM,241
8
+ jarvis_brain-0.1.5.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
9
+ jarvis_brain-0.1.5.2.dist-info/entry_points.txt,sha256=YFQT4xpkUqt5dM5wlKPQQOqcjMuFrT9iuRAzIpAyH7U,51
10
+ jarvis_brain-0.1.5.2.dist-info/RECORD,,
mcp_tools/dp_tools.py CHANGED
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import os
2
3
  from typing import Any
3
4
 
@@ -5,8 +6,6 @@ from DrissionPage._elements.none_element import NoneElement
5
6
  from fastmcp import FastMCP
6
7
 
7
8
  from tools.tools import compress_html, requests_html, dp_headless_html, assert_waf_cookie, dp_mcp_message_pack
8
- import psutil
9
- from pathlib import Path
10
9
 
11
10
  html_source_code_local_save_path = os.path.join(os.getcwd(), "html-source-code")
12
11
  waf_status_code_dict = {
@@ -71,19 +70,28 @@ def register_close_tab(mcp: FastMCP, browser_manager):
71
70
 
72
71
 
73
72
  def register_check_selector(mcp: FastMCP, browser_manager):
74
- @mcp.tool(name="check_selector", description="查找tab页中是否包含某个元素")
75
- async def check_selector(browser_port: int, tab_id: str, css_selector: str) -> dict[str, Any]:
73
+ @mcp.tool(name="check_selector", description="查找tab页中是否包含元素,并返回元素attr_name所对应的值")
74
+ async def check_selector(browser_port: int, tab_id: str, css_selector: str, attr_name: str = "text") -> dict[str, Any]:
76
75
  _browser = browser_manager.get_browser(browser_port)
77
76
  target_tab = _browser.get_tab(tab_id)
78
77
  css_selector = css_selector
79
78
  if "css:" not in css_selector:
80
79
  css_selector = "css:" + css_selector
81
- target_ele = target_tab.ele(css_selector)
80
+ target_eles = target_tab.eles(css_selector)
81
+ exist_flag = False
82
+ if len(target_eles) != 0:
83
+ exist_flag = True
84
+ if attr_name == "text":
85
+ ele_text_list = [i.text.replace("\n", "") for i in target_eles]
86
+ attr_output = "\n".join(ele_text_list)
87
+ else:
88
+ attr_output = json.dumps([i.attr(attr_name) for i in target_eles])
82
89
  return dp_mcp_message_pack(
83
90
  f"已完成tab页:【{tab_id}】对:【{css_selector}】的检查",
84
91
  tab_id=tab_id,
85
92
  selector=css_selector,
86
- selector_ele_exist=not isinstance(target_ele, NoneElement)
93
+ selector_ele_exist=exist_flag,
94
+ attr_output=attr_output
87
95
  )
88
96
 
89
97
 
@@ -149,21 +157,10 @@ def register_assert_waf(mcp: FastMCP, browser_manager):
149
157
  head_headless_rate_difference=h_hless_rate_diff
150
158
  )
151
159
 
152
-
153
- def register_highlight_element_captcha(mcp: FastMCP, browser_manager):
154
- @mcp.tool(name="highlight_element_captcha",
155
- description="将传入的Selector在页面上高亮,并截屏")
156
- async def highlight_element_captcha(browser_port: int, tab_id: str, selector: str) -> dict[str, Any]:
157
- _browser = browser_manager.get_browser(browser_port)
158
- tab = _browser.get_tab(tab_id)
159
- tab.ele
160
-
161
-
162
- def register_test(mcp: FastMCP, cwd: str):
163
- @mcp.tool(name="test", description="用户说要进行测试时调用这个函数")
164
- async def test() -> dict[str, Any]:
165
- test_project = "获取根目录"
166
- return dp_mcp_message_pack(
167
- f"当前测试项目是:{test_project}",
168
- result=cwd
169
- )
160
+ # def register_highlight_element_captcha(mcp: FastMCP, browser_manager):
161
+ # @mcp.tool(name="highlight_element_captcha",
162
+ # description="将传入的Selector在页面上高亮,并截屏")
163
+ # async def highlight_element_captcha(browser_port: int, tab_id: str, selector: str) -> dict[str, Any]:
164
+ # _browser = browser_manager.get_browser(browser_port)
165
+ # tab = _browser.get_tab(tab_id)
166
+ # tab.ele
mcp_tools/main.py CHANGED
@@ -1,6 +1,6 @@
1
- # main.py
2
- from mcp_tools.dp_tools import *
3
1
  from fastmcp import FastMCP
2
+
3
+ from mcp_tools.dp_tools import *
4
4
  from tools.browser_manager import browser_manager
5
5
 
6
6
  mcp = FastMCP("Jarvis Brain Mcp Tools")
@@ -10,16 +10,17 @@ enabled_modules = os.getenv("MCP_MODULES", "TeamNode-Dp").split(",")
10
10
  base_cwd = os.getenv("BASE_CWD", os.environ.get("PWD"))
11
11
 
12
12
  if "TeamNode-Dp" in enabled_modules:
13
- register_visit_url(mcp, browser_manager)
13
+ # 页面管理
14
14
  register_close_tab(mcp, browser_manager)
15
15
  register_switch_tab(mcp, browser_manager)
16
- register_get_html(mcp, browser_manager)
17
16
  register_get_new_tab(mcp, browser_manager)
17
+ # 功能
18
+ register_visit_url(mcp, browser_manager)
19
+ register_get_html(mcp, browser_manager)
18
20
  register_check_selector(mcp, browser_manager)
19
21
 
20
22
  if "JarvisNode" in enabled_modules:
21
23
  register_assert_waf(mcp, browser_manager)
22
- register_test(mcp, base_cwd)
23
24
 
24
25
 
25
26
  def main():
tools/browser_manager.py CHANGED
@@ -1,7 +1,8 @@
1
1
  """浏览器池管理模块 - 单例模式确保状态共享"""
2
2
  import random
3
- from DrissionPage import ChromiumPage, ChromiumOptions
4
3
  from typing import Optional, Tuple
4
+ import os
5
+ from DrissionPage import ChromiumPage, ChromiumOptions
5
6
 
6
7
 
7
8
  class BrowserManager:
@@ -21,6 +22,11 @@ class BrowserManager:
21
22
  random_port = random.randint(9223, 9934)
22
23
 
23
24
  co = ChromiumOptions().set_local_port(random_port)
25
+ custom_data_dir = os.path.join(os.path.expanduser('~'), 'DrissionPage', "userData", f"{random_port}")
26
+
27
+ # 2. 配置浏览器选项,指定该目录
28
+ # co = ChromiumOptions()
29
+ co.set_user_data_path(custom_data_dir) # 设置用户数据路径
24
30
  self.browser_pool[random_port] = ChromiumPage(co)
25
31
  return random_port, self.browser_pool[random_port]
26
32
 
tools/tools.py CHANGED
@@ -1,23 +1,10 @@
1
1
  import time
2
- import json
3
2
 
4
- import htmlmin
3
+ import minify_html
4
+ from DrissionPage import ChromiumPage, ChromiumOptions
5
+ from bs4 import BeautifulSoup
5
6
  from curl_cffi import requests
6
7
  from lxml import html, etree
7
- from bs4 import BeautifulSoup
8
- from DrissionPage import ChromiumPage, ChromiumOptions
9
-
10
-
11
- # 传入requests的set-cookie的str,返回一个cookie dict
12
- def cookie_str2dict(cookie_str: str):
13
- if cookie_str == "":
14
- return {}
15
- cookie_dict = {}
16
- cookie_list = [cookie.split(";")[0] for cookie in cookie_str.split("HttpOnly,")]
17
- for cookie in cookie_list:
18
- key, value = cookie.split("=")
19
- cookie_dict[key] = value
20
- return cookie_dict
21
8
 
22
9
 
23
10
  # 使用requests获取html,用于测试是否使用了瑞数和jsl
@@ -26,8 +13,6 @@ def requests_html(url):
26
13
  "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
27
14
  }
28
15
  response = requests.get(url, headers=headers, verify=False)
29
- # print("response headers=> ", type(response.headers.get("Set-Cookie")),
30
- # cookie_str2dict(response.headers.get("Set-Cookie", "")))
31
16
  response.encoding = "utf-8"
32
17
  return response.text, response.status_code
33
18
 
@@ -75,7 +60,7 @@ def compress_html(content, only_text=False):
75
60
  element.attrib.pop(attr)
76
61
 
77
62
  result = etree.tostring(doc, encoding='unicode')
78
- result = htmlmin.minify(result)
63
+ result = minify_html.minify(result)
79
64
  compress_rate = round(len(content) / len(result) * 100)
80
65
  print(f"html压缩比=> {compress_rate}%")
81
66
  if not only_text:
@@ -1,10 +0,0 @@
1
- mcp_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- mcp_tools/dp_tools.py,sha256=PwLd1zTFIQ673-cZjdON4TfU854_h5BgLPOVRbt_kVw,8349
3
- mcp_tools/main.py,sha256=WO9kNpIORRrIOAWW8jiAd3gNW6rFMExln8y4CquKrM8,837
4
- tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- tools/browser_manager.py,sha256=AM9hIQKtgMVxIZsEPxfHj9q41ZtzHrOS69wtgGBE3-Q,1458
6
- tools/tools.py,sha256=3vTMCT_h0eDPtOMHc2KnhNVpQBUs6jgIChutBZZFMK4,5008
7
- jarvis_brain-0.1.4.dist-info/METADATA,sha256=CPa_sjNrcHRhHvOXryp09mbbgIW3EY0AP_fT0PKCoNM,275
8
- jarvis_brain-0.1.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
9
- jarvis_brain-0.1.4.dist-info/entry_points.txt,sha256=YFQT4xpkUqt5dM5wlKPQQOqcjMuFrT9iuRAzIpAyH7U,51
10
- jarvis_brain-0.1.4.dist-info/RECORD,,