Jarvis-Brain 0.1.4.1__tar.gz → 0.1.4.3__tar.gz
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.
- jarvis_brain-0.1.4.1/.idea/JARVIS.iml → jarvis_brain-0.1.4.3/.idea/Jarvis-mcp.iml +2 -2
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/.idea/misc.xml +2 -2
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/.idea/modules.xml +1 -1
- jarvis_brain-0.1.4.3/.idea/workspace.xml +81 -0
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/PKG-INFO +2 -4
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/mcp_tools/dp_tools.py +7 -18
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/mcp_tools/main.py +0 -1
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/pyproject.toml +3 -6
- jarvis_brain-0.1.4.3/tools/task_manager.py +42 -0
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/tools/tools.py +0 -15
- jarvis_brain-0.1.4.1/.idea/workspace.xml +0 -235
- jarvis_brain-0.1.4.1/task_router/1.py +0 -137
- jarvis_brain-0.1.4.1/tools/__init__.py +0 -0
- jarvis_brain-0.1.4.1/uv.lock +0 -1818
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/.idea/.gitignore +0 -0
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/mcp_tools/__init__.py +0 -0
- {jarvis_brain-0.1.4.1/task_router → jarvis_brain-0.1.4.3/tools}/__init__.py +0 -0
- {jarvis_brain-0.1.4.1 → jarvis_brain-0.1.4.3}/tools/browser_manager.py +0 -0
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
<module type="PYTHON_MODULE" version="4">
|
|
3
3
|
<component name="NewModuleRootManager">
|
|
4
4
|
<content url="file://$MODULE_DIR$">
|
|
5
|
-
<excludeFolder url="file://$MODULE_DIR$/.
|
|
5
|
+
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
|
6
6
|
</content>
|
|
7
|
-
<orderEntry type="jdk" jdkName="Python 3.11
|
|
7
|
+
<orderEntry type="jdk" jdkName="Python 3.11 (Jarvis-mcp)" jdkType="Python SDK" />
|
|
8
8
|
<orderEntry type="sourceFolder" forTests="false" />
|
|
9
9
|
</component>
|
|
10
10
|
</module>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<project version="4">
|
|
3
3
|
<component name="Black">
|
|
4
|
-
<option name="sdkName" value="Python 3.11" />
|
|
4
|
+
<option name="sdkName" value="Python 3.11 (Jarvis-mcp)" />
|
|
5
5
|
</component>
|
|
6
|
-
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11
|
|
6
|
+
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (Jarvis-mcp)" project-jdk-type="Python SDK" />
|
|
7
7
|
</project>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<project version="4">
|
|
3
3
|
<component name="ProjectModuleManager">
|
|
4
4
|
<modules>
|
|
5
|
-
<module fileurl="file://$PROJECT_DIR$/.idea/
|
|
5
|
+
<module fileurl="file://$PROJECT_DIR$/.idea/Jarvis-mcp.iml" filepath="$PROJECT_DIR$/.idea/Jarvis-mcp.iml" />
|
|
6
6
|
</modules>
|
|
7
7
|
</component>
|
|
8
8
|
</project>
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="AutoImportSettings">
|
|
4
|
+
<option name="autoReloadType" value="SELECTIVE" />
|
|
5
|
+
</component>
|
|
6
|
+
<component name="ChangeListManager">
|
|
7
|
+
<list default="true" id="aa65bdb1-d587-475c-9912-fe658c64e81f" name="更改" comment="" />
|
|
8
|
+
<option name="SHOW_DIALOG" value="false" />
|
|
9
|
+
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
10
|
+
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
|
11
|
+
<option name="LAST_RESOLUTION" value="IGNORE" />
|
|
12
|
+
</component>
|
|
13
|
+
<component name="ProjectColorInfo"><![CDATA[{
|
|
14
|
+
"associatedIndex": 5
|
|
15
|
+
}]]></component>
|
|
16
|
+
<component name="ProjectId" id="373bT3AjZAGIdWM4eLxsq1uFlgA" />
|
|
17
|
+
<component name="ProjectViewState">
|
|
18
|
+
<option name="hideEmptyMiddlePackages" value="true" />
|
|
19
|
+
<option name="showLibraryContents" value="true" />
|
|
20
|
+
</component>
|
|
21
|
+
<component name="PropertiesComponent"><![CDATA[{
|
|
22
|
+
"keyToString": {
|
|
23
|
+
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
|
24
|
+
"Python.main.executor": "Run",
|
|
25
|
+
"RunOnceActivity.ShowReadmeOnStart": "true",
|
|
26
|
+
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
|
|
27
|
+
"last_opened_file_path": "/Users/user/PycharmProjects/Jarvis-mcp"
|
|
28
|
+
}
|
|
29
|
+
}]]></component>
|
|
30
|
+
<component name="RecentsManager">
|
|
31
|
+
<key name="CopyFile.RECENT_KEYS">
|
|
32
|
+
<recent name="$PROJECT_DIR$" />
|
|
33
|
+
</key>
|
|
34
|
+
</component>
|
|
35
|
+
<component name="RunManager">
|
|
36
|
+
<configuration name="main" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
|
37
|
+
<module name="Jarvis-mcp" />
|
|
38
|
+
<option name="ENV_FILES" value="" />
|
|
39
|
+
<option name="INTERPRETER_OPTIONS" value="" />
|
|
40
|
+
<option name="PARENT_ENVS" value="true" />
|
|
41
|
+
<envs>
|
|
42
|
+
<env name="PYTHONUNBUFFERED" value="1" />
|
|
43
|
+
</envs>
|
|
44
|
+
<option name="SDK_HOME" value="" />
|
|
45
|
+
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/mcp_tools" />
|
|
46
|
+
<option name="IS_MODULE_SDK" value="true" />
|
|
47
|
+
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
48
|
+
<option name="ADD_SOURCE_ROOTS" value="true" />
|
|
49
|
+
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/mcp_tools/main.py" />
|
|
50
|
+
<option name="PARAMETERS" value="" />
|
|
51
|
+
<option name="SHOW_COMMAND_LINE" value="false" />
|
|
52
|
+
<option name="EMULATE_TERMINAL" value="false" />
|
|
53
|
+
<option name="MODULE_MODE" value="false" />
|
|
54
|
+
<option name="REDIRECT_INPUT" value="false" />
|
|
55
|
+
<option name="INPUT_FILE" value="" />
|
|
56
|
+
<method v="2" />
|
|
57
|
+
</configuration>
|
|
58
|
+
<recent_temporary>
|
|
59
|
+
<list>
|
|
60
|
+
<item itemvalue="Python.main" />
|
|
61
|
+
</list>
|
|
62
|
+
</recent_temporary>
|
|
63
|
+
</component>
|
|
64
|
+
<component name="SharedIndexes">
|
|
65
|
+
<attachedChunks>
|
|
66
|
+
<set>
|
|
67
|
+
<option value="bundled-python-sdk-b3d66beaba9a-c6efb3732140-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-252.26199.168" />
|
|
68
|
+
</set>
|
|
69
|
+
</attachedChunks>
|
|
70
|
+
</component>
|
|
71
|
+
<component name="TaskManager">
|
|
72
|
+
<task active="true" id="Default" summary="默认任务">
|
|
73
|
+
<changelist id="aa65bdb1-d587-475c-9912-fe658c64e81f" name="更改" comment="" />
|
|
74
|
+
<created>1766134705717</created>
|
|
75
|
+
<option name="number" value="Default" />
|
|
76
|
+
<option name="presentableId" value="Default" />
|
|
77
|
+
<updated>1766134705717</updated>
|
|
78
|
+
</task>
|
|
79
|
+
<servers />
|
|
80
|
+
</component>
|
|
81
|
+
</project>
|
|
@@ -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.4.3
|
|
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
10
|
Requires-Dist: htmlmin
|
|
11
|
-
Requires-Dist: jieba
|
|
12
|
-
Requires-Dist: simhash
|
|
@@ -149,21 +149,10 @@ def register_assert_waf(mcp: FastMCP, browser_manager):
|
|
|
149
149
|
head_headless_rate_difference=h_hless_rate_diff
|
|
150
150
|
)
|
|
151
151
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
)
|
|
152
|
+
# def register_highlight_element_captcha(mcp: FastMCP, browser_manager):
|
|
153
|
+
# @mcp.tool(name="highlight_element_captcha",
|
|
154
|
+
# description="将传入的Selector在页面上高亮,并截屏")
|
|
155
|
+
# async def highlight_element_captcha(browser_port: int, tab_id: str, selector: str) -> dict[str, Any]:
|
|
156
|
+
# _browser = browser_manager.get_browser(browser_port)
|
|
157
|
+
# tab = _browser.get_tab(tab_id)
|
|
158
|
+
# tab.ele
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "Jarvis_Brain" # 别人下载时用的名字,必须在 PyPI 上唯一
|
|
3
|
-
version = "0.1.4.
|
|
4
|
-
description = "Jarvis brain"
|
|
3
|
+
version = "0.1.4.3"
|
|
4
|
+
description = "Jarvis brain mcp"
|
|
5
5
|
dependencies = [
|
|
6
6
|
"fastmcp",
|
|
7
7
|
"DrissionPage",
|
|
8
8
|
"htmlmin",
|
|
9
|
-
"jieba",
|
|
10
|
-
"simhash",
|
|
11
9
|
"beautifulsoup4",
|
|
12
10
|
"curl_cffi"
|
|
13
11
|
]
|
|
@@ -29,6 +27,5 @@ exclude = [
|
|
|
29
27
|
".venv",
|
|
30
28
|
"env",
|
|
31
29
|
".env",
|
|
32
|
-
"*.pyc"
|
|
33
|
-
"dp_test"
|
|
30
|
+
"*.pyc"
|
|
34
31
|
]
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
|
|
3
|
+
from typing import Callable, List
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class SimpleTaskManager:
|
|
7
|
+
def __init__(self, max_concurrent: int = 10):
|
|
8
|
+
self.semaphore = asyncio.Semaphore(max_concurrent)
|
|
9
|
+
self.results = []
|
|
10
|
+
|
|
11
|
+
async def execute_task(self, task_id: int, coro_func: Callable, *args, **kwargs):
|
|
12
|
+
"""执行单个任务"""
|
|
13
|
+
async with self.semaphore:
|
|
14
|
+
try:
|
|
15
|
+
result = await coro_func(*args, **kwargs)
|
|
16
|
+
self.results.append((task_id, result))
|
|
17
|
+
print(f"✅ 任务 {task_id} 完成")
|
|
18
|
+
distribution_after_hook(*result)
|
|
19
|
+
return result
|
|
20
|
+
except Exception as e:
|
|
21
|
+
error_msg = f"任务 {task_id} 失败: {e}"
|
|
22
|
+
self.results.append((task_id, error_msg))
|
|
23
|
+
print(f"❌ {error_msg}")
|
|
24
|
+
return None
|
|
25
|
+
|
|
26
|
+
async def process_all(self, tasks: List[tuple]):
|
|
27
|
+
"""
|
|
28
|
+
处理所有任务
|
|
29
|
+
tasks: 列表,每个元素是 (coro_func, args, kwargs) 元组
|
|
30
|
+
"""
|
|
31
|
+
print(f"🚀 开始处理 {len(tasks)} 个任务,最大并发数: {self.semaphore._value}")
|
|
32
|
+
|
|
33
|
+
# 创建所有任务
|
|
34
|
+
task_coroutines = []
|
|
35
|
+
for i, (coro_func, args, kwargs) in enumerate(tasks):
|
|
36
|
+
task_coroutines.append(self.execute_task(i, coro_func, *args, **kwargs))
|
|
37
|
+
|
|
38
|
+
# 并发执行所有任务
|
|
39
|
+
await asyncio.gather(*task_coroutines)
|
|
40
|
+
|
|
41
|
+
print(f"🎉 所有任务完成!成功: {len([r for r in self.results if '失败' not in str(r[1])])}")
|
|
42
|
+
return self.results
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import time
|
|
2
|
-
import json
|
|
3
2
|
|
|
4
3
|
import htmlmin
|
|
5
4
|
from curl_cffi import requests
|
|
@@ -8,26 +7,12 @@ from bs4 import BeautifulSoup
|
|
|
8
7
|
from DrissionPage import ChromiumPage, ChromiumOptions
|
|
9
8
|
|
|
10
9
|
|
|
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
|
-
|
|
22
|
-
|
|
23
10
|
# 使用requests获取html,用于测试是否使用了瑞数和jsl
|
|
24
11
|
def requests_html(url):
|
|
25
12
|
headers = {
|
|
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
|
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<project version="4">
|
|
3
|
-
<component name="AutoImportSettings">
|
|
4
|
-
<option name="autoReloadType" value="SELECTIVE" />
|
|
5
|
-
</component>
|
|
6
|
-
<component name="ChangeListManager">
|
|
7
|
-
<list default="true" id="48f45da2-6f17-4816-bf1f-550bdfd85a24" name="更改" comment="" />
|
|
8
|
-
<option name="SHOW_DIALOG" value="false" />
|
|
9
|
-
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
10
|
-
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
|
11
|
-
<option name="LAST_RESOLUTION" value="IGNORE" />
|
|
12
|
-
</component>
|
|
13
|
-
<component name="FileTemplateManagerImpl">
|
|
14
|
-
<option name="RECENT_TEMPLATES">
|
|
15
|
-
<list>
|
|
16
|
-
<option value="HTML File" />
|
|
17
|
-
<option value="Python Script" />
|
|
18
|
-
</list>
|
|
19
|
-
</option>
|
|
20
|
-
</component>
|
|
21
|
-
<component name="ProjectColorInfo">{
|
|
22
|
-
"associatedIndex": 2
|
|
23
|
-
}</component>
|
|
24
|
-
<component name="ProjectId" id="36XmbdAFsWIzfZcWGNEiaubrkQv" />
|
|
25
|
-
<component name="ProjectViewState">
|
|
26
|
-
<option name="hideEmptyMiddlePackages" value="true" />
|
|
27
|
-
<option name="showLibraryContents" value="true" />
|
|
28
|
-
</component>
|
|
29
|
-
<component name="PropertiesComponent"><![CDATA[{
|
|
30
|
-
"keyToString": {
|
|
31
|
-
"DefaultHtmlFileTemplate": "HTML File",
|
|
32
|
-
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
|
33
|
-
"Python.1 (1).executor": "Run",
|
|
34
|
-
"Python.1 (2).executor": "Run",
|
|
35
|
-
"Python.1.executor": "Run",
|
|
36
|
-
"Python.2.executor": "Run",
|
|
37
|
-
"Python.3.executor": "Run",
|
|
38
|
-
"Python.__init__.executor": "Run",
|
|
39
|
-
"Python.dp_tools (1).executor": "Run",
|
|
40
|
-
"Python.dp_tools.executor": "Run",
|
|
41
|
-
"Python.main.executor": "Run",
|
|
42
|
-
"Python.requests_tools.executor": "Run",
|
|
43
|
-
"Python.simhash.executor": "Run",
|
|
44
|
-
"Python.simhash_tools.executor": "Run",
|
|
45
|
-
"Python.tools.executor": "Run",
|
|
46
|
-
"RunOnceActivity.ShowReadmeOnStart": "true",
|
|
47
|
-
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
|
|
48
|
-
"last_opened_file_path": "/Users/user/PycharmProjects/JARVIS/mcp_tools",
|
|
49
|
-
"settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable"
|
|
50
|
-
}
|
|
51
|
-
}]]></component>
|
|
52
|
-
<component name="RecentsManager">
|
|
53
|
-
<key name="CopyFile.RECENT_KEYS">
|
|
54
|
-
<recent name="$PROJECT_DIR$/mcp_tools" />
|
|
55
|
-
<recent name="$PROJECT_DIR$" />
|
|
56
|
-
</key>
|
|
57
|
-
<key name="MoveFile.RECENT_KEYS">
|
|
58
|
-
<recent name="$PROJECT_DIR$" />
|
|
59
|
-
<recent name="$PROJECT_DIR$/tools" />
|
|
60
|
-
<recent name="$PROJECT_DIR$/src/mcp_tools" />
|
|
61
|
-
<recent name="$PROJECT_DIR$/src" />
|
|
62
|
-
</key>
|
|
63
|
-
</component>
|
|
64
|
-
<component name="RunManager" selected="Python.__init__">
|
|
65
|
-
<configuration name="1 (2)" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
|
66
|
-
<module name="JARVIS" />
|
|
67
|
-
<option name="ENV_FILES" value="" />
|
|
68
|
-
<option name="INTERPRETER_OPTIONS" value="" />
|
|
69
|
-
<option name="PARENT_ENVS" value="true" />
|
|
70
|
-
<envs>
|
|
71
|
-
<env name="PYTHONUNBUFFERED" value="1" />
|
|
72
|
-
</envs>
|
|
73
|
-
<option name="SDK_HOME" value="" />
|
|
74
|
-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/dp_test" />
|
|
75
|
-
<option name="IS_MODULE_SDK" value="true" />
|
|
76
|
-
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
77
|
-
<option name="ADD_SOURCE_ROOTS" value="true" />
|
|
78
|
-
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/dp_test/1.py" />
|
|
79
|
-
<option name="PARAMETERS" value="" />
|
|
80
|
-
<option name="SHOW_COMMAND_LINE" value="false" />
|
|
81
|
-
<option name="EMULATE_TERMINAL" value="false" />
|
|
82
|
-
<option name="MODULE_MODE" value="false" />
|
|
83
|
-
<option name="REDIRECT_INPUT" value="false" />
|
|
84
|
-
<option name="INPUT_FILE" value="" />
|
|
85
|
-
<method v="2" />
|
|
86
|
-
</configuration>
|
|
87
|
-
<configuration name="1" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
|
88
|
-
<module name="JARVIS" />
|
|
89
|
-
<option name="ENV_FILES" value="" />
|
|
90
|
-
<option name="INTERPRETER_OPTIONS" value="" />
|
|
91
|
-
<option name="PARENT_ENVS" value="true" />
|
|
92
|
-
<envs>
|
|
93
|
-
<env name="PYTHONUNBUFFERED" value="1" />
|
|
94
|
-
</envs>
|
|
95
|
-
<option name="SDK_HOME" value="" />
|
|
96
|
-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/task_router" />
|
|
97
|
-
<option name="IS_MODULE_SDK" value="true" />
|
|
98
|
-
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
99
|
-
<option name="ADD_SOURCE_ROOTS" value="true" />
|
|
100
|
-
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/task_router/1.py" />
|
|
101
|
-
<option name="PARAMETERS" value="" />
|
|
102
|
-
<option name="SHOW_COMMAND_LINE" value="false" />
|
|
103
|
-
<option name="EMULATE_TERMINAL" value="false" />
|
|
104
|
-
<option name="MODULE_MODE" value="false" />
|
|
105
|
-
<option name="REDIRECT_INPUT" value="false" />
|
|
106
|
-
<option name="INPUT_FILE" value="" />
|
|
107
|
-
<method v="2" />
|
|
108
|
-
</configuration>
|
|
109
|
-
<configuration name="2" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
|
110
|
-
<module name="JARVIS" />
|
|
111
|
-
<option name="ENV_FILES" value="" />
|
|
112
|
-
<option name="INTERPRETER_OPTIONS" value="" />
|
|
113
|
-
<option name="PARENT_ENVS" value="true" />
|
|
114
|
-
<envs>
|
|
115
|
-
<env name="PYTHONUNBUFFERED" value="1" />
|
|
116
|
-
</envs>
|
|
117
|
-
<option name="SDK_HOME" value="" />
|
|
118
|
-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/task_router" />
|
|
119
|
-
<option name="IS_MODULE_SDK" value="true" />
|
|
120
|
-
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
121
|
-
<option name="ADD_SOURCE_ROOTS" value="true" />
|
|
122
|
-
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/task_router/2.py" />
|
|
123
|
-
<option name="PARAMETERS" value="" />
|
|
124
|
-
<option name="SHOW_COMMAND_LINE" value="false" />
|
|
125
|
-
<option name="EMULATE_TERMINAL" value="false" />
|
|
126
|
-
<option name="MODULE_MODE" value="false" />
|
|
127
|
-
<option name="REDIRECT_INPUT" value="false" />
|
|
128
|
-
<option name="INPUT_FILE" value="" />
|
|
129
|
-
<method v="2" />
|
|
130
|
-
</configuration>
|
|
131
|
-
<configuration name="__init__" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
|
132
|
-
<module name="JARVIS" />
|
|
133
|
-
<option name="ENV_FILES" value="" />
|
|
134
|
-
<option name="INTERPRETER_OPTIONS" value="" />
|
|
135
|
-
<option name="PARENT_ENVS" value="true" />
|
|
136
|
-
<envs>
|
|
137
|
-
<env name="PYTHONUNBUFFERED" value="1" />
|
|
138
|
-
</envs>
|
|
139
|
-
<option name="SDK_HOME" value="" />
|
|
140
|
-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tools" />
|
|
141
|
-
<option name="IS_MODULE_SDK" value="true" />
|
|
142
|
-
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
143
|
-
<option name="ADD_SOURCE_ROOTS" value="true" />
|
|
144
|
-
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tools/__init__.py" />
|
|
145
|
-
<option name="PARAMETERS" value="" />
|
|
146
|
-
<option name="SHOW_COMMAND_LINE" value="false" />
|
|
147
|
-
<option name="EMULATE_TERMINAL" value="false" />
|
|
148
|
-
<option name="MODULE_MODE" value="false" />
|
|
149
|
-
<option name="REDIRECT_INPUT" value="false" />
|
|
150
|
-
<option name="INPUT_FILE" value="" />
|
|
151
|
-
<method v="2" />
|
|
152
|
-
</configuration>
|
|
153
|
-
<configuration name="dp_tools (1)" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
|
154
|
-
<module name="JARVIS" />
|
|
155
|
-
<option name="ENV_FILES" value="" />
|
|
156
|
-
<option name="INTERPRETER_OPTIONS" value="" />
|
|
157
|
-
<option name="PARENT_ENVS" value="true" />
|
|
158
|
-
<envs>
|
|
159
|
-
<env name="PYTHONUNBUFFERED" value="1" />
|
|
160
|
-
</envs>
|
|
161
|
-
<option name="SDK_HOME" value="" />
|
|
162
|
-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/mcp_tools" />
|
|
163
|
-
<option name="IS_MODULE_SDK" value="true" />
|
|
164
|
-
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
165
|
-
<option name="ADD_SOURCE_ROOTS" value="true" />
|
|
166
|
-
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/mcp_tools/dp_tools.py" />
|
|
167
|
-
<option name="PARAMETERS" value="" />
|
|
168
|
-
<option name="SHOW_COMMAND_LINE" value="false" />
|
|
169
|
-
<option name="EMULATE_TERMINAL" value="false" />
|
|
170
|
-
<option name="MODULE_MODE" value="false" />
|
|
171
|
-
<option name="REDIRECT_INPUT" value="false" />
|
|
172
|
-
<option name="INPUT_FILE" value="" />
|
|
173
|
-
<method v="2" />
|
|
174
|
-
</configuration>
|
|
175
|
-
<configuration name="dp_tools" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
|
|
176
|
-
<module name="JARVIS" />
|
|
177
|
-
<option name="ENV_FILES" value="" />
|
|
178
|
-
<option name="INTERPRETER_OPTIONS" value="" />
|
|
179
|
-
<option name="PARENT_ENVS" value="true" />
|
|
180
|
-
<envs>
|
|
181
|
-
<env name="PYTHONUNBUFFERED" value="1" />
|
|
182
|
-
</envs>
|
|
183
|
-
<option name="SDK_HOME" value="" />
|
|
184
|
-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
|
185
|
-
<option name="IS_MODULE_SDK" value="true" />
|
|
186
|
-
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
187
|
-
<option name="ADD_SOURCE_ROOTS" value="true" />
|
|
188
|
-
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/mcp_tools/dp_tools.py" />
|
|
189
|
-
<option name="PARAMETERS" value="" />
|
|
190
|
-
<option name="SHOW_COMMAND_LINE" value="false" />
|
|
191
|
-
<option name="EMULATE_TERMINAL" value="false" />
|
|
192
|
-
<option name="MODULE_MODE" value="false" />
|
|
193
|
-
<option name="REDIRECT_INPUT" value="false" />
|
|
194
|
-
<option name="INPUT_FILE" value="" />
|
|
195
|
-
<method v="2" />
|
|
196
|
-
</configuration>
|
|
197
|
-
<recent_temporary>
|
|
198
|
-
<list>
|
|
199
|
-
<item itemvalue="Python.__init__" />
|
|
200
|
-
<item itemvalue="Python.2" />
|
|
201
|
-
<item itemvalue="Python.1 (2)" />
|
|
202
|
-
<item itemvalue="Python.1" />
|
|
203
|
-
<item itemvalue="Python.dp_tools (1)" />
|
|
204
|
-
</list>
|
|
205
|
-
</recent_temporary>
|
|
206
|
-
</component>
|
|
207
|
-
<component name="SharedIndexes">
|
|
208
|
-
<attachedChunks>
|
|
209
|
-
<set>
|
|
210
|
-
<option value="bundled-python-sdk-b3d66beaba9a-c6efb3732140-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-252.26199.168" />
|
|
211
|
-
</set>
|
|
212
|
-
</attachedChunks>
|
|
213
|
-
</component>
|
|
214
|
-
<component name="TaskManager">
|
|
215
|
-
<task active="true" id="Default" summary="默认任务">
|
|
216
|
-
<changelist id="48f45da2-6f17-4816-bf1f-550bdfd85a24" name="更改" comment="" />
|
|
217
|
-
<created>1765161362680</created>
|
|
218
|
-
<option name="number" value="Default" />
|
|
219
|
-
<option name="presentableId" value="Default" />
|
|
220
|
-
<updated>1765161362680</updated>
|
|
221
|
-
</task>
|
|
222
|
-
<servers />
|
|
223
|
-
</component>
|
|
224
|
-
<component name="XDebuggerManager">
|
|
225
|
-
<breakpoint-manager>
|
|
226
|
-
<breakpoints>
|
|
227
|
-
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
|
228
|
-
<url>file://$PROJECT_DIR$/tools/tools.py</url>
|
|
229
|
-
<line>17</line>
|
|
230
|
-
<option name="timeStamp" value="1" />
|
|
231
|
-
</line-breakpoint>
|
|
232
|
-
</breakpoints>
|
|
233
|
-
</breakpoint-manager>
|
|
234
|
-
</component>
|
|
235
|
-
</project>
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
import os.path
|
|
3
|
-
from typing import Callable, List
|
|
4
|
-
import json
|
|
5
|
-
|
|
6
|
-
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
|
|
7
|
-
|
|
8
|
-
base_cwd = "/Users/user/PycharmProjects/JARVIS"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class SimpleTaskManager:
|
|
12
|
-
def __init__(self, max_concurrent: int = 10):
|
|
13
|
-
self.semaphore = asyncio.Semaphore(max_concurrent)
|
|
14
|
-
self.results = []
|
|
15
|
-
|
|
16
|
-
async def execute_task(self, task_id: int, coro_func: Callable, *args, **kwargs):
|
|
17
|
-
"""执行单个任务"""
|
|
18
|
-
async with self.semaphore:
|
|
19
|
-
try:
|
|
20
|
-
result = await coro_func(*args, **kwargs)
|
|
21
|
-
self.results.append((task_id, result))
|
|
22
|
-
print(f"✅ 任务 {task_id} 完成")
|
|
23
|
-
return result
|
|
24
|
-
except Exception as e:
|
|
25
|
-
error_msg = f"任务 {task_id} 失败: {e}"
|
|
26
|
-
self.results.append((task_id, error_msg))
|
|
27
|
-
print(f"❌ {error_msg}")
|
|
28
|
-
return None
|
|
29
|
-
|
|
30
|
-
async def process_all(self, tasks: List[tuple]):
|
|
31
|
-
"""
|
|
32
|
-
处理所有任务
|
|
33
|
-
tasks: 列表,每个元素是 (coro_func, args, kwargs) 元组
|
|
34
|
-
"""
|
|
35
|
-
print(f"🚀 开始处理 {len(tasks)} 个任务,最大并发数: {self.semaphore._value}")
|
|
36
|
-
|
|
37
|
-
# 创建所有任务
|
|
38
|
-
task_coroutines = []
|
|
39
|
-
for i, (coro_func, args, kwargs) in enumerate(tasks):
|
|
40
|
-
task_coroutines.append(self.execute_task(i, coro_func, *args, **kwargs))
|
|
41
|
-
|
|
42
|
-
# 并发执行所有任务
|
|
43
|
-
await asyncio.gather(*task_coroutines)
|
|
44
|
-
|
|
45
|
-
print(f"🎉 所有任务完成!成功: {len([r for r in self.results if '失败' not in str(r[1])])}")
|
|
46
|
-
return self.results
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
options = ClaudeAgentOptions(
|
|
50
|
-
permission_mode='bypassPermissions',
|
|
51
|
-
cwd=base_cwd,
|
|
52
|
-
mcp_servers={
|
|
53
|
-
"JarvisNode": {
|
|
54
|
-
"command": "uv",
|
|
55
|
-
"args": [
|
|
56
|
-
"run",
|
|
57
|
-
"--directory",
|
|
58
|
-
"/Users/user/PycharmProjects/JARVIS/mcp_tools",
|
|
59
|
-
"main.py"
|
|
60
|
-
],
|
|
61
|
-
"env": {
|
|
62
|
-
"MCP_MODULES": "TeamNode-Dp,JarvisNode",
|
|
63
|
-
"BASE_CWD": os.getcwd(),
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
# setting_sources=["project"],
|
|
68
|
-
allowed_tools=[
|
|
69
|
-
"mcp__JarvisNode__get_html",
|
|
70
|
-
"mcp__JarvisNode__visit_url",
|
|
71
|
-
"mcp__JarvisNode__get_new_tab",
|
|
72
|
-
"mcp__JarvisNode__switch_tab",
|
|
73
|
-
"mcp__JarvisNode__close_tab",
|
|
74
|
-
"mcp__JarvisNode__check_selector",
|
|
75
|
-
"mcp__JarvisNode__assert_waf", # 判断传入的url是否使用了瑞数,jsl等防火墙
|
|
76
|
-
'Read',
|
|
77
|
-
'Write',
|
|
78
|
-
'Edit',
|
|
79
|
-
'MultiEdit',
|
|
80
|
-
'Grep',
|
|
81
|
-
'Glob',
|
|
82
|
-
'TodoWrite'
|
|
83
|
-
]
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
# 使用自定义工具与 Claude
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
async def run(url):
|
|
91
|
-
from urllib.parse import urlparse
|
|
92
|
-
print(f"开始任务:{url}")
|
|
93
|
-
parser = urlparse(url)
|
|
94
|
-
domain = parser.netloc
|
|
95
|
-
analysis_file_path = os.path.join(base_cwd, f'{domain}.json')
|
|
96
|
-
async with ClaudeSDKClient(options=options) as client:
|
|
97
|
-
# prompt = f"请使用mcp工具打开网页:{url}"
|
|
98
|
-
prompt = f"""请使用mcp工具告诉我网页{url},是否存在waf,以及是否为静态网页,分析完成后关闭浏览器。
|
|
99
|
-
将分析结果存放在{analysis_file_path}中。
|
|
100
|
-
json文件的格式为:
|
|
101
|
-
{{
|
|
102
|
-
"url": "http://www.customs.gov.cn/customs/xwfb34/302425/index.html",
|
|
103
|
-
"site_name": "今日海关"
|
|
104
|
-
"recommend_team": recommend_team
|
|
105
|
-
"raw_head_rate_difference": raw_head_rate_difference,
|
|
106
|
-
"raw_headless_rate_difference": raw_headless_rate_difference,
|
|
107
|
-
"head_headless_rate_difference": head_headless_rate_difference
|
|
108
|
-
}}
|
|
109
|
-
"""
|
|
110
|
-
# prompt = f"请列出所有你可以使用的mcp工具"
|
|
111
|
-
await client.query(prompt)
|
|
112
|
-
|
|
113
|
-
# 提取并打印响应
|
|
114
|
-
async for msg in client.receive_response():
|
|
115
|
-
print(msg)
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
async def main():
|
|
119
|
-
tasks = []
|
|
120
|
-
# with open("/Users/user/Desktop/mapping_copy.json", "r", encoding="utf-8") as f:
|
|
121
|
-
with open("/Users/user/Desktop/政务项目/mapping.json", "r", encoding="utf-8") as f:
|
|
122
|
-
mapping = json.load(f)
|
|
123
|
-
mapping = dict(list(mapping.items()))
|
|
124
|
-
for key, value in mapping.items():
|
|
125
|
-
tasks.append((run, (), { # 关键字参数字典
|
|
126
|
-
"url": value,
|
|
127
|
-
}))
|
|
128
|
-
manager = SimpleTaskManager(max_concurrent=5)
|
|
129
|
-
results = await manager.process_all(tasks)
|
|
130
|
-
# 输出结果
|
|
131
|
-
print("\n任务结果摘要:")
|
|
132
|
-
for task_id, result in results[:5]: # 只显示前5个
|
|
133
|
-
print(f" 任务 {task_id}: {result}")
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if __name__ == "__main__":
|
|
137
|
-
asyncio.run(main())
|
|
File without changes
|