formharvester 2.2.2__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.
Files changed (31) hide show
  1. formharvester-2.2.2/.github/workflows/ci.yml +112 -0
  2. formharvester-2.2.2/.github/workflows/publish.yml +59 -0
  3. formharvester-2.2.2/.gitignore +140 -0
  4. formharvester-2.2.2/LICENSE +21 -0
  5. formharvester-2.2.2/PKG-INFO +90 -0
  6. formharvester-2.2.2/README.md +73 -0
  7. formharvester-2.2.2/SeleniumBot.py +631 -0
  8. formharvester-2.2.2/bot.py +882 -0
  9. formharvester-2.2.2/config.txt +24 -0
  10. formharvester-2.2.2/data/website_log.txt +12633 -0
  11. formharvester-2.2.2/dbc_api_python3/2x4.png +0 -0
  12. formharvester-2.2.2/dbc_api_python3/banner.jpg +0 -0
  13. formharvester-2.2.2/dbc_api_python3/deathbycaptcha.py +476 -0
  14. formharvester-2.2.2/dbc_api_python3/new_funcaptcha.py +37 -0
  15. formharvester-2.2.2/dbc_api_python3/new_recaptcha_coordinates.py +27 -0
  16. formharvester-2.2.2/dbc_api_python3/new_recaptcha_image_group.py +38 -0
  17. formharvester-2.2.2/dbc_api_python3/new_recaptcha_token_image.py +36 -0
  18. formharvester-2.2.2/dbc_api_python3/new_recaptcha_token_v3.py +41 -0
  19. formharvester-2.2.2/dbc_api_python3/readme.html +507 -0
  20. formharvester-2.2.2/dbc_api_python3/test.jpg +0 -0
  21. formharvester-2.2.2/dbc_api_python3/test2.jpg +0 -0
  22. formharvester-2.2.2/docs/logo.jpeg +0 -0
  23. formharvester-2.2.2/input/construction.csv +29492 -0
  24. formharvester-2.2.2/input/lawn.csv +29492 -0
  25. formharvester-2.2.2/input/mineral.csv +16 -0
  26. formharvester-2.2.2/input/pest.csv +29492 -0
  27. formharvester-2.2.2/input/roofing.csv +29492 -0
  28. formharvester-2.2.2/pyproject.toml +74 -0
  29. formharvester-2.2.2/remaining_google_pages.json +1 -0
  30. formharvester-2.2.2/utils.py +32 -0
  31. formharvester-2.2.2/uv.lock +942 -0
@@ -0,0 +1,112 @@
1
+ name: CI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ branches:
7
+ - master
8
+ - main
9
+ pull_request:
10
+ types:
11
+ - opened
12
+ - synchronize
13
+ - reopened
14
+ - ready_for_review
15
+
16
+ permissions: {}
17
+
18
+ concurrency:
19
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
20
+ cancel-in-progress: true
21
+
22
+ jobs:
23
+ lint:
24
+ name: Lint
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
28
+ with:
29
+ persist-credentials: false
30
+
31
+ - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0
32
+
33
+ - name: Ruff format check
34
+ run: uv run ruff format --check .
35
+
36
+ - name: Ruff lint
37
+ run: uv run ruff check .
38
+
39
+ type-check:
40
+ name: Type check
41
+ runs-on: ubuntu-latest
42
+ steps:
43
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
44
+ with:
45
+ persist-credentials: false
46
+
47
+ - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0
48
+
49
+ - name: Type check with ty
50
+ run: uv run ty check .
51
+
52
+ test:
53
+ name: Test (Python ${{ matrix.python-version }})
54
+ runs-on: ubuntu-latest
55
+ strategy:
56
+ fail-fast: false
57
+ matrix:
58
+ python-version: ["3.12", "3.13", "3.14"]
59
+ steps:
60
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
61
+ with:
62
+ persist-credentials: false
63
+
64
+ - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0
65
+
66
+ - name: Run tests with coverage
67
+ run: uv run --python=${{ matrix.python-version }} coverage run -m pytest
68
+
69
+ - name: Upload coverage data
70
+ uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
71
+ with:
72
+ name: coverage-${{ matrix.python-version }}
73
+ path: .coverage.*
74
+ include-hidden-files: true
75
+
76
+ coverage:
77
+ name: Coverage
78
+ needs: test
79
+ runs-on: ubuntu-latest
80
+ steps:
81
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
82
+ with:
83
+ persist-credentials: false
84
+
85
+ - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0
86
+
87
+ - name: Download coverage data
88
+ uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
89
+ with:
90
+ pattern: coverage-*
91
+ merge-multiple: true
92
+
93
+ - name: Combine coverage
94
+ run: uv run coverage combine
95
+
96
+ - name: Coverage report
97
+ run: |
98
+ echo '## Coverage Report' >> $GITHUB_STEP_SUMMARY
99
+ echo '```' >> $GITHUB_STEP_SUMMARY
100
+ uv run coverage report | tee -a $GITHUB_STEP_SUMMARY
101
+ echo '```' >> $GITHUB_STEP_SUMMARY
102
+
103
+ all-checks-pass:
104
+ name: All checks pass
105
+ if: always()
106
+ needs: [lint, type-check, test, coverage]
107
+ runs-on: ubuntu-latest
108
+ steps:
109
+ - name: Check job results
110
+ uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2
111
+ with:
112
+ jobs: ${{ toJSON(needs) }}
@@ -0,0 +1,59 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions: {}
9
+
10
+ concurrency:
11
+ group: publish
12
+
13
+ jobs:
14
+ build:
15
+ name: Build distribution
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
19
+ with:
20
+ persist-credentials: false
21
+
22
+ # Cache disabled to prevent cache-poisoning attacks on release artifacts.
23
+ - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0
24
+ with:
25
+ enable-cache: false
26
+
27
+ - name: Build
28
+ run: uv build
29
+
30
+ - name: Upload distribution
31
+ uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
32
+ with:
33
+ name: dist
34
+ path: dist/
35
+
36
+ publish:
37
+ name: Publish to PyPI
38
+ needs: build
39
+ runs-on: ubuntu-latest
40
+ permissions:
41
+ id-token: write
42
+ attestations: write
43
+ environment:
44
+ name: pypi
45
+ url: https://pypi.org/p/formharvester
46
+ steps:
47
+ - name: Download distribution
48
+ uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
49
+ with:
50
+ name: dist
51
+ path: dist/
52
+
53
+ - name: Attest build provenance
54
+ uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0
55
+ with:
56
+ subject-path: "dist/*"
57
+
58
+ - name: Publish to PyPI
59
+ uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
@@ -0,0 +1,140 @@
1
+ # Created by .ignore support plugin (hsz.mobi)
2
+ ### Python template
3
+ # Byte-compiled / optimized / DLL files
4
+ __pycache__/
5
+ *.py[cod]
6
+ *$py.class
7
+
8
+ # C extensions
9
+ *.so
10
+
11
+ # Distribution / packaging
12
+ .Python
13
+ build/
14
+ develop-eggs/
15
+ dist/
16
+ downloads/
17
+ eggs/
18
+ .eggs/
19
+ lib/
20
+ lib64/
21
+ parts/
22
+ sdist/
23
+ var/
24
+ wheels/
25
+ pip-wheel-metadata/
26
+ share/python-wheels/
27
+ *.egg-info/
28
+ .installed.cfg
29
+ *.egg
30
+ MANIFEST
31
+
32
+ # PyInstaller
33
+ # Usually these files are written by a python script from a template
34
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
35
+ *.manifest
36
+ *.spec
37
+
38
+ # Installer logs
39
+ pip-log.txt
40
+ pip-delete-this-directory.txt
41
+
42
+ # Unit test / coverage reports
43
+ htmlcov/
44
+ .tox/
45
+ .nox/
46
+ .coverage
47
+ .coverage.*
48
+ .cache
49
+ nosetests.xml
50
+ coverage.xml
51
+ *.cover
52
+ *.py,cover
53
+ .hypothesis/
54
+ .pytest_cache/
55
+
56
+ # Translations
57
+ *.mo
58
+ *.pot
59
+
60
+ # Django stuff:
61
+ *.log
62
+ local_settings.py
63
+ db.sqlite3
64
+ db.sqlite3-journal
65
+
66
+ # Flask stuff:
67
+ instance/
68
+ .webassets-cache
69
+
70
+ # Scrapy stuff:
71
+ .scrapy
72
+
73
+ # Sphinx documentation
74
+ docs/_build/
75
+
76
+ # PyBuilder
77
+ target/
78
+
79
+ # Jupyter Notebook
80
+ .ipynb_checkpoints
81
+
82
+ # IPython
83
+ profile_default/
84
+ ipython_config.py
85
+
86
+ # pyenv
87
+ .python-version
88
+
89
+ # pipenv
90
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
91
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
92
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
93
+ # install all needed dependencies.
94
+ #Pipfile.lock
95
+
96
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
97
+ __pypackages__/
98
+
99
+ # Celery stuff
100
+ celerybeat-schedule
101
+ celerybeat.pid
102
+
103
+ # SageMath parsed files
104
+ *.sage.py
105
+
106
+ # Environments
107
+ .env
108
+ .venv
109
+ env/
110
+ venv/
111
+ ENV/
112
+ env.bak/
113
+ venv.bak/
114
+
115
+ # Spyder project settings
116
+ .spyderproject
117
+ .spyproject
118
+
119
+ # Rope project settings
120
+ .ropeproject
121
+
122
+ # mkdocs documentation
123
+ /site
124
+
125
+ # mypy
126
+ .mypy_cache/
127
+ .dmypy.json
128
+ dmypy.json
129
+
130
+ # Pyre type checker
131
+ .pyre/
132
+
133
+ ### Example user template template
134
+ ### Example user template
135
+
136
+ # IntelliJ project files
137
+ .idea
138
+ *.iml
139
+ out
140
+ gen
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020, Dario Mory
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,90 @@
1
+ Metadata-Version: 2.4
2
+ Name: formharvester
3
+ Version: 2.2.2
4
+ Summary: Automated web form harvesting and submission tool
5
+ License: MIT
6
+ License-File: LICENSE
7
+ Requires-Python: >=3.12
8
+ Requires-Dist: beautifulsoup4
9
+ Requires-Dist: pandas
10
+ Requires-Dist: pydantic
11
+ Requires-Dist: requests
12
+ Requires-Dist: rich
13
+ Requires-Dist: selenium
14
+ Requires-Dist: tldextract
15
+ Requires-Dist: typer
16
+ Description-Content-Type: text/markdown
17
+
18
+ ![formharvester](docs/logo.jpeg)
19
+
20
+ FormHarvester is an AI-assisted form intelligence engine.
21
+ It navigates the open web autonomously - executing searches, parsing page structure, extracting contact signals, and interacting with forms at the browser level. Built on async browser with stealth fingerprinting, proxy rotation, and a pluggable captcha solver interface.
22
+
23
+ ## Adjusting config.txt
24
+
25
+ #### `mode`
26
+ The CSV that will be used by the bot (e.g. `mode = lawn` will use `lawn.csv`)
27
+
28
+ #### `max_google_pages`
29
+ The CSV that will be used by the bot (e.g. `mode = lawn` will use `lawn.csv`)
30
+
31
+ #### `skip_ads`
32
+ FormHarvester will skip any ads on Google Search.
33
+
34
+ #### `start_page`
35
+ FormHarvester will start on X google page.
36
+
37
+ #### `send_form`
38
+ FormHarvester will send the form inside the website. It can be disabled to save time.
39
+
40
+ #### `generate_email_sources`
41
+ Generate an extra file showing the source URL where the email was extracted.
42
+
43
+ #### `hide_browser`
44
+ This setting will run the browser in headless mode and it will be hidden.
45
+
46
+ #### `max_time`
47
+ Max time FormHarvester can spend on a single website.
48
+
49
+ #### `min_delay` and `max_delay`
50
+ A random delay between `min` and `max` will be used for google.
51
+
52
+ #### `captcha_sleep`
53
+ Sleep for `X` minutes after a Google captcha is found. 0 to disable.
54
+
55
+ #### `search_timer`
56
+ A waiting time (in minutes) between the last google search and the next one.
57
+
58
+ #### `[captcha]`
59
+ Here you can enter deathbycaptcha credentials to solve captchas automatically.
60
+
61
+ #### `[dev]`
62
+ Disable in production. They are used for development reasons. `debug_form` may be useful, as it prevents the form from submitting.
63
+
64
+
65
+ ## How to run
66
+ #### Executable
67
+ `Run formharvester.exe`
68
+
69
+ #### Python
70
+ `pip install -r requirements.txt`
71
+
72
+ `python3 bot.py`
73
+
74
+ ## Folder structure
75
+
76
+ #### data
77
+ Where scraped emails and logs are dumped.
78
+
79
+ #### drivers
80
+ Browser drivers used by selenium.
81
+
82
+ #### input
83
+ Input CSV files go here.
84
+
85
+ #### log
86
+ This folder will report errors on websites, very useful to improve the bot.
87
+
88
+ ___
89
+
90
+ This project is released under the [MIT License](LICENSE). You are free to use, modify, and distribute this software, provided that the original copyright notice and license terms are included in all copies or substantial portions of the software.
@@ -0,0 +1,73 @@
1
+ ![formharvester](docs/logo.jpeg)
2
+
3
+ FormHarvester is an AI-assisted form intelligence engine.
4
+ It navigates the open web autonomously - executing searches, parsing page structure, extracting contact signals, and interacting with forms at the browser level. Built on async browser with stealth fingerprinting, proxy rotation, and a pluggable captcha solver interface.
5
+
6
+ ## Adjusting config.txt
7
+
8
+ #### `mode`
9
+ The CSV that will be used by the bot (e.g. `mode = lawn` will use `lawn.csv`)
10
+
11
+ #### `max_google_pages`
12
+ The CSV that will be used by the bot (e.g. `mode = lawn` will use `lawn.csv`)
13
+
14
+ #### `skip_ads`
15
+ FormHarvester will skip any ads on Google Search.
16
+
17
+ #### `start_page`
18
+ FormHarvester will start on X google page.
19
+
20
+ #### `send_form`
21
+ FormHarvester will send the form inside the website. It can be disabled to save time.
22
+
23
+ #### `generate_email_sources`
24
+ Generate an extra file showing the source URL where the email was extracted.
25
+
26
+ #### `hide_browser`
27
+ This setting will run the browser in headless mode and it will be hidden.
28
+
29
+ #### `max_time`
30
+ Max time FormHarvester can spend on a single website.
31
+
32
+ #### `min_delay` and `max_delay`
33
+ A random delay between `min` and `max` will be used for google.
34
+
35
+ #### `captcha_sleep`
36
+ Sleep for `X` minutes after a Google captcha is found. 0 to disable.
37
+
38
+ #### `search_timer`
39
+ A waiting time (in minutes) between the last google search and the next one.
40
+
41
+ #### `[captcha]`
42
+ Here you can enter deathbycaptcha credentials to solve captchas automatically.
43
+
44
+ #### `[dev]`
45
+ Disable in production. They are used for development reasons. `debug_form` may be useful, as it prevents the form from submitting.
46
+
47
+
48
+ ## How to run
49
+ #### Executable
50
+ `Run formharvester.exe`
51
+
52
+ #### Python
53
+ `pip install -r requirements.txt`
54
+
55
+ `python3 bot.py`
56
+
57
+ ## Folder structure
58
+
59
+ #### data
60
+ Where scraped emails and logs are dumped.
61
+
62
+ #### drivers
63
+ Browser drivers used by selenium.
64
+
65
+ #### input
66
+ Input CSV files go here.
67
+
68
+ #### log
69
+ This folder will report errors on websites, very useful to improve the bot.
70
+
71
+ ___
72
+
73
+ This project is released under the [MIT License](LICENSE). You are free to use, modify, and distribute this software, provided that the original copyright notice and license terms are included in all copies or substantial portions of the software.