torbot 4.3.0__tar.gz → 4.3.1__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.
- torbot-4.3.1/.github/workflows/flake8.yml +33 -0
- torbot-4.3.1/.github/workflows/pytest.yml +37 -0
- {torbot-4.3.0 → torbot-4.3.1}/PKG-INFO +32 -5
- {torbot-4.3.0 → torbot-4.3.1}/README.md +29 -1
- torbot-4.3.1/docs/ANALYST.md +82 -0
- {torbot-4.3.0 → torbot-4.3.1}/docs/CHANGELOG.md +19 -0
- torbot-4.3.1/docs/CRAWL_RESULT.md +41 -0
- {torbot-4.3.0 → torbot-4.3.1}/pyproject.toml +5 -3
- {torbot-4.3.0 → torbot-4.3.1}/requirements.txt +5 -5
- torbot-4.3.1/schemas/crawl-result.v1.schema.json +33 -0
- torbot-4.3.1/schemas/investigation-report.v1.schema.json +26 -0
- torbot-4.3.1/src/torbot/analyst.py +486 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/cli.py +82 -3
- torbot-4.3.1/src/torbot/crawl_result.py +193 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/linktree.py +65 -3
- torbot-4.3.1/tests/fixtures/analyst-safe-crawl.json +34 -0
- torbot-4.3.1/tests/fixtures/gotor-v1-success.json +13 -0
- torbot-4.3.1/tests/fixtures/torbot-v1-cancelled.json +1 -0
- torbot-4.3.1/tests/fixtures/torbot-v1-invalid.json +1 -0
- torbot-4.3.1/tests/fixtures/torbot-v1-partial.json +1 -0
- torbot-4.3.1/tests/fixtures/torbot-v1-skipped.json +1 -0
- torbot-4.3.1/tests/test_analyst.py +182 -0
- {torbot-4.3.0 → torbot-4.3.1}/tests/test_cli_and_crawler.py +20 -0
- torbot-4.3.1/tests/test_crawl_result.py +83 -0
- torbot-4.3.1/tests/test_export_paths.py +38 -0
- torbot-4.3.0/.env +0 -1
- torbot-4.3.0/.github/workflows/flake8.yml +0 -26
- torbot-4.3.0/.github/workflows/pytest.yml +0 -34
- {torbot-4.3.0 → torbot-4.3.1}/.flake8 +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/.gitattributes +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/.github/FUNDING.yml +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/.github/pull_request_template.md +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/.gitignore +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/CITATION.cff +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/Dockerfile +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/LICENSE.md +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/TESTING.md +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/docs/CODE_OF_CONDUCT.md +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/docs/DESKTOP_APP.md +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/docs/Tor.md +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/main.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/run_tests.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/scripts/build.sh +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/scripts/install.sh +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/scripts/publish.sh +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/scripts/remove.sh +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/scripts/update-requirements.sh +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/__init__.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/__init__.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/api.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/app_launcher.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/color.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/config.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/info.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/nlp/README.md +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/nlp/__init__.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/nlp/gather_data.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/nlp/main.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/nlp/website_classification.csv +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/updater.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/tests/__init__.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/tests/conftest.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/tests/test_api.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/tests/test_linktree.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/tests/test_linktree_extra.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/tests/test_linktree_tree.py +0 -0
- {torbot-4.3.0 → torbot-4.3.1}/tests/test_nlp.py +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Flake8
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ "dev" ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ "dev" ]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
lint:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
strategy:
|
|
16
|
+
fail-fast: false
|
|
17
|
+
matrix:
|
|
18
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
19
|
+
steps:
|
|
20
|
+
- name: Check out repository
|
|
21
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
22
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
23
|
+
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
24
|
+
with:
|
|
25
|
+
python-version: ${{ matrix.python-version }}
|
|
26
|
+
cache: pip
|
|
27
|
+
cache-dependency-path: pyproject.toml
|
|
28
|
+
- name: Install dependencies
|
|
29
|
+
run: |
|
|
30
|
+
python -m pip install --upgrade pip
|
|
31
|
+
python -m pip install flake8
|
|
32
|
+
- name: Analysing the code with flake8
|
|
33
|
+
run: flake8 --per-file-ignores="__init__.py:F401" .
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: Pytest
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ "dev" ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ "dev" ]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
test:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
strategy:
|
|
16
|
+
fail-fast: false
|
|
17
|
+
matrix:
|
|
18
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- name: Check out repository
|
|
22
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
23
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
24
|
+
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
25
|
+
with:
|
|
26
|
+
python-version: ${{ matrix.python-version }}
|
|
27
|
+
cache: pip
|
|
28
|
+
cache-dependency-path: |
|
|
29
|
+
requirements.txt
|
|
30
|
+
pyproject.toml
|
|
31
|
+
- name: Install dependencies
|
|
32
|
+
run: |
|
|
33
|
+
python -m pip install --upgrade pip
|
|
34
|
+
python -m pip install -r requirements.txt
|
|
35
|
+
python -m pip install --no-deps -e .
|
|
36
|
+
- name: Test with pytest
|
|
37
|
+
run: pytest
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: torbot
|
|
3
|
-
Version: 4.3.
|
|
3
|
+
Version: 4.3.1
|
|
4
4
|
Summary: TorBot is an OSINT tool for the dark web.
|
|
5
5
|
Author-email: Akeem King <akeemtlking@gmail.com>, PS Narayanan <thepsnarayanan@gmail.com>
|
|
6
6
|
License-File: LICENSE.md
|
|
7
7
|
Classifier: Operating System :: OS Independent
|
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
|
9
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
10
9
|
Classifier: Programming Language :: Python :: 3.10
|
|
11
10
|
Classifier: Programming Language :: Python :: 3.11
|
|
12
11
|
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
-
Requires-Python: >=3.
|
|
12
|
+
Requires-Python: >=3.10
|
|
14
13
|
Requires-Dist: altgraph>=0.17.4
|
|
15
14
|
Requires-Dist: beautifulsoup4>=4.12.3
|
|
16
15
|
Requires-Dist: certifi>=2024.7.4
|
|
@@ -95,7 +94,7 @@ Description-Content-Type: text/markdown
|
|
|
95
94
|
|
|
96
95
|
### Dependencies
|
|
97
96
|
- Tor (Optional)
|
|
98
|
-
- Python 3.
|
|
97
|
+
- Python 3.10+
|
|
99
98
|
- pip
|
|
100
99
|
|
|
101
100
|
## Quick start
|
|
@@ -109,6 +108,16 @@ python -m pip install -r requirements.txt
|
|
|
109
108
|
python -m pip install -e .
|
|
110
109
|
```
|
|
111
110
|
|
|
111
|
+
### Install with OTinstaller (Linux)
|
|
112
|
+
[OTinstaller](https://github.com/OSINTVerseHQ/OTinstaller) is a third-party tool manager that installs the `torbot` PyPI release into its own virtualenv. It is not maintained by the TorBot team, so please report problems with it [on the OTinstaller tracker](https://github.com/OSINTVerseHQ/OTinstaller/issues).
|
|
113
|
+
```sh
|
|
114
|
+
pipx install otinstaller
|
|
115
|
+
otinstaller init
|
|
116
|
+
otinstaller install torbot
|
|
117
|
+
# url:... is passed to TorBot as -u; the other flags go through unchanged
|
|
118
|
+
otinstaller run torbot -- url:https://example.com --depth 2 --visualize table
|
|
119
|
+
```
|
|
120
|
+
|
|
112
121
|
### Run the CLI
|
|
113
122
|
```sh
|
|
114
123
|
python main.py --help
|
|
@@ -131,6 +140,24 @@ python main.py -u https://example.com --disable-socks5 --visualize tree
|
|
|
131
140
|
torbot app
|
|
132
141
|
```
|
|
133
142
|
|
|
143
|
+
### Evidence-first AI analysis
|
|
144
|
+
|
|
145
|
+
Save a versioned crawl result and turn it into a cited investigation bundle:
|
|
146
|
+
|
|
147
|
+
```sh
|
|
148
|
+
torbot --url https://example.com --disable-socks5 \
|
|
149
|
+
--save result --result-file crawl-result.json
|
|
150
|
+
torbot analyze crawl-result.json --provider ollama --model qwen3 \
|
|
151
|
+
--output investigation/
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Analyst defaults to a local Ollama endpoint. Remote OpenAI-compatible
|
|
155
|
+
providers require the explicit `--allow-remote` flag. Every supported finding
|
|
156
|
+
must cite captured evidence, and a provider outage never prevents the
|
|
157
|
+
deterministic evidence bundle from being written. See
|
|
158
|
+
[TorBot Analyst](docs/ANALYST.md) for the offline quick start, output formats,
|
|
159
|
+
privacy boundary, and schemas.
|
|
160
|
+
|
|
134
161
|
### Options
|
|
135
162
|
```text
|
|
136
163
|
usage: Gather and analyze data from Tor sites.
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
|
|
49
49
|
### Dependencies
|
|
50
50
|
- Tor (Optional)
|
|
51
|
-
- Python 3.
|
|
51
|
+
- Python 3.10+
|
|
52
52
|
- pip
|
|
53
53
|
|
|
54
54
|
## Quick start
|
|
@@ -62,6 +62,16 @@ python -m pip install -r requirements.txt
|
|
|
62
62
|
python -m pip install -e .
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
+
### Install with OTinstaller (Linux)
|
|
66
|
+
[OTinstaller](https://github.com/OSINTVerseHQ/OTinstaller) is a third-party tool manager that installs the `torbot` PyPI release into its own virtualenv. It is not maintained by the TorBot team, so please report problems with it [on the OTinstaller tracker](https://github.com/OSINTVerseHQ/OTinstaller/issues).
|
|
67
|
+
```sh
|
|
68
|
+
pipx install otinstaller
|
|
69
|
+
otinstaller init
|
|
70
|
+
otinstaller install torbot
|
|
71
|
+
# url:... is passed to TorBot as -u; the other flags go through unchanged
|
|
72
|
+
otinstaller run torbot -- url:https://example.com --depth 2 --visualize table
|
|
73
|
+
```
|
|
74
|
+
|
|
65
75
|
### Run the CLI
|
|
66
76
|
```sh
|
|
67
77
|
python main.py --help
|
|
@@ -84,6 +94,24 @@ python main.py -u https://example.com --disable-socks5 --visualize tree
|
|
|
84
94
|
torbot app
|
|
85
95
|
```
|
|
86
96
|
|
|
97
|
+
### Evidence-first AI analysis
|
|
98
|
+
|
|
99
|
+
Save a versioned crawl result and turn it into a cited investigation bundle:
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
torbot --url https://example.com --disable-socks5 \
|
|
103
|
+
--save result --result-file crawl-result.json
|
|
104
|
+
torbot analyze crawl-result.json --provider ollama --model qwen3 \
|
|
105
|
+
--output investigation/
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Analyst defaults to a local Ollama endpoint. Remote OpenAI-compatible
|
|
109
|
+
providers require the explicit `--allow-remote` flag. Every supported finding
|
|
110
|
+
must cite captured evidence, and a provider outage never prevents the
|
|
111
|
+
deterministic evidence bundle from being written. See
|
|
112
|
+
[TorBot Analyst](docs/ANALYST.md) for the offline quick start, output formats,
|
|
113
|
+
privacy boundary, and schemas.
|
|
114
|
+
|
|
87
115
|
### Options
|
|
88
116
|
```text
|
|
89
117
|
usage: Gather and analyze data from Tor sites.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# TorBot Analyst
|
|
2
|
+
|
|
3
|
+
TorBot Analyst turns a versioned crawl result into a local investigation
|
|
4
|
+
bundle. It records stable evidence IDs and content hashes, maps page and
|
|
5
|
+
contact relationships, and requires every supported finding to reference
|
|
6
|
+
captured evidence.
|
|
7
|
+
|
|
8
|
+
## Five-minute quick start
|
|
9
|
+
|
|
10
|
+
Create a deterministic report without an AI provider:
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
torbot analyze tests/fixtures/analyst-safe-crawl.json \
|
|
14
|
+
--provider none \
|
|
15
|
+
--keyword example \
|
|
16
|
+
--output investigation/
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The output contains:
|
|
20
|
+
|
|
21
|
+
- `report.md` with supported, conflicted, and unsupported findings
|
|
22
|
+
- `evidence.jsonl` with captured URLs, excerpts, timestamps, and hashes
|
|
23
|
+
- `graph.json` with evidence-linked page and contact relationships
|
|
24
|
+
- `run.json` with reproducibility metadata and provider warnings
|
|
25
|
+
|
|
26
|
+
## Capture a crawl result
|
|
27
|
+
|
|
28
|
+
The existing tree and JSON outputs are unchanged. Save the new versioned
|
|
29
|
+
result explicitly:
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
torbot --url https://example.com \
|
|
33
|
+
--disable-socks5 \
|
|
34
|
+
--save result \
|
|
35
|
+
--result-file crawl-result.json
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The versioned result contains bounded visible text, not raw HTML, scripts,
|
|
39
|
+
styles, cookies, headers, credentials, or arbitrary exception messages.
|
|
40
|
+
|
|
41
|
+
## Local AI analysis
|
|
42
|
+
|
|
43
|
+
Ollama is the default provider and is contacted only on localhost:
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
torbot analyze crawl-result.json \
|
|
47
|
+
--provider ollama \
|
|
48
|
+
--model qwen3 \
|
|
49
|
+
--output investigation/
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
If Ollama or the model is unavailable, TorBot still writes the deterministic
|
|
53
|
+
evidence bundle and records a warning in `run.json` and `report.md`.
|
|
54
|
+
|
|
55
|
+
## Remote OpenAI-compatible providers
|
|
56
|
+
|
|
57
|
+
Remote transmission is fail-closed. Both an explicit provider and
|
|
58
|
+
`--allow-remote` are required. The API key is read from `OPENAI_API_KEY` and is
|
|
59
|
+
never written to an output file. Email addresses and phone numbers are
|
|
60
|
+
redacted before remote transmission. Repeat `--redact-pattern` to add
|
|
61
|
+
case-specific regular expressions.
|
|
62
|
+
|
|
63
|
+
```sh
|
|
64
|
+
export OPENAI_API_KEY=your-key
|
|
65
|
+
torbot analyze crawl-result.json \
|
|
66
|
+
--provider openai-compatible \
|
|
67
|
+
--base-url https://api.openai.com/v1 \
|
|
68
|
+
--model your-model \
|
|
69
|
+
--allow-remote \
|
|
70
|
+
--redact-pattern 'CASE-[0-9]+' \
|
|
71
|
+
--output investigation/
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Captured page text is untrusted data. Analyst exposes no tools to the model,
|
|
75
|
+
does not execute page instructions, discards unknown evidence references, and
|
|
76
|
+
never promotes an uncited model statement to `supported`.
|
|
77
|
+
|
|
78
|
+
## Schemas
|
|
79
|
+
|
|
80
|
+
Machine-readable schemas live in `schemas/crawl-result.v1.schema.json` and
|
|
81
|
+
`schemas/investigation-report.v1.schema.json`. Consumers must reject schema
|
|
82
|
+
versions they do not understand.
|
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
--------------------
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## 4.3.1 - 2026-11-12
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- Added `--save result` for analysis-ready crawl-result v1 files with bounded visible text and content hashes.
|
|
9
|
+
- Added `torbot analyze` for deterministic evidence bundles and optional local or remote OpenAI-compatible analysis.
|
|
10
|
+
- Added stable evidence IDs, claim citation validation, an evidence graph, JSON schemas, and a safe surface-web fixture.
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- Requires Python 3.10 or newer, with CI coverage for Python 3.10, 3.11, and 3.12.
|
|
14
|
+
- Updated pinned AnyIO, Soup Sieve, urllib3, certifi, and setuptools dependencies.
|
|
15
|
+
- Documented installation with OTinstaller.
|
|
16
|
+
- Excluded environment files from package builds.
|
|
17
|
+
|
|
18
|
+
### Security
|
|
19
|
+
- Fixed path traversal in tree, JSON, and HTML export filenames by sanitizing untrusted page titles. Thanks to Artur Chlebicki (@Artur12555) for reporting GHSA-5888-59xj-84pf.
|
|
20
|
+
- Added regression tests for relative and absolute paths, Windows separators, encoded separators, reserved names, and long titles.
|
|
21
|
+
- Remote evidence transmission now requires `--allow-remote`, redacts contact data by default, and never stores API keys.
|
|
22
|
+
- Crawled content is treated as untrusted data, model calls receive no tools, and uncited model output cannot become a supported finding.
|
|
23
|
+
|
|
5
24
|
## 4.3.0 - 2026-07-28
|
|
6
25
|
|
|
7
26
|
### Changed
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Shared crawl-result contract
|
|
2
|
+
|
|
3
|
+
TorBot exposes a versioned, machine-readable crawl result through
|
|
4
|
+
`LinkTree.to_crawl_result()`. It is an integration contract, not a replacement
|
|
5
|
+
for the existing tree JSON saved by `--save json`; that legacy format remains
|
|
6
|
+
available through the 4.x series. Consumers must feature-detect
|
|
7
|
+
`schemaVersion` and reject versions they do not understand.
|
|
8
|
+
|
|
9
|
+
## Version 1
|
|
10
|
+
|
|
11
|
+
The top-level object contains `schemaVersion`, a unique `runId`, `engine` and
|
|
12
|
+
`engineVersion`, normalized `target`, effective `settings`, terminal status,
|
|
13
|
+
timestamps, `durationMs`, `pages`, and privacy-safe `diagnostics`.
|
|
14
|
+
|
|
15
|
+
Each page records `url`, `parentUrl`, `depth`, `outcome`, HTTP `status`,
|
|
16
|
+
`skippedReason`, bounded `errorCategory`, extracted `links`, and `contacts`.
|
|
17
|
+
`outcome` is `fetched` or `failed`; failures expose one of `cancelled`,
|
|
18
|
+
`invalid_input`, `network`, `parse`, or `unknown`, never an exception message.
|
|
19
|
+
Links and contacts include their source (`anchor`, `mailto`, or `tel`). Raw
|
|
20
|
+
HTML, headers, cookies, credentials, and arbitrary exception strings are not
|
|
21
|
+
part of the contract.
|
|
22
|
+
|
|
23
|
+
When a caller explicitly requests analysis-ready output, a fetched page may
|
|
24
|
+
also include a `title`, deterministic classification metadata, and `content`.
|
|
25
|
+
Content contains bounded visible plain text and its SHA-256 digest. Scripts,
|
|
26
|
+
styles, templates, and raw markup are excluded. The CLI exposes this form only
|
|
27
|
+
through `--save result`; legacy `--save json` behavior is unchanged.
|
|
28
|
+
|
|
29
|
+
GoTor's versioned report is the compatibility baseline: both projects use
|
|
30
|
+
`schemaVersion: 1`, `engine`, `target`, depth/settings, timestamps, duration,
|
|
31
|
+
and per-page URL/parent/depth/status/link information. TorBot's fields are
|
|
32
|
+
additive where GoTor's current report has no equivalent (`runId`, terminal
|
|
33
|
+
state, provenance, bounded errors, and diagnostics). Consumers should retain
|
|
34
|
+
unknown fields and branch only on the schema version, not on engine-specific
|
|
35
|
+
internals.
|
|
36
|
+
|
|
37
|
+
## Deprecation path
|
|
38
|
+
|
|
39
|
+
No existing CLI output changes in this issue. A future major release may mark
|
|
40
|
+
the legacy tree JSON as deprecated only after the shared result is available
|
|
41
|
+
from an explicit CLI/API surface and downstream consumers have migrated.
|
|
@@ -4,17 +4,16 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "torbot"
|
|
7
|
-
version = "4.3.
|
|
7
|
+
version = "4.3.1"
|
|
8
8
|
authors = [
|
|
9
9
|
{ name="Akeem King", email="akeemtlking@gmail.com" },
|
|
10
10
|
{ name="PS Narayanan", email="thepsnarayanan@gmail.com" },
|
|
11
11
|
]
|
|
12
12
|
description = "TorBot is an OSINT tool for the dark web."
|
|
13
13
|
readme = "README.md"
|
|
14
|
-
requires-python = ">=3.
|
|
14
|
+
requires-python = ">=3.10"
|
|
15
15
|
classifiers = [
|
|
16
16
|
"Programming Language :: Python :: 3",
|
|
17
|
-
"Programming Language :: Python :: 3.9",
|
|
18
17
|
"Programming Language :: Python :: 3.10",
|
|
19
18
|
"Programming Language :: Python :: 3.11",
|
|
20
19
|
"Programming Language :: Python :: 3.12",
|
|
@@ -57,3 +56,6 @@ dependencies = [
|
|
|
57
56
|
|
|
58
57
|
[project.scripts]
|
|
59
58
|
torbot = "torbot.cli:main"
|
|
59
|
+
|
|
60
|
+
[tool.hatch.build]
|
|
61
|
+
exclude = [".env", ".env.*"]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
altgraph==0.17.4
|
|
2
|
-
anyio==4.
|
|
2
|
+
anyio==4.14.2
|
|
3
3
|
beautifulsoup4==4.12.3
|
|
4
|
-
certifi==
|
|
4
|
+
certifi==2026.10.19
|
|
5
5
|
charset-normalizer==3.3.2
|
|
6
6
|
colorama==0.4.6 ; sys_platform == "win32"
|
|
7
7
|
decorator==5.1.1
|
|
@@ -27,11 +27,11 @@ python-dotenv==1.2.2
|
|
|
27
27
|
pywin32-ctypes==0.2.2 ; sys_platform == "win32"
|
|
28
28
|
scikit-learn==1.5.0
|
|
29
29
|
scipy==1.13.0
|
|
30
|
-
setuptools==
|
|
30
|
+
setuptools==84.1.0
|
|
31
31
|
six==1.16.0
|
|
32
32
|
sniffio==1.3.1
|
|
33
33
|
socksio==1.0.0
|
|
34
|
-
soupsieve==2.
|
|
34
|
+
soupsieve==2.9
|
|
35
35
|
tabulate==0.9.0
|
|
36
36
|
termcolor==2.4.0
|
|
37
37
|
texttable==1.7.0
|
|
@@ -40,6 +40,6 @@ toml==0.10.2
|
|
|
40
40
|
tomli==2.0.1
|
|
41
41
|
treelib==1.7.1
|
|
42
42
|
unipath==1.1
|
|
43
|
-
urllib3==2.
|
|
43
|
+
urllib3==2.8.0
|
|
44
44
|
validators==0.22.0
|
|
45
45
|
yattag==1.15.2
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/DedSecInside/TorBot/schemas/crawl-result.v1.schema.json",
|
|
4
|
+
"title": "TorBot crawl-result v1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schemaVersion", "target", "pages"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schemaVersion": {"const": 1},
|
|
9
|
+
"runId": {"type": "string"},
|
|
10
|
+
"target": {"type": "string", "minLength": 1},
|
|
11
|
+
"pages": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"items": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"required": ["url", "outcome"],
|
|
16
|
+
"properties": {
|
|
17
|
+
"url": {"type": "string", "minLength": 1},
|
|
18
|
+
"outcome": {"enum": ["fetched", "failed", "skipped"]},
|
|
19
|
+
"content": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"required": ["mediaType", "text", "sha256"],
|
|
22
|
+
"properties": {
|
|
23
|
+
"mediaType": {"const": "text/plain"},
|
|
24
|
+
"text": {"type": "string"},
|
|
25
|
+
"sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}
|
|
26
|
+
},
|
|
27
|
+
"additionalProperties": false
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/DedSecInside/TorBot/schemas/investigation-report.v1.schema.json",
|
|
4
|
+
"title": "TorBot investigation-report v1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schema", "createdAt", "source", "claims", "evidenceIds", "warnings"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schema": {"const": "investigation-report.v1"},
|
|
9
|
+
"claims": {
|
|
10
|
+
"type": "array",
|
|
11
|
+
"items": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"required": ["text", "status", "evidenceIds", "source"],
|
|
14
|
+
"properties": {
|
|
15
|
+
"text": {"type": "string"},
|
|
16
|
+
"status": {"enum": ["supported", "unsupported", "conflicted"]},
|
|
17
|
+
"evidenceIds": {"type": "array", "items": {"type": "string"}},
|
|
18
|
+
"source": {"enum": ["deterministic", "model"]}
|
|
19
|
+
},
|
|
20
|
+
"additionalProperties": false
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"evidenceIds": {"type": "array", "items": {"type": "string"}},
|
|
24
|
+
"warnings": {"type": "array", "items": {"type": "string"}}
|
|
25
|
+
}
|
|
26
|
+
}
|