├── .gitignore
├── LICENSE
├── README.md
├── banner.png
├── go.mod
├── go.sum
├── keys.json
├── main.go
├── modules
├── BreachDirectory.go
├── Core.go
├── EmailRep.go
├── FileWriter.go
├── Googling.go
├── Holehe.py
├── Hunter.go
├── Intelx.go
├── Lookup.go
├── SocialScan.py
├── ThreatCrowd.go
└── Verify.go
├── outputs
└── DELETEME.txt
└── requirements.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | ### Linux ###
2 | *~
3 |
4 | # temporary files which can be created if a process still has a handle open of a deleted file
5 | .fuse_hidden*
6 |
7 | # KDE directory preferences
8 | .directory
9 |
10 | # Linux trash folder which might appear on any partition or disk
11 | .Trash-*
12 |
13 | # .nfs files are created when an open file is removed but is still being accessed
14 | .nfs*
15 |
16 | ### macOS ###
17 | # General
18 | .DS_Store
19 | .AppleDouble
20 | .LSOverride
21 |
22 | # Icon must end with two \r
23 | Icon
24 |
25 |
26 | # Thumbnails
27 | ._*
28 |
29 | # Files that might appear in the root of a volume
30 | .DocumentRevisions-V100
31 | .fseventsd
32 | .Spotlight-V100
33 | .TemporaryItems
34 | .Trashes
35 | .VolumeIcon.icns
36 | .com.apple.timemachine.donotpresent
37 |
38 | # Directories potentially created on remote AFP share
39 | .AppleDB
40 | .AppleDesktop
41 | Network Trash Folder
42 | Temporary Items
43 | .apdisk
44 |
45 | ### Python ###
46 | # Byte-compiled / optimized / DLL files
47 | __pycache__/
48 | *.py[cod]
49 | *$py.class
50 |
51 | # C extensions
52 | *.so
53 |
54 | # Distribution / packaging
55 | .Python
56 | build/
57 | develop-eggs/
58 | dist/
59 | downloads/
60 | eggs/
61 | .eggs/
62 | lib/
63 | lib64/
64 | parts/
65 | sdist/
66 | var/
67 | wheels/
68 | pip-wheel-metadata/
69 | share/python-wheels/
70 | *.egg-info/
71 | .installed.cfg
72 | *.egg
73 | MANIFEST
74 |
75 | # PyInstaller
76 | # Usually these files are written by a python script from a template
77 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
78 | *.manifest
79 | *.spec
80 |
81 | # Installer logs
82 | pip-log.txt
83 | pip-delete-this-directory.txt
84 |
85 | # Unit test / coverage reports
86 | htmlcov/
87 | .tox/
88 | .nox/
89 | .coverage
90 | .coverage.*
91 | .cache
92 | nosetests.xml
93 | coverage.xml
94 | *.cover
95 | *.py,cover
96 | .hypothesis/
97 | .pytest_cache/
98 | pytestdebug.log
99 |
100 | # Translations
101 | *.mo
102 | *.pot
103 |
104 | # Django stuff:
105 | *.log
106 | local_settings.py
107 | db.sqlite3
108 | db.sqlite3-journal
109 |
110 | # Flask stuff:
111 | instance/
112 | .webassets-cache
113 |
114 | # Scrapy stuff:
115 | .scrapy
116 |
117 | # Sphinx documentation
118 | docs/_build/
119 | doc/_build/
120 |
121 | # PyBuilder
122 | target/
123 |
124 | # Jupyter Notebook
125 | .ipynb_checkpoints
126 |
127 | # IPython
128 | profile_default/
129 | ipython_config.py
130 |
131 | # pyenv
132 | .python-version
133 |
134 | # pipenv
135 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
136 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
137 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
138 | # install all needed dependencies.
139 | #Pipfile.lock
140 |
141 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
142 | __pypackages__/
143 |
144 | # Celery stuff
145 | celerybeat-schedule
146 | celerybeat.pid
147 |
148 | # SageMath parsed files
149 | *.sage.py
150 |
151 | # Environments
152 | .env
153 | .venv
154 | env/
155 | venv/
156 | ENV/
157 | env.bak/
158 | venv.bak/
159 | pythonenv*
160 |
161 | # Spyder project settings
162 | .spyderproject
163 | .spyproject
164 |
165 | # Rope project settings
166 | .ropeproject
167 |
168 | # mkdocs documentation
169 | /site
170 |
171 | # mypy
172 | .mypy_cache/
173 | .dmypy.json
174 | dmypy.json
175 |
176 | # Pyre type checker
177 | .pyre/
178 |
179 | # pytype static type analyzer
180 | .pytype/
181 |
182 | # profiling data
183 | .prof
184 |
185 | ### venv ###
186 | # Virtualenv
187 | # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
188 | [Bb]in
189 | [Ii]nclude
190 | [Ll]ib
191 | [Ll]ib64
192 | [Ll]ocal
193 | [Ss]cripts
194 | pyvenv.cfg
195 | pip-selfcheck.json
196 |
197 | ### vscode ###
198 | .vscode/*
199 | !.vscode/settings.json
200 | !.vscode/tasks.json
201 | !.vscode/launch.json
202 | !.vscode/extensions.json
203 | *.code-workspace
204 |
205 | ### Windows ###
206 | # Windows thumbnail cache files
207 | Thumbs.db
208 | Thumbs.db:encryptable
209 | ehthumbs.db
210 | ehthumbs_vista.db
211 |
212 | # Dump file
213 | *.stackdump
214 |
215 | # Folder config file
216 | [Dd]esktop.ini
217 |
218 | # Recycle Bin used on file shares
219 | $RECYCLE.BIN/
220 |
221 | # Windows Installer files
222 | *.cab
223 | *.msi
224 | *.msix
225 | *.msm
226 | *.msp
227 |
228 | # Windows shortcuts
229 | *.lnk
230 |
231 | # End of https://www.toptal.com/developers/gitignore/api/python,vscode,macos,windows,linux,venv
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Creative Commons Legal Code
2 |
3 | CC0 1.0 Universal
4 |
5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
12 | HEREUNDER.
13 |
14 | Statement of Purpose
15 |
16 | The laws of most jurisdictions throughout the world automatically confer
17 | exclusive Copyright and Related Rights (defined below) upon the creator
18 | and subsequent owner(s) (each and all, an "owner") of an original work of
19 | authorship and/or a database (each, a "Work").
20 |
21 | Certain owners wish to permanently relinquish those rights to a Work for
22 | the purpose of contributing to a commons of creative, cultural and
23 | scientific works ("Commons") that the public can reliably and without fear
24 | of later claims of infringement build upon, modify, incorporate in other
25 | works, reuse and redistribute as freely as possible in any form whatsoever
26 | and for any purposes, including without limitation commercial purposes.
27 | These owners may contribute to the Commons to promote the ideal of a free
28 | culture and the further production of creative, cultural and scientific
29 | works, or to gain reputation or greater distribution for their Work in
30 | part through the use and efforts of others.
31 |
32 | For these and/or other purposes and motivations, and without any
33 | expectation of additional consideration or compensation, the person
34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she
35 | is an owner of Copyright and Related Rights in the Work, voluntarily
36 | elects to apply CC0 to the Work and publicly distribute the Work under its
37 | terms, with knowledge of his or her Copyright and Related Rights in the
38 | Work and the meaning and intended legal effect of CC0 on those rights.
39 |
40 | 1. Copyright and Related Rights. A Work made available under CC0 may be
41 | protected by copyright and related or neighboring rights ("Copyright and
42 | Related Rights"). Copyright and Related Rights include, but are not
43 | limited to, the following:
44 |
45 | i. the right to reproduce, adapt, distribute, perform, display,
46 | communicate, and translate a Work;
47 | ii. moral rights retained by the original author(s) and/or performer(s);
48 | iii. publicity and privacy rights pertaining to a person's image or
49 | likeness depicted in a Work;
50 | iv. rights protecting against unfair competition in regards to a Work,
51 | subject to the limitations in paragraph 4(a), below;
52 | v. rights protecting the extraction, dissemination, use and reuse of data
53 | in a Work;
54 | vi. database rights (such as those arising under Directive 96/9/EC of the
55 | European Parliament and of the Council of 11 March 1996 on the legal
56 | protection of databases, and under any national implementation
57 | thereof, including any amended or successor version of such
58 | directive); and
59 | vii. other similar, equivalent or corresponding rights throughout the
60 | world based on applicable law or treaty, and any national
61 | implementations thereof.
62 |
63 | 2. Waiver. To the greatest extent permitted by, but not in contravention
64 | of, applicable law, Affirmer hereby overtly, fully, permanently,
65 | irrevocably and unconditionally waives, abandons, and surrenders all of
66 | Affirmer's Copyright and Related Rights and associated claims and causes
67 | of action, whether now known or unknown (including existing as well as
68 | future claims and causes of action), in the Work (i) in all territories
69 | worldwide, (ii) for the maximum duration provided by applicable law or
70 | treaty (including future time extensions), (iii) in any current or future
71 | medium and for any number of copies, and (iv) for any purpose whatsoever,
72 | including without limitation commercial, advertising or promotional
73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
74 | member of the public at large and to the detriment of Affirmer's heirs and
75 | successors, fully intending that such Waiver shall not be subject to
76 | revocation, rescission, cancellation, termination, or any other legal or
77 | equitable action to disrupt the quiet enjoyment of the Work by the public
78 | as contemplated by Affirmer's express Statement of Purpose.
79 |
80 | 3. Public License Fallback. Should any part of the Waiver for any reason
81 | be judged legally invalid or ineffective under applicable law, then the
82 | Waiver shall be preserved to the maximum extent permitted taking into
83 | account Affirmer's express Statement of Purpose. In addition, to the
84 | extent the Waiver is so judged Affirmer hereby grants to each affected
85 | person a royalty-free, non transferable, non sublicensable, non exclusive,
86 | irrevocable and unconditional license to exercise Affirmer's Copyright and
87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the
88 | maximum duration provided by applicable law or treaty (including future
89 | time extensions), (iii) in any current or future medium and for any number
90 | of copies, and (iv) for any purpose whatsoever, including without
91 | limitation commercial, advertising or promotional purposes (the
92 | "License"). The License shall be deemed effective as of the date CC0 was
93 | applied by Affirmer to the Work. Should any part of the License for any
94 | reason be judged legally invalid or ineffective under applicable law, such
95 | partial invalidity or ineffectiveness shall not invalidate the remainder
96 | of the License, and in such case Affirmer hereby affirms that he or she
97 | will not (i) exercise any of his or her remaining Copyright and Related
98 | Rights in the Work or (ii) assert any associated claims and causes of
99 | action with respect to the Work, in either case contrary to Affirmer's
100 | express Statement of Purpose.
101 |
102 | 4. Limitations and Disclaimers.
103 |
104 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
105 | surrendered, licensed or otherwise affected by this document.
106 | b. Affirmer offers the Work as-is and makes no representations or
107 | warranties of any kind concerning the Work, express, implied,
108 | statutory or otherwise, including without limitation warranties of
109 | title, merchantability, fitness for a particular purpose, non
110 | infringement, or the absence of latent or other defects, accuracy, or
111 | the present or absence of errors, whether or not discoverable, all to
112 | the greatest extent permissible under applicable law.
113 | c. Affirmer disclaims responsibility for clearing rights of other persons
114 | that may apply to the Work or any use thereof, including without
115 | limitation any person's Copyright and Related Rights in the Work.
116 | Further, Affirmer disclaims responsibility for obtaining any necessary
117 | consents, permissions or other rights required for any use of the
118 | Work.
119 | d. Affirmer understands and acknowledges that Creative Commons is not a
120 | party to this document and has no duty or obligation with respect to
121 | this CC0 or use of the Work.
122 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MOSINT
2 |
3 |
4 |
5 |
6 |
7 | ## What is the MOSINT
8 |
9 | MOSINT is an OSINT Tool for emails. It helps you gather information about the target email.
10 |
11 | #### Features: :eyes:
12 |
13 | * Email validation
14 | * Check social accounts with Socialscan and Holehe
15 | * Check data breaches and password leaks
16 | * Find related emails and domains
17 | * Scan Pastebin and Throwbin Dumps
18 | * Google Search
19 | * DNS Lookup
20 | * IP Lookup
21 | * Output to text file
22 |
23 |
24 | ## Services (APIs):
25 |
26 | \[not required to run the program\]
27 |
28 | | Service | Function | Status |
29 | | :--- | :--- | :--- |
30 | | [ipapi.co](https://ipapi.co/) - Public | More Information About Domain | :white\_check\_mark: |
31 | | [hunter.io](https://hunter.io/) - Public | Related Emails | :white\_check\_mark: :key: |
32 | | [emailrep.io](https://emailrep.io/) - Public | Breached Sites Names | :white\_check\_mark: :key: |
33 | | [scylla.so](https://scylla.so/) - Public | Database Leaks | :construction: |
34 | | [breachdirectory.org](https://breachdirectory.org/) - Public | Password Leaks | :white\_check\_mark: :key: |
35 | | [Intelligence X](https://intelx.io/)| Password Leaks | :white\_check\_mark: :key: |
36 |
37 | :key: API key required
38 |
39 | #### For Use:
40 |
41 | - Save your API key in the `keys.json`
42 | - Install Go and Python on your system
43 |
44 | ## Installation:
45 |
46 | `git clone https://github.com/alpkeskin/mosint.git`
47 |
48 | `cd mosint`
49 |
50 | `pip3 install -r requirements.txt`
51 |
52 | ## Usage:
53 |
54 | you can type `-h` for help menu.
55 |
56 | | FLAGS | DESCRIPTION | ISREQUIRED |
57 | |-----------|---------------------------------------------------|------------|
58 | | -e | Set target email | Yes |
59 | | -verify | Verify target email | No |
60 | | -social | Social scan for target email | No |
61 | | -relateds | Find related emails and domains with target email | No |
62 | | -leaks | Find password leaks for target email | No |
63 | | -dumps | Search pastebin dumps for target email | No |
64 | | -domain | More information about target email's domain | No |
65 | | -o | Output to text file | No |
66 | | -v | Version of mosint | No |
67 | | -h | Help Menu | No |
68 | | -all | All features! | No |
69 |
70 | ### Example:
71 |
72 | `go run main.go -e example@domain.com -all`
73 |
74 | Just type `-o` for output file (.txt)
75 |
76 |
77 | ## Screen :
78 |
79 | [](https://asciinema.org/a/479072)
80 |
81 | ### Buy me a coffee: :money_with_wings:
82 |
83 | https://www.buymeacoffee.com/alpkeskin
84 |
85 | #### Tested on:
86 |
87 | - [x] Linux
88 | - [x] macOS
89 |
--------------------------------------------------------------------------------
/banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/blackhatethicalhacking/mosint/e427f68f646f330cdcea4208c435b62330707b80/banner.png
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module main
2 |
3 | go 1.17
4 |
5 | require (
6 | github.com/AfterShip/email-verifier v1.3.0
7 | github.com/IntelligenceX/SDK v0.0.0-20211026051259-f2f7df085178
8 | github.com/dimiro1/banner v1.1.0
9 | github.com/fatih/color v1.13.0
10 | github.com/mattn/go-colorable v0.1.9
11 | github.com/olekukonko/tablewriter v0.0.5
12 | github.com/rocketlaunchr/google-search v1.1.4
13 | github.com/schollz/progressbar/v3 v3.8.6
14 | github.com/valyala/fasthttp v1.31.0
15 | )
16 |
17 | require (
18 | github.com/PuerkitoBio/goquery v1.5.0 // indirect
19 | github.com/andybalholm/brotli v1.0.2 // indirect
20 | github.com/andybalholm/cascadia v1.0.0 // indirect
21 | github.com/antchfx/htmlquery v1.0.0 // indirect
22 | github.com/antchfx/xmlquery v1.0.0 // indirect
23 | github.com/antchfx/xpath v1.0.0 // indirect
24 | github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2 // indirect
25 | github.com/go-dedup/megophone v0.0.0-20170830025436-f01be21026f5 // indirect
26 | github.com/go-dedup/simhash v0.0.0-20170904020510-9ecaca7b509c // indirect
27 | github.com/go-dedup/text v0.0.0-20170907015346-8bb1b95e3cb7 // indirect
28 | github.com/gobwas/glob v0.2.3 // indirect
29 | github.com/gocolly/colly/v2 v2.0.1 // indirect
30 | github.com/gofrs/uuid v4.2.0+incompatible // indirect
31 | github.com/golang/protobuf v1.4.3 // indirect
32 | github.com/google/go-cmp v0.5.4 // indirect
33 | github.com/hbollon/go-edlib v1.4.0 // indirect
34 | github.com/kennygrant/sanitize v1.2.4 // indirect
35 | github.com/klauspost/compress v1.13.4 // indirect
36 | github.com/mattn/go-isatty v0.0.14 // indirect
37 | github.com/mattn/go-runewidth v0.0.13 // indirect
38 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
39 | github.com/rivo/uniseg v0.2.0 // indirect
40 | github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
41 | github.com/temoto/robotstxt v1.1.1 // indirect
42 | github.com/valyala/bytebufferpool v1.0.0 // indirect
43 | golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 // indirect
44 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
45 | golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 // indirect
46 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
47 | golang.org/x/text v0.3.6 // indirect
48 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
49 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
50 | google.golang.org/appengine v1.6.1 // indirect
51 | google.golang.org/protobuf v1.25.0 // indirect
52 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
53 | h12.io/socks v1.0.3 // indirect
54 | )
55 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
2 | github.com/AfterShip/email-verifier v1.3.0 h1:RhRLm3v2Iui5ZmWg6e+Q0xQU2Bai3mgINkY2t2p9u0g=
3 | github.com/AfterShip/email-verifier v1.3.0/go.mod h1:XeRhBrlxgnon6zOZ05EBNNanuxSy5uXl22RRBd5Jcug=
4 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
5 | github.com/IntelligenceX/SDK v0.0.0-20211026051259-f2f7df085178 h1:3BGr4zPVNltiGPrwF2kjPaiBk3cLguAC0CZkT8n68po=
6 | github.com/IntelligenceX/SDK v0.0.0-20211026051259-f2f7df085178/go.mod h1:sF7U8A+lYVdZYVmdbW1QceYaGpI1h2mXMbNdllz6uYs=
7 | github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk=
8 | github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
9 | github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E=
10 | github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
11 | github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
12 | github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
13 | github.com/antchfx/htmlquery v1.0.0 h1:O5IXz8fZF3B3MW+B33MZWbTHBlYmcfw0BAxgErHuaMA=
14 | github.com/antchfx/htmlquery v1.0.0/go.mod h1:MS9yksVSQXls00iXkiMqXr0J+umL/AmxXKuP28SUJM8=
15 | github.com/antchfx/xmlquery v1.0.0 h1:YuEPqexGG2opZKNc9JU3Zw6zFXwC47wNcy6/F8oKsrM=
16 | github.com/antchfx/xmlquery v1.0.0/go.mod h1:/+CnyD/DzHRnv2eRxrVbieRU/FIF6N0C+7oTtyUtCKk=
17 | github.com/antchfx/xpath v1.0.0 h1:Q5gFgh2O40VTSwMOVbFE7nFNRBu3tS21Tn0KAWeEjtk=
18 | github.com/antchfx/xpath v1.0.0/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
19 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
20 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
21 | github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2 h1:tjT4Jp4gxECvsJcYpAMtW2I3YqzBTPuB67OejxXs86s=
22 | github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w=
23 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
24 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
25 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
26 | github.com/dimiro1/banner v1.1.0 h1:TSfy+FsPIIGLzaMPOt52KrEed/omwFO1P15VA8PMUh0=
27 | github.com/dimiro1/banner v1.1.0/go.mod h1:tbL318TJiUaHxOUNN+jnlvFSgsh/RX7iJaQrGgOiTco=
28 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
29 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
30 | github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
31 | github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
32 | github.com/go-dedup/megophone v0.0.0-20170830025436-f01be21026f5 h1:4U+x+EB1P66zwYgTjxWXSOT8vF+651Ksr1lojiCZnT8=
33 | github.com/go-dedup/megophone v0.0.0-20170830025436-f01be21026f5/go.mod h1:poR/Cp00iqtqu9ltFwl6C00sKC0HY13u/Gh05ZBmP54=
34 | github.com/go-dedup/simhash v0.0.0-20170904020510-9ecaca7b509c h1:mucYYQn+sMGNSxidhleonzAdwL203RxhjJGnxQU4NWU=
35 | github.com/go-dedup/simhash v0.0.0-20170904020510-9ecaca7b509c/go.mod h1:gO3u2bjRAgUaLdQd2XK+3oooxrheOAx1BzS7WmPzw1s=
36 | github.com/go-dedup/text v0.0.0-20170907015346-8bb1b95e3cb7 h1:11wFcswN+37U+ByjxdKzsRY5KzNqqq5Uk5ztxnLOc7w=
37 | github.com/go-dedup/text v0.0.0-20170907015346-8bb1b95e3cb7/go.mod h1:wSsK4VOECOSfSYTzkBFw+iGY7wj59e7X96ABtNj9aCQ=
38 | github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
39 | github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
40 | github.com/gocolly/colly/v2 v2.0.1 h1:GGPzBEdrEsavhzVK00FQXMMHBHRpwrbbCCcEKM/0Evw=
41 | github.com/gocolly/colly/v2 v2.0.1/go.mod h1:ePrRZlJcLTU2C/f8pJzXfkdBtBDHL5hOaKLcBoiJcq8=
42 | github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
43 | github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
44 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
45 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
46 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
47 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
48 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
49 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
50 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
51 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
52 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
53 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
54 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
55 | github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
56 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
57 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
58 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
59 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
60 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
61 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
62 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
63 | github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
64 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
65 | github.com/h12w/go-socks5 v0.0.0-20200522160539-76189e178364 h1:5XxdakFhqd9dnXoAZy1Mb2R/DZ6D1e+0bGC/JhucGYI=
66 | github.com/h12w/go-socks5 v0.0.0-20200522160539-76189e178364/go.mod h1:eDJQioIyy4Yn3MVivT7rv/39gAJTrA7lgmYr8EW950c=
67 | github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
68 | github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
69 | github.com/hbollon/go-edlib v1.4.0 h1:k0D3nH6HXOXvlM1v0XPRS7Nn5TBQKWYXv4tPrZgPrgQ=
70 | github.com/hbollon/go-edlib v1.4.0/go.mod h1:wnt6o6EIVEzUfgbUZY7BerzQ2uvzp354qmS2xaLkrhM=
71 | github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg=
72 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
73 | github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
74 | github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
75 | github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
76 | github.com/klauspost/compress v1.13.4 h1:0zhec2I8zGnjWcKyLl6i3gPqKANCCn5e9xmviEEeX6s=
77 | github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
78 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
79 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
80 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
81 | github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
82 | github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
83 | github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
84 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
85 | github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
86 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
87 | github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
88 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
89 | github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
90 | github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
91 | github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
92 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
93 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
94 | github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
95 | github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
96 | github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
97 | github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc=
98 | github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
99 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
100 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
101 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
102 | github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
103 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
104 | github.com/rocketlaunchr/google-search v1.1.4 h1:11tA5CoeUjoNnvdyUMGwyuxzihbBRDhoEFXlMmPm0k4=
105 | github.com/rocketlaunchr/google-search v1.1.4/go.mod h1:6WRqswVvv6PJtvGCB1sEVxt726NolmA0QTl6xSEXel0=
106 | github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
107 | github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
108 | github.com/schollz/progressbar/v3 v3.8.6 h1:QruMUdzZ1TbEP++S1m73OqRJk20ON11m6Wqv4EoGg8c=
109 | github.com/schollz/progressbar/v3 v3.8.6/go.mod h1:W5IEwbJecncFGBvuEh4A7HT1nZZ6WNIL2i3qbnI0WKY=
110 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
111 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
112 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
113 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
114 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
115 | github.com/temoto/robotstxt v1.1.1 h1:Gh8RCs8ouX3hRSxxK7B1mO5RFByQ4CmJZDwgom++JaA=
116 | github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
117 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
118 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
119 | github.com/valyala/fasthttp v1.31.0 h1:lrauRLII19afgCs2fnWRJ4M5IkV0lo2FqA61uGkNBfE=
120 | github.com/valyala/fasthttp v1.31.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
121 | github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
122 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
123 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
124 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
125 | golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
126 | golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 h1:71vQrMauZZhcTVK6KdYM+rklehEEwb3E+ZhaE5jrPrE=
127 | golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
128 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
129 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
130 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
131 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
132 | golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
133 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
134 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
135 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
136 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
137 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
138 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
139 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
140 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
141 | golang.org/x/net v0.0.0-20201207224615-747e23833adb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
142 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
143 | golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
144 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
145 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
146 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
147 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
148 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
149 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
150 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
151 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
152 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
153 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
154 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
155 | golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
156 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
157 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
158 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
159 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
160 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
161 | golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
162 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
163 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
164 | golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo=
165 | golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
166 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
167 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
168 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
169 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
170 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
171 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
172 | golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
173 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
174 | golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
175 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs=
176 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
177 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
178 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
179 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
180 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
181 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
182 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
183 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
184 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
185 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
186 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
187 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
188 | google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
189 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
190 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
191 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
192 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
193 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
194 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
195 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
196 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
197 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
198 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
199 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
200 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
201 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
202 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
203 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
204 | google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
205 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
206 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
207 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
208 | gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY=
209 | gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0=
210 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
211 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
212 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
213 | h12.io/socks v1.0.3 h1:Ka3qaQewws4j4/eDQnOdpr4wXsC//dXtWvftlIcCQUo=
214 | h12.io/socks v1.0.3/go.mod h1:AIhxy1jOId/XCz9BO+EIgNL2rQiPTBNnOfnVnQ+3Eck=
215 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
216 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
217 |
--------------------------------------------------------------------------------
/keys.json:
--------------------------------------------------------------------------------
1 | {
2 | "BreachDirectory.org API Key": "",
3 | "Hunter.io API Key": "",
4 | "EmailRep.io API Key": "",
5 | "Intelx.io API Key": ""
6 | }
--------------------------------------------------------------------------------
/main.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package main
6 |
7 | import (
8 | "bufio"
9 | "flag"
10 | "fmt"
11 | "log"
12 | "main/modules"
13 | "strconv"
14 |
15 | "os"
16 |
17 | "github.com/dimiro1/banner"
18 | "github.com/fatih/color"
19 | "github.com/mattn/go-colorable"
20 | "github.com/olekukonko/tablewriter"
21 | "github.com/schollz/progressbar/v3"
22 | )
23 |
24 | func init() {
25 | templ := `{{ .Title "mosint" "" 2 }}
26 | {{ .AnsiColor.BrightWhite }}v2.1{{ .AnsiColor.Default }}
27 | {{ .AnsiColor.BrightCyan }}https://github.com/alpkeskin/{{ .AnsiColor.Default }}
28 | Now: {{ .Now "Monday, 2 Jan 2006" }}`
29 |
30 | banner.InitString(colorable.NewColorableStdout(), true, true, templ)
31 | println()
32 | }
33 |
34 | func help_menu() {
35 | data := [][]string{
36 | {"-e", "Set target email", "Yes"},
37 | {"-verify", "Verify the target email", "No"},
38 | {"-social", "Social scan for target email", "No"},
39 | {"-relateds", "Find related emails and domains with target email", "No"},
40 | {"-leaks", "Find password leaks for target email", "No"},
41 | {"-dumps", "Search pastebin dumps for target email", "No"},
42 | {"-domain", "More information about target email's domain", "No"},
43 | {"-o", "Output to text file", "No"},
44 | {"-v", "Version of mosint", "No"},
45 | {"-h", "Help Menu", "No"},
46 | {"-all", "All features!", "No"},
47 | }
48 | table := tablewriter.NewWriter(os.Stdout)
49 | table.SetHeader([]string{"Flags", "Description", "isRequired"})
50 | for _, v := range data {
51 | table.Append(v)
52 | }
53 | table.Render()
54 | color.Yellow("Example: go run main.go -e example@domain.com -all")
55 | }
56 |
57 | func verifyPrint(verifyData modules.VerifyStruct, emailRepData modules.EmailRepStruct, email string) {
58 | if verifyData.IsVerified {
59 | fmt.Println(email+" =>", color.GreenString("Verified \u2714"))
60 | outputText += email + " => Verified \n"
61 | } else {
62 | fmt.Println(email+" =>", color.RedString("Not Verified \u2718"))
63 | outputText += email + " => Not Verified \n"
64 | }
65 | if verifyData.IsDisposable {
66 | fmt.Println(email+" =>", color.RedString("Disposable \u2718"))
67 | outputText += email + " => Disposable \n"
68 | } else {
69 | fmt.Println(email+" =>", color.GreenString("Not Disposable \u2714"))
70 | outputText += email + " => Not Disposable \n"
71 | }
72 |
73 | if modules.GetAPIKey("EmailRep.io API Key") != "" {
74 | fmt.Println("\nEmailRep Data for", color.WhiteString(email))
75 | outputText += "\nEmailRep Data for " + email + "\n"
76 | fmt.Println("|- Reputation:", color.YellowString(emailRepData.Reputation))
77 | outputText += "|- Reputation: " + emailRepData.Reputation + "\n"
78 | fmt.Println("|- Blacklisted:", color.WhiteString(strconv.FormatBool(emailRepData.Details.Blacklisted)))
79 | outputText += "|- Blacklisted: " + strconv.FormatBool(emailRepData.Details.Blacklisted) + "\n"
80 | fmt.Println("|- Malicious Activity:", color.WhiteString(strconv.FormatBool(emailRepData.Details.MaliciousActivity)))
81 | outputText += "|- Malicious Activity: " + strconv.FormatBool(emailRepData.Details.MaliciousActivity) + "\n"
82 | fmt.Println("|- Credential Leaked:", color.WhiteString(strconv.FormatBool(emailRepData.Details.CredentialsLeaked)))
83 | outputText += "|- Credential Leaked: " + strconv.FormatBool(emailRepData.Details.CredentialsLeaked) + "\n"
84 | fmt.Println("|- First Seen:", color.YellowString(emailRepData.Details.FirstSeen))
85 | outputText += "|- First Seen: " + emailRepData.Details.FirstSeen + "\n"
86 | fmt.Println("|- Last Seen:", color.YellowString(emailRepData.Details.LastSeen))
87 | outputText += "|- Last Seen: " + emailRepData.Details.LastSeen + "\n"
88 | fmt.Println("|- Day Since Domain Creation:", color.WhiteString(strconv.Itoa(emailRepData.Details.DaysSinceDomainCreation)))
89 | outputText += "|- Day Since Domain Creation: " + strconv.Itoa(emailRepData.Details.DaysSinceDomainCreation) + "\n"
90 | fmt.Println("|- Spam:", color.WhiteString(strconv.FormatBool(emailRepData.Details.Spam)))
91 | outputText += "|- Spam: " + strconv.FormatBool(emailRepData.Details.Spam) + "\n"
92 | fmt.Println("|- Free Provider:", color.WhiteString(strconv.FormatBool(emailRepData.Details.FreeProvider)))
93 | outputText += "|- Free Provider: " + strconv.FormatBool(emailRepData.Details.FreeProvider) + "\n"
94 | fmt.Println("|- Deliverable:", color.WhiteString(strconv.FormatBool(emailRepData.Details.Deliverable)))
95 | outputText += "|- Deliverable: " + strconv.FormatBool(emailRepData.Details.Deliverable) + "\n"
96 | fmt.Println("|- Valid MX:", color.WhiteString(strconv.FormatBool(emailRepData.Details.ValidMx)))
97 | outputText += "|- Valid MX: " + strconv.FormatBool(emailRepData.Details.ValidMx) + "\n"
98 | } else {
99 | color.Red("EmailRep.io API Key is not set!")
100 | outputText += "EmailRep.io API Key is not set!\n"
101 | }
102 | }
103 |
104 | func socialPrint(filename string) {
105 |
106 | f, err := os.Open(filename)
107 | if err != nil {
108 | log.Fatal(err)
109 | }
110 | outputText += "Social Media Search Results: \n"
111 | defer f.Close()
112 | scanner := bufio.NewScanner(f)
113 | for scanner.Scan() {
114 | fmt.Println("|- "+scanner.Text(), color.GreenString("\u2714"))
115 | outputText += "|- " + scanner.Text() + "\n"
116 |
117 | }
118 | if err := scanner.Err(); err != nil {
119 | log.Fatal(err)
120 | }
121 | e := os.Remove(filename)
122 | if e != nil {
123 | log.Fatal(e)
124 | }
125 | }
126 |
127 | func relatedPrint(relEmails []string, relDomains []string, fromGoogle []string, hunterData modules.HunterStruct) {
128 |
129 | fmt.Println("Related Emails:")
130 | outputText += "Related Emails: \n"
131 | for _, v := range relEmails {
132 | fmt.Println("|- "+v, color.GreenString("\u2714"))
133 | outputText += "|- " + v + "\n"
134 | }
135 | if modules.GetAPIKey("Hunter.io API Key") != "" {
136 | for _, v := range hunterData.Data.Emails {
137 | fmt.Println("|- "+v.Value, color.GreenString("\u2714"))
138 | outputText += "|- " + v.Value + "\n"
139 | }
140 | }
141 | println("")
142 | fmt.Println("Related Domains:")
143 | outputText += "Related Domains: \n"
144 | for _, v := range relDomains {
145 | fmt.Println("|- "+v, color.GreenString("\u2714"))
146 | outputText += "|- " + v + "\n"
147 | }
148 | for _, v := range fromGoogle {
149 | fmt.Println("|- "+v, color.GreenString("\u2714"))
150 | outputText += "|- " + v + "\n"
151 | }
152 | }
153 |
154 | func leakPrint(breachData modules.BreachDirectoryStruct, intelxData []string) {
155 | fmt.Println("Password Leaks:")
156 | outputText += "Password Leaks: \n"
157 | if breachData.Success {
158 | for _, v := range breachData.Result {
159 | for _, w := range v.Sources {
160 | fmt.Println("|- " + w)
161 | outputText += "|- " + w + "\n"
162 | }
163 | if v.HasPassword {
164 | fmt.Println("|-- "+v.Password, color.GreenString("\u2714"))
165 | outputText += "|-- " + v.Password + "\n"
166 | }
167 | }
168 | } else {
169 | fmt.Println("|- No Password Leaks from Breach Directory")
170 | outputText += "|- No Password Leaks from Breach Directory \n"
171 | }
172 | println("\nPassword Leaks from Intelx:")
173 | if len(intelxData) > 0 {
174 | for _, v := range intelxData {
175 | fmt.Println("|- "+v, color.GreenString("\u2714"))
176 | outputText += "|- " + v + "\n"
177 | }
178 | } else {
179 | color.Red("No intelx file!")
180 | outputText += "No intelx file! \n"
181 | }
182 | }
183 |
184 | func dumpPrint(binData []string) {
185 | fmt.Println("Pastebin and Throwbin Search Results:")
186 | outputText += "Pastebin and Throwbin Search Results: \n"
187 | for _, v := range binData {
188 | fmt.Println("|- "+v, color.GreenString("\u2714"))
189 | outputText += "|- " + v + "\n"
190 | }
191 | }
192 |
193 | func domainPrint(table *tablewriter.Table, ipapi modules.IPAPIStruct) {
194 | println("\nDomain Information:")
195 | outputText += "Domain Information: \n"
196 | fmt.Println("|- IP: "+ipapi.IP, color.GreenString("\u2714"))
197 | outputText += "|- IP: " + ipapi.IP + "\n"
198 | fmt.Println("|- City: "+ipapi.City, color.GreenString("\u2714"))
199 | outputText += "|- City: " + ipapi.City + "\n"
200 | fmt.Println("|- Region: "+ipapi.Region, color.GreenString("\u2714"))
201 | outputText += "|- Region: " + ipapi.Region + "\n"
202 | fmt.Println("|- Region Code: "+ipapi.RegionCode, color.GreenString("\u2714"))
203 | outputText += "|- Region Code: " + ipapi.RegionCode + "\n"
204 | fmt.Println("|- Country: "+ipapi.Country, color.GreenString("\u2714"))
205 | outputText += "|- Country: " + ipapi.Country + "\n"
206 | fmt.Println("|- Country Code: "+ipapi.CountryCode, color.GreenString("\u2714"))
207 | outputText += "|- Country Code: " + ipapi.CountryCode + "\n"
208 | fmt.Println("|- Country Name: "+ipapi.CountryName, color.GreenString("\u2714"))
209 | outputText += "|- Country Name: " + ipapi.CountryName + "\n"
210 | fmt.Println("|- Postal: "+ipapi.Postal, color.GreenString("\u2714"))
211 | outputText += "|- Postal: " + ipapi.Postal + "\n"
212 | fmt.Println("|- TimeZone: "+ipapi.Timezone, color.GreenString("\u2714"))
213 | outputText += "|- TimeZone: " + ipapi.Timezone + "\n"
214 | fmt.Println("|- Country Calling Code: "+ipapi.CountryCallingCode, color.GreenString("\u2714"))
215 | outputText += "|- Country Calling Code: " + ipapi.CountryCallingCode + "\n"
216 | fmt.Println("|- Currency: "+ipapi.Currency, color.GreenString("\u2714"))
217 | outputText += "|- Currency: " + ipapi.Currency + "\n"
218 | fmt.Println("|- Organization: "+ipapi.Org, color.GreenString("\u2714"))
219 | outputText += "|- Organization: " + ipapi.Org + "\n"
220 |
221 | println("\nDNS Records:")
222 | table.Render()
223 | }
224 |
225 | var outputText string = ""
226 |
227 | func main() {
228 | var email *string = flag.String("e", "", "Set email")
229 | var verify *bool = flag.Bool("verify", false, "Verify method")
230 | var social_accounts *bool = flag.Bool("social", false, "Finding registered accounts from email")
231 | var relateds *bool = flag.Bool("relateds", false, "Finding related emails and domains from domain")
232 | var leaks *bool = flag.Bool("leaks", false, "Finding password leaks from email")
233 | var dumps *bool = flag.Bool("dumps", false, "Finding Pastebin dumps from email")
234 | var domain *bool = flag.Bool("domain", false, "More information about domain")
235 | var output *bool = flag.Bool("o", false, "Output to text file")
236 | var version *bool = flag.Bool("v", false, "Version of mosint")
237 | var help *bool = flag.Bool("h", false, "Help Menu")
238 | var all *bool = flag.Bool("all", false, "All features!")
239 | flag.Parse()
240 | println("")
241 | if len(*email) == 0 {
242 | help_menu()
243 | os.Exit(0)
244 | } else if *help {
245 | help_menu()
246 | os.Exit(0)
247 | } else if *version {
248 | color.White("version: 2.1")
249 | os.Exit(0)
250 | } else if *all {
251 |
252 | var bar = progressbar.Default(100, "mosinting")
253 | bar.Add(5)
254 | var verifyData = modules.VerifyEmail(*email)
255 | bar.Add(7)
256 | var emailRepData = modules.EmailRep(*email)
257 | bar.Add(8)
258 | modules.Runner(*email, "SocialScan")
259 | bar.Add(8)
260 | modules.Runner(*email, "Holehe")
261 | var relEmails = modules.RelatedEmails(*email)
262 | bar.Add(8)
263 | var relDomains = modules.RelatedDomains(*email)
264 | bar.Add(8)
265 | var fromGoogle = modules.Related_domains_from_google(*email)
266 | bar.Add(8)
267 | var hunterData = modules.Hunter(*email)
268 | bar.Add(8)
269 | var breachData = modules.BreachDirectory(*email)
270 | bar.Add(8)
271 | var binData = modules.BinSearch(*email)
272 | bar.Add(8)
273 | var ipapi = modules.IPAPI(*email)
274 | bar.Add(8)
275 | var table = modules.DNS_lookup(*email)
276 | bar.Add(8)
277 | var intelxData = modules.Intelx(*email)
278 | bar.Finish()
279 | verifyPrint(verifyData, emailRepData, *email)
280 | socialPrint("socialscantempresult.txt")
281 | socialPrint("holehetempresult.txt")
282 | relatedPrint(relEmails, relDomains, fromGoogle, hunterData)
283 | leakPrint(breachData, intelxData)
284 | dumpPrint(binData)
285 | domainPrint(table, ipapi)
286 | if *output {
287 | var filename = modules.FileWriter(*email, outputText)
288 | color.Green("\nOutput file: " + filename)
289 | }
290 | os.Exit(0)
291 | } else {
292 | if *verify {
293 | verifyPrint(modules.VerifyEmail(*email), modules.EmailRep(*email), *email)
294 | if *output {
295 | var filename = modules.FileWriter(*email, outputText)
296 | color.Green("\nOutput file: " + filename)
297 | }
298 | os.Exit(0)
299 | }
300 | if *social_accounts {
301 | fmt.Println("Social media accounts opened with", color.WhiteString(*email))
302 | modules.Runner(*email, "SocialScan")
303 | modules.Runner(*email, "Holehe")
304 | socialPrint("socialscantempresult.txt")
305 | socialPrint("holehetempresult.txt")
306 | if *output {
307 | var filename = modules.FileWriter(*email, outputText)
308 | color.Green("\nOutput file: " + filename)
309 | }
310 | os.Exit(0)
311 | }
312 | if *relateds {
313 | relatedPrint(modules.RelatedEmails(*email), modules.RelatedDomains(*email), modules.Related_domains_from_google(*email), modules.Hunter(*email))
314 | if *output {
315 | var filename = modules.FileWriter(*email, outputText)
316 | color.Green("\nOutput file: " + filename)
317 | }
318 | os.Exit(0)
319 | }
320 | if *leaks {
321 | leakPrint(modules.BreachDirectory(*email), modules.Intelx(*email))
322 | if *output {
323 | var filename = modules.FileWriter(*email, outputText)
324 | color.Green("\nOutput file: " + filename)
325 | }
326 | os.Exit(0)
327 | }
328 | if *dumps {
329 | dumpPrint(modules.BinSearch(*email))
330 | if *output {
331 | var filename = modules.FileWriter(*email, outputText)
332 | color.Green("\nOutput file: " + filename)
333 | }
334 | }
335 | if *domain {
336 | domainPrint(modules.DNS_lookup(*email), modules.IPAPI(*email))
337 | if *output {
338 | var filename = modules.FileWriter(*email, outputText)
339 | color.Green("\nOutput file: " + filename)
340 | }
341 | os.Exit(0)
342 | }
343 | }
344 |
345 | }
346 |
--------------------------------------------------------------------------------
/modules/BreachDirectory.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package modules
6 |
7 | import (
8 | "encoding/json"
9 | "io/ioutil"
10 | "net/http"
11 | )
12 |
13 | type BreachDirectoryStruct struct {
14 | Success bool `json:"success"`
15 | Found int `json:"found"`
16 | Result []struct {
17 | HasPassword bool `json:"has_password"`
18 | Sources []string `json:"sources"`
19 | Password string `json:"password,omitempty"`
20 | Sha1 string `json:"sha1,omitempty"`
21 | Hash string `json:"hash,omitempty"`
22 | } `json:"result"`
23 | }
24 |
25 | func BreachDirectory(email string) BreachDirectoryStruct {
26 | key := GetAPIKey("BreachDirectory.org API Key")
27 | url := "https://breachdirectory.p.rapidapi.com/?func=auto&term=" + email
28 |
29 | req, _ := http.NewRequest("GET", url, nil)
30 |
31 | req.Header.Add("x-rapidapi-host", "breachdirectory.p.rapidapi.com")
32 | req.Header.Add("x-rapidapi-key", key)
33 |
34 | res, _ := http.DefaultClient.Do(req)
35 |
36 | defer res.Body.Close()
37 | body, _ := ioutil.ReadAll(res.Body)
38 | data := BreachDirectoryStruct{}
39 | json.Unmarshal(body, &data)
40 | return data
41 | }
42 |
--------------------------------------------------------------------------------
/modules/Core.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package modules
6 |
7 | import (
8 | "bufio"
9 | "encoding/json"
10 | "fmt"
11 | "io"
12 | "io/ioutil"
13 | "os/exec"
14 | )
15 |
16 | func GetAPIKey(key string) string {
17 | data, err := ioutil.ReadFile("keys.json")
18 | if err != nil {
19 | panic(err)
20 | }
21 | var returnData map[string]interface{}
22 | err = json.Unmarshal(data, &returnData)
23 | if err != nil {
24 | fmt.Printf("%+v", err.Error())
25 | return ""
26 | }
27 | return returnData[key].(string)
28 | }
29 |
30 | func Runner(email string, kind string) {
31 | cmd := exec.Command("python3", "modules/"+kind+".py", "-e", email)
32 | stdout, err := cmd.StdoutPipe()
33 | if err != nil {
34 | panic(err)
35 | }
36 | stderr, err := cmd.StderrPipe()
37 | if err != nil {
38 | panic(err)
39 | }
40 | err = cmd.Start()
41 | if err != nil {
42 | panic(err)
43 | }
44 |
45 | go copyOutput(stdout)
46 | go copyOutput(stderr)
47 | cmd.Wait()
48 |
49 | }
50 |
51 | func copyOutput(r io.Reader) {
52 | scanner := bufio.NewScanner(r)
53 | for scanner.Scan() {
54 | fmt.Println(scanner.Text())
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/modules/EmailRep.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package modules
6 |
7 | import (
8 | "encoding/json"
9 | "io/ioutil"
10 | "net/http"
11 | )
12 |
13 | type EmailRepStruct struct {
14 | Email string `json:"email"`
15 | Reputation string `json:"reputation"`
16 | Suspicious bool `json:"suspicious"`
17 | References int `json:"references"`
18 | Details struct {
19 | Blacklisted bool `json:"blacklisted"`
20 | MaliciousActivity bool `json:"malicious_activity"`
21 | MaliciousActivityRecent bool `json:"malicious_activity_recent"`
22 | CredentialsLeaked bool `json:"credentials_leaked"`
23 | CredentialsLeakedRecent bool `json:"credentials_leaked_recent"`
24 | DataBreach bool `json:"data_breach"`
25 | FirstSeen string `json:"first_seen"`
26 | LastSeen string `json:"last_seen"`
27 | DomainExists bool `json:"domain_exists"`
28 | DomainReputation string `json:"domain_reputation"`
29 | NewDomain bool `json:"new_domain"`
30 | DaysSinceDomainCreation int `json:"days_since_domain_creation"`
31 | SuspiciousTld bool `json:"suspicious_tld"`
32 | Spam bool `json:"spam"`
33 | FreeProvider bool `json:"free_provider"`
34 | Disposable bool `json:"disposable"`
35 | Deliverable bool `json:"deliverable"`
36 | AcceptAll bool `json:"accept_all"`
37 | ValidMx bool `json:"valid_mx"`
38 | PrimaryMx string `json:"primary_mx"`
39 | Spoofable bool `json:"spoofable"`
40 | SpfStrict bool `json:"spf_strict"`
41 | DmarcEnforced bool `json:"dmarc_enforced"`
42 | Profiles []string `json:"profiles"`
43 | } `json:"details"`
44 | }
45 |
46 | func EmailRep(email string) EmailRepStruct {
47 | key := GetAPIKey("EmailRep.io API Key")
48 |
49 | client := &http.Client{}
50 | req, _ := http.NewRequest("GET", "https://emailrep.io/"+email, nil)
51 | req.Header.Set("Key", key)
52 | req.Header.Set("User-Agent", "mosint")
53 | resp, _ := client.Do(req)
54 | body, _ := ioutil.ReadAll(resp.Body)
55 | data := EmailRepStruct{}
56 | json.Unmarshal(body, &data)
57 | return data
58 | }
59 |
--------------------------------------------------------------------------------
/modules/FileWriter.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package modules
6 |
7 | import (
8 | "log"
9 | "os"
10 | "strconv"
11 | "time"
12 | )
13 |
14 | func FileWriter(email string, text string) string {
15 | t := time.Now()
16 |
17 | var filename string = "outputs/" + email + "-" + strconv.FormatUint(uint64(t.Unix()), 10) + ".txt"
18 | f, err := os.Create(filename)
19 |
20 | if err != nil {
21 | log.Fatal(err)
22 | }
23 | defer f.Close()
24 | f.WriteString(text)
25 | return filename
26 | }
27 |
--------------------------------------------------------------------------------
/modules/Googling.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package modules
6 |
7 | import (
8 | googlesearch "github.com/rocketlaunchr/google-search"
9 | )
10 |
11 | func BinSearch(email string) []string {
12 | var url_array []string
13 | q := "intext:" + string('"') + email + string('"') + " site:pastebin.com"
14 | res, _ := googlesearch.Search(nil, q)
15 | size := len(res)
16 | for i := 0; i < size; i++ {
17 | url_array = append(url_array, res[i].URL)
18 | }
19 | q = "intext:" + string('"') + email + string('"') + " site:throwbin.io"
20 | res, _ = googlesearch.Search(nil, q)
21 | size2 := len(res)
22 | for i := 0; i < size2; i++ {
23 | url_array = append(url_array, res[i].URL)
24 | }
25 | return url_array
26 | }
27 |
28 | func Related_domains_from_google(email string) []string {
29 | var url_array []string
30 | res, _ := googlesearch.Search(nil, email)
31 | size := len(res)
32 | for i := 0; i < size; i++ {
33 | url_array = append(url_array, res[i].URL)
34 | }
35 | return url_array
36 | }
37 |
--------------------------------------------------------------------------------
/modules/Holehe.py:
--------------------------------------------------------------------------------
1 | #mosint v2.1
2 | #Author: Alp Keskin
3 | #Github: github.com/alpkeskin
4 | #Website: https://imalp.co
5 | from genericpath import exists
6 | import trio
7 | import httpx
8 | import argparse
9 | from holehe.modules.social_media.wattpad import wattpad
10 | from holehe.modules.social_media.discord import discord
11 | from holehe.modules.social_media.plurk import plurk
12 | from holehe.modules.social_media.imgur import imgur
13 |
14 |
15 | def parse_args():
16 | parser = argparse.ArgumentParser()
17 | parser.add_argument("-e", "--email", type=str, required=True, help="Email")
18 | return parser.parse_args()
19 |
20 |
21 | async def main():
22 | try:
23 | args = parse_args()
24 | mail = args.email
25 | out = []
26 | client = httpx.AsyncClient()
27 |
28 | await wattpad(mail, client, out)
29 | await discord(mail, client, out)
30 | await plurk(mail, client, out)
31 | await imgur(mail, client, out)
32 | file = open("holehetempresult.txt", "w")
33 | for i in out:
34 | if i["exists"]:
35 | file.write(i["name"])
36 | await client.aclose()
37 | file.close()
38 | except Exception as e:
39 | print(e)
40 |
41 | trio.run(main)
42 |
--------------------------------------------------------------------------------
/modules/Hunter.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package modules
6 |
7 | import (
8 | "encoding/json"
9 | "io/ioutil"
10 | "net/http"
11 | "strings"
12 | )
13 |
14 | type HunterStruct struct {
15 | Data struct {
16 | Domain string `json:"domain"`
17 | Disposable bool `json:"disposable"`
18 | Webmail bool `json:"webmail"`
19 | AcceptAll bool `json:"accept_all"`
20 | Pattern string `json:"pattern"`
21 | Organization string `json:"organization"`
22 | Country string `json:"country"`
23 | State interface{} `json:"state"`
24 | Emails []struct {
25 | Value string `json:"value"`
26 | Type string `json:"type"`
27 | Confidence int `json:"confidence"`
28 | Sources []struct {
29 | Domain string `json:"domain"`
30 | URI string `json:"uri"`
31 | ExtractedOn string `json:"extracted_on"`
32 | LastSeenOn string `json:"last_seen_on"`
33 | StillOnPage bool `json:"still_on_page"`
34 | } `json:"sources"`
35 | FirstName string `json:"first_name"`
36 | LastName string `json:"last_name"`
37 | Position string `json:"position"`
38 | Seniority string `json:"seniority"`
39 | Department string `json:"department"`
40 | Linkedin interface{} `json:"linkedin"`
41 | Twitter interface{} `json:"twitter"`
42 | PhoneNumber interface{} `json:"phone_number"`
43 | Verification struct {
44 | Date string `json:"date"`
45 | Status string `json:"status"`
46 | } `json:"verification"`
47 | } `json:"emails"`
48 | LinkedDomains []interface{} `json:"linked_domains"`
49 | } `json:"data"`
50 | Meta struct {
51 | Results int `json:"results"`
52 | Limit int `json:"limit"`
53 | Offset int `json:"offset"`
54 | Params struct {
55 | Domain string `json:"domain"`
56 | Company interface{} `json:"company"`
57 | Type interface{} `json:"type"`
58 | Seniority interface{} `json:"seniority"`
59 | Department interface{} `json:"department"`
60 | } `json:"params"`
61 | } `json:"meta"`
62 | }
63 |
64 | func Hunter(email string) HunterStruct {
65 | key := GetAPIKey("Hunter.io API Key")
66 |
67 | client := &http.Client{}
68 | req, _ := http.NewRequest("GET", "https://api.hunter.io/v2/domain-search?domain="+strings.Split(email, "@")[1]+"&api_key="+key, nil)
69 | req.Header.Set("User-Agent", "mosint")
70 | resp, _ := client.Do(req)
71 | body, _ := ioutil.ReadAll(resp.Body)
72 | data := HunterStruct{}
73 | json.Unmarshal(body, &data)
74 | return data
75 | }
76 |
--------------------------------------------------------------------------------
/modules/Intelx.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package modules
6 |
7 | import (
8 | "context"
9 | "fmt"
10 |
11 | "github.com/IntelligenceX/SDK/Go/ixapi"
12 | )
13 |
14 | const defaultMaxResults = 10 // max results to query and show
15 | const frontendBaseURL = "https://intelx.io/"
16 |
17 | var urls []string
18 |
19 | func Intelx(email string) []string {
20 | key := GetAPIKey("Intelx.io API Key")
21 |
22 | search(context.Background(), key, email, 2)
23 |
24 | return urls
25 | }
26 |
27 | func search(ctx context.Context, Key, Selector string, Sort int) {
28 |
29 | search := ixapi.IntelligenceXAPI{}
30 | search.Init("", Key)
31 | results, selectorInvalid, err := search.Search(ctx, Selector, Sort, defaultMaxResults, ixapi.DefaultWaitSortTime, ixapi.DefaultTimeoutGetResults)
32 |
33 | if err != nil {
34 | fmt.Printf("Error querying results: %s\n", err)
35 | return
36 | } else if len(results) == 0 && selectorInvalid {
37 | return
38 | }
39 |
40 | text := generateResultText(ctx, &search, results)
41 | fmt.Println(text)
42 | }
43 |
44 | func generateResultText(ctx context.Context, api *ixapi.IntelligenceXAPI, Records []ixapi.SearchResult) (text string) {
45 |
46 | for n, record := range Records {
47 | resultLink := frontendBaseURL + "?did=" + record.SystemID.String()
48 |
49 | title := record.Name
50 | if title == "" {
51 | title = "Untitled Document"
52 | }
53 | urls = append(urls, resultLink)
54 |
55 | if n >= defaultMaxResults-1 {
56 | break
57 | }
58 | }
59 |
60 | return
61 | }
62 |
--------------------------------------------------------------------------------
/modules/Lookup.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package modules
6 |
7 | import (
8 | "encoding/json"
9 | "net"
10 | "os"
11 | "strings"
12 |
13 | "github.com/olekukonko/tablewriter"
14 | "github.com/valyala/fasthttp"
15 | )
16 |
17 | type IPAPIStruct struct {
18 | IP string `json:"ip"`
19 | Version string `json:"version"`
20 | City string `json:"city"`
21 | Region string `json:"region"`
22 | RegionCode string `json:"region_code"`
23 | Country string `json:"country"`
24 | CountryName string `json:"country_name"`
25 | CountryCode string `json:"country_code"`
26 | CountryCodeIso3 string `json:"country_code_iso3"`
27 | CountryCapital string `json:"country_capital"`
28 | CountryTld string `json:"country_tld"`
29 | ContinentCode string `json:"continent_code"`
30 | InEu bool `json:"in_eu"`
31 | Postal string `json:"postal"`
32 | Latitude float64 `json:"latitude"`
33 | Longitude float64 `json:"longitude"`
34 | Timezone string `json:"timezone"`
35 | UtcOffset string `json:"utc_offset"`
36 | CountryCallingCode string `json:"country_calling_code"`
37 | Currency string `json:"currency"`
38 | CurrencyName string `json:"currency_name"`
39 | Languages string `json:"languages"`
40 | CountryArea float64 `json:"country_area"`
41 | CountryPopulation int `json:"country_population"`
42 | Asn string `json:"asn"`
43 | Org string `json:"org"`
44 | }
45 |
46 | func DNS_lookup(email string) *tablewriter.Table {
47 | splt := strings.Split(email, "@")
48 |
49 | data := [][]string{}
50 | iprecords, _ := net.LookupIP(splt[1])
51 | for _, ip := range iprecords {
52 | row := []string{"IP", ip.String()}
53 | data = append(data, row)
54 | }
55 | nameserver, _ := net.LookupNS(splt[1])
56 | for _, ns := range nameserver {
57 | row := []string{"NS", ns.Host}
58 | data = append(data, row)
59 | }
60 | mxrecords, _ := net.LookupMX(splt[1])
61 | for _, mx := range mxrecords {
62 | row := []string{"MX", mx.Host}
63 | data = append(data, row)
64 | }
65 | txtrecords, _ := net.LookupTXT(splt[1])
66 | for _, txt := range txtrecords {
67 | row := []string{"TXT", txt}
68 | data = append(data, row)
69 | }
70 |
71 | table := tablewriter.NewWriter(os.Stdout)
72 | table.SetHeader([]string{"Name", "Record"})
73 |
74 | for _, v := range data {
75 | table.Append(v)
76 | }
77 | //table.Render()
78 | return table
79 | }
80 |
81 | func IPAPI(email string) IPAPIStruct {
82 | data := IPAPIStruct{}
83 | splt := strings.Split(email, "@")
84 | ips, _ := net.LookupIP(splt[1])
85 | ip4api := ""
86 | for _, ip := range ips {
87 | if ipv4 := ip.To4(); ipv4 != nil {
88 | ip4api = ipv4.String()
89 | }
90 | }
91 | if ip4api != "" {
92 | req := fasthttp.AcquireRequest()
93 | resp := fasthttp.AcquireResponse()
94 | defer fasthttp.ReleaseRequest(req)
95 | defer fasthttp.ReleaseResponse(resp)
96 |
97 | req.SetRequestURI("https://ipapi.co/" + ip4api + "/json/")
98 |
99 | fasthttp.Do(req, resp)
100 |
101 | bodyBytes := resp.Body()
102 |
103 | json.Unmarshal(bodyBytes, &data)
104 | }
105 | return data
106 | }
107 |
--------------------------------------------------------------------------------
/modules/SocialScan.py:
--------------------------------------------------------------------------------
1 | #mosint v2.1
2 | #Author: Alp Keskin
3 | #Github: github.com/alpkeskin
4 | #Website: https://imalp.co
5 | from socialscan.util import Platforms, sync_execute_queries
6 | import argparse
7 |
8 |
9 |
10 | def parse_args():
11 | parser = argparse.ArgumentParser()
12 | parser.add_argument("-e", "--email", type=str, required=True, help="Email")
13 | return parser.parse_args()
14 |
15 |
16 | def main():
17 | try:
18 | args = parse_args()
19 | mail = args.email
20 | q = [mail]
21 | platforms = [
22 | Platforms.GITHUB,
23 | Platforms.TWITTER,
24 | Platforms.INSTAGRAM,
25 | Platforms.PINTEREST,
26 | Platforms.SPOTIFY,
27 | Platforms.FIREFOX,
28 | ]
29 | results = sync_execute_queries(q, platforms)
30 | f = open("socialscantempresult.txt", "w")
31 | for result in results:
32 | if not result.available:
33 | f.write(f"{result.platform}\n")
34 | f.close()
35 | except Exception as e:
36 | print(e)
37 |
38 | main()
39 |
--------------------------------------------------------------------------------
/modules/ThreatCrowd.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package modules
6 |
7 | import (
8 | "encoding/json"
9 | "fmt"
10 | "strings"
11 |
12 | "github.com/valyala/fasthttp"
13 | )
14 |
15 | func doRequest(url string, kind string) []string {
16 | req := fasthttp.AcquireRequest()
17 | resp := fasthttp.AcquireResponse()
18 | defer fasthttp.ReleaseRequest(req)
19 | defer fasthttp.ReleaseResponse(resp)
20 |
21 | req.SetRequestURI(url)
22 |
23 | fasthttp.Do(req, resp)
24 | var data_array []string
25 | bodyBytes := resp.Body()
26 | var dat map[string]interface{}
27 | if err := json.Unmarshal(bodyBytes, &dat); err != nil {
28 | panic(err)
29 | }
30 | if dat["response_code"] == "1" {
31 |
32 | q := dat[kind]
33 | str := fmt.Sprintf("%v", q)
34 | splt := strings.Split(str, " ")
35 | length := len(splt)
36 | if length > 0 {
37 | for i := 0; i < length; i++ {
38 | if i == 0 {
39 | data_array = append(data_array, splt[i][1:])
40 | } else if i == (length - 1) {
41 | data_array = append(data_array, splt[i][:len(splt[i])-1])
42 | } else {
43 | data_array = append(data_array, splt[i])
44 | }
45 | }
46 | }
47 | }
48 | return data_array
49 | }
50 |
51 | func RelatedDomains(email string) []string {
52 | return doRequest("https://www.threatcrowd.org/searchApi/v2/email/report/?email="+email, "domains")
53 | }
54 |
55 | func RelatedEmails(email string) []string {
56 | return doRequest("https://www.threatcrowd.org/searchApi/v2/domain/report/?domain="+strings.Split(email, "@")[1], "emails")
57 | }
58 |
--------------------------------------------------------------------------------
/modules/Verify.go:
--------------------------------------------------------------------------------
1 | // mosint v2.1
2 | // Author: Alp Keskin
3 | // Github: github.com/alpkeskin
4 | // Website: https://imalp.co
5 | package modules
6 |
7 | import (
8 | "strings"
9 |
10 | emailverifier "github.com/AfterShip/email-verifier"
11 | )
12 |
13 | type VerifyStruct struct {
14 | IsVerified bool `json:"is_verified"`
15 | IsDisposable bool `json:"is_disposable"`
16 | Err error `json:"err"`
17 | }
18 |
19 | var (
20 | verifier = emailverifier.NewVerifier().
21 | EnableAutoUpdateDisposable()
22 | )
23 |
24 | func VerifyEmail(email string) VerifyStruct {
25 | v := VerifyStruct{}
26 | ret, err := verifier.Verify(email)
27 | if err != nil {
28 | v.Err = err
29 | }
30 | if !ret.Syntax.Valid {
31 | v.IsVerified = false
32 | } else {
33 | domain := strings.Split(email, "@")[1]
34 | v.IsVerified = true
35 | if !verifier.IsDisposable(domain) {
36 | v.IsDisposable = false
37 | } else {
38 | v.IsDisposable = true
39 | }
40 | }
41 | return v
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/outputs/DELETEME.txt:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | holehe==1.60.3
2 | httpx==0.22.0
3 | socialscan==1.4.1
4 | trio==0.20.0
5 |
--------------------------------------------------------------------------------