Compare commits

..

224 Commits

Author SHA1 Message Date
Soxoj 470ef5721f Merge pull request #385 from soxoj/v0.4.2
Bump to 0.4.2
2022-03-07 20:12:59 +03:00
Maigret autoupdate fd2c8afd33 Updated site list and statistics 2022-03-07 16:44:19 +00:00
cyb3rk0tik 8c007219f5 Bump to 0.4.2 2022-03-07 21:42:34 +05:00
Soxoj a425e5ceff Merge pull request #380 from soxoj/dependabot/pip/pytest-asyncio-0.18.2
Bump pytest-asyncio from 0.18.1 to 0.18.2
2022-03-07 15:36:39 +03:00
Soxoj d0fd3533b5 Merge pull request #374 from soxoj/dependabot/pip/tqdm-4.63.0
Bump tqdm from 4.62.3 to 4.63.0
2022-03-07 15:36:25 +03:00
Soxoj 5bf361a1ac Merge pull request #382 from soxoj/fix-alexa-rank
Fixed issue with str alexaRank
2022-03-06 16:23:19 +03:00
Maigret autoupdate e07d3b60ba Updated site list and statistics 2022-03-06 13:20:31 +00:00
Soxoj 1e2d5cf742 Fixed issue with str alexaRank 2022-03-06 16:19:25 +03:00
Soxoj 694e024ba1 Merge pull request #375 from kustermariocoding/main
Added new sites to data.json
2022-03-06 16:17:50 +03:00
dependabot[bot] 6862425215 Bump pytest-asyncio from 0.18.1 to 0.18.2
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.18.1 to 0.18.2.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.18.1...v0.18.2)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-04 06:05:57 +00:00
kustermariocoding 54c8074e51 tried to fix merge conflicts 2022-02-28 11:41:38 +01:00
dependabot[bot] 71e1fb6dcf Bump tqdm from 4.62.3 to 4.63.0
Bumps [tqdm](https://github.com/tqdm/tqdm) from 4.62.3 to 4.63.0.
- [Release notes](https://github.com/tqdm/tqdm/releases)
- [Commits](https://github.com/tqdm/tqdm/compare/v4.62.3...v4.63.0)

---
updated-dependencies:
- dependency-name: tqdm
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-28 06:07:15 +00:00
Soxoj 364187861d Fix false positive and CI (#372)
* Fix false positive and CI
* Updated site list and statistics
2022-02-27 04:44:15 +03:00
Soxoj 8a53a38543 Fixed the rest of false positives for now (#371)
* Fixed the rest of false positives for now

* Fixed tag

* Updated site list and statistics
2022-02-26 16:43:40 +03:00
Soxoj bc787cdf51 Fix false positives (#370)
* Fixed several false positives, improved statistics info

* Disabled some sites, fixed fp percent count method

* Updated site list and statistics
2022-02-26 16:01:22 +03:00
Soxoj dcf5181e28 Fixed several false positives, improved statistics info (#368)
* Fixed several false positives, improved statistics info

* Updated site list and statistics
2022-02-26 15:31:15 +03:00
Soxoj 61452d56d3 Disabled Netvibes and LeetCode (#366)
* Disabled Netvibes and LeetCode

* Specified types of PR for tests in CI

* Updated site list and statistics
2022-02-26 14:49:43 +03:00
Soxoj be204ff119 Wikipedia fix (#365)
* Fixed op.gg sites

* Added testing docs, fixed some error

* Fixed Wikipedia
2022-02-26 14:27:08 +03:00
Soxoj 8a865a1ce6 Op.gg fixes (#363)
* Fixed op.gg sites

* Added testing docs, fixed some error

* Updated site list and statistics
2022-02-26 14:16:13 +03:00
Soxoj a29c3c6abe CI autoupdate (#359)
* CI autoupdate

* Updated site list and statistics
2022-02-26 13:38:15 +03:00
kustermariocoding ea6fd30a30 added kotburger.pl 2022-02-24 11:51:00 +01:00
kustermariocoding 8dbe9a415c added karab.in 2022-02-24 11:45:23 +01:00
kustermariocoding 222398154e added joemonster 2022-02-24 11:25:18 +01:00
kustermariocoding 3030025ea3 added jellyfin weblate 2022-02-24 11:11:40 +01:00
kustermariocoding 40233e66cb added jeja.pl 2022-02-24 10:57:13 +01:00
kustermariocoding 2ea75f7f76 added jbzd 2022-02-24 10:50:33 +01:00
kustermariocoding dbd393da58 added ipolska.pl 2022-02-24 10:34:03 +01:00
kustermariocoding b9f72151ea added Inkbunny 2022-02-24 10:08:59 +01:00
kustermariocoding dc2989a47d added hexrpg 2022-02-24 09:53:56 +01:00
kustermariocoding c86e558a57 added hackerrank 2022-02-24 09:41:14 +01:00
kustermariocoding 3c8c1d1f5a Merge branch 'main' of https://github.com/soxoj/maigret into site_adds 2022-02-24 09:39:58 +01:00
Soxoj 1683e5b744 Added DB statistics autoupdate and write to sites.md (#357) 2022-02-23 18:01:42 +03:00
Soxoj 31fc656721 Added package publishing instruction (#356) 2022-02-23 16:46:58 +03:00
Soxoj 79f872c77c Added some scripts (#355) 2022-02-23 14:33:37 +03:00
kustermariocoding 22f158e749 added gradle 2022-02-22 11:42:39 +01:00
kustermariocoding ff1eac0b20 added gnome vcs 2022-02-22 11:23:16 +01:00
kustermariocoding f2d3fed9c7 added Furaffinity 2022-02-22 10:26:58 +01:00
kustermariocoding cbbdc5a820 added friendfinder-x 2022-02-22 10:15:56 +01:00
kustermariocoding 8a614001fd added friendfinder 2022-02-22 09:49:37 +01:00
kustermariocoding 7a50f2922a Merge branch 'main' of https://github.com/soxoj/maigret into site_adds 2022-02-22 09:15:39 +01:00
kustermariocoding da0f4ae7cf added fotka 2022-02-22 09:15:11 +01:00
kustermariocoding d12310bb53 added fosstodon 2022-02-22 08:59:12 +01:00
cyberkotik 211b8ccfd0 Merge pull request #352 from soxoj/cyb3rk0tik-patch-1
Fix reportlab not only for testing
2022-02-21 23:52:58 +05:00
cyberkotik f352f9f58b Fix reportlab not only for testing 2022-02-21 23:42:49 +05:00
kustermariocoding 0d70ee1abc added forumprawne.org 2022-02-21 14:43:08 +01:00
kustermariocoding 032ca8141a added fedi.lewactwo.pl 2022-02-21 14:28:48 +01:00
kustermariocoding 3acf6e5180 added fansly 2022-02-21 14:20:54 +01:00
kustermariocoding 14f2b0c756 added fancentro.com 2022-02-21 12:50:41 +01:00
cyberkotik e0a4775205 Merge pull request #351 from soxoj/cyb3rk0tik-patch-1
Pin reportlab version
2022-02-21 16:47:25 +05:00
cyberkotik d056eb545f Pin reportlab version 2022-02-21 16:39:56 +05:00
kustermariocoding 10f8e1f597 added faktopedia.pl 2022-02-21 12:12:27 +01:00
kustermariocoding 6cc789d800 added fabswingers 2022-02-21 11:59:34 +01:00
kustermariocoding c214f38841 Merge branch 'main' of https://github.com/soxoj/maigret into site_adds 2022-02-21 11:56:35 +01:00
cyberkotik 392b83c230 Merge pull request #350 from soxoj/dependabot/pip/lxml-4.8.0
Bump lxml from 4.7.1 to 4.8.0
2022-02-21 15:23:31 +05:00
cyberkotik 96bebd49d3 Merge pull request #346 from soxoj/dependabot/pip/typing-extensions-4.1.1
Bump typing-extensions from 4.0.1 to 4.1.1
2022-02-21 15:23:19 +05:00
cyberkotik 92950f1b88 Merge pull request #345 from soxoj/dependabot/pip/pytest-7.0.1
Bump pytest from 7.0.0 to 7.0.1
2022-02-21 15:21:53 +05:00
cyberkotik 07b5874802 Merge pull request #343 from soxoj/dependabot/pip/pytest-asyncio-0.18.1
Bump pytest-asyncio from 0.18.0 to 0.18.1
2022-02-21 15:21:42 +05:00
kustermariocoding 6a62586a59 added dojoverse 2022-02-18 15:00:36 +01:00
kustermariocoding 883abe7877 added demotywatory.pl 2022-02-18 13:53:34 +01:00
kustermariocoding fc58046a34 added cytoid.io 2022-02-18 11:50:54 +01:00
kustermariocoding b6a1eb26e7 added Cults3d 2022-02-18 11:37:16 +01:00
kustermariocoding 42169397fe added chomukij.pl and crowdin.com 2022-02-18 11:18:57 +01:00
kustermariocoding 870d68ec1c added site castingcallclub 2022-02-18 09:22:18 +01:00
kustermariocoding 12ef7f62c2 added site caringbridge 2022-02-18 09:05:16 +01:00
dependabot[bot] 8b7ea67edc Bump lxml from 4.7.1 to 4.8.0
Bumps [lxml](https://github.com/lxml/lxml) from 4.7.1 to 4.8.0.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.7.1...lxml-4.8.0)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-18 06:07:51 +00:00
dependabot[bot] 182a493b6a Bump typing-extensions from 4.0.1 to 4.1.1
Bumps [typing-extensions](https://github.com/python/typing) from 4.0.1 to 4.1.1.
- [Release notes](https://github.com/python/typing/releases)
- [Changelog](https://github.com/python/typing/blob/master/typing_extensions/CHANGELOG)
- [Commits](https://github.com/python/typing/compare/4.0.1...4.1.1)

---
updated-dependencies:
- dependency-name: typing-extensions
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 06:09:08 +00:00
dependabot[bot] 4f7781b7a2 Bump pytest from 7.0.0 to 7.0.1
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.0.0 to 7.0.1.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.0.0...7.0.1)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 06:09:03 +00:00
dependabot[bot] 3579f2fd09 Bump pytest-asyncio from 0.18.0 to 0.18.1
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.18.0 to 0.18.1.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.18.0...v0.18.1)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-11 06:14:37 +00:00
kustermariocoding 34b8d938f7 added site blogi.pl 2022-02-10 14:32:47 +01:00
kustermariocoding ea963af29b added Bitwarden Forum 2022-02-10 14:17:20 +01:00
kustermariocoding 5ea5f6337d added site Biggerpockets 2022-02-10 14:00:05 +01:00
kustermariocoding 292d0a2665 added site Bentbox 2022-02-10 13:42:33 +01:00
kustermariocoding 057bdce751 added site Bandlab 2022-02-10 13:24:29 +01:00
kustermariocoding f051cc768e added AvidCommunity Site 2022-02-10 12:06:56 +01:00
kustermariocoding 985f4075f4 added site Artistsnclients 2022-02-10 11:29:14 +01:00
kustermariocoding d88abc6271 added site arduino.cc 2022-02-10 11:14:27 +01:00
kustermariocoding 63b99338d7 added new site appian 2022-02-10 10:35:50 +01:00
kustermariocoding bd3503f3c8 added 101010.pl website to data.json 2022-02-08 14:51:59 +01:00
dependabot[bot] d7f94076bf Bump pytest-asyncio from 0.17.2 to 0.18.0 (#340)
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.17.2 to 0.18.0.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.17.2...v0.18.0)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-08 12:28:58 +03:00
dependabot[bot] 10879c8bf3 Bump pytest from 6.2.5 to 7.0.0 (#339)
Bumps [pytest](https://github.com/pytest-dev/pytest) from 6.2.5 to 7.0.0.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/6.2.5...7.0.0)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-07 12:42:00 +03:00
dependabot[bot] b48d126118 Bump pytest-httpserver from 1.0.3 to 1.0.4 (#334)
Bumps [pytest-httpserver](https://github.com/csernazs/pytest-httpserver) from 1.0.3 to 1.0.4.
- [Release notes](https://github.com/csernazs/pytest-httpserver/releases)
- [Changelog](https://github.com/csernazs/pytest-httpserver/blob/master/CHANGES.rst)
- [Commits](https://github.com/csernazs/pytest-httpserver/compare/1.0.3...1.0.4)

---
updated-dependencies:
- dependency-name: pytest-httpserver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-29 00:10:17 +03:00
dependabot[bot] c2c2707fb6 Bump multidict from 6.0.1 to 6.0.2 (#333)
Bumps [multidict](https://github.com/aio-libs/multidict) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/aio-libs/multidict/releases)
- [Changelog](https://github.com/aio-libs/multidict/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/multidict/compare/v6.0.1...v6.0.2)

---
updated-dependencies:
- dependency-name: multidict
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-25 23:05:58 +03:00
dependabot[bot] 5e16edc003 Bump multidict from 5.2.0 to 6.0.1 (#332)
* Bump multidict from 5.2.0 to 6.0.1

Bumps [multidict](https://github.com/aio-libs/multidict) from 5.2.0 to 6.0.1.
- [Release notes](https://github.com/aio-libs/multidict/releases)
- [Changelog](https://github.com/aio-libs/multidict/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/multidict/compare/v5.2.0...v6.0.1)

---
updated-dependencies:
- dependency-name: multidict
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Fixed Python 3.6 compatibility

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Soxoj <soxoj@protonmail.com>
2022-01-25 00:52:11 +03:00
Soxoj e84b5e3d5d Disable kinooh, sites list update workflow added (#329)
* Disable kinooh, sites list update workflow added

* Workflow update
2022-01-22 00:37:49 +03:00
Soxoj 4d65d03074 Disabled Ruboard (#327) 2022-01-21 02:11:08 +03:00
Soxoj 222e8d3d09 Update logo 2022-01-18 23:36:02 +03:00
dependabot[bot] 92c7e41439 Bump pytest-asyncio from 0.17.1 to 0.17.2 (#323)
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.17.1 to 0.17.2.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.17.1...v0.17.2)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-18 17:34:08 +03:00
dependabot[bot] 55f941cf18 Bump pytest-asyncio from 0.17.0 to 0.17.1 (#321)
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.17.0 to 0.17.1.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.17.0...v0.17.1)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-17 19:29:03 +03:00
imgbot[bot] fa6bb1ee17 [ImgBot] Optimize images (#319)
*Total -- 1,424.29kb -> 846.97kb (40.53%)

/static/report_alexaimephotography_xmind_screenshot.png -- 772.80kb -> 351.39kb (54.53%)
/static/report_alexaimephotography_html_screenshot.png -- 606.94kb -> 451.06kb (25.68%)
/static/recursive_search.svg -- 44.55kb -> 44.52kb (0.07%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>

Co-authored-by: ImgBotApp <ImgBotHelp@gmail.com>
2022-01-15 15:33:42 +03:00
Soxoj 58ae979904 Bumped to v0.4.1 (#317) 2022-01-15 12:51:27 +03:00
dependabot[bot] e8d63ef273 Bump pytest-asyncio from 0.16.0 to 0.17.0 (#314)
* Bump pytest-asyncio from 0.16.0 to 0.17.0

Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.16.0 to 0.17.0.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.16.0...v0.17.0)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Python version specified for dependency (3.6 support was dropped)

* Pytest config fixes

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Soxoj <soxoj@protonmail.com>
2022-01-15 12:46:33 +03:00
Soxoj 41f2ae6faa Codacademy fixed (#316) 2022-01-15 12:30:23 +03:00
Soxoj 6cf9b296e5 Pornhub search improved (#315) 2022-01-15 12:22:11 +03:00
dependabot[bot] 1301e66e90 Bump pycountry from 20.7.3 to 22.1.10 (#313)
Bumps [pycountry](https://github.com/flyingcircusio/pycountry) from 20.7.3 to 22.1.10.
- [Release notes](https://github.com/flyingcircusio/pycountry/releases)
- [Changelog](https://github.com/flyingcircusio/pycountry/blob/master/HISTORY.txt)
- [Commits](https://github.com/flyingcircusio/pycountry/compare/20.7.3...22.1.10)

---
updated-dependencies:
- dependency-name: pycountry
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-11 11:37:08 +03:00
Soxoj 549a8b43fe Fixed TikTok checks (#303) (#306) 2022-01-10 20:11:52 +03:00
Soxoj 2c33d797ce Temporary fix for Twitter (#299) (#300) 2022-01-08 19:15:57 +03:00
Soxoj 5c05cfa5bc Fixed BongaCams, links parsing improved (#297)
* Fixed BongaCams, links parsing improved

* Fixed tests
2022-01-08 03:45:49 +03:00
Soxoj 3e884d4b76 Added aparat.com (#294) 2022-01-06 20:25:31 +03:00
dependabot[bot] 66c80aa878 Bump requests from 2.27.0 to 2.27.1 (#293)
Bumps [requests](https://github.com/psf/requests) from 2.27.0 to 2.27.1.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.27.0...v2.27.1)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-06 11:45:50 +03:00
Antônio Marco da Silva e51aba743a changed Bayoushooter to use XenForo and foursquare to use correct checkType (#289)
* changed Bayoushooter to use XenForo and foursquare to use correct checkType
* fix: removed disable from Bayoushooter

Co-authored-by: Antonio Marco <antonio.marco@liferaftinc.com>
2022-01-04 17:23:04 +03:00
dependabot[bot] 55dea38b6b Bump requests from 2.26.0 to 2.27.0 (#292)
Bumps [requests](https://github.com/psf/requests) from 2.26.0 to 2.27.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.26.0...v2.27.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 10:15:25 +03:00
Soxoj d516c93bfc Added dozen of sites, improved submit mode (#288) 2022-01-03 06:05:45 +03:00
Soxoj e520418f6a Bump to v0.4.0 (#287) 2022-01-03 01:44:11 +03:00
Soxoj ecabf88c3a Added a couple of sites, fixed false positives (#286) 2022-01-03 01:35:53 +03:00
dependabot[bot] 8801f7e6de Bump attrs from 21.3.0 to 21.4.0 (#283)
Bumps [attrs](https://github.com/python-attrs/attrs) from 21.3.0 to 21.4.0.
- [Release notes](https://github.com/python-attrs/attrs/releases)
- [Changelog](https://github.com/python-attrs/attrs/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/python-attrs/attrs/compare/21.3.0...21.4.0)

---
updated-dependencies:
- dependency-name: attrs
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-30 10:29:12 +03:00
dependabot[bot] d52ff10186 Bump psutil from 5.8.0 to 5.9.0 (#282)
Bumps [psutil](https://github.com/giampaolo/psutil) from 5.8.0 to 5.9.0.
- [Release notes](https://github.com/giampaolo/psutil/releases)
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-5.8.0...release-5.9.0)

---
updated-dependencies:
- dependency-name: psutil
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-30 10:29:04 +03:00
dependabot[bot] 4ee65e0445 Bump attrs from 21.2.0 to 21.3.0 (#281)
Bumps [attrs](https://github.com/python-attrs/attrs) from 21.2.0 to 21.3.0.
- [Release notes](https://github.com/python-attrs/attrs/releases)
- [Changelog](https://github.com/python-attrs/attrs/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/python-attrs/attrs/compare/21.2.0...21.3.0)

---
updated-dependencies:
- dependency-name: attrs
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-29 10:53:44 +03:00
Soxoj 1dfc45722b Fixed some false positives (#280) 2021-12-26 19:47:26 +03:00
dependabot[bot] bc8e29e92a Bump async-timeout from 4.0.1 to 4.0.2 (#275)
Bumps [async-timeout](https://github.com/aio-libs/async-timeout) from 4.0.1 to 4.0.2.
- [Release notes](https://github.com/aio-libs/async-timeout/releases)
- [Changelog](https://github.com/aio-libs/async-timeout/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/async-timeout/compare/v4.0.1...v4.0.2)

---
updated-dependencies:
- dependency-name: async-timeout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-21 23:54:30 +03:00
Soxoj c5df7ca990 Fixed votetags, updated issue template (#278) 2021-12-21 23:54:21 +03:00
Soxoj bda85b290e Fixed failed tests (thx to Meta aka Facebook) (#273) 2021-12-20 23:16:33 +03:00
dependabot[bot] b781602474 Bump pytest-httpserver from 1.0.2 to 1.0.3 (#270)
Bumps [pytest-httpserver](https://github.com/csernazs/pytest-httpserver) from 1.0.2 to 1.0.3.
- [Release notes](https://github.com/csernazs/pytest-httpserver/releases)
- [Changelog](https://github.com/csernazs/pytest-httpserver/blob/master/CHANGES.rst)
- [Commits](https://github.com/csernazs/pytest-httpserver/compare/1.0.2...1.0.3)

---
updated-dependencies:
- dependency-name: pytest-httpserver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-16 21:47:49 +03:00
dependabot[bot] 56ad1d1c60 Bump lxml from 4.6.5 to 4.7.1 (#269)
Bumps [lxml](https://github.com/lxml/lxml) from 4.6.5 to 4.7.1.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.6.5...lxml-4.7.1)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-14 09:41:24 +03:00
dependabot[bot] 744ad1deda Bump lxml from 4.6.4 to 4.6.5 (#266)
Bumps [lxml](https://github.com/lxml/lxml) from 4.6.4 to 4.6.5.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.6.4...lxml-4.6.5)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-13 19:42:30 +03:00
Soxoj aee9125c96 Disabled non-working sites, updated public sites list (#263) 2021-12-12 14:00:11 +03:00
Soxoj 262f97ce33 Fixed xHamster, added support of proxies to self-check mode (#259) 2021-12-10 23:01:56 +03:00
soxoj 4880b71246 Added false results buttons to reports, fixed some falses (#256) 2021-12-09 01:04:24 +03:00
soxoj 5f220b652d Disabled non-working sites (#255)
* Disabled non-working sites

* Added invalid result issue template
2021-12-09 00:50:53 +03:00
soxoj f533c30564 Fixed some false positives (#254) 2021-12-08 04:21:16 +03:00
dependabot[bot] 2b905ae996 Bump typing-extensions from 4.0.0 to 4.0.1 (#253)
Bumps [typing-extensions](https://github.com/python/typing) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/python/typing/releases)
- [Changelog](https://github.com/python/typing/blob/master/typing_extensions/CHANGELOG)
- [Commits](https://github.com/python/typing/commits)

---
updated-dependencies:
- dependency-name: typing-extensions
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-01 18:01:42 +03:00
dependabot[bot] c154cf9f23 Bump aiohttp-socks from 0.6.1 to 0.7.1 (#250)
Bumps [aiohttp-socks](https://github.com/romis2012/aiohttp-socks) from 0.6.1 to 0.7.1.
- [Release notes](https://github.com/romis2012/aiohttp-socks/releases)
- [Commits](https://github.com/romis2012/aiohttp-socks/compare/v0.6.1...v0.7.1)

---
updated-dependencies:
- dependency-name: aiohttp-socks
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-27 14:22:33 +03:00
dependabot[bot] 90ec62d657 Bump aiohttp-socks from 0.6.0 to 0.6.1 (#249)
Bumps [aiohttp-socks](https://github.com/romis2012/aiohttp-socks) from 0.6.0 to 0.6.1.
- [Release notes](https://github.com/romis2012/aiohttp-socks/releases)
- [Commits](https://github.com/romis2012/aiohttp-socks/compare/v0.6.0...v0.6.1)

---
updated-dependencies:
- dependency-name: aiohttp-socks
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-24 00:22:00 +03:00
dependabot[bot] 09ae96e4da Bump typing-extensions from 3.10.0.2 to 4.0.0 (#245)
Bumps [typing-extensions](https://github.com/python/typing) from 3.10.0.2 to 4.0.0.
- [Release notes](https://github.com/python/typing/releases)
- [Changelog](https://github.com/python/typing/blob/master/typing_extensions/CHANGELOG)
- [Commits](https://github.com/python/typing/compare/3.10.0.2...4.0.0)

---
updated-dependencies:
- dependency-name: typing-extensions
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-15 22:56:48 +03:00
dependabot[bot] b664efc3f1 Bump aiohttp from 3.8.0 to 3.8.1 (#246)
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.8.0 to 3.8.1.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/v3.8.1/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.8.0...v3.8.1)

---
updated-dependencies:
- dependency-name: aiohttp
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-15 22:56:34 +03:00
dependabot[bot] 39a523c188 Bump soupsieve from 2.1 to 2.3.1 (#239)
Bumps [soupsieve](https://github.com/facelessuser/soupsieve) from 2.1 to 2.3.1.
- [Release notes](https://github.com/facelessuser/soupsieve/releases)
- [Commits](https://github.com/facelessuser/soupsieve/compare/2.1.0...2.3.1)

---
updated-dependencies:
- dependency-name: soupsieve
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 17:43:38 +03:00
dependabot[bot] d1c708e8c3 Bump chardet from 3.0.4 to 4.0.0 (#241)
Bumps [chardet](https://github.com/chardet/chardet) from 3.0.4 to 4.0.0.
- [Release notes](https://github.com/chardet/chardet/releases)
- [Commits](https://github.com/chardet/chardet/compare/3.0.4...4.0.0)

---
updated-dependencies:
- dependency-name: chardet
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 17:43:26 +03:00
dependabot[bot] 954465f2d6 Bump pytest-asyncio from 0.14.0 to 0.16.0 (#240)
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 0.14.0 to 0.16.0.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v0.14.0...v0.16.0)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 17:42:40 +03:00
dependabot[bot] fb75e9e5a2 Bump arabic-reshaper from 2.1.1 to 2.1.3 (#243)
Bumps [arabic-reshaper](https://github.com/mpcabd/python-arabic-reshaper) from 2.1.1 to 2.1.3.
- [Release notes](https://github.com/mpcabd/python-arabic-reshaper/releases)
- [Commits](https://github.com/mpcabd/python-arabic-reshaper/compare/v2.1.1...v2.1.3)

---
updated-dependencies:
- dependency-name: arabic-reshaper
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 17:42:30 +03:00
dependabot[bot] ef8f9ce15b Bump tqdm from 4.55.0 to 4.62.3 (#242)
Bumps [tqdm](https://github.com/tqdm/tqdm) from 4.55.0 to 4.62.3.
- [Release notes](https://github.com/tqdm/tqdm/releases)
- [Commits](https://github.com/tqdm/tqdm/compare/v4.55.0...v4.62.3)

---
updated-dependencies:
- dependency-name: tqdm
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 17:42:11 +03:00
dependabot[bot] 0aec913eee Bump pytest from 6.2.4 to 6.2.5 (#238)
Bumps [pytest](https://github.com/pytest-dev/pytest) from 6.2.4 to 6.2.5.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/6.2.4...6.2.5)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 17:26:41 +03:00
dependabot[bot] fa064b6c1b Bump jinja2 from 3.0.2 to 3.0.3 (#235)
Bumps [jinja2](https://github.com/pallets/jinja) from 3.0.2 to 3.0.3.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: jinja2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 17:26:29 +03:00
dependabot[bot] 7f151a0d6a Bump psutil from 5.7.0 to 5.8.0 (#234)
Bumps [psutil](https://github.com/giampaolo/psutil) from 5.7.0 to 5.8.0.
- [Release notes](https://github.com/giampaolo/psutil/releases)
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-5.7.0...release-5.8.0)

---
updated-dependencies:
- dependency-name: psutil
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 17:26:17 +03:00
dependabot[bot] 8b20799a34 Bump async-timeout from 4.0.0 to 4.0.1 (#236)
Bumps [async-timeout](https://github.com/aio-libs/async-timeout) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/aio-libs/async-timeout/releases)
- [Changelog](https://github.com/aio-libs/async-timeout/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/async-timeout/compare/v4.0.0...v4.0.1)

---
updated-dependencies:
- dependency-name: async-timeout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 17:26:02 +03:00
dependabot[bot] 6477a36ae1 Bump yarl from 1.6.3 to 1.7.2 (#237)
Bumps [yarl](https://github.com/aio-libs/yarl) from 1.6.3 to 1.7.2.
- [Release notes](https://github.com/aio-libs/yarl/releases)
- [Changelog](https://github.com/aio-libs/yarl/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/yarl/compare/v1.6.3...v1.7.2)

---
updated-dependencies:
- dependency-name: yarl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-14 17:25:20 +03:00
dependabot[bot] a7a56839a9 Bump pytest-rerunfailures from 9.1.1 to 10.2 (#230)
Bumps [pytest-rerunfailures](https://github.com/pytest-dev/pytest-rerunfailures) from 9.1.1 to 10.2.
- [Release notes](https://github.com/pytest-dev/pytest-rerunfailures/releases)
- [Changelog](https://github.com/pytest-dev/pytest-rerunfailures/blob/master/CHANGES.rst)
- [Commits](https://github.com/pytest-dev/pytest-rerunfailures/compare/9.1.1...10.2)

---
updated-dependencies:
- dependency-name: pytest-rerunfailures
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-12 13:42:15 +03:00
dependabot[bot] b33656c02c Bump pefile from 2019.4.18 to 2021.9.3 (#229)
Bumps [pefile](https://github.com/erocarrera/pefile) from 2019.4.18 to 2021.9.3.
- [Release notes](https://github.com/erocarrera/pefile/releases)
- [Commits](https://github.com/erocarrera/pefile/compare/v2019.4.18...v2021.9.3)

---
updated-dependencies:
- dependency-name: pefile
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-12 13:30:00 +03:00
dependabot[bot] c5ac36affe Bump lxml from 4.6.3 to 4.6.4 (#231)
Bumps [lxml](https://github.com/lxml/lxml) from 4.6.3 to 4.6.4.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.6.3...lxml-4.6.4)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-12 13:29:23 +03:00
dependabot[bot] e4f87e1a9b Bump pytest-httpserver from 1.0.0 to 1.0.2 (#232)
Bumps [pytest-httpserver](https://github.com/csernazs/pytest-httpserver) from 1.0.0 to 1.0.2.
- [Release notes](https://github.com/csernazs/pytest-httpserver/releases)
- [Changelog](https://github.com/csernazs/pytest-httpserver/blob/master/CHANGES.rst)
- [Commits](https://github.com/csernazs/pytest-httpserver/compare/1.0.0...1.0.2)

---
updated-dependencies:
- dependency-name: pytest-httpserver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-12 13:29:14 +03:00
dependabot[bot] b7b902f108 Bump certifi from 2020.12.5 to 2021.10.8 (#233)
Bumps [certifi](https://github.com/certifi/python-certifi) from 2020.12.5 to 2021.10.8.
- [Release notes](https://github.com/certifi/python-certifi/releases)
- [Commits](https://github.com/certifi/python-certifi/compare/2020.12.05...2021.10.08)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-12 13:29:06 +03:00
dependabot[bot] 447cd8511c Bump mock from 4.0.2 to 4.0.3 (#226)
Bumps [mock](https://github.com/testing-cabal/mock) from 4.0.2 to 4.0.3.
- [Release notes](https://github.com/testing-cabal/mock/releases)
- [Changelog](https://github.com/testing-cabal/mock/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/testing-cabal/mock/compare/4.0.2...4.0.3)

---
updated-dependencies:
- dependency-name: mock
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-11 23:13:06 +03:00
dependabot[bot] 220c749af3 Bump pytest-cov from 2.10.1 to 3.0.0 (#227)
Bumps [pytest-cov](https://github.com/pytest-dev/pytest-cov) from 2.10.1 to 3.0.0.
- [Release notes](https://github.com/pytest-dev/pytest-cov/releases)
- [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-cov/compare/v2.10.1...v3.0.0)

---
updated-dependencies:
- dependency-name: pytest-cov
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-11 13:07:41 +03:00
dependabot[bot] 9e6d38dfea Bump idna from 2.10 to 3.3 (#228)
Bumps [idna](https://github.com/kjd/idna) from 2.10 to 3.3.
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v2.10...v3.3)

---
updated-dependencies:
- dependency-name: idna
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-11 13:07:23 +03:00
dependabot[bot] 1283ac01bf Bump multidict from 5.1.0 to 5.2.0 (#225)
Bumps [multidict](https://github.com/aio-libs/multidict) from 5.1.0 to 5.2.0.
- [Release notes](https://github.com/aio-libs/multidict/releases)
- [Changelog](https://github.com/aio-libs/multidict/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/multidict/compare/v5.1.0...v5.2.0)

---
updated-dependencies:
- dependency-name: multidict
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-11 13:07:00 +03:00
dependabot[bot] dbcd52da81 Bump typing-extensions from 3.7.4.3 to 3.10.0.2 (#224)
Bumps [typing-extensions](https://github.com/python/typing) from 3.7.4.3 to 3.10.0.2.
- [Release notes](https://github.com/python/typing/releases)
- [Changelog](https://github.com/python/typing/blob/master/typing_extensions/CHANGELOG)
- [Commits](https://github.com/python/typing/compare/3.7.4.3...3.10.0.2)

---
updated-dependencies:
- dependency-name: typing-extensions
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-11 13:06:49 +03:00
dependabot[bot] 3e370ce967 Bump aiohttp-socks from 0.5.5 to 0.6.0 (#222)
* Bump aiohttp-socks from 0.5.5 to 0.6.0

Bumps [aiohttp-socks](https://github.com/romis2012/aiohttp-socks) from 0.5.5 to 0.6.0.
- [Release notes](https://github.com/romis2012/aiohttp-socks/releases)
- [Commits](https://github.com/romis2012/aiohttp-socks/compare/v0.5.5...v0.6.0)

---
updated-dependencies:
- dependency-name: aiohttp-socks
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requirements.txt

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: soxoj <31013580+soxoj@users.noreply.github.com>
2021-11-10 19:40:58 +03:00
dependabot[bot] 0bc11da598 Bump aiohttp from 3.7.4 to 3.8.0 (#220)
* Bump aiohttp from 3.7.4 to 3.8.0

Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.7.4 to 3.8.0.
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.7.4...v3.8.0)

---
updated-dependencies:
- dependency-name: aiohttp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update requirements.txt

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: soxoj <31013580+soxoj@users.noreply.github.com>
2021-11-10 16:31:28 +03:00
dependabot[bot] 0a6d2bed2e Bump flake8 from 3.8.4 to 4.0.1 (#219)
Bumps [flake8](https://github.com/pycqa/flake8) from 3.8.4 to 4.0.1.
- [Release notes](https://github.com/pycqa/flake8/releases)
- [Commits](https://github.com/pycqa/flake8/compare/3.8.4...4.0.1)

---
updated-dependencies:
- dependency-name: flake8
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-10 16:16:04 +03:00
dependabot[bot] 2059e69e99 Bump six from 1.15.0 to 1.16.0 (#221)
Bumps [six](https://github.com/benjaminp/six) from 1.15.0 to 1.16.0.
- [Release notes](https://github.com/benjaminp/six/releases)
- [Changelog](https://github.com/benjaminp/six/blob/master/CHANGES)
- [Commits](https://github.com/benjaminp/six/compare/1.15.0...1.16.0)

---
updated-dependencies:
- dependency-name: six
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-11-10 16:12:25 +03:00
soxoj 10523e98c5 Create dependabot.yml 2021-11-10 15:52:47 +03:00
soxoj cae9bf99ff Fixes for win32 release (#218) 2021-11-09 23:14:42 +03:00
soxoj 7decbce08d Box drawing logic improved, added new settings (#217) 2021-11-09 02:33:31 +03:00
soxoj c0f2a550f5 Fixed path and names of report files (#216) 2021-11-09 00:21:19 +03:00
soxoj 6688479c1c Create bug.md (#213) 2021-11-08 19:52:53 +03:00
soxoj 3dc8ae1f41 Update README.md 2021-11-07 22:06:57 +03:00
soxoj 1290a9863f PyInstaller workflow (#206)
* PyInstaller workflow
2021-11-07 20:12:30 +03:00
soxoj 282a3bef73 Merge pull request #210 from soxoj/settings-logging
Removed redundant logging
2021-11-07 18:53:35 +03:00
Soxoj 1b9ce3bac7 Removed redundant logging 2021-11-07 18:52:56 +03:00
soxoj 1931877756 Merge pull request #207 from soxoj/cli-export
Added export of cli entrypoint
2021-11-07 18:16:38 +03:00
soxoj 646265791a Added export of cli entrypoint 2021-11-07 18:14:48 +03:00
soxoj e38e302b6d Merge pull request #204 from soxoj/settings-new-configs
New config options added
2021-11-06 14:37:01 +03:00
soxoj 4ff19970dd Merge branch 'main' into settings-new-configs 2021-11-06 14:31:29 +03:00
Soxoj 267d9e505b New config options added 2021-11-06 14:29:56 +03:00
soxoj 979e0c4dd4 Merge pull request #203 from soxoj/settings-docs
Documentation and settings improved
2021-11-06 08:35:09 +03:00
Soxoj 24a446bd3a Merge branch 'main' into settings-docs 2021-11-06 08:27:58 +03:00
Soxoj 7a362406d5 Documentation and settings improved 2021-11-06 08:24:12 +03:00
soxoj cc0ecb49d4 Merge pull request #200 from soxoj/settings-improving
Added cascade settings loading from ~/.maigret/settings.json and ./settings.json
2021-11-05 13:59:49 +03:00
soxoj 216e02111e Merge pull request #201 from soxoj/codeql-run-fix
Run CodeQL only aflter merge and each Saturday
2021-11-05 13:57:25 +03:00
soxoj 59f573e754 Run CodeQL only aflter merge and each Saturday 2021-11-05 13:57:00 +03:00
soxoj d993c4883e Merge branch 'main' into settings-improving 2021-11-05 13:47:39 +03:00
Soxoj f81a500d72 Added cascade settings loading from ~/.maigret/settings.json and ./settings.json 2021-11-05 13:46:17 +03:00
soxoj 89711ff036 Merge pull request #199 from soxoj/dockerfile-update-05-11
Upgraded base docker image
2021-11-05 11:58:56 +03:00
Soxoj dc8fdc25f5 Upgraded base docker image 2021-11-05 11:57:51 +03:00
soxoj 4f5222df1c Merge pull request #198 from soxoj/doc-link
Added link to documentation
2021-11-04 23:48:59 +03:00
soxoj 1a0db9032d Added link to documentation 2021-11-04 23:48:34 +03:00
soxoj b4a13562a2 Merge pull request #196 from JasperJuergensen/main
Fix incompatible version requirements
2021-11-04 23:45:53 +03:00
Jasper Jürgensen fa3225a7cf Update MarkupSafe to 2.0.1
Fix dependency conflict with jinja2==3.0.2
2021-11-04 21:43:08 +01:00
Jasper Jürgensen 6aef69cc81 Update dependencies
- attrs from 20.3.0 to 21.2.0
- jinja2 from 2.11.3 to 3.0.2
2021-11-04 16:16:16 +00:00
soxoj 74665283ed Merge pull request #195 from soxoj/readthedocs-build-reqs
Created ReadTheDocs requirements file
2021-11-02 20:22:21 +03:00
soxoj 4ce241893b Created ReadTheDocs requirements file 2021-11-02 20:22:00 +03:00
soxoj 784eec7748 Merge pull request #194 from egornagornov/read-the-docs
Move wiki pages to ReadTheDocs
2021-11-02 20:11:24 +03:00
Egor Nagornov eeab6ba82c Move wiki pages to ReadTheDocs 2021-11-02 17:21:27 +07:00
Soxoj 516861e0ae Some security fixes
Added link to Patreon
2021-10-31 22:41:59 +03:00
soxoj 87a7a2cc59 Merge pull request #191 from soxoj/codeql-analysis
Create codeql-analysis.yml
2021-10-31 20:35:27 +03:00
soxoj 8f86d76db6 Create codeql-analysis.yml 2021-10-31 20:35:16 +03:00
soxoj 290c162094 Merge pull request #190 from Lab-Osintitalia/main
Snapcraft yaml added
2021-10-31 19:52:22 +03:00
soxoj 63a7e8feac Merge pull request #189 from soxoj/additional-speed-up
Delayed import of requests module, speed check command, reqs updated
2021-10-31 19:43:41 +03:00
Soxoj e3b4512c47 Delayed import of requests module, speed check command, reqs updated 2021-10-31 19:37:26 +03:00
soxoj 37854a867b Merge pull request #188 from soxoj/fp-fixes-speed-up
Accelerated start time & fixed some false positives
2021-10-31 18:35:26 +03:00
Soxoj 6480eebbdf Accelerated start time & fixed some false positives 2021-10-31 18:25:01 +03:00
Lab-Osintitalia c57204ff2f Update snapcraft.yaml 2021-10-03 10:53:16 +02:00
Lab-Osintitalia c147f19c3a Update snapcraft.yaml 2021-10-03 10:44:38 +02:00
Lab-Osintitalia 998ff2e4e6 Update snapcraft.yaml 2021-10-03 10:44:13 +02:00
Lab-OsintItalia 0dd3f2e137 added snapcraft and bin folder 2021-10-03 10:42:04 +02:00
soxoj aad862b2ed Merge pull request #187 from soxoj/false-positive-fixes-04-09
Fixed some false positives from telegram bot
2021-09-04 18:26:29 +03:00
Soxoj c6d0f332bd Fixed some false positives from telegram bot 2021-09-04 18:10:56 +03:00
soxoj f1c006159e Merge pull request #186 from soxoj/reddit-fix
Reddit search fixed
2021-09-04 18:02:02 +03:00
Soxoj 69a09fcd94 Reddit search fixed 2021-09-04 17:50:35 +03:00
soxoj 9f948928e6 Merge pull request #181 from soxoj/sites-fixes-18-07-21
False positives fixes
2021-07-18 23:00:32 +03:00
Soxoj a3034c11ff False positives fixes 2021-07-18 20:25:21 +03:00
soxoj d47c72b972 Merge pull request #179 from soxoj/sites-fixes-04-07-21
Added new sites and fixed some fp
2021-07-05 00:23:02 +03:00
Soxoj 8062ec30e9 Added new sites and fixed some fp 2021-07-05 00:17:05 +03:00
soxoj 32000a1cfd Merge pull request #178 from soxoj/url-source-fix
Fixed DB loading from URL
2021-07-02 23:33:09 +03:00
Soxoj 8af6ce3af5 Fixed DB loading from URL 2021-07-02 23:30:44 +03:00
soxoj 0dd1dd5d76 Merge pull request #176 from soxoj/google-plus
Added checking of Google Plus account through Wayback machine
2021-06-27 13:36:06 +03:00
Soxoj 4aab21046b Added checking of Google Plus account through Wayback machine 2021-06-27 13:33:25 +03:00
soxoj 92ac9ec8b7 Merge pull request #175 from soxoj/new-sites-26-06-21
Added new sites
2021-06-26 13:16:18 +03:00
Soxoj ca2c8b3502 Added new sites 2021-06-26 13:12:45 +03:00
soxoj 4362a41fca Merge pull request #174 from soxoj/graph-report-draft
Draft of graph report
2021-06-21 22:27:40 +03:00
Soxoj c7977f1cdf Draft of graph report 2021-06-21 22:20:51 +03:00
soxoj 49708da980 Update README.md 2021-06-13 03:18:36 +03:00
soxoj bc1398061f Merge pull request #172 from soxoj/dockerfile-update
Dockerfile update
2021-06-13 01:52:35 +03:00
Soxoj e8634c8c56 Dockerfile update 2021-06-13 01:50:36 +03:00
soxoj dc59b93f38 Merge pull request #171 from soxoj/add-code-of-conduct-1
Create CODE_OF_CONDUCT.md
2021-06-13 01:25:59 +03:00
soxoj c727cbae27 Create CODE_OF_CONDUCT.md 2021-06-13 01:25:50 +03:00
soxoj e6c6cc8f6d Update issue templates 2021-06-13 01:22:55 +03:00
soxoj c80e8b1207 Create CONTRIBUTING.md 2021-06-13 01:17:28 +03:00
soxoj 6e78fdeb81 Merge pull request #170 from soxoj/readme-links-fixes
Fixed links to static files in README
2021-06-13 00:51:04 +03:00
Soxoj 9c22e09808 Fixed links to static files in README 2021-06-13 00:49:43 +03:00
soxoj f057fd3a68 Merge pull request #169 from soxoj/submit-mode-refactoring
Refactoring of submit module, some fixes
2021-06-13 00:45:37 +03:00
Soxoj 9b0acc092a Refactoring of submit module, some fixes 2021-06-13 00:43:28 +03:00
soxoj e6b4cdfa77 Added README views counter 2021-06-06 18:25:06 +03:00
Soxoj eb721dc7e3 Makefile, some fixes 2021-06-06 17:32:04 +03:00
soxoj eba0c4531c Merge pull request #167 from soxoj/fixes-04-06-21
Fixed some false positives
2021-06-04 02:59:53 +03:00
Soxoj b4a26c03fe Fixed some false positives 2021-06-04 02:57:32 +03:00
77 changed files with 4303 additions and 878 deletions
+3
View File
@@ -0,0 +1,3 @@
# These are supported funding model platforms
patreon: soxoj
+13
View File
@@ -0,0 +1,13 @@
---
name: Add a site
about: I want to add a new site for Maigret checks
title: New site
labels: new-site
assignees: soxoj
---
Link to the site main page: https://example.com
Link to an existing account: https://example.com/users/john
Link to a nonexistent account: https://example.com/users/noonewouldeverusethis7
Tags: photo, us, ...
+24
View File
@@ -0,0 +1,24 @@
---
name: Maigret bug report
about: I want to report a bug in Maigret functionality
title: ''
labels: bug
assignees: soxoj
---
## Checklist
- [ ] I'm reporting a bug in Maigret functionality
- [ ] I've checked for similar bug reports including closed ones
- [ ] I've checked for pull requests that attempt to fix this bug
## Description
Info about Maigret version you are running and environment (`--version`, operation system, ISP provuder):
<INSERT VERSION INFO HERE>
How to reproduce this bug (commandline options / conditions):
<INSERT EXAMPLE OF CLI COMMAND HERE>
<DESCRIPTION>
@@ -0,0 +1,20 @@
---
name: Report invalid result
about: I want to report invalid result of Maigret search
title: Invalid result
labels: false-result
assignees: soxoj
---
Invalid link: <INSERT LINK HERE>
<!--
Put x into the box
[ ] ==> [x]
-->
- [ ] I'm sure that the link leads to "not found" page
+6
View File
@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "daily"
+67
View File
@@ -0,0 +1,67 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ main ]
schedule:
- cron: '23 6 * * 6'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'python' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
+24
View File
@@ -0,0 +1,24 @@
name: Package exe with PyInstaller - Windows
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: PyInstaller Windows
uses: JackMcKew/pyinstaller-action-windows@main
with:
path: pyinstaller
- uses: actions/upload-artifact@v2
with:
name: maigret_standalone_win32
path: pyinstaller/dist/windows # or path/to/artifact
+2 -5
View File
@@ -1,13 +1,10 @@
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Python package
name: Linting and testing
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
types: [opened, synchronize, reopened]
jobs:
build:
-3
View File
@@ -1,6 +1,3 @@
# This workflow will upload a Python Package using Twine when a release is created
# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
name: Upload Python Package
on:
+34
View File
@@ -0,0 +1,34 @@
name: Update sites rating and statistics
on:
pull_request:
branches: [ main ]
types: [opened, synchronize]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2.3.2
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0 # otherwise, there would be errors pushing refs to the destination repository.
- name: build application
run: |
pip3 install .
python3 ./utils/update_site_data.py --empty-only
- name: Commit and push changes
run: |
git config --global user.name "Maigret autoupdate"
git config --global user.email "soxoj@protonmail.com"
echo `git name-rev ${{ github.event.pull_request.head.sha }} --name-only`
export BRANCH=`git name-rev ${{ github.event.pull_request.head.sha }} --name-only | sed 's/remotes\/origin\///'`
echo $BRANCH
git remote -v
git checkout $BRANCH
git add sites.md
git commit -m "Updated site list and statistics"
git push origin $BRANCH
+4 -1
View File
@@ -30,4 +30,7 @@ src/
.coverage
dist/
htmlcov/
/test_*
/test_*
# Maigret files
settings.json
+124
View File
@@ -2,6 +2,130 @@
## [Unreleased]
## [0.4.2] - 2022-03-07
* [ImgBot] Optimize images by @imgbot in https://github.com/soxoj/maigret/pull/319
* Bump pytest-asyncio from 0.17.0 to 0.17.1 by @dependabot in https://github.com/soxoj/maigret/pull/321
* Bump pytest-asyncio from 0.17.1 to 0.17.2 by @dependabot in https://github.com/soxoj/maigret/pull/323
* Disabled Ruboard by @soxoj in https://github.com/soxoj/maigret/pull/327
* Disable kinooh, sites list update workflow added by @soxoj in https://github.com/soxoj/maigret/pull/329
* Bump multidict from 5.2.0 to 6.0.1 by @dependabot in https://github.com/soxoj/maigret/pull/332
* Bump multidict from 6.0.1 to 6.0.2 by @dependabot in https://github.com/soxoj/maigret/pull/333
* Bump pytest-httpserver from 1.0.3 to 1.0.4 by @dependabot in https://github.com/soxoj/maigret/pull/334
* Bump pytest from 6.2.5 to 7.0.0 by @dependabot in https://github.com/soxoj/maigret/pull/339
* Bump pytest-asyncio from 0.17.2 to 0.18.0 by @dependabot in https://github.com/soxoj/maigret/pull/340
* Bump pytest-asyncio from 0.18.0 to 0.18.1 by @dependabot in https://github.com/soxoj/maigret/pull/343
* Bump pytest from 7.0.0 to 7.0.1 by @dependabot in https://github.com/soxoj/maigret/pull/345
* Bump typing-extensions from 4.0.1 to 4.1.1 by @dependabot in https://github.com/soxoj/maigret/pull/346
* Bump lxml from 4.7.1 to 4.8.0 by @dependabot in https://github.com/soxoj/maigret/pull/350
* Pin reportlab version by @cyb3rk0tik in https://github.com/soxoj/maigret/pull/351
* Fix reportlab not only for testing by @cyb3rk0tik in https://github.com/soxoj/maigret/pull/352
* Added some scripts by @soxoj in https://github.com/soxoj/maigret/pull/355
* Added package publishing instruction by @soxoj in https://github.com/soxoj/maigret/pull/356
* Added DB statistics autoupdate and write to sites.md by @soxoj in https://github.com/soxoj/maigret/pull/357
* CI autoupdate by @soxoj in https://github.com/soxoj/maigret/pull/359
* Op.gg fixes by @soxoj in https://github.com/soxoj/maigret/pull/363
* Wikipedia fix by @soxoj in https://github.com/soxoj/maigret/pull/365
* Disabled Netvibes and LeetCode by @soxoj in https://github.com/soxoj/maigret/pull/366
* Fixed several false positives, improved statistics info by @soxoj in https://github.com/soxoj/maigret/pull/368
* Fix false positives by @soxoj in https://github.com/soxoj/maigret/pull/370
* Fixed the rest of false positives for now by @soxoj in https://github.com/soxoj/maigret/pull/371
* Fix false positive and CI by @soxoj in https://github.com/soxoj/maigret/pull/372
* Added new sites to data.json by @kustermariocoding in https://github.com/soxoj/maigret/pull/375
* Fixed issue with str alexaRank by @soxoj in https://github.com/soxoj/maigret/pull/382
* Bump tqdm from 4.62.3 to 4.63.0 by @dependabot in https://github.com/soxoj/maigret/pull/374
* Bump pytest-asyncio from 0.18.1 to 0.18.2 by @dependabot in https://github.com/soxoj/maigret/pull/380
* @imgbot made their first contribution in https://github.com/soxoj/maigret/pull/319
* @kustermariocoding made their first contribution in https://github.com/soxoj/maigret/pull/375
**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.4.1...v0.4.2
## [0.4.1] - 2022-01-15
* Added dozen of sites, improved submit mode by @soxoj in https://github.com/soxoj/maigret/pull/288
* Bump requests from 2.26.0 to 2.27.0 by @dependabot in https://github.com/soxoj/maigret/pull/292
* changed Bayoushooter to use XenForo and foursquare to use correct checkType by @antomarsi in https://github.com/soxoj/maigret/pull/289
* Bump requests from 2.27.0 to 2.27.1 by @dependabot in https://github.com/soxoj/maigret/pull/293
* Added aparat.com by @soxoj in https://github.com/soxoj/maigret/pull/294
* Fixed BongaCams, links parsing improved by @soxoj in https://github.com/soxoj/maigret/pull/297
* Temporary fix for Twitter (#299) by @soxoj in https://github.com/soxoj/maigret/pull/300
* Fixed TikTok checks (#303) by @soxoj in https://github.com/soxoj/maigret/pull/306
* Bump pycountry from 20.7.3 to 22.1.10 by @dependabot in https://github.com/soxoj/maigret/pull/313
* Pornhub search improved by @soxoj in https://github.com/soxoj/maigret/pull/315
* Codacademy fixed by @soxoj in https://github.com/soxoj/maigret/pull/316
* Bump pytest-asyncio from 0.16.0 to 0.17.0 by @dependabot in https://github.com/soxoj/maigret/pull/314
**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.4.0...v0.4.1
## [0.4.0] - 2022-01-03
* Delayed import of requests module, speed check command, reqs updated by @soxoj in https://github.com/soxoj/maigret/pull/189
* Snapcraft yaml added by @soxoj in https://github.com/soxoj/maigret/pull/190
* Create codeql-analysis.yml by @soxoj in https://github.com/soxoj/maigret/pull/191
* Move wiki pages to ReadTheDocs by @egornagornov in https://github.com/soxoj/maigret/pull/194
* Created ReadTheDocs requirements file by @soxoj in https://github.com/soxoj/maigret/pull/195
* Fix incompatible version requirements by @JasperJuergensen in https://github.com/soxoj/maigret/pull/196
* Added link to documentation by @soxoj in https://github.com/soxoj/maigret/pull/198
* Upgraded base docker image by @soxoj in https://github.com/soxoj/maigret/pull/199
* Run CodeQL only aflter merge and each Saturday by @soxoj in https://github.com/soxoj/maigret/pull/201
* Added cascade settings loading from /.maigret/settings.json and ./settings.json by @soxoj in https://github.com/soxoj/maigret/pull/200
* Documentation and settings improved by @soxoj in https://github.com/soxoj/maigret/pull/203
* New config options added by @soxoj in https://github.com/soxoj/maigret/pull/204
* Added export of cli entrypoint by @soxoj in https://github.com/soxoj/maigret/pull/207
* Removed redundant logging by @soxoj in https://github.com/soxoj/maigret/pull/210
* PyInstaller workflow by @soxoj in https://github.com/soxoj/maigret/pull/206
* Create bug.md by @soxoj in https://github.com/soxoj/maigret/pull/213
* Fixed path and names of report files by @soxoj in https://github.com/soxoj/maigret/pull/216
* Box drawing logic improved, added new settings by @soxoj in https://github.com/soxoj/maigret/pull/217
* Fixes for win32 release by @soxoj in https://github.com/soxoj/maigret/pull/218
* Bump six from 1.15.0 to 1.16.0 by @dependabot in https://github.com/soxoj/maigret/pull/221
* Bump flake8 from 3.8.4 to 4.0.1 by @dependabot in https://github.com/soxoj/maigret/pull/219
* Bump aiohttp from 3.7.4 to 3.8.0 by @dependabot in https://github.com/soxoj/maigret/pull/220
* Bump aiohttp-socks from 0.5.5 to 0.6.0 by @dependabot in https://github.com/soxoj/maigret/pull/222
* Bump typing-extensions from 3.7.4.3 to 3.10.0.2 by @dependabot in https://github.com/soxoj/maigret/pull/224
* Bump multidict from 5.1.0 to 5.2.0 by @dependabot in https://github.com/soxoj/maigret/pull/225
* Bump idna from 2.10 to 3.3 by @dependabot in https://github.com/soxoj/maigret/pull/228
* Bump pytest-cov from 2.10.1 to 3.0.0 by @dependabot in https://github.com/soxoj/maigret/pull/227
* Bump mock from 4.0.2 to 4.0.3 by @dependabot in https://github.com/soxoj/maigret/pull/226
* Bump certifi from 2020.12.5 to 2021.10.8 by @dependabot in https://github.com/soxoj/maigret/pull/233
* Bump pytest-httpserver from 1.0.0 to 1.0.2 by @dependabot in https://github.com/soxoj/maigret/pull/232
* Bump lxml from 4.6.3 to 4.6.4 by @dependabot in https://github.com/soxoj/maigret/pull/231
* Bump pefile from 2019.4.18 to 2021.9.3 by @dependabot in https://github.com/soxoj/maigret/pull/229
* Bump pytest-rerunfailures from 9.1.1 to 10.2 by @dependabot in https://github.com/soxoj/maigret/pull/230
* Bump yarl from 1.6.3 to 1.7.2 by @dependabot in https://github.com/soxoj/maigret/pull/237
* Bump async-timeout from 4.0.0 to 4.0.1 by @dependabot in https://github.com/soxoj/maigret/pull/236
* Bump psutil from 5.7.0 to 5.8.0 by @dependabot in https://github.com/soxoj/maigret/pull/234
* Bump jinja2 from 3.0.2 to 3.0.3 by @dependabot in https://github.com/soxoj/maigret/pull/235
* Bump pytest from 6.2.4 to 6.2.5 by @dependabot in https://github.com/soxoj/maigret/pull/238
* Bump tqdm from 4.55.0 to 4.62.3 by @dependabot in https://github.com/soxoj/maigret/pull/242
* Bump arabic-reshaper from 2.1.1 to 2.1.3 by @dependabot in https://github.com/soxoj/maigret/pull/243
* Bump pytest-asyncio from 0.14.0 to 0.16.0 by @dependabot in https://github.com/soxoj/maigret/pull/240
* Bump chardet from 3.0.4 to 4.0.0 by @dependabot in https://github.com/soxoj/maigret/pull/241
* Bump soupsieve from 2.1 to 2.3.1 by @dependabot in https://github.com/soxoj/maigret/pull/239
* Bump aiohttp from 3.8.0 to 3.8.1 by @dependabot in https://github.com/soxoj/maigret/pull/246
* Bump typing-extensions from 3.10.0.2 to 4.0.0 by @dependabot in https://github.com/soxoj/maigret/pull/245
* Bump aiohttp-socks from 0.6.0 to 0.6.1 by @dependabot in https://github.com/soxoj/maigret/pull/249
* Bump aiohttp-socks from 0.6.1 to 0.7.1 by @dependabot in https://github.com/soxoj/maigret/pull/250
* Bump typing-extensions from 4.0.0 to 4.0.1 by @dependabot in https://github.com/soxoj/maigret/pull/253
* Fixed some false positives by @soxoj in https://github.com/soxoj/maigret/pull/254
* Disabled non-working sites by @soxoj in https://github.com/soxoj/maigret/pull/255
* Added false results buttons to reports, fixed some falses by @soxoj in https://github.com/soxoj/maigret/pull/256
* Fixed xHamster, added support of proxies to self-check mode by @soxoj in https://github.com/soxoj/maigret/pull/259
* Disabled non-working sites, updated public sites list by @soxoj in https://github.com/soxoj/maigret/pull/263
* Bump lxml from 4.6.4 to 4.6.5 by @dependabot in https://github.com/soxoj/maigret/pull/266
* Bump lxml from 4.6.5 to 4.7.1 by @dependabot in https://github.com/soxoj/maigret/pull/269
* Bump pytest-httpserver from 1.0.2 to 1.0.3 by @dependabot in https://github.com/soxoj/maigret/pull/270
* Fixed failed tests (thx to Meta aka Facebook) by @soxoj in https://github.com/soxoj/maigret/pull/273
* Fixed votetags, updated issue template by @soxoj in https://github.com/soxoj/maigret/pull/278
* Bump async-timeout from 4.0.1 to 4.0.2 by @dependabot in https://github.com/soxoj/maigret/pull/275
* Fixed some false positives by @soxoj in https://github.com/soxoj/maigret/pull/280
* Bump attrs from 21.2.0 to 21.3.0 by @dependabot in https://github.com/soxoj/maigret/pull/281
* Bump psutil from 5.8.0 to 5.9.0 by @dependabot in https://github.com/soxoj/maigret/pull/282
* Bump attrs from 21.3.0 to 21.4.0 by @dependabot in https://github.com/soxoj/maigret/pull/283
**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.3.1...v0.4.0
## [0.3.1] - 2021-10-31
* fixed false positives
* accelerated maigret start time by 3 times
## [0.3.0] - 2021-06-02
* added support of Tor and I2P sites
* added experimental DNS checking feature
+128
View File
@@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
https://t.me/soxoj.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
+30
View File
@@ -0,0 +1,30 @@
# How to contribute
Hey! I'm really glad you're reading this. Maigret contains a lot of sites, and it is very hard to keep all the sites operational. That's why any fix is important.
## How to add a new site
#### Beginner level
You can use Maigret **submit mode** (`maigret --submit URL`) to add a new site or update an existing site. In this mode Maigret do an automatic analysis of the given account URL or site main page URL to determine the site engine and methods to check account presence. After checking Maigret asks if you want to add the site, answering y/Y will rewrite the local database.
#### Advanced level
You can edit [the database JSON file](https://github.com/soxoj/maigret/blob/main/maigret/resources/data.json) (`./maigret/resources/data.json`) manually.
## Testing
There are CI checks for every PR to the Maigret repository. But it will be better to run `make format`, `make link` and `make test` to ensure you've made a corrent changes.
## Submitting changes
To submit you changes you must [send a GitHub PR](https://github.com/soxoj/maigret/pulls) to the Maigret project.
Always write a clear log message for your commits. One-line messages are fine for small changes, but bigger changes should look like this:
$ git commit -m "A brief summary of the commit
>
> A paragraph describing what changed and its impact."
## Coding conventions
Start reading the code and you'll get the hang of it. ;)
+8 -17
View File
@@ -1,25 +1,16 @@
FROM python:3.7
LABEL maintainer="Soxoj <soxoj@protonmail.com>"
FROM python:3.9-slim
MAINTAINER Soxoj <soxoj@protonmail.com>
WORKDIR /app
ADD requirements.txt .
RUN pip install --upgrade pip
RUN apt update -y
RUN apt install -y\
RUN apt update && \
apt install -y \
gcc \
musl-dev \
libxml2 \
libxml2-dev \
libxslt-dev \
&& YARL_NO_EXTENSIONS=1 python3 -m pip install maigret \
&& rm -rf /var/cache/apk/* \
/tmp/* \
/var/tmp/*
libxslt-dev
RUN apt clean \
&& rm -rf /var/lib/apt/lists/* /tmp/*
ADD . .
RUN YARL_NO_EXTENSIONS=1 python3 -m pip install .
ENTRYPOINT ["maigret"]
+41
View File
@@ -0,0 +1,41 @@
LINT_FILES=maigret wizard.py tests
test:
coverage run --source=./maigret -m pytest tests
coverage report -m
coverage html
rerun-tests:
pytest --lf -vv
lint:
@echo 'syntax errors or undefined names'
flake8 --count --select=E9,F63,F7,F82 --show-source --statistics ${LINT_FILES} maigret.py
@echo 'warning'
flake8 --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics --ignore=E731,W503,E501 ${LINT_FILES} maigret.py
@echo 'mypy'
mypy ${LINT_FILES}
speed:
time python3 ./maigret.py --version
python3 -c "import timeit; t = timeit.Timer('import maigret'); print(t.timeit(number = 1000000))"
python3 -X importtime -c "import maigret" 2> maigret-import.log
python3 -m tuna maigret-import.log
format:
@echo 'black'
black --skip-string-normalization ${LINT_FILES}
pull:
git stash
git checkout main
git pull origin main
git stash pop
clean:
rm -rf reports htmcov dist
install:
pip3 install .
+21 -12
View File
@@ -8,9 +8,12 @@
<a href="https://pypi.org/project/maigret/">
<img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dw/maigret?style=flat-square">
</a>
<a href="https://pypi.org/project/maigret/">
<img alt="Views" src="https://komarev.com/ghpvc/?username=maigret&color=brightgreen&label=views&style=flat-square">
</a>
</p>
<p align="center">
<img src="./static/maigret.png" height="200"/>
<img src="https://raw.githubusercontent.com/soxoj/maigret/main/static/maigret.png" height="200"/>
</p>
</p>
@@ -20,7 +23,7 @@
**Maigret** collect a dossier on a person **by username only**, checking for accounts on a huge number of sites and gathering all the available information from web pages. No API keys required. Maigret is an easy-to-use and powerful fork of [Sherlock](https://github.com/sherlock-project/sherlock).
Currently supported more than 2000 sites ([full list](./sites.md)), search is launched against 500 popular sites in descending order of popularity by default. Also supported checking of Tor sites, I2P sites, and domains (via DNS resolving).
Currently supported more than 2500 sites ([full list](https://github.com/soxoj/maigret/blob/main/sites.md)), search is launched against 500 popular sites in descending order of popularity by default. Also supported checking of Tor sites, I2P sites, and domains (via DNS resolving).
## Main features
@@ -30,15 +33,21 @@ Currently supported more than 2000 sites ([full list](./sites.md)), search is la
* Censorship and captcha detection
* Requests retries
See full description of Maigret features [in the Wiki](https://github.com/soxoj/maigret/wiki/Features).
See full description of Maigret features [in the documentation](https://maigret.readthedocs.io/en/latest/features.html).
## Installation
Maigret can be installed using pip, Docker, or simply can be launched from the cloned repo.
Also you can run Maigret using cloud shells (see buttons below).
[![Open in Cloud Shell](https://user-images.githubusercontent.com/27065646/92304704-8d146d80-ef80-11ea-8c29-0deaabb1c702.png)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/soxoj/maigret&tutorial=README.md) [![Run on Repl.it](https://user-images.githubusercontent.com/27065646/92304596-bf719b00-ef7f-11ea-987f-2c1f3c323088.png)](https://repl.it/github/soxoj/maigret)
<a href="https://colab.research.google.com/gist//soxoj/879b51bc3b2f8b695abb054090645000/maigret.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab" height="40"></a>
Standalone EXE-binaries for Windows are located in [Releases section](https://github.com/soxoj/maigret/releases) of GitHub repository.
Also you can run Maigret using cloud shells and Jupyter notebooks (see buttons below).
[![Open in Cloud Shell](https://user-images.githubusercontent.com/27065646/92304704-8d146d80-ef80-11ea-8c29-0deaabb1c702.png)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/soxoj/maigret&tutorial=README.md)
<a href="https://repl.it/github/soxoj/maigret"><img src="https://user-images.githubusercontent.com/27065646/92304596-bf719b00-ef7f-11ea-987f-2c1f3c323088.png" alt="Run on Repl.it" height="50"></a>
<a href="https://colab.research.google.com/gist/soxoj/879b51bc3b2f8b695abb054090645000/maigret-collab.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab" height="45"></a>
<a href="https://mybinder.org/v2/gist/soxoj/9d65c2f4d3bec5dd25949197ea73cf3a/HEAD"><img src="https://mybinder.org/badge_logo.svg" alt="Open In Binder" height="45"></a>
### Package installing
@@ -92,21 +101,21 @@ maigret user --tags photo,dating
maigret user1 user2 user3 -a
```
Use `maigret --help` to get full options description. Also options are documented in [the Maigret Wiki](https://github.com/soxoj/maigret/wiki/Command-line-options).
Use `maigret --help` to get full options description. Also options [are documented](https://maigret.readthedocs.io/en/latest/command-line-options.html).
## Demo with page parsing and recursive username search
[PDF report](./static/report_alexaimephotographycars.pdf), [HTML report](https://htmlpreview.github.io/?https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotographycars.html)
[PDF report](https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotographycars.pdf), [HTML report](https://htmlpreview.github.io/?https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotographycars.html)
![animation of recursive search](./static/recursive_search.svg)
![animation of recursive search](https://raw.githubusercontent.com/soxoj/maigret/main/static/recursive_search.svg)
![HTML report screenshot](./static/report_alexaimephotography_html_screenshot.png)
![HTML report screenshot](https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotography_html_screenshot.png)
![XMind report screenshot](./static/report_alexaimephotography_xmind_screenshot.png)
![XMind report screenshot](https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotography_xmind_screenshot.png)
[Full console output](./static/recursive_search.md)
[Full console output](https://raw.githubusercontent.com/soxoj/maigret/main/static/recursive_search.md)
## License
Executable
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env python3
import asyncio
import sys
from maigret.maigret import main
def run():
try:
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
except KeyboardInterrupt:
print('Maigret is interrupted.')
sys.exit(1)
if __name__ == "__main__":
run()
+20
View File
@@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+35
View File
@@ -0,0 +1,35 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build
if "%1" == "" goto help
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd
+1
View File
@@ -0,0 +1 @@
sphinx-copybutton
+127
View File
@@ -0,0 +1,127 @@
.. _command-line-options:
Command line options
====================
Usernames
---------
``maigret username1 username2 ...``
You can specify several usernames separated by space. Usernames are
**not** mandatory as there are other operations modes (see below).
Parsing of account pages and online documents
---------------------------------------------
``maigret --parse URL``
Maigret will try to extract information about the document/account owner
(including username and other ids) and will make a search by the
extracted username and ids. :doc:`Examples <extracting-information-from-pages>`.
Main options
------------
Options are also configurable through settings files, see
:doc:`settings section <settings>`.
``--tags`` - Filter sites for searching by tags: sites categories and
two-letter country codes. E.g. photo, dating, sport; jp, us, global.
Multiple tags can be associated with one site. **Warning: tags markup is
not stable now.**
``-n``, ``--max-connections`` - Allowed number of concurrent connections
**(default: 100)**.
``-a``, ``--all-sites`` - Use all sites for scan **(default: top 500)**.
``--top-sites`` - Count of sites for scan ranked by Alexa Top
**(default: top 500)**.
``--timeout`` - Time (in seconds) to wait for responses from sites
**(default: 30)**. A longer timeout will be more likely to get results
from slow sites. On the other hand, this may cause a long delay to
gather all results. The choice of the right timeout should be carried
out taking into account the bandwidth of the Internet connection.
``--cookies-jar-file`` - File with custom cookies in Netscape format
(aka cookies.txt). You can install an extension to your browser to
download own cookies (`Chrome <https://chrome.google.com/webstore/detail/get-cookiestxt/bgaddhkoddajcdgocldbbfleckgcbcid>`_, `Firefox <https://addons.mozilla.org/en-US/firefox/addon/cookies-txt/>`_).
``--no-recursion`` - Disable parsing pages for other usernames and
recursive search by them.
``--use-disabled-sites`` - Use disabled sites to search (may cause many
false positives).
``--id-type`` - Specify identifier(s) type (default: username).
Supported types: gaia_id, vk_id, yandex_public_id, ok_id, wikimapia_uid.
Currently, you must add ``-a`` flag to run a scan on sites with custom
id types, sites will be filtered automatically.
``--ignore-ids`` - Do not make search by the specified username or other
ids. Useful for repeated scanning with found known irrelevant usernames.
``--db`` - Load Maigret database from a JSON file or an online, valid,
JSON file.
``--retries RETRIES`` - Count of attempts to restart temporarily failed
requests.
Reports
-------
``-P``, ``--pdf`` - Generate a PDF report (general report on all
usernames).
``-H``, ``--html`` - Generate an HTML report file (general report on all
usernames).
``-X``, ``--xmind`` - Generate an XMind 8 mindmap (one report per
username).
``-C``, ``--csv`` - Generate a CSV report (one report per username).
``-T``, ``--txt`` - Generate a TXT report (one report per username).
``-J``, ``--json`` - Generate a JSON report of specific type: simple,
ndjson (one report per username). E.g. ``--json ndjson``
``-fo``, ``--folderoutput`` - Results will be saved to this folder,
``results`` by default. Will be created if doesnt exist.
Output options
--------------
``-v``, ``--verbose`` - Display extra information and metrics.
*(loglevel=WARNING)*
``-vv``, ``--info`` - Display service information. *(loglevel=INFO)*
``-vvv``, ``--debug``, ``-d`` - Display debugging information and site
responses. *(loglevel=DEBUG)*
``--print-not-found`` - Print sites where the username was not found.
``--print-errors`` - Print errors messages: connection, captcha, site
country ban, etc.
Other operations modes
----------------------
``--version`` - Display version information and dependencies.
``--self-check`` - Do self-checking for sites and database and disable
non-working ones **for current search session** by default. Its useful
for testing new internet connection (it depends on provider/hosting on
which sites there will be censorship stub or captcha display). After
checking Maigret asks if you want to save updates, answering y/Y will
rewrite the local database.
``--submit URL`` - Do an automatic analysis of the given account URL or
site main page URL to determine the site engine and methods to check
account presence. After checking Maigret asks if you want to add the
site, answering y/Y will rewrite the local database.
+36
View File
@@ -0,0 +1,36 @@
# Configuration file for the Sphinx documentation builder.
# -- Project information
project = 'Maigret'
copyright = '2021, soxoj'
author = 'soxoj'
release = '0.4.2'
version = '0.4.2'
# -- General configuration
extensions = [
'sphinx.ext.duration',
'sphinx.ext.doctest',
'sphinx.ext.autodoc',
'sphinx.ext.autosummary',
'sphinx.ext.intersphinx',
'sphinx_copybutton'
]
intersphinx_mapping = {
'python': ('https://docs.python.org/3/', None),
'sphinx': ('https://www.sphinx-doc.org/en/master/', None),
}
intersphinx_disabled_domains = ['std']
templates_path = ['_templates']
# -- Options for HTML output
html_theme = 'sphinx_rtd_theme'
# -- Options for EPUB output
epub_show_urls = 'footnote'
+101
View File
@@ -0,0 +1,101 @@
.. _development:
Development
==============
Testing
-------
It is recommended use Python 3.7/3.8 for test due to some conflicts in 3.9.
Install test requirements:
.. code-block:: console
pip install -r test-requirements.txt
Use the following commands to check Maigret:
.. code-block:: console
# run linter and typing checks
# order of checks%
# - critical syntax errors or undefined names
# - flake checks
# - mypy checks
make lint
# run testing with coverage html report
# current test coverage is 60%
make text
# open html report
open htmlcov/index.html
How to publish new version of Maigret
-------------------------------------
**Collaborats rights are requires, write Soxoj to get them**.
For new version publishing you must create a new branch in repository
with a bumped version number and actual changelog first. After it you
must create a release, and GitHub action automatically create a new
PyPi package.
- New branch example: https://github.com/soxoj/maigret/commit/e520418f6a25d7edacde2d73b41a8ae7c80ddf39
- Release example: https://github.com/soxoj/maigret/releases/tag/v0.4.1
1. Make a new branch locally with a new version name. Check the current version number here: https://pypi.org/project/maigret/.
**Increase only patch version (third number)** if there are no breaking changes.
.. code-block:: console
git checkout -b 0.4.0
2. Update Maigret version in three files manually:
- setup.py
- maigret/__version__.py
- docs/source/conf.py
3. Create a new empty text section in the beginning of the file `CHANGELOG.md` with a current date:
.. code-block:: console
## [0.4.0] - 2022-01-03
4. Get auto-generate release notes:
- Open https://github.com/soxoj/maigret/releases/new
- Click `Choose a tag`, enter `test`
- Click `Create new tag`
- Press `+ Auto-generate release notes`
- Copy all the text from description text field below
- Paste it to empty text section in `CHANGELOG.txt`
- Remove redundant lines `## What's Changed` and `## New Contributors` section if it exists
- *Close the new release page*
5. Commit all the changes, push, make pull request
.. code-block:: console
git add ...
git commit -m 'Bump to 0.4.0'
git push origin head
6. Merge pull request
7. Create new release
- Open https://github.com/soxoj/maigret/releases/new again
- Click `Choose a tag`
- Enter actual version in format `v0.4.0`
- Also enter actual version in the field `Release title`
- Click `Create new tag`
- Press `+ Auto-generate release notes`
- **Press "Publish release" button**
8. That's all, now you can simply wait push to PyPi. You can monitor it in Action page: https://github.com/soxoj/maigret/actions/workflows/python-publish.yml
@@ -0,0 +1,35 @@
.. _extracting-information-from-pages:
Extracting information from pages
=================================
Maigret can parse URLs and content of web pages by URLs to extract info about account owner and other meta information.
You must specify the URL with the option ``--parse``, it's can be a link to an account or an online document. List of supported sites `see here <https://github.com/soxoj/socid-extractor#sites>`_.
After the end of the parsing phase, Maigret will start the search phase by :doc:`supported identifiers <supported-identifier-types>` found (usernames, ids, etc.).
Examples
--------
.. code-block:: console
$ maigret --parse https://docs.google.com/spreadsheets/d/1HtZKMLRXNsZ0HjtBmo0Gi03nUPiJIA4CC4jTYbCAnXw/edit\#gid\=0
Scanning webpage by URL https://docs.google.com/spreadsheets/d/1HtZKMLRXNsZ0HjtBmo0Gi03nUPiJIA4CC4jTYbCAnXw/edit#gid=0...
┣╸org_name: Gooten
┗╸mime_type: application/vnd.google-apps.ritz
Scanning webpage by URL https://clients6.google.com/drive/v2beta/files/1HtZKMLRXNsZ0HjtBmo0Gi03nUPiJIA4CC4jTYbCAnXw?fields=alternateLink%2CcopyRequiresWriterPermission%2CcreatedDate%2Cdescription%2CdriveId%2CfileSize%2CiconLink%2Cid%2Clabels(starred%2C%20trashed)%2ClastViewedByMeDate%2CmodifiedDate%2Cshared%2CteamDriveId%2CuserPermission(id%2Cname%2CemailAddress%2Cdomain%2Crole%2CadditionalRoles%2CphotoLink%2Ctype%2CwithLink)%2Cpermissions(id%2Cname%2CemailAddress%2Cdomain%2Crole%2CadditionalRoles%2CphotoLink%2Ctype%2CwithLink)%2Cparents(id)%2Ccapabilities(canMoveItemWithinDrive%2CcanMoveItemOutOfDrive%2CcanMoveItemOutOfTeamDrive%2CcanAddChildren%2CcanEdit%2CcanDownload%2CcanComment%2CcanMoveChildrenWithinDrive%2CcanRename%2CcanRemoveChildren%2CcanMoveItemIntoTeamDrive)%2Ckind&supportsTeamDrives=true&enforceSingleParent=true&key=AIzaSyC1eQ1xj69IdTMeii5r7brs3R90eck-m7k...
┣╸created_at: 2016-02-16T18:51:52.021Z
┣╸updated_at: 2019-10-23T17:15:47.157Z
┣╸gaia_id: 15696155517366416778
┣╸fullname: Nadia Burgess
┣╸email: nadia@gooten.com
┣╸image: https://lh3.googleusercontent.com/a-/AOh14GheZe1CyNa3NeJInWAl70qkip4oJ7qLsD8vDy6X=s64
┗╸email_username: nadia
.. code-block:: console
$ maigret.py --parse https://steamcommunity.com/profiles/76561199113454789
Scanning webpage by URL https://steamcommunity.com/profiles/76561199113454789...
┣╸steam_id: 76561199113454789
┣╸nickname: Pok
┗╸username: Machine42
+76
View File
@@ -0,0 +1,76 @@
.. _features:
Features
========
This is the list of Maigret features.
Personal info gathering
-----------------------
Maigret does the `parsing of accounts webpages and extraction <https://github.com/soxoj/socid-extractor>`_ of personal info, links to other profiles, etc.
Extracted info displayed as an additional result in CLI output and as tables in HTML and PDF reports.
Also, Maigret use found ids and usernames from links to start a recursive search.
Enabled by default, can be disabled with ``--no extracting``.
Recursive search
----------------
Maigret can extract some :ref:`common ids <supported-identifier-types>` and usernames from links on the account page (often people placed links to their other accounts) and immediately start new searches. All the gathered information will be displayed in CLI output and reports.
Enabled by default, can be disabled with ``--no-recursion``.
Reports
-------
Maigret currently supports HTML, PDF, TXT, XMind mindmap, and JSON reports.
HTML/PDF reports contain:
- profile photo
- all the gathered personal info
- additional information about supposed personal data (full name, gender, location), resulting from statistics of all found accounts
Also, there is a short text report in the CLI output after the end of a searching phase.
Tags
----
The Maigret sites database very big (and will be bigger), and it is maybe an overhead to run a search for all the sites.
Also, it is often hard to understand, what sites more interesting for us in the case of a certain person.
Tags markup allows selecting a subset of sites by interests (photo, messaging, finance, etc.) or by country. Tags of found accounts grouped and displayed in the reports.
See full description :doc:`in the Tags Wiki page <tags>`.
Censorship and captcha detection
--------------------------------
Maigret can detect common errors such as censorship stub pages, CloudFlare captcha pages, and others.
If you get more them 3% errors of a certain type in a session, you've got a warning message in the CLI output with recommendations to improve performance and avoid problems.
Retries
-------
Maigret will do retries of the requests with temporary errors got (connection failures, proxy errors, etc.).
One attempt by default, can be changed with option ``--retries N``.
Archives and mirrors checking
-----------------------------
The Maigret database contains not only the original websites, but also mirrors, archives, and aggregators. For example:
- `Reddit BigData search <https://camas.github.io/reddit-search/>`_
- `Picuki <https://www.picuki.com/>`_, Instagram mirror
- `Twitter shadowban <https://shadowban.eu/>`_ checker
It allows getting additional info about the person and checking the existence of the account even if the main site is unavailable (bot protection, captcha, etc.)
Simple API
----------
Maigret can be easily integrated with the use of Python package `maigret <https://pypi.org/project/maigret/>`_.
Example: the official `Telegram bot <https://github.com/soxoj/maigret-tg-bot>`_
+31
View File
@@ -0,0 +1,31 @@
.. _index:
Welcome to the Maigret docs!
============================
**Maigret** is an easy-to-use and powerful OSINT tool for collecting a dossier on a person by username only.
This is achieved by checking for accounts on a huge number of sites and gathering all the available information from web pages.
The project's main goal - give to OSINT researchers and pentesters a **universal tool** to get maximum information about a subject and integrate it with other tools in automatization pipelines.
You may be interested in:
-------------------------
- :doc:`Command line options description <command-line-options>` and :doc:`usage examples <usage-examples>`
- :doc:`Features list <features>`
- :doc:`Project roadmap <roadmap>`
.. toctree::
:hidden:
:caption: Sections
command-line-options
extracting-information-from-pages
features
philosophy
roadmap
supported-identifier-types
tags
usage-examples
settings
development
+6
View File
@@ -0,0 +1,6 @@
.. _philosophy:
Philosophy
==========
Username => Dossier
+18
View File
@@ -0,0 +1,18 @@
.. _roadmap:
Roadmap
=======
.. figure:: https://i.imgur.com/kk8cFdR.png
:target: https://i.imgur.com/kk8cFdR.png
:align: center
Current status
--------------
- Sites DB stats - ok
- Scan sessions stats - ok
- Site engine autodetect - ok
- Engines for all the sites - WIP
- Unified reporting flow - ok
- Retries - ok
+26
View File
@@ -0,0 +1,26 @@
.. _settings:
Settings
==============
Options are also configurable through settings files. See
`settings JSON file <https://github.com/soxoj/maigret/blob/main/maigret/resources/settings.json>`_
for the list of currently supported options.
After start Maigret tries to load configuration from the following sources in exactly the same order:
.. code-block:: console
# relative path, based on installed package path
resources/settings.json
# absolute path, configuration file in home directory
~/.maigret/settings.json
# relative path, based on current working directory
settings.json
Missing any of these files is not an error.
If the next settings file contains already known option,
this option will be rewrited. So it is possible to make
custom configuration for different users and directories.
@@ -0,0 +1,15 @@
.. _supported-identifier-types:
Supported identifier types
==========================
Maigret can search against not only ordinary usernames, but also through certain common identifiers. There is a list of all currently supported identifiers.
- **gaia_id** - Google inner numeric user identifier, in former times was placed in a Google Plus account URL.
- **steam_id** - Steam inner numeric user identifier.
- **wikimapia_uid** - Wikimapia.org inner numeric user identifier.
- **uidme_uguid** - uID.me inner numeric user identifier.
- **yandex_public_id** - Yandex sites inner letter user identifier. See also: `YaSeeker <https://github.com/HowToFind-bot/YaSeeker>`_.
- **vk_id** - VK.com inner numeric user identifier.
- **ok_id** - OK.ru inner numeric user identifier.
- **yelp_userid** - Yelp inner user identifier.
+24
View File
@@ -0,0 +1,24 @@
.. _tags:
Tags
====
The use of tags allows you to select a subset of the sites from big Maigret DB for search.
**Warning: tags markup is not stable now.**
There are several types of tags:
1. **Country codes**: ``us``, ``jp``, ``br``... (`ISO 3166-1 alpha-2 <https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2>`_). These tags reflect the site language and regional origin of its users and are then used to locate the owner of a username. If the regional origin is difficult to establish or a site is positioned as worldwide, `no country code is given`. There could be multiple country code tags for one site.
2. **Site engines**. Most of them are forum engines now: ``uCoz``, ``vBulletin``, ``XenForo`` et al. Full list of engines stored in the Maigret database.
3. **Sites' subject/type and interests of its users**. Full list of "standard" tags is `present in the source code <https://github.com/soxoj/maigret/blob/main/maigret/sites.py#L13>`_ only for a moment.
Usage
-----
``--tags en,jp`` -- search on US and Japanese sites (actually marked as such in the Maigret database)
``--tags coding`` -- search on sites related to software development.
``--tags ucoz`` -- search on uCoz sites only (mostly CIS countries)
+53
View File
@@ -0,0 +1,53 @@
.. _usage-examples:
Usage examples
==============
Start a search for accounts with username ``machine42`` on top 500 sites from the Maigret DB.
.. code-block:: console
maigret machine42
Start a search for accounts with username ``machine42`` on **all sites** from the Maigret DB.
.. code-block:: console
maigret machine42 -a
Start a search [...] and generate HTML and PDF reports.
.. code-block:: console
maigret machine42 -a -HP
Start a search for accounts with username ``machine42`` only on Facebook.
.. code-block:: console
maigret machine42 --site Facebook
Extract information from the Steam page by URL and start a search for accounts with found username ``machine42``.
.. code-block:: console
maigret --parse https://steamcommunity.com/profiles/76561199113454789
Start a search for accounts with username ``machine42`` only on US and Japanese sites.
.. code-block:: console
maigret michael --tags en,jp
Start a search for accounts with username ``machine42`` only on sites related to software development.
.. code-block:: console
maigret michael --tags coding
Start a search for accounts with username ``machine42`` on uCoz sites only (mostly CIS countries).
.. code-block:: console
maigret michael --tags ucoz
+68
View File
@@ -0,0 +1,68 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "8v6PEfyXb0Gx"
},
"outputs": [],
"source": [
"# clone the repo\n",
"!git clone https://github.com/soxoj/maigret\n",
"!pip3 install -r maigret/requirements.txt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "cXOQUAhDchkl"
},
"outputs": [],
"source": [
"# help\n",
"!python3 maigret/maigret.py --help"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "SjDmpN4QGnJu"
},
"outputs": [],
"source": [
"# search\n",
"!python3 maigret/maigret.py user"
]
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
"include_colab_link": true,
"name": "maigret.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
-5
View File
@@ -1,5 +0,0 @@
#!/bin/sh
FILES="maigret wizard.py maigret.py tests"
echo 'black'
black --skip-string-normalization $FILES
-11
View File
@@ -1,11 +0,0 @@
#!/bin/sh
FILES="maigret wizard.py maigret.py tests"
echo 'syntax errors or undefined names'
flake8 --count --select=E9,F63,F7,F82 --show-source --statistics $FILES
echo 'warning'
flake8 --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics --ignore=E731,W503 $FILES
echo 'mypy'
mypy ./maigret ./wizard.py ./tests
+1
View File
@@ -8,5 +8,6 @@ __author_email__ = 'soxoj@protonmail.com'
from .__version__ import __version__
from .checking import maigret as search
from .maigret import main as cli
from .sites import MaigretEngine, MaigretSite, MaigretDatabase
from .notify import QueryNotifyPrint as Notifier
+1 -1
View File
@@ -1,3 +1,3 @@
"""Maigret version file"""
__version__ = '0.3.0'
__version__ = '0.4.2'
+6 -1
View File
@@ -1,7 +1,6 @@
from http.cookiejar import MozillaCookieJar
from http.cookies import Morsel
import requests
from aiohttp import CookieJar
@@ -10,6 +9,8 @@ class ParsingActivator:
def twitter(site, logger, cookies={}):
headers = dict(site.headers)
del headers["x-guest-token"]
import requests
r = requests.post(site.activation["url"], headers=headers)
logger.info(r)
j = r.json()
@@ -21,6 +22,8 @@ class ParsingActivator:
headers = dict(site.headers)
if "Authorization" in headers:
del headers["Authorization"]
import requests
r = requests.get(site.activation["url"], headers=headers)
jwt_token = r.json()["jwt"]
site.headers["Authorization"] = "jwt " + jwt_token
@@ -30,6 +33,8 @@ class ParsingActivator:
headers = dict(site.headers)
if "Authorization" in headers:
del headers["Authorization"]
import requests
r = requests.get(site.activation["url"])
bearer_token = r.json()["accessToken"]
site.headers["authorization"] = f"Bearer {bearer_token}"
+26 -10
View File
@@ -1,6 +1,11 @@
import asyncio
import logging
from mock import Mock
try:
from mock import Mock
except ImportError:
from unittest.mock import Mock
import re
import ssl
import sys
@@ -8,12 +13,11 @@ import tqdm
from typing import Tuple, Optional, Dict, List
from urllib.parse import quote
import aiohttp
import aiodns
import tqdm.asyncio
from aiohttp_socks import ProxyConnector
from python_socks import _errors as proxy_errors
from socid_extractor import extract
from aiohttp import TCPConnector, ClientSession, http_exceptions
from aiohttp.client_exceptions import ServerDisconnectedError, ClientConnectorError
from .activation import ParsingActivator, import_aiohttp_cookies
@@ -24,6 +28,7 @@ from .executors import (
AsyncioSimpleExecutor,
AsyncioProgressbarQueueExecutor,
)
from .result import QueryResult, QueryStatus
from .sites import MaigretDatabase, MaigretSite
from .types import QueryOptions, QueryResultWrapper
@@ -31,6 +36,7 @@ from .utils import get_random_user_agent, ascii_data_display
SUPPORTED_IDS = (
"username",
"yandex_public_id",
"gaia_id",
"vk_id",
@@ -54,12 +60,13 @@ class SimpleAiohttpChecker(CheckerBase):
cookie_jar = kwargs.get('cookie_jar')
self.logger = kwargs.get('logger', Mock())
# moved here to speed up the launch of Maigret
from aiohttp_socks import ProxyConnector
# make http client session
connector = (
ProxyConnector.from_url(proxy) if proxy else aiohttp.TCPConnector(ssl=False)
)
connector = ProxyConnector.from_url(proxy) if proxy else TCPConnector(ssl=False)
connector.verify_ssl = False
self.session = aiohttp.ClientSession(
self.session = ClientSession(
connector=connector, trust_env=True, cookie_jar=cookie_jar
)
@@ -107,7 +114,7 @@ class SimpleAiohttpChecker(CheckerBase):
error = CheckError("Connecting failure", str(e))
except ServerDisconnectedError as e:
error = CheckError("Server disconnected", str(e))
except aiohttp.http_exceptions.BadHttpMessage as e:
except http_exceptions.BadHttpMessage as e:
error = CheckError("HTTP", str(e))
except proxy_errors.ProxyError as e:
error = CheckError("Proxy", str(e))
@@ -124,6 +131,9 @@ class SimpleAiohttpChecker(CheckerBase):
self.logger.debug(e, exc_info=True)
error = CheckError("Unexpected", str(e))
if error == "Invalid proxy response":
self.logger.debug(error, exc_info=True)
return str(html_text), status_code, error
@@ -133,9 +143,12 @@ class ProxiedAiohttpChecker(SimpleAiohttpChecker):
cookie_jar = kwargs.get('cookie_jar')
self.logger = kwargs.get('logger', Mock())
# moved here to speed up the launch of Maigret
from aiohttp_socks import ProxyConnector
connector = ProxyConnector.from_url(proxy)
connector.verify_ssl = False
self.session = aiohttp.ClientSession(
self.session = ClientSession(
connector=connector, trust_env=True, cookie_jar=cookie_jar
)
@@ -754,6 +767,7 @@ async def site_self_check(
semaphore,
db: MaigretDatabase,
silent=False,
proxy=None,
tor_proxy=None,
i2p_proxy=None,
):
@@ -779,6 +793,7 @@ async def site_self_check(
forced=True,
no_progressbar=True,
retries=1,
proxy=proxy,
tor_proxy=tor_proxy,
i2p_proxy=i2p_proxy,
)
@@ -835,6 +850,7 @@ async def self_check(
logger,
silent=False,
max_connections=10,
proxy=None,
tor_proxy=None,
i2p_proxy=None,
) -> bool:
@@ -849,7 +865,7 @@ async def self_check(
for _, site in all_sites.items():
check_coro = site_self_check(
site, logger, sem, db, silent, tor_proxy, i2p_proxy
site, logger, sem, db, silent, proxy, tor_proxy, i2p_proxy
)
future = asyncio.ensure_future(check_coro)
tasks.append(future)
+94 -73
View File
@@ -1,7 +1,6 @@
"""
Maigret main module
"""
import aiohttp
import asyncio
import logging
import os
@@ -9,9 +8,9 @@ import sys
import platform
from argparse import ArgumentParser, RawDescriptionHelpFormatter
from typing import List, Tuple
import os.path as path
import requests
from socid_extractor import extract, parse, __version__ as socid_version
from socid_extractor import extract, parse
from .__version__ import __version__
from .checking import (
@@ -34,11 +33,13 @@ from .report import (
save_json_report,
get_plaintext_report,
sort_report_by_data_points,
save_graph_report,
)
from .sites import MaigretDatabase
from .submit import submit_dialog
from .submit import Submitter
from .types import QueryResultWrapper
from .utils import get_dict_ascii_tree
from .settings import Settings
def notify_about_errors(search_results: QueryResultWrapper, query_notify):
@@ -47,7 +48,7 @@ def notify_about_errors(search_results: QueryResultWrapper, query_notify):
for e in errs:
if not errors.is_important(e):
continue
text = f'Too many errors of type "{e["err"]}" ({e["perc"]}%)'
text = f'Too many errors of type "{e["err"]}" ({round(e["perc"],2)}%)'
solution = errors.solution_of(e['err'])
if solution:
text = '. '.join([text, solution.capitalize()])
@@ -61,17 +62,6 @@ def notify_about_errors(search_results: QueryResultWrapper, query_notify):
)
def extract_ids_from_url(url: str, db: MaigretDatabase) -> dict:
results = {}
for s in db.sites:
result = s.extract_id_from_url(url)
if not result:
continue
_id, _type = result
results[_id] = _type
return results
def extract_ids_from_page(url, logger, timeout=5) -> dict:
results = {}
# url, headers
@@ -117,25 +107,31 @@ def extract_ids_from_results(results: QueryResultWrapper, db: MaigretDatabase) -
ids_results[u] = utype
for url in dictionary.get('ids_links', []):
ids_results.update(extract_ids_from_url(url, db))
ids_results.update(db.extract_ids_from_url(url))
return ids_results
def setup_arguments_parser():
def setup_arguments_parser(settings: Settings):
from aiohttp import __version__ as aiohttp_version
from requests import __version__ as requests_version
from socid_extractor import __version__ as socid_version
version_string = '\n'.join(
[
f'%(prog)s {__version__}',
f'Socid-extractor: {socid_version}',
f'Aiohttp: {aiohttp.__version__}',
f'Requests: {requests.__version__}',
f'Aiohttp: {aiohttp_version}',
f'Requests: {requests_version}',
f'Python: {platform.python_version()}',
]
)
parser = ArgumentParser(
formatter_class=RawDescriptionHelpFormatter,
description=f"Maigret v{__version__}",
description=f"Maigret v{__version__}\n"
"Documentation: https://maigret.readthedocs.io/\n"
"All settings are also configurable through files, see docs.",
)
parser.add_argument(
"username",
@@ -155,9 +151,9 @@ def setup_arguments_parser():
metavar='TIMEOUT',
dest="timeout",
type=timeout_check,
default=30,
help="Time in seconds to wait for response to requests. "
"Default timeout of 30.0s. "
default=settings.timeout,
help="Time in seconds to wait for response to requests "
f"(default {settings.timeout}s). "
"A longer timeout will be more likely to get results from slow sites. "
"On the other hand, this may cause a long delay to gather all results. ",
)
@@ -166,7 +162,7 @@ def setup_arguments_parser():
action="store",
type=int,
metavar='RETRIES',
default=1,
default=settings.retries_count,
help="Attempts to restart temporarily failed requests.",
)
parser.add_argument(
@@ -175,21 +171,21 @@ def setup_arguments_parser():
action="store",
type=int,
dest="connections",
default=100,
default=settings.max_connections,
help="Allowed number of concurrent connections.",
)
parser.add_argument(
"--no-recursion",
action="store_true",
dest="disable_recursive_search",
default=False,
default=(not settings.recursive_search),
help="Disable recursive search by additional data extracted from pages.",
)
parser.add_argument(
"--no-extracting",
action="store_true",
dest="disable_extracting",
default=False,
default=(not settings.info_extracting),
help="Disable parsing pages for additional data and other usernames.",
)
parser.add_argument(
@@ -203,14 +199,14 @@ def setup_arguments_parser():
"--db",
metavar="DB_FILE",
dest="db_file",
default=None,
help="Load Maigret database from a JSON file or an online, valid, JSON file.",
default=settings.sites_db_path,
help="Load Maigret database from a JSON file or HTTP web resource.",
)
parser.add_argument(
"--cookies-jar-file",
metavar="COOKIE_FILE",
dest="cookie_file",
default=None,
default=settings.cookie_jar_file,
help="File with cookies.",
)
parser.add_argument(
@@ -218,7 +214,7 @@ def setup_arguments_parser():
action="append",
metavar='IGNORED_IDS',
dest="ignore_ids_list",
default=[],
default=settings.ignore_ids_list,
help="Do not make search by the specified username or other ids.",
)
# reports options
@@ -226,7 +222,7 @@ def setup_arguments_parser():
"--folderoutput",
"-fo",
dest="folderoutput",
default="reports",
default=settings.reports_path,
metavar="PATH",
help="If using multiple usernames, the output of the results will be saved to this folder.",
)
@@ -236,27 +232,27 @@ def setup_arguments_parser():
metavar='PROXY_URL',
action="store",
dest="proxy",
default=None,
default=settings.proxy_url,
help="Make requests over a proxy. e.g. socks5://127.0.0.1:1080",
)
parser.add_argument(
"--tor-proxy",
metavar='TOR_PROXY_URL',
action="store",
default='socks5://127.0.0.1:9050',
default=settings.tor_proxy_url,
help="Specify URL of your Tor gateway. Default is socks5://127.0.0.1:9050",
)
parser.add_argument(
"--i2p-proxy",
metavar='I2P_PROXY_URL',
action="store",
default='http://127.0.0.1:4444',
default=settings.i2p_proxy_url,
help="Specify URL of your I2P gateway. Default is http://127.0.0.1:4444",
)
parser.add_argument(
"--with-domains",
action="store_true",
default=False,
default=settings.domain_search,
help="Enable (experimental) feature of checking domains on usernames.",
)
@@ -268,13 +264,13 @@ def setup_arguments_parser():
"--all-sites",
action="store_true",
dest="all_sites",
default=False,
default=settings.scan_all_sites,
help="Use all sites for scan.",
)
filter_group.add_argument(
"--top-sites",
action="store",
default=500,
default=settings.top_sites_count,
metavar="N",
type=int,
help="Count of sites for scan ranked by Alexa Top (default: 500).",
@@ -287,13 +283,13 @@ def setup_arguments_parser():
action="append",
metavar='SITE_NAME',
dest="site_list",
default=[],
default=settings.scan_sites_list,
help="Limit analysis to just the specified sites (multiple option).",
)
filter_group.add_argument(
"--use-disabled-sites",
action="store_true",
default=False,
default=settings.scan_disabled_sites,
help="Use disabled sites to search (may cause many false positives).",
)
@@ -320,7 +316,7 @@ def setup_arguments_parser():
modes_group.add_argument(
"--self-check",
action="store_true",
default=False,
default=settings.self_check_enabled,
help="Do self check for sites and database and disable non-working ones.",
)
modes_group.add_argument(
@@ -337,14 +333,14 @@ def setup_arguments_parser():
"--print-not-found",
action="store_true",
dest="print_not_found",
default=False,
default=settings.print_not_found,
help="Print sites where the username was not found.",
)
output_group.add_argument(
"--print-errors",
action="store_true",
dest="print_check_errors",
default=False,
default=settings.print_check_errors,
help="Print errors messages: connection, captcha, site country ban, etc.",
)
output_group.add_argument(
@@ -376,14 +372,14 @@ def setup_arguments_parser():
"--no-color",
action="store_true",
dest="no_color",
default=False,
default=(not settings.colored_print),
help="Don't color terminal output",
)
output_group.add_argument(
"--no-progressbar",
action="store_true",
dest="no_progressbar",
default=False,
default=(not settings.show_progressbar),
help="Don't show progressbar.",
)
@@ -395,7 +391,7 @@ def setup_arguments_parser():
"--txt",
action="store_true",
dest="txt",
default=False,
default=settings.txt_report,
help="Create a TXT report (one report per username).",
)
report_group.add_argument(
@@ -403,7 +399,7 @@ def setup_arguments_parser():
"--csv",
action="store_true",
dest="csv",
default=False,
default=settings.csv_report,
help="Create a CSV report (one report per username).",
)
report_group.add_argument(
@@ -411,7 +407,7 @@ def setup_arguments_parser():
"--html",
action="store_true",
dest="html",
default=False,
default=settings.html_report,
help="Create an HTML report file (general report on all usernames).",
)
report_group.add_argument(
@@ -419,7 +415,7 @@ def setup_arguments_parser():
"--xmind",
action="store_true",
dest="xmind",
default=False,
default=settings.xmind_report,
help="Generate an XMind 8 mindmap report (one report per username).",
)
report_group.add_argument(
@@ -427,16 +423,24 @@ def setup_arguments_parser():
"--pdf",
action="store_true",
dest="pdf",
default=False,
default=settings.pdf_report,
help="Generate a PDF report (general report on all usernames).",
)
report_group.add_argument(
"-G",
"--graph",
action="store_true",
dest="graph",
default=settings.graph_report,
help="Generate a graph report (general report on all usernames).",
)
report_group.add_argument(
"-J",
"--json",
action="store",
metavar='TYPE',
dest="json",
default='',
default=settings.json_report_type,
choices=SUPPORTED_JSON_REPORT_FORMATS,
help=f"Generate a JSON report of specific type: {', '.join(SUPPORTED_JSON_REPORT_FORMATS)}"
" (one report per username).",
@@ -444,7 +448,7 @@ def setup_arguments_parser():
parser.add_argument(
"--reports-sorting",
default='default',
default=settings.report_sorting,
choices=('default', 'data'),
help="Method of results sorting in reports (default: in order of getting the result)",
)
@@ -452,9 +456,6 @@ def setup_arguments_parser():
async def main():
arg_parser = setup_arguments_parser()
args = arg_parser.parse_args()
# Logging
log_level = logging.ERROR
logging.basicConfig(
@@ -462,15 +463,27 @@ async def main():
datefmt='%H:%M:%S',
level=log_level,
)
logger = logging.getLogger('maigret')
logger.setLevel(log_level)
# Load settings
settings = Settings()
settings_loaded, err = settings.load()
if not settings_loaded:
logger.error(err)
sys.exit(3)
arg_parser = setup_arguments_parser(settings)
args = arg_parser.parse_args()
# Re-set loggging level based on args
if args.debug:
log_level = logging.DEBUG
elif args.info:
log_level = logging.INFO
elif args.verbose:
log_level = logging.WARNING
logger = logging.getLogger('maigret')
logger.setLevel(log_level)
# Usernames initial list
@@ -496,10 +509,7 @@ async def main():
if args.tags:
args.tags = list(set(str(args.tags).split(',')))
if args.db_file is None:
args.db_file = os.path.join(
os.path.dirname(os.path.realpath(__file__)), "resources/data.json"
)
db_file = path.join(path.dirname(path.realpath(__file__)), args.db_file)
if args.top_sites == 0 or args.all_sites:
args.top_sites = sys.maxsize
@@ -514,7 +524,7 @@ async def main():
)
# Create object with all information about sites we are aware of.
db = MaigretDatabase().load_from_file(args.db_file)
db = MaigretDatabase().load_from_path(db_file)
get_top_sites_for_id = lambda x: db.ranked_sites_dict(
top=args.top_sites,
tags=args.tags,
@@ -526,11 +536,10 @@ async def main():
site_data = get_top_sites_for_id(args.id_type)
if args.new_site_to_submit:
is_submitted = await submit_dialog(
db, args.new_site_to_submit, args.cookie_file, logger
)
submitter = Submitter(db=db, logger=logger, settings=settings, args=args)
is_submitted = await submitter.dialog(args.new_site_to_submit, args.cookie_file)
if is_submitted:
db.save_to_file(args.db_file)
db.save_to_file(db_file)
# Database self-checking
if args.self_check:
@@ -539,6 +548,7 @@ async def main():
db,
site_data,
logger,
proxy=args.proxy,
max_connections=args.connections,
tor_proxy=args.tor_proxy,
i2p_proxy=args.i2p_proxy,
@@ -548,7 +558,7 @@ async def main():
'y',
'',
):
db.save_to_file(args.db_file)
db.save_to_file(db_file)
print('Database was successfully updated.')
else:
print('Updates will be applied only for current search session.')
@@ -556,13 +566,15 @@ async def main():
# Database statistics
if args.stats:
print(db.get_db_stats(db.sites_dict))
print(db.get_db_stats())
report_dir = path.join(os.getcwd(), args.folderoutput)
# Make reports folder is not exists
os.makedirs(args.folderoutput, exist_ok=True)
os.makedirs(report_dir, exist_ok=True)
# Define one report filename template
report_filepath_tpl = os.path.join(args.folderoutput, 'report_{username}{postfix}')
report_filepath_tpl = path.join(report_dir, 'report_{username}{postfix}')
if usernames == {}:
# magic params to exit after init
@@ -678,7 +690,9 @@ async def main():
username = report_context['username']
if args.html:
filename = report_filepath_tpl.format(username=username, postfix='.html')
filename = report_filepath_tpl.format(
username=username, postfix='_plain.html'
)
save_html_report(filename, report_context)
query_notify.warning(f'HTML report on all usernames saved in {filename}')
@@ -687,13 +701,20 @@ async def main():
save_pdf_report(filename, report_context)
query_notify.warning(f'PDF report on all usernames saved in {filename}')
if args.graph:
filename = report_filepath_tpl.format(
username=username, postfix='_graph.html'
)
save_graph_report(filename, general_results, db)
query_notify.warning(f'Graph report on all usernames saved in {filename}')
text_report = get_plaintext_report(report_context)
if text_report:
query_notify.info('Short text report:')
print(text_report)
# update database
db.save_to_file(args.db_file)
db.save_to_file(db_file)
def run():
+135 -2
View File
@@ -1,3 +1,4 @@
import ast
import csv
import io
import json
@@ -6,13 +7,13 @@ import os
from datetime import datetime
from typing import Dict, Any
import pycountry
import xmind
from dateutil.parser import parse as parse_datetime_str
from jinja2 import Template
from xhtml2pdf import pisa
from .checking import SUPPORTED_IDS
from .result import QueryStatus
from .sites import MaigretDatabase
from .utils import is_country_tag, CaseConverter, enrich_link_str
SUPPORTED_JSON_REPORT_FORMATS = [
@@ -73,6 +74,10 @@ def save_html_report(filename: str, context: dict):
def save_pdf_report(filename: str, context: dict):
template, css = generate_report_template(is_pdf=True)
filled_template = template.render(**context)
# moved here to speed up the launch of Maigret
from xhtml2pdf import pisa
with open(filename, "w+b") as f:
pisa.pisaDocument(io.StringIO(filled_template), dest=f, default_css=css)
@@ -82,6 +87,131 @@ def save_json_report(filename: str, username: str, results: dict, report_type: s
generate_json_report(username, results, f, report_type=report_type)
class MaigretGraph:
other_params = {'size': 10, 'group': 3}
site_params = {'size': 15, 'group': 2}
username_params = {'size': 20, 'group': 1}
def __init__(self, graph):
self.G = graph
def add_node(self, key, value):
node_name = f'{key}: {value}'
params = self.other_params
if key in SUPPORTED_IDS:
params = self.username_params
elif value.startswith('http'):
params = self.site_params
self.G.add_node(node_name, title=node_name, **params)
if value != value.lower():
normalized_node_name = self.add_node(key, value.lower())
self.link(node_name, normalized_node_name)
return node_name
def link(self, node1_name, node2_name):
self.G.add_edge(node1_name, node2_name, weight=2)
def save_graph_report(filename: str, username_results: list, db: MaigretDatabase):
# moved here to speed up the launch of Maigret
import networkx as nx
G = nx.Graph()
graph = MaigretGraph(G)
for username, id_type, results in username_results:
username_node_name = graph.add_node(id_type, username)
for website_name in results:
dictionary = results[website_name]
# TODO: fix no site data issue
if not dictionary:
continue
if dictionary.get("is_similar"):
continue
status = dictionary.get("status")
if not status: # FIXME: currently in case of timeout
continue
if dictionary["status"].status != QueryStatus.CLAIMED:
continue
site_fallback_name = dictionary.get(
'url_user', f'{website_name}: {username.lower()}'
)
# site_node_name = dictionary.get('url_user', f'{website_name}: {username.lower()}')
site_node_name = graph.add_node('site', site_fallback_name)
graph.link(username_node_name, site_node_name)
def process_ids(parent_node, ids):
for k, v in ids.items():
if k.endswith('_count') or k.startswith('is_') or k.endswith('_at'):
continue
if k in 'image':
continue
v_data = v
if v.startswith('['):
try:
v_data = ast.literal_eval(v)
except Exception as e:
logging.error(e)
# value is a list
if isinstance(v_data, list):
list_node_name = graph.add_node(k, site_fallback_name)
for vv in v_data:
data_node_name = graph.add_node(vv, site_fallback_name)
graph.link(list_node_name, data_node_name)
add_ids = {
a: b for b, a in db.extract_ids_from_url(vv).items()
}
if add_ids:
process_ids(data_node_name, add_ids)
else:
# value is just a string
# ids_data_name = f'{k}: {v}'
# if ids_data_name == parent_node:
# continue
ids_data_name = graph.add_node(k, v)
# G.add_node(ids_data_name, size=10, title=ids_data_name, group=3)
graph.link(parent_node, ids_data_name)
# check for username
if 'username' in k or k in SUPPORTED_IDS:
new_username_node_name = graph.add_node('username', v)
graph.link(ids_data_name, new_username_node_name)
add_ids = {k: v for v, k in db.extract_ids_from_url(v).items()}
if add_ids:
process_ids(ids_data_name, add_ids)
if status.ids_data:
process_ids(site_node_name, status.ids_data)
nodes_to_remove = []
for node in G.nodes:
if len(str(node)) > 100:
nodes_to_remove.append(node)
[G.remove_node(node) for node in nodes_to_remove]
# moved here to speed up the launch of Maigret
from pyvis.network import Network
nt = Network(notebook=True, height="750px", width="100%")
nt.from_nx(G)
nt.show(filename)
def get_plaintext_report(context: dict) -> str:
output = (context['brief'] + " ").replace('. ', '.\n')
interests = list(map(lambda x: x[0], context.get('interests_tuple_list', [])))
@@ -130,6 +260,9 @@ def generate_report_context(username_results: list):
first_seen = None
# moved here to speed up the launch of Maigret
import pycountry
for username, id_type, results in username_results:
found_accounts = 0
new_ids = []
+1332 -160
View File
File diff suppressed because it is too large Load Diff
+48
View File
@@ -0,0 +1,48 @@
{
"presence_strings": [
"username",
"not found",
"пользователь",
"profile",
"lastname",
"firstname",
"biography",
"birthday",
"репутация",
"информация",
"e-mail"
],
"supposed_usernames": [
"alex", "god", "admin", "red", "blue", "john"
],
"retries_count": 1,
"sites_db_path": "resources/data.json",
"timeout": 30,
"max_connections": 100,
"recursive_search": true,
"info_extracting": true,
"cookie_jar_file": null,
"ignore_ids_list": [],
"reports_path": "reports",
"proxy_url": null,
"tor_proxy_url": "socks5://127.0.0.1:9050",
"i2p_proxy_url": "http://127.0.0.1:4444",
"domain_search": false,
"scan_all_sites": false,
"top_sites_count": 500,
"scan_disabled_sites": false,
"scan_sites_list": [],
"self_check_enabled": false,
"print_not_found": false,
"print_check_errors": false,
"colored_print": true,
"show_progressbar": true,
"report_sorting": "default",
"json_report_type": "",
"txt_report": false,
"csv_report": false,
"xmind_report": false,
"graph_report": false,
"pdf_report": false,
"html_report": false
}
+1
View File
@@ -68,6 +68,7 @@
<div class="row-mb">
<div class="col-md">
<div class="card flex-md-row mb-4 box-shadow h-md-250">
<span style="position: absolute; right: 10px;"><a href="https://github.com/soxoj/maigret/issues/new?assignees=soxoj&amp;labels=bug&amp;template=report-false-result.md&amp;title=Invalid%20result%20{{ v.url_user }}">Invalid?</a></span>
<img class="card-img-right flex-auto d-md-block" alt="Photo" style="width: 200px; height: 200px; object-fit: scale-down;" src="{{ v.status and v.status.ids_data and v.status.ids_data.image or 'https://i.imgur.com/040fmbw.png' }}" data-holder-rendered="true">
<div class="card-body d-flex flex-column align-items-start" style="padding-top: 0;">
<h3 class="mb-0" style="padding-top: 1rem;">
+4
View File
@@ -38,4 +38,8 @@ div {
border-bottom-color: #3e3e3e;
border-bottom-width: 1px;
border-bottom-style: solid;
}
.invalid-button {
position: absolute;
left: 10px;
}
+1
View File
@@ -64,6 +64,7 @@
<div class="sitebox" style="margin-top: 20px;" >
<div>
<div>
<span class="invalid-button"><a href="https://github.com/soxoj/maigret/issues/new?assignees=soxoj&amp;labels=bug&amp;template=report-false-result.md&amp;title=Invalid%20result%20{{ v.url_user }}">Invalid?</a></span>
<table>
<tr>
<td valign="top">
+85
View File
@@ -0,0 +1,85 @@
import os
import os.path as path
import json
from typing import List
SETTINGS_FILES_PATHS = [
path.join(path.dirname(path.realpath(__file__)), "resources/settings.json"),
'~/.maigret/settings.json',
path.join(os.getcwd(), 'settings.json'),
]
class Settings:
# main maigret setting
retries_count: int
sites_db_path: str
timeout: int
max_connections: int
recursive_search: bool
info_extracting: bool
cookie_jar_file: str
ignore_ids_list: List
reports_path: str
proxy_url: str
tor_proxy_url: str
i2p_proxy_url: str
domain_search: bool
scan_all_sites: bool
top_sites_count: int
scan_disabled_sites: bool
scan_sites_list: List
self_check_enabled: bool
print_not_found: bool
print_check_errors: bool
colored_print: bool
show_progressbar: bool
report_sorting: str
json_report_type: str
txt_report: bool
csv_report: bool
xmind_report: bool
pdf_report: bool
html_report: bool
graph_report: bool
# submit mode settings
presence_strings: list
supposed_usernames: list
def __init__(self):
pass
def load(self, paths=None):
was_inited = False
if not paths:
paths = SETTINGS_FILES_PATHS
for filename in paths:
data = {}
try:
with open(filename, "r", encoding="utf-8") as file:
data = json.load(file)
except FileNotFoundError:
# treast as a normal situation
pass
except Exception as error:
return False, ValueError(
f"Problem with parsing json contents of "
f"settings file '{filename}': {str(error)}."
)
self.__dict__.update(data)
if data:
was_inited = True
return (
was_inited,
f'None of the default settings files found: {", ".join(paths)}',
)
@property
def json(self):
return self.__dict__
+58 -79
View File
@@ -5,70 +5,8 @@ import json
import sys
from typing import Optional, List, Dict, Any, Tuple
import requests
from .utils import CaseConverter, URLMatcher, is_country_tag
# TODO: move to data.json
SUPPORTED_TAGS = [
"gaming",
"coding",
"photo",
"music",
"blog",
"finance",
"freelance",
"dating",
"tech",
"forum",
"porn",
"erotic",
"webcam",
"video",
"movies",
"hacking",
"art",
"discussion",
"sharing",
"writing",
"wiki",
"business",
"shopping",
"sport",
"books",
"news",
"documents",
"travel",
"maps",
"hobby",
"apps",
"classified",
"career",
"geosocial",
"streaming",
"education",
"networking",
"torrent",
"science",
"medicine",
"reading",
"stock",
"messaging",
"trading",
"links",
"fashion",
"tasks",
"military",
"auto",
"gambling",
"cybercriminal",
"review",
"bookmarks",
"design",
"tor",
"i2p",
]
class MaigretEngine:
site: Dict[str, Any] = {}
@@ -204,12 +142,12 @@ class MaigretSite:
errors.update(self.errors)
return errors
def get_url_type(self) -> str:
def get_url_template(self) -> str:
url = URLMatcher.extract_main_part(self.url)
if url.startswith("{username}"):
url = "SUBDOMAIN"
elif url == "":
url = f"{self.url} ({self.engine})"
url = f"{self.url} ({self.engine or 'no engine'})"
else:
parts = url.split("/")
url = "/" + "/".join(parts[1:])
@@ -273,8 +211,9 @@ class MaigretSite:
class MaigretDatabase:
def __init__(self):
self._sites = []
self._engines = []
self._tags: list = []
self._sites: list = []
self._engines: list = []
@property
def sites(self):
@@ -351,9 +290,13 @@ class MaigretDatabase:
return self
def save_to_file(self, filename: str) -> "MaigretDatabase":
if '://' in filename:
return self
db_data = {
"sites": {site.name: site.strip_engine_data().json for site in self._sites},
"engines": {engine.name: engine.json for engine in self._engines},
"tags": self._tags,
}
json_data = json.dumps(db_data, indent=4)
@@ -367,6 +310,9 @@ class MaigretDatabase:
# Add all of site information from the json file to internal site list.
site_data = json_data.get("sites", {})
engines_data = json_data.get("engines", {})
tags = json_data.get("tags", [])
self._tags += tags
for engine_name in engines_data:
self._engines.append(MaigretEngine(engine_name, engines_data[engine_name]))
@@ -399,12 +345,20 @@ class MaigretDatabase:
return self.load_from_json(data)
def load_from_url(self, url: str) -> "MaigretDatabase":
def load_from_path(self, path: str) -> "MaigretDatabase":
if '://' in path:
return self.load_from_http(path)
else:
return self.load_from_file(path)
def load_from_http(self, url: str) -> "MaigretDatabase":
is_url_valid = url.startswith("http://") or url.startswith("https://")
if not is_url_valid:
raise FileNotFoundError(f"Invalid data file URL '{url}'.")
import requests
try:
response = requests.get(url=url)
except Exception as error:
@@ -455,9 +409,18 @@ class MaigretDatabase:
return found_flags
def get_db_stats(self, sites_dict):
if not sites_dict:
sites_dict = self.sites_dict()
def extract_ids_from_url(self, url: str) -> dict:
results = {}
for s in self._sites:
result = s.extract_id_from_url(url)
if not result:
continue
_id, _type = result
results[_id] = _type
return results
def get_db_stats(self, is_markdown=False):
sites_dict = self.sites_dict
urls = {}
tags = {}
@@ -465,31 +428,47 @@ class MaigretDatabase:
disabled_count = 0
total_count = len(sites_dict)
message_checks = 0
message_checks_one_factor = 0
for _, site in sites_dict.items():
if site.disabled:
disabled_count += 1
url_type = site.get_url_type()
url_type = site.get_url_template()
urls[url_type] = urls.get(url_type, 0) + 1
if site.check_type == 'message' and not site.disabled:
message_checks += 1
if site.absence_strs and site.presense_strs:
continue
message_checks_one_factor += 1
if not site.tags:
tags["NO_TAGS"] = tags.get("NO_TAGS", 0) + 1
for tag in filter(lambda x: not is_country_tag(x), site.tags):
tags[tag] = tags.get(tag, 0) + 1
output += f"Enabled/total sites: {total_count - disabled_count}/{total_count}\n"
output += "Top profile URLs:\n"
for url, count in sorted(urls.items(), key=lambda x: x[1], reverse=True)[:20]:
enabled_perc = round(100*(total_count-disabled_count)/total_count, 2)
output += f"Enabled/total sites: {total_count - disabled_count}/{total_count} = {enabled_perc}%\n\n"
checks_perc = round(100*message_checks_one_factor/message_checks, 2)
output += f"Incomplete checks: {message_checks_one_factor}/{message_checks} = {checks_perc}% (false positive risks)\n\n"
top_urls_count = 20
output += f"Top {top_urls_count} profile URLs:\n"
for url, count in sorted(urls.items(), key=lambda x: x[1], reverse=True)[:top_urls_count]:
if count == 1:
break
output += f"{count}\t{url}\n"
output += f"- ({count})\t`{url}`\n" if is_markdown else f"{count}\t{url}\n"
output += "Top tags:\n"
for tag, count in sorted(tags.items(), key=lambda x: x[1], reverse=True)[:200]:
top_tags_count = 20
output += f"\nTop {top_tags_count} tags:\n"
for tag, count in sorted(tags.items(), key=lambda x: x[1], reverse=True)[:top_tags_count]:
mark = ""
if tag not in SUPPORTED_TAGS:
if tag not in self._tags:
mark = " (non-standard)"
output += f"{count}\t{tag}{mark}\n"
output += f"- ({count})\t`{tag}`{mark}\n" if is_markdown else f"{count}\t{tag}{mark}\n"
return output
+377 -359
View File
@@ -1,389 +1,407 @@
import asyncio
import difflib
import json
import re
from typing import List
import xml.etree.ElementTree as ET
from aiohttp import TCPConnector, ClientSession
import requests
from .activation import import_aiohttp_cookies
from .checking import maigret
from .result import QueryStatus
from .settings import Settings
from .sites import MaigretDatabase, MaigretSite, MaigretEngine
from .utils import get_random_user_agent
from .utils import get_random_user_agent, get_match_ratio
DESIRED_STRINGS = [
"username",
"not found",
"пользователь",
"profile",
"lastname",
"firstname",
"biography",
"birthday",
"репутация",
"информация",
"e-mail",
]
SUPPOSED_USERNAMES = ["alex", "god", "admin", "red", "blue", "john"]
HEADERS = {
"User-Agent": get_random_user_agent(),
}
SEPARATORS = "\"'"
RATIO = 0.6
TOP_FEATURES = 5
URL_RE = re.compile(r"https?://(www\.)?")
def get_match_ratio(x):
return round(
max(
[difflib.SequenceMatcher(a=x.lower(), b=y).ratio() for y in DESIRED_STRINGS]
),
2,
)
def get_alexa_rank(site_url_main):
url = f"http://data.alexa.com/data?cli=10&url={site_url_main}"
xml_data = requests.get(url).text
root = ET.fromstring(xml_data)
alexa_rank = 0
try:
alexa_rank = int(root.find('.//REACH').attrib['RANK'])
except Exception:
pass
return alexa_rank
def extract_mainpage_url(url):
return "/".join(url.split("/", 3)[:3])
async def site_self_check(site, logger, semaphore, db: MaigretDatabase, silent=False):
changes = {
"disabled": False,
class Submitter:
HEADERS = {
"User-Agent": get_random_user_agent(),
}
check_data = [
(site.username_claimed, QueryStatus.CLAIMED),
(site.username_unclaimed, QueryStatus.AVAILABLE),
]
SEPARATORS = "\"'"
logger.info(f"Checking {site.name}...")
RATIO = 0.6
TOP_FEATURES = 5
URL_RE = re.compile(r"https?://(www\.)?")
for username, status in check_data:
results_dict = await maigret(
username=username,
site_dict={site.name: site},
logger=logger,
timeout=30,
id_type=site.type,
forced=True,
no_progressbar=True,
def __init__(self, db: MaigretDatabase, settings: Settings, logger, args):
self.settings = settings
self.args = args
self.db = db
self.logger = logger
from aiohttp_socks import ProxyConnector
proxy = self.args.proxy
cookie_jar = None
if args.cookie_file:
cookie_jar = import_aiohttp_cookies(args.cookie_file)
connector = ProxyConnector.from_url(proxy) if proxy else TCPConnector(ssl=False)
connector.verify_ssl = False
self.session = ClientSession(
connector=connector, trust_env=True, cookie_jar=cookie_jar
)
# don't disable entries with other ids types
# TODO: make normal checking
if site.name not in results_dict:
logger.info(results_dict)
changes["disabled"] = True
continue
@staticmethod
def get_alexa_rank(site_url_main):
url = f"http://data.alexa.com/data?cli=10&url={site_url_main}"
xml_data = requests.get(url).text
root = ET.fromstring(xml_data)
alexa_rank = 0
result = results_dict[site.name]["status"]
try:
alexa_rank = int(root.find('.//REACH').attrib['RANK'])
except Exception:
pass
site_status = result.status
return alexa_rank
if site_status != status:
if site_status == QueryStatus.UNKNOWN:
msgs = site.absence_strs
etype = site.check_type
logger.warning(
"Error while searching '%s' in %s: %s, %s, check type %s",
username,
site.name,
result.context,
msgs,
etype,
)
# don't disable in case of available username
if status == QueryStatus.CLAIMED:
changes["disabled"] = True
elif status == QueryStatus.CLAIMED:
logger.warning(
f"Not found `{username}` in {site.name}, must be claimed"
)
logger.info(results_dict[site.name])
changes["disabled"] = True
else:
logger.warning(f"Found `{username}` in {site.name}, must be available")
logger.info(results_dict[site.name])
changes["disabled"] = True
@staticmethod
def extract_mainpage_url(url):
return "/".join(url.split("/", 3)[:3])
logger.info(f"Site {site.name} checking is finished")
async def site_self_check(self, site, semaphore, silent=False):
changes = {
"disabled": False,
}
return changes
def generate_additional_fields_dialog(engine: MaigretEngine, dialog):
fields = {}
if 'urlSubpath' in engine.site.get('url', ''):
msg = (
'Detected engine suppose additional URL subpath using (/forum/, /blog/, etc). '
'Enter in manually if it exists: '
)
subpath = input(msg).strip('/')
if subpath:
fields['urlSubpath'] = f'/{subpath}'
return fields
async def detect_known_engine(
db, url_exists, url_mainpage, logger
) -> List[MaigretSite]:
try:
r = requests.get(url_mainpage)
logger.debug(r.text)
except Exception as e:
logger.warning(e)
print("Some error while checking main page")
return []
for engine in db.engines:
strs_to_check = engine.__dict__.get("presenseStrs")
if strs_to_check and r and r.text:
all_strs_in_response = True
for s in strs_to_check:
if s not in r.text:
all_strs_in_response = False
sites = []
if all_strs_in_response:
engine_name = engine.__dict__.get("name")
print(f"Detected engine {engine_name} for site {url_mainpage}")
usernames_to_check = SUPPOSED_USERNAMES
supposed_username = extract_username_dialog(url_exists)
if supposed_username:
usernames_to_check = [supposed_username] + usernames_to_check
add_fields = generate_additional_fields_dialog(engine, url_exists)
for u in usernames_to_check:
site_data = {
"urlMain": url_mainpage,
"name": url_mainpage.split("//")[1],
"engine": engine_name,
"usernameClaimed": u,
"usernameUnclaimed": "noonewouldeverusethis7",
**add_fields,
}
logger.info(site_data)
maigret_site = MaigretSite(url_mainpage.split("/")[-1], site_data)
maigret_site.update_from_engine(db.engines_dict[engine_name])
sites.append(maigret_site)
return sites
return []
def extract_username_dialog(url):
url_parts = url.rstrip("/").split("/")
supposed_username = url_parts[-1].strip('@')
entered_username = input(
f'Is "{supposed_username}" a valid username? If not, write it manually: '
)
return entered_username if entered_username else supposed_username
async def check_features_manually(
db, url_exists, url_mainpage, cookie_file, logger, redirects=False
):
custom_headers = {}
while True:
header_key = input(
'Specify custom header if you need or just press Enter to skip. Header name: '
)
if not header_key:
break
header_value = input('Header value: ')
custom_headers[header_key.strip()] = header_value.strip()
supposed_username = extract_username_dialog(url_exists)
non_exist_username = "noonewouldeverusethis7"
url_user = url_exists.replace(supposed_username, "{username}")
url_not_exists = url_exists.replace(supposed_username, non_exist_username)
headers = dict(HEADERS)
headers.update(custom_headers)
# cookies
cookie_dict = None
if cookie_file:
logger.info(f'Use {cookie_file} for cookies')
cookie_jar = import_aiohttp_cookies(cookie_file)
cookie_dict = {c.key: c.value for c in cookie_jar}
exists_resp = requests.get(
url_exists, cookies=cookie_dict, headers=headers, allow_redirects=redirects
)
logger.debug(url_exists)
logger.debug(exists_resp.status_code)
logger.debug(exists_resp.text)
non_exists_resp = requests.get(
url_not_exists, cookies=cookie_dict, headers=headers, allow_redirects=redirects
)
logger.debug(url_not_exists)
logger.debug(non_exists_resp.status_code)
logger.debug(non_exists_resp.text)
a = exists_resp.text
b = non_exists_resp.text
tokens_a = set(re.split(f'[{SEPARATORS}]', a))
tokens_b = set(re.split(f'[{SEPARATORS}]', b))
a_minus_b = tokens_a.difference(tokens_b)
b_minus_a = tokens_b.difference(tokens_a)
if len(a_minus_b) == len(b_minus_a) == 0:
print("The pages for existing and non-existing account are the same!")
top_features_count = int(
input(f"Specify count of features to extract [default {TOP_FEATURES}]: ")
or TOP_FEATURES
)
presence_list = sorted(a_minus_b, key=get_match_ratio, reverse=True)[
:top_features_count
]
print("Detected text features of existing account: " + ", ".join(presence_list))
features = input("If features was not detected correctly, write it manually: ")
if features:
presence_list = list(map(str.strip, features.split(",")))
absence_list = sorted(b_minus_a, key=get_match_ratio, reverse=True)[
:top_features_count
]
print("Detected text features of non-existing account: " + ", ".join(absence_list))
features = input("If features was not detected correctly, write it manually: ")
if features:
absence_list = list(map(str.strip, features.split(",")))
site_data = {
"absenceStrs": absence_list,
"presenseStrs": presence_list,
"url": url_user,
"urlMain": url_mainpage,
"usernameClaimed": supposed_username,
"usernameUnclaimed": non_exist_username,
"checkType": "message",
}
if headers != HEADERS:
site_data['headers'] = headers
site = MaigretSite(url_mainpage.split("/")[-1], site_data)
return site
async def submit_dialog(db, url_exists, cookie_file, logger):
domain_raw = URL_RE.sub("", url_exists).strip().strip("/")
domain_raw = domain_raw.split("/")[0]
logger.info('Domain is %s', domain_raw)
# check for existence
matched_sites = list(filter(lambda x: domain_raw in x.url_main + x.url, db.sites))
if matched_sites:
print(
f'Sites with domain "{domain_raw}" already exists in the Maigret database!'
)
status = lambda s: "(disabled)" if s.disabled else ""
url_block = lambda s: f"\n\t{s.url_main}\n\t{s.url}"
print(
"\n".join(
[
f"{site.name} {status(site)}{url_block(site)}"
for site in matched_sites
]
)
)
if input("Do you want to continue? [yN] ").lower() in "n":
return False
url_mainpage = extract_mainpage_url(url_exists)
print('Detecting site engine, please wait...')
sites = []
try:
sites = await detect_known_engine(db, url_exists, url_mainpage, logger)
except KeyboardInterrupt:
print('Engine detect process is interrupted.')
if not sites:
print("Unable to detect site engine, lets generate checking features")
sites = [
await check_features_manually(
db, url_exists, url_mainpage, cookie_file, logger
)
check_data = [
(site.username_claimed, QueryStatus.CLAIMED),
(site.username_unclaimed, QueryStatus.AVAILABLE),
]
logger.debug(sites[0].__dict__)
self.logger.info(f"Checking {site.name}...")
sem = asyncio.Semaphore(1)
print("Checking, please wait...")
found = False
chosen_site = None
for s in sites:
chosen_site = s
result = await site_self_check(s, logger, sem, db)
if not result["disabled"]:
found = True
break
if not found:
print(
f"Sorry, we couldn't find params to detect account presence/absence in {chosen_site.name}."
)
print(
"Try to run this mode again and increase features count or choose others."
)
return False
else:
if (
input(
f"Site {chosen_site.name} successfully checked. Do you want to save it in the Maigret DB? [Yn] "
for username, status in check_data:
results_dict = await maigret(
username=username,
site_dict={site.name: site},
proxy=self.args.proxy,
logger=self.logger,
cookies=self.args.cookie_file,
timeout=30,
id_type=site.type,
forced=True,
no_progressbar=True,
)
.lower()
.strip("y")
):
# don't disable entries with other ids types
# TODO: make normal checking
if site.name not in results_dict:
self.logger.info(results_dict)
changes["disabled"] = True
continue
result = results_dict[site.name]["status"]
site_status = result.status
if site_status != status:
if site_status == QueryStatus.UNKNOWN:
msgs = site.absence_strs
etype = site.check_type
self.logger.warning(
"Error while searching '%s' in %s: %s, %s, check type %s",
username,
site.name,
result.context,
msgs,
etype,
)
# don't disable in case of available username
if status == QueryStatus.CLAIMED:
changes["disabled"] = True
elif status == QueryStatus.CLAIMED:
self.logger.warning(
f"Not found `{username}` in {site.name}, must be claimed"
)
self.logger.info(results_dict[site.name])
changes["disabled"] = True
else:
self.logger.warning(
f"Found `{username}` in {site.name}, must be available"
)
self.logger.info(results_dict[site.name])
changes["disabled"] = True
self.logger.info(f"Site {site.name} checking is finished")
return changes
def generate_additional_fields_dialog(self, engine: MaigretEngine, dialog):
fields = {}
if 'urlSubpath' in engine.site.get('url', ''):
msg = (
'Detected engine suppose additional URL subpath using (/forum/, /blog/, etc). '
'Enter in manually if it exists: '
)
subpath = input(msg).strip('/')
if subpath:
fields['urlSubpath'] = f'/{subpath}'
return fields
async def detect_known_engine(self, url_exists, url_mainpage) -> List[MaigretSite]:
resp_text = ''
try:
r = await self.session.get(url_mainpage)
resp_text = await r.text()
self.logger.debug(resp_text)
except Exception as e:
self.logger.warning(e)
print("Some error while checking main page")
return []
for engine in self.db.engines:
strs_to_check = engine.__dict__.get("presenseStrs")
if strs_to_check and resp_text:
all_strs_in_response = True
for s in strs_to_check:
if s not in resp_text:
all_strs_in_response = False
sites = []
if all_strs_in_response:
engine_name = engine.__dict__.get("name")
print(f"Detected engine {engine_name} for site {url_mainpage}")
usernames_to_check = self.settings.supposed_usernames
supposed_username = self.extract_username_dialog(url_exists)
if supposed_username:
usernames_to_check = [supposed_username] + usernames_to_check
add_fields = self.generate_additional_fields_dialog(
engine, url_exists
)
for u in usernames_to_check:
site_data = {
"urlMain": url_mainpage,
"name": url_mainpage.split("//")[1],
"engine": engine_name,
"usernameClaimed": u,
"usernameUnclaimed": "noonewouldeverusethis7",
**add_fields,
}
self.logger.info(site_data)
maigret_site = MaigretSite(
url_mainpage.split("/")[-1], site_data
)
maigret_site.update_from_engine(
self.db.engines_dict[engine_name]
)
sites.append(maigret_site)
return sites
return []
def extract_username_dialog(self, url):
url_parts = url.rstrip("/").split("/")
supposed_username = url_parts[-1].strip('@')
entered_username = input(
f'Is "{supposed_username}" a valid username? If not, write it manually: '
)
return entered_username if entered_username else supposed_username
async def check_features_manually(
self, url_exists, url_mainpage, cookie_file, redirects=False
):
custom_headers = {}
while self.args.verbose:
header_key = input(
'Specify custom header if you need or just press Enter to skip. Header name: '
)
if not header_key:
break
header_value = input('Header value: ')
custom_headers[header_key.strip()] = header_value.strip()
supposed_username = self.extract_username_dialog(url_exists)
non_exist_username = "noonewouldeverusethis7"
url_user = url_exists.replace(supposed_username, "{username}")
url_not_exists = url_exists.replace(supposed_username, non_exist_username)
headers = dict(self.HEADERS)
headers.update(custom_headers)
exists_resp = await self.session.get(
url_exists,
headers=headers,
allow_redirects=redirects,
)
exists_resp_text = await exists_resp.text()
self.logger.debug(url_exists)
self.logger.debug(exists_resp.status)
self.logger.debug(exists_resp_text)
non_exists_resp = await self.session.get(
url_not_exists,
headers=headers,
allow_redirects=redirects,
)
non_exists_resp_text = await non_exists_resp.text()
self.logger.debug(url_not_exists)
self.logger.debug(non_exists_resp.status)
self.logger.debug(non_exists_resp_text)
a = exists_resp_text
b = non_exists_resp_text
tokens_a = set(re.split(f'[{self.SEPARATORS}]', a))
tokens_b = set(re.split(f'[{self.SEPARATORS}]', b))
a_minus_b = tokens_a.difference(tokens_b)
b_minus_a = tokens_b.difference(tokens_a)
if len(a_minus_b) == len(b_minus_a) == 0:
print("The pages for existing and non-existing account are the same!")
top_features_count = int(
input(
f"Specify count of features to extract [default {self.TOP_FEATURES}]: "
)
or self.TOP_FEATURES
)
match_fun = get_match_ratio(self.settings.presence_strings)
presence_list = sorted(a_minus_b, key=match_fun, reverse=True)[
:top_features_count
]
print("Detected text features of existing account: " + ", ".join(presence_list))
features = input("If features was not detected correctly, write it manually: ")
if features:
presence_list = list(map(str.strip, features.split(",")))
absence_list = sorted(b_minus_a, key=match_fun, reverse=True)[
:top_features_count
]
print(
"Detected text features of non-existing account: " + ", ".join(absence_list)
)
features = input("If features was not detected correctly, write it manually: ")
if features:
absence_list = list(map(str.strip, features.split(",")))
site_data = {
"absenceStrs": absence_list,
"presenseStrs": presence_list,
"url": url_user,
"urlMain": url_mainpage,
"usernameClaimed": supposed_username,
"usernameUnclaimed": non_exist_username,
"checkType": "message",
}
if headers != self.HEADERS:
site_data['headers'] = headers
site = MaigretSite(url_mainpage.split("/")[-1], site_data)
return site
async def dialog(self, url_exists, cookie_file):
domain_raw = self.URL_RE.sub("", url_exists).strip().strip("/")
domain_raw = domain_raw.split("/")[0]
self.logger.info('Domain is %s', domain_raw)
# check for existence
matched_sites = list(
filter(lambda x: domain_raw in x.url_main + x.url, self.db.sites)
)
if matched_sites:
print(
f'Sites with domain "{domain_raw}" already exists in the Maigret database!'
)
status = lambda s: "(disabled)" if s.disabled else ""
url_block = lambda s: f"\n\t{s.url_main}\n\t{s.url}"
print(
"\n".join(
[
f"{site.name} {status(site)}{url_block(site)}"
for site in matched_sites
]
)
)
if input("Do you want to continue? [yN] ").lower() in "n":
return False
url_mainpage = self.extract_mainpage_url(url_exists)
print('Detecting site engine, please wait...')
sites = []
try:
sites = await self.detect_known_engine(url_exists, url_mainpage)
except KeyboardInterrupt:
print('Engine detect process is interrupted.')
if not sites:
print("Unable to detect site engine, lets generate checking features")
redirects = False
if self.args.verbose:
redirects = 'y' in input('Should we do redirects automatically? [yN] ').lower()
sites = [
await self.check_features_manually(
url_exists, url_mainpage, cookie_file, redirects,
)
]
self.logger.debug(sites[0].__dict__)
sem = asyncio.Semaphore(1)
print("Checking, please wait...")
found = False
chosen_site = None
for s in sites:
chosen_site = s
result = await self.site_self_check(s, sem)
if not result["disabled"]:
found = True
break
if not found:
print(
f"Sorry, we couldn't find params to detect account presence/absence in {chosen_site.name}."
)
print(
"Try to run this mode again and increase features count or choose others."
)
self.logger.debug(json.dumps(chosen_site.json))
return False
else:
if (
input(
f"Site {chosen_site.name} successfully checked. Do you want to save it in the Maigret DB? [Yn] "
)
.lower()
.strip("y")
):
return False
chosen_site.name = input("Change site name if you want: ") or chosen_site.name
chosen_site.tags = list(map(str.strip, input("Site tags: ").split(',')))
rank = get_alexa_rank(chosen_site.url_main)
if rank:
print(f'New alexa rank: {rank}')
chosen_site.alexa_rank = rank
if self.args.verbose:
source = input("Name the source site if it is mirror: ")
if source:
chosen_site.source = source
logger.debug(chosen_site.json)
site_data = chosen_site.strip_engine_data()
logger.debug(site_data.json)
db.update_site(site_data)
return True
chosen_site.name = input("Change site name if you want: ") or chosen_site.name
chosen_site.tags = list(map(str.strip, input("Site tags: ").split(',')))
rank = Submitter.get_alexa_rank(chosen_site.url_main)
if rank:
print(f'New alexa rank: {rank}')
chosen_site.alexa_rank = rank
self.logger.debug(chosen_site.json)
site_data = chosen_site.strip_engine_data()
self.logger.debug(site_data.json)
self.db.update_site(site_data)
return True
+28 -4
View File
@@ -1,4 +1,6 @@
# coding: utf8
import ast
import difflib
import re
import random
from typing import Any
@@ -40,7 +42,7 @@ def enrich_link_str(link: str) -> str:
class URLMatcher:
_HTTP_URL_RE_STR = "^https?://(www.)?(.+)$"
_HTTP_URL_RE_STR = "^https?://(www.|m.)?(.+)$"
HTTP_URL_RE = re.compile(_HTTP_URL_RE_STR)
UNSAFE_SYMBOLS = ".?"
@@ -64,7 +66,7 @@ class URLMatcher:
)
regexp_str = self._HTTP_URL_RE_STR.replace("(.+)", url_regexp)
return re.compile(regexp_str)
return re.compile(regexp_str, re.IGNORECASE)
def ascii_data_display(data: str) -> Any:
@@ -72,15 +74,22 @@ def ascii_data_display(data: str) -> Any:
def get_dict_ascii_tree(items, prepend="", new_line=True):
new_result = b'\xe2\x94\x9c'.decode()
new_line = b'\xe2\x94\x80'.decode()
last_result = b'\xe2\x94\x94'.decode()
skip_result = b'\xe2\x94\x82'.decode()
text = ""
for num, item in enumerate(items):
box_symbol = "┣╸" if num != len(items) - 1 else "┗╸"
box_symbol = (
new_result + new_line if num != len(items) - 1 else last_result + new_line
)
if type(item) == tuple:
field_name, field_value = item
if field_value.startswith("['"):
is_last_item = num == len(items) - 1
prepend_symbols = " " * 3 if is_last_item else " "
prepend_symbols = " " * 3 if is_last_item else f" {skip_result} "
data = ascii_data_display(field_value)
field_value = get_dict_ascii_tree(data, prepend_symbols)
text += f"\n{prepend}{box_symbol}{field_name}: {field_value}"
@@ -95,3 +104,18 @@ def get_dict_ascii_tree(items, prepend="", new_line=True):
def get_random_user_agent():
return random.choice(DEFAULT_USER_AGENTS)
def get_match_ratio(base_strs: list):
def get_match_inner(s: str):
return round(
max(
[
difflib.SequenceMatcher(a=s.lower(), b=s2.lower()).ratio()
for s2 in base_strs
]
),
2,
)
return get_match_inner
+7
View File
@@ -0,0 +1,7 @@
#!/usr/bin/env python3
import asyncio
import maigret
if __name__ == "__main__":
asyncio.run(maigret.cli())
+55
View File
@@ -0,0 +1,55 @@
# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_all
datas = []
binaries = []
hiddenimports = []
full_import_modules = ['maigret', 'socid_extractor', 'arabic_reshaper', 'pyvis', 'reportlab.graphics.barcode']
for module in full_import_modules:
tmp_ret = collect_all(module)
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]
hiddenimports += ['PySocks', 'beautifulsoup4', 'python-dateutil',
'future-annotations', 'six', 'python-bidi',
'typing-extensions', 'attrs', 'torrequest']
block_cipher = None
a = Analysis(['maigret_standalone.py'],
pathex=[],
binaries=binaries,
datas=datas,
hiddenimports=hiddenimports,
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='maigret_standalone',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )
+5
View File
@@ -0,0 +1,5 @@
maigret @ https://github.com/soxoj/maigret/archive/refs/heads/main.zip
pefile==2021.9.3
psutil==5.9.0
pyinstaller @ https://github.com/pyinstaller/pyinstaller/archive/develop.zip
pywin32-ctypes==0.2.0
+1
View File
@@ -3,3 +3,4 @@
filterwarnings =
error
ignore::UserWarning
asyncio_mode=auto
+24 -24
View File
@@ -1,39 +1,39 @@
aiodns==3.0.0
aiohttp==3.7.4
aiohttp-socks==0.5.5
arabic-reshaper==2.1.1
async-timeout==3.0.1
attrs==20.3.0
beautifulsoup4==4.9.3
bs4==0.0.1
certifi==2020.12.5
chardet==3.0.4
aiohttp==3.8.1
aiohttp-socks==0.7.1
arabic-reshaper==2.1.3
async-timeout==4.0.2
attrs==21.4.0
certifi==2021.10.8
chardet==4.0.0
colorama==0.4.4
python-dateutil==2.8.1
future==0.18.2
future-annotations==1.0.0
html5lib==1.1
idna==2.10
Jinja2==2.11.3
lxml==4.6.3
MarkupSafe==1.1.1
mock==4.0.2
multidict==5.1.0
pycountry==20.7.3
idna==3.3
Jinja2==3.0.3
lxml==4.8.0
MarkupSafe==2.0.1
mock==4.0.3
multidict==5.2.0;python_version<"3.7"
multidict==6.0.2;python_version>="3.7"
pycountry==22.1.10
PyPDF2==1.26.0
PySocks==1.7.1
python-bidi==0.4.2
python-socks==1.1.2
requests>=2.24.0
requests==2.27.1
requests-futures==1.0.0
six==1.15.0
six==1.16.0
socid-extractor>=0.0.21
soupsieve==2.1
soupsieve==2.3.1
stem==1.8.0
torrequest==0.1.0
tqdm==4.55.0
typing-extensions==3.7.4.3
tqdm==4.63.0
typing-extensions==4.1.1
webencodings==0.5.1
xhtml2pdf==0.2.5
XMind==1.2.0
yarl==1.6.3
yarl==1.7.2
networkx==2.5.1
pyvis==0.1.9
reportlab==3.6.6
+2 -3
View File
@@ -5,14 +5,13 @@ from setuptools import (
with open('README.md') as fh:
readme = fh.read()
long_description = readme.replace('./', 'https://raw.githubusercontent.com/soxoj/maigret/main/')
long_description = fh.read()
with open('requirements.txt') as rf:
requires = rf.read().splitlines()
setup(name='maigret',
version='0.3.0',
version='0.4.2',
description='Collect a dossier on a person by username from a huge number of sites',
long_description=long_description,
long_description_content_type="text/markdown",
+186 -59
View File
@@ -1,9 +1,10 @@
## List of supported sites (search methods): total 2560
## List of supported sites (search methods): total 2638
Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://maps.google.com/) [GoogleMaps (https://maps.google.com/)](https://maps.google.com/)*: top 1, maps, us*
1. ![](https://www.google.com/s2/favicons?domain=https://maps.google.com/) [Google Maps (https://maps.google.com/)](https://maps.google.com/)*: top 1, maps, us*
1. ![](https://www.google.com/s2/favicons?domain=https://plus.google.com) [Google Plus (archived) (https://plus.google.com)](https://plus.google.com)*: top 1*
1. ![](https://www.google.com/s2/favicons?domain=https://play.google.com/store) [GooglePlayStore (https://play.google.com/store)](https://play.google.com/store)*: top 1, apps, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.youtube.com/) [YouTube (https://www.youtube.com/)](https://www.youtube.com/)*: top 2, us, video*
1. ![](https://www.google.com/s2/favicons?domain=https://www.facebook.com/) [Facebook (https://www.facebook.com/)](https://www.facebook.com/)*: top 10, networking*
@@ -19,7 +20,8 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://naver.com) [Naver (https://naver.com)](https://naver.com)*: top 50, kr*
1. ![](https://www.google.com/s2/favicons?domain=https://developer.apple.com/forums) [AppleDeveloper (https://developer.apple.com/forums)](https://developer.apple.com/forums)*: top 50, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=https://discussions.apple.com/) [AppleDiscussions (https://discussions.apple.com/)](https://discussions.apple.com/)*: top 50, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.twitter.com/) [Twitter (https://www.twitter.com/)](https://www.twitter.com/)*: top 50, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.nitter.net/) [Nitter (https://www.nitter.net/)](https://www.nitter.net/)*: top 50, messaging*
1. ![](https://www.google.com/s2/favicons?domain=https://www.twitter.com/) [Twitter (https://www.twitter.com/)](https://www.twitter.com/)*: top 50, messaging*
1. ![](https://www.google.com/s2/favicons?domain=https://allods.mail.ru) [Allods (https://allods.mail.ru)](https://allods.mail.ru)*: top 50, forum, gaming, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://aa.mail.ru) [ArcheAge (https://aa.mail.ru)](https://aa.mail.ru)*: top 50, forum, gaming, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://cfire.mail.ru) [Crossfire (https://cfire.mail.ru)](https://cfire.mail.ru)*: top 50, gaming, ru*
@@ -50,6 +52,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://wordpress.com) [WordPress (https://wordpress.com)](https://wordpress.com)*: top 100, blog*
1. ![](https://www.google.com/s2/favicons?domain=https://ok.ru/) [OK (https://ok.ru/)](https://ok.ru/)*: top 100, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.tradingview.com/) [TradingView (https://www.tradingview.com/)](https://www.tradingview.com/)*: top 100, trading, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.aparat.com) [Aparat (https://www.aparat.com)](https://www.aparat.com)*: top 100, ir, video*
1. ![](https://www.google.com/s2/favicons?domain=https://chaturbate.com) [ChaturBate (https://chaturbate.com)](https://chaturbate.com)*: top 100, us*
1. ![](https://www.google.com/s2/favicons?domain=https://medium.com/) [Medium (https://medium.com/)](https://medium.com/)*: top 100, blog, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.livejasmin.com/) [Livejasmin (https://www.livejasmin.com/)](https://www.livejasmin.com/)*: top 100, us, webcam*
@@ -85,7 +88,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.shutterstock.com) [Shutterstock (https://www.shutterstock.com)](https://www.shutterstock.com)*: top 500, music, photo, stock, us*
1. ![](https://www.google.com/s2/favicons?domain=https://wix.com/) [Wix (https://wix.com/)](https://wix.com/)*: top 500, us*
1. ![](https://www.google.com/s2/favicons?domain=https://slack.com) [Slack (https://slack.com)](https://slack.com)*: top 500, messaging*
1. ![](https://www.google.com/s2/favicons?domain=https://www.chess.com/ru/) [Chess (https://www.chess.com/ru/)](https://www.chess.com/ru/)*: top 500, hobby*
1. ![](https://www.google.com/s2/favicons?domain=https://www.chess.com/) [Chess (https://www.chess.com/)](https://www.chess.com/)*: top 500, gaming, hobby*
1. ![](https://www.google.com/s2/favicons?domain=https://archive.org) [Archive.org (https://archive.org)](https://archive.org)*: top 500*
1. ![](https://www.google.com/s2/favicons?domain=https://www.scribd.com/) [Scribd (https://www.scribd.com/)](https://www.scribd.com/)*: top 500, reading*
1. ![](https://www.google.com/s2/favicons?domain=https://www.dailymotion.com/) [DailyMotion (https://www.dailymotion.com/)](https://www.dailymotion.com/)*: top 500, us, video*
@@ -148,6 +151,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.gamespot.com/) [Gamespot (https://www.gamespot.com/)](https://www.gamespot.com/)*: top 1K, gaming, us*
1. ![](https://www.google.com/s2/favicons?domain=https://note.com/) [note (https://note.com/)](https://note.com/)*: top 1K, jp*
1. ![](https://www.google.com/s2/favicons?domain=https://www.redbubble.com/) [Redbubble (https://www.redbubble.com/)](https://www.redbubble.com/)*: top 1K, shopping, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.yumpu.com) [Yumpu (https://www.yumpu.com)](https://www.yumpu.com)*: top 1K, stock*
1. ![](https://www.google.com/s2/favicons?domain=https://tinder.com/) [Tinder (https://tinder.com/)](https://tinder.com/)*: top 1K, dating, us*
1. ![](https://www.google.com/s2/favicons?domain=https://community.cloudflare.com/) [CloudflareCommunity (https://community.cloudflare.com/)](https://community.cloudflare.com/)*: top 1K, forum, tech*
1. ![](https://www.google.com/s2/favicons?domain=https://eksisozluk.com/biri/) [Eksisozluk (https://eksisozluk.com/biri/)](https://eksisozluk.com/biri/)*: top 1K, tr*
@@ -193,7 +197,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.polygon.com/) [Polygon (https://www.polygon.com/)](https://www.polygon.com/)*: top 5K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://otzovik.com/) [Otzovik (https://otzovik.com/)](https://otzovik.com/)*: top 5K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.liveinternet.ru) [LiveInternet (https://www.liveinternet.ru)](https://www.liveinternet.ru)*: top 5K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://leetcode.com/) [LeetCode (https://leetcode.com/)](https://leetcode.com/)*: top 5K, coding*
1. ![](https://www.google.com/s2/favicons?domain=https://leetcode.com/) [LeetCode (https://leetcode.com/)](https://leetcode.com/)*: top 5K, coding*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://www.kaggle.com/) [Kaggle (https://www.kaggle.com/)](https://www.kaggle.com/)*: top 5K, tech*
1. ![](https://www.google.com/s2/favicons?domain=https://codepen.io/) [Codepen (https://codepen.io/)](https://codepen.io/)*: top 5K, coding, in*
1. ![](https://www.google.com/s2/favicons?domain=https://www.rajce.idnes.cz/) [Rajce.net (https://www.rajce.idnes.cz/)](https://www.rajce.idnes.cz/)*: top 5K, cz*
@@ -210,7 +214,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://ccm.net) [Ccm (https://ccm.net)](https://ccm.net)*: top 5K, ao, in, ve*
1. ![](https://www.google.com/s2/favicons?domain=https://www.xing.com/) [Xing (https://www.xing.com/)](https://www.xing.com/)*: top 5K, de, eu*
1. ![](https://www.google.com/s2/favicons?domain=https://www.sbnation.com) [Sbnation (https://www.sbnation.com)](https://www.sbnation.com)*: top 5K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://lichess.org) [Lichess (https://lichess.org)](https://lichess.org)*: top 5K, hobby*
1. ![](https://www.google.com/s2/favicons?domain=https://lichess.org) [Lichess (https://lichess.org)](https://lichess.org)*: top 5K, gaming, hobby*
1. ![](https://www.google.com/s2/favicons?domain=https://ru.pathofexile.com) [Pathofexile (https://ru.pathofexile.com)](https://ru.pathofexile.com)*: top 5K, ru, us*
1. ![](https://www.google.com/s2/favicons?domain=https://vc.ru) [VC.ru (https://vc.ru)](https://vc.ru)*: top 5K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.metacritic.com/) [metacritic (https://www.metacritic.com/)](https://www.metacritic.com/)*: top 5K, us*
@@ -244,7 +248,8 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.mixcloud.com/) [MixCloud (https://www.mixcloud.com/)](https://www.mixcloud.com/)*: top 5K, music*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.xda-developers.com) [XDA (https://forum.xda-developers.com)](https://forum.xda-developers.com)*: top 5K, apps, forum*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://i.thechive.com/) [Thechive (https://i.thechive.com/)](https://i.thechive.com/)*: top 5K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://ru.foursquare.com/) [Foursquare (https://ru.foursquare.com/)](https://ru.foursquare.com/)*: top 5K, geosocial, in*
1. ![](https://www.google.com/s2/favicons?domain=https://999.md) [999.md (https://999.md)](https://999.md)*: top 5K, freelance, md, shopping*
1. ![](https://www.google.com/s2/favicons?domain=https://foursquare.com/) [Foursquare (https://foursquare.com/)](https://foursquare.com/)*: top 5K, geosocial, in*
1. ![](https://www.google.com/s2/favicons?domain=https://4pda.ru/) [4pda (https://4pda.ru/)](https://4pda.ru/)*: top 5K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.weforum.org) [Weforum (https://www.weforum.org)](https://www.weforum.org)*: top 5K, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=http://www.techspot.com/community/) [techspot.com (http://www.techspot.com/community/)](http://www.techspot.com/community/)*: top 5K, forum, us*
@@ -276,6 +281,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://gramho.com/) [Gramho (https://gramho.com/)](https://gramho.com/)*: top 5K, photo*
1. ![](https://www.google.com/s2/favicons?domain=https://taplink.cc/) [Taplink (https://taplink.cc/)](https://taplink.cc/)*: top 5K, links, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.buymeacoffee.com/) [BuyMeACoffee (https://www.buymeacoffee.com/)](https://www.buymeacoffee.com/)*: top 5K, in*
1. ![](https://www.google.com/s2/favicons?domain=https://muckrack.com) [Muckrack (https://muckrack.com)](https://muckrack.com)*: top 5K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.fixya.com) [fixya (https://www.fixya.com)](https://www.fixya.com)*: top 5K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://lolchess.gg/) [Lolchess (https://lolchess.gg/)](https://lolchess.gg/)*: top 5K, kr*
1. ![](https://www.google.com/s2/favicons?domain=https://www.ifttt.com/) [IFTTT (https://www.ifttt.com/)](https://www.ifttt.com/)*: top 5K, tech*
@@ -294,7 +300,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://forums.digitalspy.com/) [Digitalspy (https://forums.digitalspy.com/)](https://forums.digitalspy.com/)*: top 10K, forum, gb, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.bibsonomy.org) [Bibsonomy (https://www.bibsonomy.org)](https://www.bibsonomy.org)*: top 10K, in*
1. ![](https://www.google.com/s2/favicons?domain=https://slashdot.org) [Slashdot (https://slashdot.org)](https://slashdot.org)*: top 10K, news*
1. ![](https://www.google.com/s2/favicons?domain=https://www.netvibes.com) [Netvibes (https://www.netvibes.com)](https://www.netvibes.com)*: top 10K, de, fr, jp*
1. ![](https://www.google.com/s2/favicons?domain=https://www.netvibes.com) [Netvibes (https://www.netvibes.com)](https://www.netvibes.com)*: top 10K, business, fr*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://opensource.com/) [opensource (https://opensource.com/)](https://opensource.com/)*: top 10K, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://discuss.elastic.co/) [Discuss.Elastic.co (https://discuss.elastic.co/)](https://discuss.elastic.co/)*: top 10K, forum, tech, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.baby.ru/) [Baby.ru (https://www.baby.ru/)](https://www.baby.ru/)*: top 10K, ru*
@@ -316,6 +322,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://club.doctissimo.fr) [doctissimo (https://club.doctissimo.fr)](https://club.doctissimo.fr)*: top 10K, fr*
1. ![](https://www.google.com/s2/favicons?domain=https://www.anime-planet.com) [Anime-planet (https://www.anime-planet.com)](https://www.anime-planet.com)*: top 10K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.dailykos.com) [dailykos (https://www.dailykos.com)](https://www.dailykos.com)*: top 10K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://blogs.klerk.ru) [blogs.klerk.ru (https://blogs.klerk.ru)](https://blogs.klerk.ru)*: top 10K*
1. ![](https://www.google.com/s2/favicons?domain=https://pokemonshowdown.com) [Pokemon Showdown (https://pokemonshowdown.com)](https://pokemonshowdown.com)*: top 10K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://coub.com/) [Coub (https://coub.com/)](https://coub.com/)*: top 10K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.corsair.com) [CORSAIR (https://forum.corsair.com)](https://forum.corsair.com)*: top 10K, forum, us*
@@ -332,7 +339,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.trakt.tv/) [Trakt (https://www.trakt.tv/)](https://www.trakt.tv/)*: top 10K, de, fr*
1. ![](https://www.google.com/s2/favicons?domain=https://hotcopper.com.au) [Hotcopper (https://hotcopper.com.au)](https://hotcopper.com.au)*: top 10K, au*
1. ![](https://www.google.com/s2/favicons?domain=https://pandia.ru) [Pandia (https://pandia.ru)](https://pandia.ru)*: top 10K, news, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.hackerearth.com) [Hackerearth (https://www.hackerearth.com)](https://www.hackerearth.com)*: top 10K, in*
1. ![](https://www.google.com/s2/favicons?domain=https://www.hackerearth.com) [Hackerearth (https://www.hackerearth.com)](https://www.hackerearth.com)*: top 10K, freelance*
1. ![](https://www.google.com/s2/favicons?domain=https://repl.it/) [Repl.it (https://repl.it/)](https://repl.it/)*: top 10K, coding, us*
1. ![](https://www.google.com/s2/favicons?domain=https://support.advancedcustomfields.com/) [AdvancedCustomFields (https://support.advancedcustomfields.com/)](https://support.advancedcustomfields.com/)*: top 10K, au, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.seoclerks.com) [SeoClerks (https://www.seoclerks.com)](https://www.seoclerks.com)*: top 10K, in, jp, us*
@@ -340,7 +347,6 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.codechef.com/) [Codechef (https://www.codechef.com/)](https://www.codechef.com/)*: top 10K, in*
1. ![](https://www.google.com/s2/favicons?domain=http://www.soloby.ru) [Soloby (http://www.soloby.ru)](http://www.soloby.ru)*: top 10K, by, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.diigo.com/) [Diigo (https://www.diigo.com/)](https://www.diigo.com/)*: top 10K, in*
1. ![](https://www.google.com/s2/favicons?domain=https://muckrack.com) [Muckrack (https://muckrack.com)](https://muckrack.com)*: top 10K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.yummly.com) [Yummly (https://www.yummly.com)](https://www.yummly.com)*: top 10K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.thestudentroom.co.uk) [TheStudentRoom (https://www.thestudentroom.co.uk)](https://www.thestudentroom.co.uk)*: top 10K, forum, gb*
1. ![](https://www.google.com/s2/favicons?domain=https://getmyuni.com/) [getmyuni (https://getmyuni.com/)](https://getmyuni.com/)*: top 10K, in*
@@ -396,6 +402,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.animenewsnetwork.com) [AnimeNewsNetwork (https://www.animenewsnetwork.com)](https://www.animenewsnetwork.com)*: top 100K, gb, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.smule.com/) [Smule (https://www.smule.com/)](https://www.smule.com/)*: top 100K, music*
1. ![](https://www.google.com/s2/favicons?domain=https://tvtropes.org) [TVTropes (https://tvtropes.org)](https://tvtropes.org)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://profi.ru) [profi.ru (https://profi.ru)](https://profi.ru)*: top 100K, freelance*
1. ![](https://www.google.com/s2/favicons?domain=https://author.today) [author.today (https://author.today)](https://author.today)*: top 100K, reading, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.thesimsresource.com/) [TheSimsResource (https://www.thesimsresource.com/)](https://www.thesimsresource.com/)*: top 100K, gaming*
1. ![](https://www.google.com/s2/favicons?domain=https://n4g.com/) [N4g (https://n4g.com/)](https://n4g.com/)*: top 100K, gaming, news, us*
@@ -420,19 +427,22 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://allmylinks.com/) [allmylinks (https://allmylinks.com/)](https://allmylinks.com/)*: top 100K, links*
1. ![](https://www.google.com/s2/favicons?domain=https://ello.co/) [Ello (https://ello.co/)](https://ello.co/)*: top 100K, in*
1. ![](https://www.google.com/s2/favicons?domain=https://www.metal-archives.com) [Metal-archives (https://www.metal-archives.com)](https://www.metal-archives.com)*: top 100K, de, music, pl, us*
1. ![](https://www.google.com/s2/favicons?domain=https://mel.fm) [mel.fm (https://mel.fm)](https://mel.fm)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.influenster.com/) [Influenster (https://www.influenster.com/)](https://www.influenster.com/)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.neoseeker.com) [Neoseeker (https://www.neoseeker.com)](https://www.neoseeker.com)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://community.infosecinstitute.com) [InfosecInstitute (https://community.infosecinstitute.com)](https://community.infosecinstitute.com)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://armorgames.com) [Armorgames (https://armorgames.com)](https://armorgames.com)*: top 100K, gaming, us*
1. ![](https://www.google.com/s2/favicons?domain=https://giters.com) [giters.com (https://giters.com)](https://giters.com)*: top 100K, coding*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.blu-ray.com/) [Blu-ray (https://forum.blu-ray.com/)](https://forum.blu-ray.com/)*: top 100K, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.theodysseyonline.com) [TheOdysseyOnline (https://www.theodysseyonline.com)](https://www.theodysseyonline.com)*: top 100K, blog*
1. ![](https://www.google.com/s2/favicons?domain=https://dtf.ru) [DTF (https://dtf.ru)](https://dtf.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://trashbox.ru/) [TRASHBOX.RU (https://trashbox.ru/)](https://trashbox.ru/)*: top 100K, az, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://vgtimes.ru) [Vgtimes (https://vgtimes.ru)](https://vgtimes.ru)*: top 100K, gaming, news, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://launchpad.net/) [Launchpad (https://launchpad.net/)](https://launchpad.net/)*: top 100K, tech, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.digitalpoint.com) [DigitalPoint (https://www.digitalpoint.com)](https://www.digitalpoint.com)*: top 100K, forum*
1. ![](https://www.google.com/s2/favicons?domain=https://forums.digitalpoint.com/) [forums.digitalpoint.com (https://forums.digitalpoint.com/)](https://forums.digitalpoint.com/)*: top 100K, forum, in*
1. ![](https://www.google.com/s2/favicons?domain=https://www.voices.com/) [Voices (https://www.voices.com/)](https://www.voices.com/)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forums.overclockers.co.uk) [forums.overclockers.co.uk (https://forums.overclockers.co.uk)](https://forums.overclockers.co.uk)*: top 100K, forum, gb, uk*
1. ![](https://www.google.com/s2/favicons?domain=https://forums.overclockers.co.uk) [forums.overclockers.co.uk (https://forums.overclockers.co.uk)](https://forums.overclockers.co.uk)*: top 100K, forum, gb, uk*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://forum.lingvolive.com) [Lingvolive (http://forum.lingvolive.com)](http://forum.lingvolive.com)*: top 100K, de, forum, it, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://www.ariva.de/) [Ariva (https://www.ariva.de/)](https://www.ariva.de/)*: top 100K, de*
1. ![](https://www.google.com/s2/favicons?domain=https://talks.by) [Talks.by (https://talks.by)](https://talks.by)*: top 100K, by, forum*, search is disabled
@@ -440,7 +450,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.techdirt.com/) [Techdirt (https://www.techdirt.com/)](https://www.techdirt.com/)*: top 100K, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.myminifactory.com/) [MyMiniFactory (https://www.myminifactory.com/)](https://www.myminifactory.com/)*: top 100K, gb, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.geocaching.com/) [geocaching (https://www.geocaching.com/)](https://www.geocaching.com/)*: top 100K, de, hobby, us*
1. ![](https://www.google.com/s2/favicons?domain=https://vgtimes.ru) [Vgtimes (https://vgtimes.ru)](https://vgtimes.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://vgtimes.ru) [Vgtimes/Games (https://vgtimes.ru)](https://vgtimes.ru)*: top 100K, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://cont.ws) [Cont (https://cont.ws)](https://cont.ws)*: top 100K, be, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.etxt.ru) [Etxt (https://www.etxt.ru)](https://www.etxt.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.babyblog.ru/) [BabyBlog.ru (https://www.babyblog.ru/)](https://www.babyblog.ru/)*: top 100K, ru*
@@ -469,9 +479,9 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.codewars.com) [Codewars (https://www.codewars.com)](https://www.codewars.com)*: top 100K, coding, us*
1. ![](https://www.google.com/s2/favicons?domain=https://shikimori.one) [Shikimori (https://shikimori.one)](https://shikimori.one)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://gurushots.com/) [GuruShots (https://gurushots.com/)](https://gurushots.com/)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://id.pr-cy.ru) [PRCY (https://id.pr-cy.ru)](https://id.pr-cy.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://id.pr-cy.ru) [PRCY (https://id.pr-cy.ru)](https://id.pr-cy.ru)*: top 100K, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://forum.igromania.ru/) [igromania (http://forum.igromania.ru/)](http://forum.igromania.ru/)*: top 100K, forum, gaming, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://facenama.com/) [Facenama (https://facenama.com/)](https://facenama.com/)*: top 100K, ir*
1. ![](https://www.google.com/s2/favicons?domain=https://facenama.com/) [Facenama (https://facenama.com/)](https://facenama.com/)*: top 100K, ir*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://www.pushsquare.com) [PushSquare (http://www.pushsquare.com)](http://www.pushsquare.com)*: top 100K, gaming, news, us*
1. ![](https://www.google.com/s2/favicons?domain=https://moscow.flamp.ru/) [MoscowFlamp (https://moscow.flamp.ru/)](https://moscow.flamp.ru/)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.the-village.ru/) [TheVillage.ru (https://www.the-village.ru/)](https://www.the-village.ru/)*: top 100K, ru*, search is disabled
@@ -483,7 +493,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://robertsspaceindustries.com/) [Star Citizen (https://robertsspaceindustries.com/)](https://robertsspaceindustries.com/)*: top 100K, de, us*
1. ![](https://www.google.com/s2/favicons?domain=https://eva.ru/) [Eva (https://eva.ru/)](https://eva.ru/)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://e621.net) [E621 (https://e621.net)](https://e621.net)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.metacafe.com/) [Metacafe (https://www.metacafe.com/)](https://www.metacafe.com/)*: top 100K, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.metacafe.com/) [Metacafe (https://www.metacafe.com/)](https://www.metacafe.com/)*: top 100K, in, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://discussions.tomtom.com/) [Tomtom (https://discussions.tomtom.com/)](https://discussions.tomtom.com/)*: top 100K, de, in, it, nl, no, us*
1. ![](https://www.google.com/s2/favicons?domain=https://tryhackme.com/) [TryHackMe (https://tryhackme.com/)](https://tryhackme.com/)*: top 100K, hacking, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://gbatemp.net/) [GBAtemp.net (https://gbatemp.net/)](https://gbatemp.net/)*: top 100K, de, forum, gaming, us*
@@ -518,7 +528,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.affiliatefix.com) [Affiliatefix (https://www.affiliatefix.com)](https://www.affiliatefix.com)*: top 100K, forum, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.smogon.com) [Smogon (https://www.smogon.com)](https://www.smogon.com)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://users.rust-lang.org) [Rust-lang (https://users.rust-lang.org)](https://users.rust-lang.org)*: top 100K, coding, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=https://au.ru) [Au (https://au.ru)](https://au.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://au.ru) [Au (https://au.ru)](https://au.ru)*: top 100K, freelance, ru, shopping*
1. ![](https://www.google.com/s2/favicons?domain=https://www.pepper.ru/) [Pepper (https://www.pepper.ru/)](https://www.pepper.ru/)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://carbonmade.com/) [Carbonmade (https://carbonmade.com/)](https://carbonmade.com/)*: top 100K, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://wanelo.co/adam) [Wanelo (https://wanelo.co/adam)](https://wanelo.co/adam)*: top 100K, in, us*
@@ -528,6 +538,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.rusfootball.info/) [Football (https://www.rusfootball.info/)](https://www.rusfootball.info/)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.guns.ru/) [Guns.ru (https://forum.guns.ru/)](https://forum.guns.ru/)*: top 100K, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.paltalk.com) [Paltalk (https://www.paltalk.com)](https://www.paltalk.com)*: top 100K, sa, us*
1. ![](https://www.google.com/s2/favicons?domain=https://app.airnfts.com) [app.airnfts.com (https://app.airnfts.com)](https://app.airnfts.com)*: top 100K*
1. ![](https://www.google.com/s2/favicons?domain=https://www.airliners.net/) [Airliners (https://www.airliners.net/)](https://www.airliners.net/)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forums.battlefield.com) [forums.battlefield.com (https://forums.battlefield.com)](https://forums.battlefield.com)*: top 100K, forum, gaming, gb, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://gotovim-doma.ru) [GotovimDoma (https://gotovim-doma.ru)](https://gotovim-doma.ru)*: top 100K, ru*
@@ -551,7 +562,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://pinboard.in) [Pinboard (http://pinboard.in)](http://pinboard.in)*: top 100K, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://ask.fedoraproject.org/) [Ask Fedora (https://ask.fedoraproject.org/)](https://ask.fedoraproject.org/)*: top 100K, forum, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://boosty.to) [Boosty (https://boosty.to)](https://boosty.to)*: top 100K, eu, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://tproger.ru) [Tproger (https://tproger.ru)](https://tproger.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://tproger.ru) [Tproger (https://tproger.ru)](https://tproger.ru)*: top 100K, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://www.1001tracklists.com) [1001tracklists (https://www.1001tracklists.com)](https://www.1001tracklists.com)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.jetpunk.com) [Jetpunk (https://www.jetpunk.com)](https://www.jetpunk.com)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.leasehackr.com/) [leasehackr (https://forum.leasehackr.com/)](https://forum.leasehackr.com/)*: top 100K, forum, us*
@@ -559,7 +570,8 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.goldderby.com) [Goldderby (https://www.goldderby.com)](https://www.goldderby.com)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.blackhatprotools.info) [BlackHatProTools (https://www.blackhatprotools.info)](https://www.blackhatprotools.info)*: top 100K, forum*
1. ![](https://www.google.com/s2/favicons?domain=https://www.aufeminin.com) [Aufeminin (https://www.aufeminin.com)](https://www.aufeminin.com)*: top 100K, fr, ma, mg*
1. ![](https://www.google.com/s2/favicons?domain=https://www.vsemayki.ru/) [Vsemayki (https://www.vsemayki.ru/)](https://www.vsemayki.ru/)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.vsemayki.ru/) [Vsemayki (https://www.vsemayki.ru/)](https://www.vsemayki.ru/)*: top 100K, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://likee.video) [Likee (https://likee.video)](https://likee.video)*: top 100K, video*
1. ![](https://www.google.com/s2/favicons?domain=https://blog.7ya.ru) [7ya (https://blog.7ya.ru)](https://blog.7ya.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://club.7ya.ru) [club.7ya.ru (https://club.7ya.ru)](https://club.7ya.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://gloria.tv) [gloria.tv (https://gloria.tv)](https://gloria.tv)*: top 100K, ar, mx, pl, sk, us*
@@ -595,12 +607,13 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.setlist.fm) [Setlist (https://www.setlist.fm)](https://www.setlist.fm)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forum-ru.101xp.com) [101xp.com (https://forum-ru.101xp.com)](https://forum-ru.101xp.com)*: top 100K, forum, gaming, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://wakatime.com) [Wakatime (https://wakatime.com)](https://wakatime.com)*: top 100K, ng, ve*
1. ![](https://www.google.com/s2/favicons?domain=https://photoshop-kopona.com) [photoshop-kopona.com (https://photoshop-kopona.com)](https://photoshop-kopona.com)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.mt5.com) [mt5 (https://forum.mt5.com)](https://forum.mt5.com)*: top 100K, forum, in, pk, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forums.collectors.com) [collectors.com (https://forums.collectors.com)](https://forums.collectors.com)*: top 100K, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=http://blogmarks.net) [Blogmarks (http://blogmarks.net)](http://blogmarks.net)*: top 100K, fr, in*
1. ![](https://www.google.com/s2/favicons?domain=http://forum.oszone.net) [ForumOszone (http://forum.oszone.net)](http://forum.oszone.net)*: top 100K, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://davesgarden.com) [Davesgarden (https://davesgarden.com)](https://davesgarden.com)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.cxem.net/) [forum.cxem.net (https://forum.cxem.net/)](https://forum.cxem.net/)*: top 100K, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.cxem.net/) [forum.cxem.net (https://forum.cxem.net/)](https://forum.cxem.net/)*: top 100K, forum, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://icq.com) [ICQ (https://icq.com)](https://icq.com)*: top 100K, ch, ru, tr*
1. ![](https://www.google.com/s2/favicons?domain=https://d3.ru/) [d3 (https://d3.ru/)](https://d3.ru/)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.dwg.ru/) [dwg (https://forum.dwg.ru/)](https://forum.dwg.ru/)*: top 100K, forum, ru*
@@ -610,7 +623,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://promodj.com/) [PromoDJ (http://promodj.com/)](http://promodj.com/)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.sythe.org) [Sythe (https://www.sythe.org)](https://www.sythe.org)*: top 100K, ca, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=http://www.forum.hr) [forum.hr (http://www.forum.hr)](http://www.forum.hr)*: top 100K, forum, hr*
1. ![](https://www.google.com/s2/favicons?domain=https://www.capfriendly.com/) [CapFriendly (https://www.capfriendly.com/)](https://www.capfriendly.com/)*: top 100K, ca, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.capfriendly.com/) [CapFriendly (https://www.capfriendly.com/)](https://www.capfriendly.com/)*: top 100K, ca, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://kosmetista.ru) [Kosmetista (https://kosmetista.ru)](https://kosmetista.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://forum.notebookreview.com) [NotebookReview (http://forum.notebookreview.com)](http://forum.notebookreview.com)*: top 100K, forum, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://tl.net) [Tl (https://tl.net)](https://tl.net)*: top 100K, de, dk, us*
@@ -621,7 +634,8 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.ethicalhacker.net) [EthicalHacker (https://www.ethicalhacker.net)](https://www.ethicalhacker.net)*: top 100K, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.playstationtrophies.org) [PlaystationTrophies (https://www.playstationtrophies.org)](https://www.playstationtrophies.org)*: top 100K, forum, gaming*
1. ![](https://www.google.com/s2/favicons?domain=https://www.hr.com) [Hr (https://www.hr.com)](https://www.hr.com)*: top 100K, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.funnyordie.com) [Funnyordie (https://www.funnyordie.com)](https://www.funnyordie.com)*: top 100K, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.funnyordie.com) [Funnyordie (https://www.funnyordie.com)](https://www.funnyordie.com)*: top 100K, in, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://id.dev.by) [Dev.by (https://id.dev.by)](https://id.dev.by)*: top 100K, by, news, tech*
1. ![](https://www.google.com/s2/favicons?domain=http://forum.hochu.ua) [hochu (http://forum.hochu.ua)](http://forum.hochu.ua)*: top 100K, forum, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://24open.ru) [24open (https://24open.ru)](https://24open.ru)*: top 100K, dating, ru, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://www.pokecommunity.com) [Pokecommunity (https://www.pokecommunity.com)](https://www.pokecommunity.com)*: top 100K, de, forum, gb, us*
@@ -634,6 +648,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.bookcrossing.com/) [Bookcrossing (https://www.bookcrossing.com/)](https://www.bookcrossing.com/)*: top 100K, in*
1. ![](https://www.google.com/s2/favicons?domain=https://dota2.ru/) [Dota2 (https://dota2.ru/)](https://dota2.ru/)*: top 100K, gaming, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.questionablequesting.com) [QuestionableQuesting (https://forum.questionablequesting.com)](https://forum.questionablequesting.com)*: top 100K, forum, gb, jp, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=) [Appian ()]()*: top 100K*
1. ![](https://www.google.com/s2/favicons?domain=https://dissenter.com/) [Dissenter (https://dissenter.com/)](https://dissenter.com/)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=insanejournal.com) [Insanejournal (insanejournal.com)](insanejournal.com)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://shazoo.ru) [Shazoo (https://shazoo.ru)](https://shazoo.ru)*: top 100K, ru*
@@ -658,8 +673,9 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://forums.vkmonline.com) [VKMOnline (http://forums.vkmonline.com)](http://forums.vkmonline.com)*: top 100K, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.fl.ru/) [fl (https://www.fl.ru/)](https://www.fl.ru/)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.huntingnet.com) [Huntingnet (https://www.huntingnet.com)](https://www.huntingnet.com)*: top 100K, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.realmeye.com/) [Realmeye (https://www.realmeye.com/)](https://www.realmeye.com/)*: top 100K, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.realmeye.com/) [Realmeye (https://www.realmeye.com/)](https://www.realmeye.com/)*: top 100K, gaming*
1. ![](https://www.google.com/s2/favicons?domain=https://keybase.io/) [Keybase (https://keybase.io/)](https://keybase.io/)*: top 100K, business, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.djagi.com) [Djagi (https://www.djagi.com)](https://www.djagi.com)*: top 100K, bg*
1. ![](https://www.google.com/s2/favicons?domain=https://pregame.com) [Pregame (https://pregame.com)](https://pregame.com)*: top 100K, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.tks.ru/) [tks (https://forum.tks.ru/)](https://forum.tks.ru/)*: top 100K, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://listography.com/adam) [Listography (https://listography.com/adam)](https://listography.com/adam)*: top 100K, in*
@@ -677,6 +693,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://4gameforum.com) [4gameforum (https://4gameforum.com)](https://4gameforum.com)*: top 100K, forum, kr, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://libraries.io) [Libraries (https://libraries.io)](https://libraries.io)*: top 100K, coding, in*
1. ![](https://www.google.com/s2/favicons?domain=https://lib.rus.ec) [Librusec (https://lib.rus.ec)](https://lib.rus.ec)*: top 100K, br, ru, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.realmeye.com) [Realmeye-graveyard (https://www.realmeye.com)](https://www.realmeye.com)*: top 100K, gaming*
1. ![](https://www.google.com/s2/favicons?domain=https://3dtoday.ru/) [3dtoday (https://3dtoday.ru/)](https://3dtoday.ru/)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.rasa.com) [Rasa (https://forum.rasa.com)](https://forum.rasa.com)*: top 100K, forum, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://fifaforums.easports.com/) [FIFA FORUMS (https://fifaforums.easports.com/)](https://fifaforums.easports.com/)*: top 100K, forum, gb, us*
@@ -684,6 +701,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.nkj.ru/) [Nkj (https://www.nkj.ru/)](https://www.nkj.ru/)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://zagony.ru) [Zagony (https://zagony.ru)](https://zagony.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.romanticcollection.ru) [RomanticCollection (https://www.romanticcollection.ru)](https://www.romanticcollection.ru)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://dumskaya.net) [dumskaya.net (https://dumskaya.net)](https://dumskaya.net)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.wowcircle.net) [WOW Circle (https://forum.wowcircle.net)](https://forum.wowcircle.net)*: top 100K, forum, it, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://dating.ru) [Dating.Ru (http://dating.ru)](http://dating.ru)*: top 100K, dating, ru, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.antichat.ru/) [Antichat (https://forum.antichat.ru/)](https://forum.antichat.ru/)*: top 100K, forum, ru, us*
@@ -718,8 +736,8 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://steamidfinder.com) [Steamidfinder (https://steamidfinder.com)](https://steamidfinder.com)*: top 100K, gaming*
1. ![](https://www.google.com/s2/favicons?domain=https://steamidfinder.com) [Steamidfinder (by id) (https://steamidfinder.com)](https://steamidfinder.com)*: top 100K, gaming*
1. ![](https://www.google.com/s2/favicons?domain=https://mssg.me) [mssg.me (https://mssg.me)](https://mssg.me)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://capitalcity.combats.com) [CapitalcityCombats (http://capitalcity.combats.com)](http://capitalcity.combats.com)*: top 100K, az, it, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://demonscity.combats.com) [Demonscity (http://demonscity.combats.com)](http://demonscity.combats.com)*: top 100K, az, it, pa*
1. ![](https://www.google.com/s2/favicons?domain=http://capitalcity.combats.com) [CapitalcityCombats (http://capitalcity.combats.com)](http://capitalcity.combats.com)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://demonscity.combats.com) [Demonscity (http://demonscity.combats.com)](http://demonscity.combats.com)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.cfd-online.com) [cfd-online (https://www.cfd-online.com)](https://www.cfd-online.com)*: top 100K, ca, de, fr, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://otzyvy.pro) [Otzyvy (https://otzyvy.pro)](https://otzyvy.pro)*: top 100K, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.allthelyrics.com) [AllTheLyrics (https://www.allthelyrics.com)](https://www.allthelyrics.com)*: top 100K, forum, music*
@@ -746,10 +764,10 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://asciinema.org) [Asciinema (https://asciinema.org)](https://asciinema.org)*: top 10M, in, tr, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.ddo.com) [Ddo (https://www.ddo.com)](https://www.ddo.com)*: top 10M, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=https://golbis.com) [Golbis (https://golbis.com)](https://golbis.com)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forexdengi.com/) [ForexDengi (https://forexdengi.com/)](https://forexdengi.com/)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forexdengi.com/) [ForexDengi (https://forexdengi.com/)](https://forexdengi.com/)*: top 10M, forum, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://mywed.com/ru) [Mywed (https://mywed.com/ru)](https://mywed.com/ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://elixirforum.com) [Elixirforum (https://elixirforum.com)](https://elixirforum.com)*: top 10M, coding, forum*
1. ![](https://www.google.com/s2/favicons?domain=https://forums.funny-games.biz) [funny-games.biz (https://forums.funny-games.biz)](https://forums.funny-games.biz)*: top 10M, forum, lt, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forums.funny-games.biz) [funny-games.biz (https://forums.funny-games.biz)](https://forums.funny-games.biz)*: top 10M, forum, lt, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://wolpy.com) [Wolpy (http://wolpy.com)](http://wolpy.com)*: top 10M, travel*
1. ![](https://www.google.com/s2/favicons?domain=http://www.tfw2005.com/boards/) [tfw2005.com (http://www.tfw2005.com/boards/)](http://www.tfw2005.com/boards/)*: top 10M, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=https://truesteamachievements.com) [Truesteamachievements (https://truesteamachievements.com)](https://truesteamachievements.com)*: top 10M, az, gb, us*
@@ -764,6 +782,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://noblogs.org/) [Noblogs (https://noblogs.org/)](https://noblogs.org/)*: top 10M, blog*
1. ![](https://www.google.com/s2/favicons?domain=https://forums.eagle.ru) [forums.eagle.ru (https://forums.eagle.ru)](https://forums.eagle.ru)*: top 10M, ca, forum, gaming, gb, in, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://schlock.ru/) [Schlock (https://schlock.ru/)](https://schlock.ru/)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://monitoringminecraft.ru) [monitoringminecraft.ru (https://monitoringminecraft.ru)](https://monitoringminecraft.ru)*: top 10M, gaming*
1. ![](https://www.google.com/s2/favicons?domain=https://www.stratege.ru) [Stratege (https://www.stratege.ru)](https://www.stratege.ru)*: top 10M, forum, gaming, news, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.quibblo.com/) [Quibblo (https://www.quibblo.com/)](https://www.quibblo.com/)*: top 10M, in*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://forums.riftgame.com) [Riftgame (http://forums.riftgame.com)](http://forums.riftgame.com)*: top 10M, cr, forum, us*
@@ -794,7 +813,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://bbs.huami.com) [bbs.huami.com (https://bbs.huami.com)](https://bbs.huami.com)*: top 10M, cn, in, ir, ru, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://amazfitwatchfaces.com) [AmazfitWatchFaces (https://amazfitwatchfaces.com)](https://amazfitwatchfaces.com)*: top 10M, ae, es, forum, gr, id, ir, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://moikrug.ru/) [MoiKrug (https://moikrug.ru/)](https://moikrug.ru/)*: top 10M, career, us*
1. ![](https://www.google.com/s2/favicons?domain=http://www.movescount.com) [Movescount (http://www.movescount.com)](http://www.movescount.com)*: top 10M, es, in, pk, ru, us*
1. ![](https://www.google.com/s2/favicons?domain=http://www.movescount.com) [Movescount (http://www.movescount.com)](http://www.movescount.com)*: top 10M, maps*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://tamtam.chat/) [TamTam (https://tamtam.chat/)](https://tamtam.chat/)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.velomania.ru/) [Velomania (https://forum.velomania.ru/)](https://forum.velomania.ru/)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.itvdn.com) [ITVDN Forum (https://forum.itvdn.com)](https://forum.itvdn.com)*: top 10M, forum, ru, ua*
@@ -819,7 +838,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://ethresear.ch) [Ethresear (https://ethresear.ch)](https://ethresear.ch)*: top 10M, ch, cr, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=https://sysadmins.ru) [Sysadmins (https://sysadmins.ru)](https://sysadmins.ru)*: top 10M, forum, ru, tech*
1. ![](https://www.google.com/s2/favicons?domain=https://radioskot.ru) [radioskot (https://radioskot.ru)](https://radioskot.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.ruboard.ru) [ruboard (https://forum.ruboard.ru)](https://forum.ruboard.ru)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.ruboard.ru) [ruboard (https://forum.ruboard.ru)](https://forum.ruboard.ru)*: top 10M, forum, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://carmasters.org) [Carmasters (https://carmasters.org)](https://carmasters.org)*: top 10M, fi, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://fclmnews.ru) [Fclmnews (https://fclmnews.ru)](https://fclmnews.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://www.ustream.tv) [Ustream (http://www.ustream.tv)](http://www.ustream.tv)*: top 10M, eg, us*
@@ -847,10 +866,11 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://mathhelpplanet.com) [Mathhelpplanet (http://mathhelpplanet.com)](http://mathhelpplanet.com)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.talkstats.com) [Talkstats (https://www.talkstats.com)](https://www.talkstats.com)*: top 10M, au*
1. ![](https://www.google.com/s2/favicons?domain=http://www.cqham.ru) [Cqham (http://www.cqham.ru)](http://www.cqham.ru)*: top 10M, ru, tech*
1. ![](https://www.google.com/s2/favicons?domain=https://tikbuddy.com) [tikbuddy.com (https://tikbuddy.com)](https://tikbuddy.com)*: top 10M, hobby, video*
1. ![](https://www.google.com/s2/favicons?domain=https://www.kharkovforum.com/) [KharkovForum (https://www.kharkovforum.com/)](https://www.kharkovforum.com/)*: top 10M, forum, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://studwork.org/) [Studwork (https://studwork.org/)](https://studwork.org/)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.freeton.org) [forum.freeton.org (https://forum.freeton.org)](https://forum.freeton.org)*: top 10M, finance, forum*
1. ![](https://www.google.com/s2/favicons?domain=https://playlists.net) [Playlists (https://playlists.net)](https://playlists.net)*: top 10M, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://playlists.net) [Playlists (https://playlists.net)](https://playlists.net)*: top 10M, in, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://liberapay.com) [Liberapay (https://liberapay.com)](https://liberapay.com)*: top 10M, eg, finance, in, pk, us, za*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.artinvestment.ru/) [artinvestment (https://forum.artinvestment.ru/)](https://forum.artinvestment.ru/)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.golangbridge.org/) [Golangbridge (https://forum.golangbridge.org/)](https://forum.golangbridge.org/)*: top 10M, forum, in, sa, ua, us, vn*
@@ -877,6 +897,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.virtualireland.ru) [VirtualIreland (https://www.virtualireland.ru)](https://www.virtualireland.ru)*: top 10M, forum, ie, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.freelancebay.com) [Freelancebay (https://www.freelancebay.com)](https://www.freelancebay.com)*: top 10M, freelance, th*
1. ![](https://www.google.com/s2/favicons?domain=https://4cheat.ru) [4cheat (https://4cheat.ru)](https://4cheat.ru)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://githubplus.com) [githubplus.com (https://githubplus.com)](https://githubplus.com)*: top 10M, coding*
1. ![](https://www.google.com/s2/favicons?domain=https://www.runitonce.com/) [Runitonce (https://www.runitonce.com/)](https://www.runitonce.com/)*: top 10M, ca, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.paypal.me) [Paypal (https://www.paypal.me)](https://www.paypal.me)*: top 10M, finance*
1. ![](https://www.google.com/s2/favicons?domain=https://seatracker.ru/) [Seatracker (https://seatracker.ru/)](https://seatracker.ru/)*: top 10M, ru*
@@ -917,6 +938,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://muz-fresh.ucoz.kz) [muz-fresh.ucoz.kz (http://muz-fresh.ucoz.kz)](http://muz-fresh.ucoz.kz)*: top 10M, kz*
1. ![](https://www.google.com/s2/favicons?domain=https://radiomed.ru) [Radiomed (https://radiomed.ru)](https://radiomed.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://excelworld.ru) [excelworld.ru (http://excelworld.ru)](http://excelworld.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://onlyfinder.com) [Onlyfinder (https://onlyfinder.com)](https://onlyfinder.com)*: top 10M, webcam*
1. ![](https://www.google.com/s2/favicons?domain=https://binarysearch.com/) [BinarySearch (https://binarysearch.com/)](https://binarysearch.com/)*: top 10M, in*
1. ![](https://www.google.com/s2/favicons?domain=https://nick-name.ru/) [Nick-name.ru (https://nick-name.ru/)](https://nick-name.ru/)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://naturalworld.guru) [Naturalworld (https://naturalworld.guru)](https://naturalworld.guru)*: top 10M, ru*
@@ -961,6 +983,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://faqusha.ru) [Faqusha (https://faqusha.ru)](https://faqusha.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://skyrimforums.org) [Skyrimforums (https://skyrimforums.org)](https://skyrimforums.org)*: top 10M, forum, in, us*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.juce.com) [juce (https://forum.juce.com)](https://forum.juce.com)*: top 10M, ca, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=https://rblx.trade) [rblx.trade (https://rblx.trade)](https://rblx.trade)*: top 10M, gaming*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.quik.ru) [quik (https://forum.quik.ru)](https://forum.quik.ru)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.gardenstew.com) [Gardenstew (https://www.gardenstew.com)](https://www.gardenstew.com)*: top 10M, forum, in, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://www.office-forums.com) [Office-forums (https://www.office-forums.com)](https://www.office-forums.com)*: top 10M, forum, in, us*
@@ -995,7 +1018,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.meendo.net) [Meendo (https://www.meendo.net)](https://www.meendo.net)*: top 10M, bg, kg, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://www.oakleyforum.com) [oakleyforum.com (https://www.oakleyforum.com)](https://www.oakleyforum.com)*: top 10M, forum*
1. ![](https://www.google.com/s2/favicons?domain=https://worldofplayers.ru) [Worldofplayers (https://worldofplayers.ru)](https://worldofplayers.ru)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.prizyvnik.info) [Prizyvnik (https://www.prizyvnik.info)](https://www.prizyvnik.info)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.prizyvnik.info) [Prizyvnik (https://www.prizyvnik.info)](https://www.prizyvnik.info)*: top 10M, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://defenceforumindia.com/) [DefenceForumIndia (https://defenceforumindia.com/)](https://defenceforumindia.com/)*: top 10M, forum, in, military*
1. ![](https://www.google.com/s2/favicons?domain=https://ro-ru.ru) [Ro-ru (https://ro-ru.ru)](https://ro-ru.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://zhyk.ru) [Zhyk (https://zhyk.ru)](https://zhyk.ru)*: top 10M, forum, ru*, search is disabled
@@ -1006,7 +1029,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://ethereum-magicians.org) [Ethereum-magicians (https://ethereum-magicians.org)](https://ethereum-magicians.org)*: top 10M, cr, forum*
1. ![](https://www.google.com/s2/favicons?domain=http://bbs.evony.com) [bbs.evony.com (http://bbs.evony.com)](http://bbs.evony.com)*: top 10M, forum, in, pk, tr, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.animeforum.com) [Animeforum (https://www.animeforum.com)](https://www.animeforum.com)*: top 10M, forum, pk, us, vn*
1. ![](https://www.google.com/s2/favicons?domain=https://kinooh.ru) [Kinooh (https://kinooh.ru)](https://kinooh.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://kinooh.ru) [Kinooh (https://kinooh.ru)](https://kinooh.ru)*: top 10M, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://www.clubsnap.com/) [clubsnap.com (https://www.clubsnap.com/)](https://www.clubsnap.com/)*: top 10M, forum, in, sg, us*
1. ![](https://www.google.com/s2/favicons?domain=https://southklad.ru) [Southklad (https://southklad.ru)](https://southklad.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.theturboforums.com/forums/) [theturboforums.com (https://www.theturboforums.com/forums/)](https://www.theturboforums.com/forums/)*: top 10M, forum, us*
@@ -1018,23 +1041,23 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.wireclub.com) [Wireclub (https://www.wireclub.com)](https://www.wireclub.com)*: top 10M, in, tr, us*
1. ![](https://www.google.com/s2/favicons?domain=https://community.go365.com) [Go365 (https://community.go365.com)](https://community.go365.com)*: top 10M, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://social.tchncs.de/) [social.tchncs.de (https://social.tchncs.de/)](https://social.tchncs.de/)*: top 10M, de, in*
1. ![](https://www.google.com/s2/favicons?domain=https://www.rusforum.com/) [Rusforum (https://www.rusforum.com/)](https://www.rusforum.com/)*: top 10M, forum, in, pk, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://www.rusforum.com/) [Rusforum (https://www.rusforum.com/)](https://www.rusforum.com/)*: top 10M, forum, in, pk, ru, ua*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://gribnyemesta.unoforum.pro) [Gribnyemesta (https://gribnyemesta.unoforum.pro)](https://gribnyemesta.unoforum.pro)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://cheat-master.ru) [cheat-master.ru (http://cheat-master.ru)](http://cheat-master.ru)*: top 10M, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://lovetalk.ru) [Mylove (https://lovetalk.ru)](https://lovetalk.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://lovetalk.ru) [Mylove (https://lovetalk.ru)](https://lovetalk.ru)*: top 10M, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://board.german242.com) [German242 (https://board.german242.com)](https://board.german242.com)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.beyond3d.com) [beyond3d (https://forum.beyond3d.com)](https://forum.beyond3d.com)*: top 10M, forum, in, pk, ru, us*
1. ![](https://www.google.com/s2/favicons?domain=https://lightstalking.us/) [Lightstalking (https://lightstalking.us/)](https://lightstalking.us/)*: top 10M, forum, photo*
1. ![](https://www.google.com/s2/favicons?domain=http://wowjp.net) [wowjp.net (http://wowjp.net)](http://wowjp.net)*: top 10M, ru, ua*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://gentlemint.com) [Gentlemint (https://gentlemint.com)](https://gentlemint.com)*: top 10M, in*
1. ![](https://www.google.com/s2/favicons?domain=https://www.invalidnost.com) [Invalidnost (https://www.invalidnost.com)](https://www.invalidnost.com)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://bestfantasybooks.com) [Bestfantasybooks (http://bestfantasybooks.com)](http://bestfantasybooks.com)*: top 10M, us*
1. ![](https://www.google.com/s2/favicons?domain=http://bestfantasybooks.com) [Bestfantasybooks (http://bestfantasybooks.com)](http://bestfantasybooks.com)*: top 10M, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://life-dom2.su) [Life-dom2 (https://life-dom2.su)](https://life-dom2.su)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://angara.net) [Angara (https://angara.net)](https://angara.net)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.swiftbook.ru) [swiftbook (https://forum.swiftbook.ru)](https://forum.swiftbook.ru)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://ladies.zp.ua) [Ladies (http://ladies.zp.ua)](http://ladies.zp.ua)*: top 10M, forum, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://archlinux.org.ru) [Archlinux (https://archlinux.org.ru)](https://archlinux.org.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://bethepro.com) [Bethepro (https://bethepro.com)](https://bethepro.com)*: top 10M, pk, us*
1. ![](https://www.google.com/s2/favicons?domain=https://bethepro.com) [Bethepro (https://bethepro.com)](https://bethepro.com)*: top 10M, pk, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://forum.mapillary.com) [Mapillary Forum (https://forum.mapillary.com)](https://forum.mapillary.com)*: top 10M, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.firearmstalk.com) [Firearmstalk (https://www.firearmstalk.com)](https://www.firearmstalk.com)*: top 10M, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.houserepairtalk.com) [Houserepairtalk (https://www.houserepairtalk.com)](https://www.houserepairtalk.com)*: top 10M, forum, in, us*
@@ -1049,7 +1072,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://partyflock.nl) [Partyflock (https://partyflock.nl)](https://partyflock.nl)*: top 10M, in, nl*
1. ![](https://www.google.com/s2/favicons?domain=http://forum.bratsk.org) [Bratsk Forum (http://forum.bratsk.org)](http://forum.bratsk.org)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://armtorg.ru/) [Armtorg (https://armtorg.ru/)](https://armtorg.ru/)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.duno.com/) [Duno (https://www.duno.com/)](https://www.duno.com/)*: top 10M, in, pk*
1. ![](https://www.google.com/s2/favicons?domain=https://www.duno.com/) [Duno (https://www.duno.com/)](https://www.duno.com/)*: top 10M, in, pk*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://www.damochka.ru) [Damochka (https://www.damochka.ru)](https://www.damochka.ru)*: top 10M, kz, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://player.ru) [Player (http://player.ru)](http://player.ru)*: top 10M, forum, ru, shopping*
1. ![](https://www.google.com/s2/favicons?domain=https://python.su/) [python.su (https://python.su/)](https://python.su/)*: top 10M, ru*
@@ -1084,17 +1107,18 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://www.babyboom.pl/forum/) [babyboom.pl (http://www.babyboom.pl/forum/)](http://www.babyboom.pl/forum/)*: top 10M, forum, pl*
1. ![](https://www.google.com/s2/favicons?domain=https://gamesubject.com) [Gamesubject (https://gamesubject.com)](https://gamesubject.com)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://sa-mp.ucoz.de) [sa-mp.ucoz.de (http://sa-mp.ucoz.de)](http://sa-mp.ucoz.de)*: top 10M, in, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://xgm.guru) [xgm.guru (https://xgm.guru)](https://xgm.guru)*: top 10M, forum, gaming*
1. ![](https://www.google.com/s2/favicons?domain=https://xboxgamertag.com/) [Xbox Gamertag (https://xboxgamertag.com/)](https://xboxgamertag.com/)*: top 10M, us*
1. ![](https://www.google.com/s2/favicons?domain=https://hpc.ru) [Hpc (https://hpc.ru)](https://hpc.ru)*: top 10M, in, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.openframeworks.cc) [openframeworks (https://forum.openframeworks.cc)](https://forum.openframeworks.cc)*: top 10M, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=http://sportsjournalists.com/forum/) [sportsjournalists.com (http://sportsjournalists.com/forum/)](http://sportsjournalists.com/forum/)*: top 10M, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.gardening-forums.com) [Gardening-forums (https://www.gardening-forums.com)](https://www.gardening-forums.com)*: top 10M, forum, ph*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.reverse4you.org) [reverse4you (https://forum.reverse4you.org)](https://forum.reverse4you.org)*: top 10M, forum, lk, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.reverse4you.org) [reverse4you (https://forum.reverse4you.org)](https://forum.reverse4you.org)*: top 10M, forum, lk, ru, ua*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://macosx.com) [Macosx (https://macosx.com)](https://macosx.com)*: top 10M, forum*
1. ![](https://www.google.com/s2/favicons?domain=https://smashrun.com/) [Smashrun (https://smashrun.com/)](https://smashrun.com/)*: top 10M, br, jp, us*
1. ![](https://www.google.com/s2/favicons?domain=http://spishu.ru) [spishu.ru (http://spishu.ru)](http://spishu.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.thedaftclub.com) [Thedaftclub (https://www.thedaftclub.com)](https://www.thedaftclub.com)*: top 10M, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://forum.allgaz.ru) [allgaz (https://forum.allgaz.ru)](https://forum.allgaz.ru)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.allgaz.ru) [allgaz (https://forum.allgaz.ru)](https://forum.allgaz.ru)*: top 10M, forum, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://forums.vitalfootball.co.uk) [VitalFootball (https://forums.vitalfootball.co.uk)](https://forums.vitalfootball.co.uk)*: top 10M, forum, gb, in, pk*
1. ![](https://www.google.com/s2/favicons?domain=https://vlmi.biz) [Vlmi (https://vlmi.biz)](https://vlmi.biz)*: top 10M, forum, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://www.sciax2.it/forum/) [sciax2.it (https://www.sciax2.it/forum/)](https://www.sciax2.it/forum/)*: top 10M, forum, tr*
@@ -1131,7 +1155,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://forum.evaveda.com/) [ForumEvaveda (http://forum.evaveda.com/)](http://forum.evaveda.com/)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://kpyto.pp.net.ua) [kpyto.pp.net.ua (http://kpyto.pp.net.ua)](http://kpyto.pp.net.ua)*: top 10M, ua*
1. ![](https://www.google.com/s2/favicons?domain=http://samsungmobile.pp.net.ua) [samsungmobile.pp.net.ua (http://samsungmobile.pp.net.ua)](http://samsungmobile.pp.net.ua)*: top 10M, ua*
1. ![](https://www.google.com/s2/favicons?domain=http://fapforum.net) [Fapforum (http://fapforum.net)](http://fapforum.net)*: top 10M, forum, porn, ua*
1. ![](https://www.google.com/s2/favicons?domain=http://fapforum.net) [Fapforum (http://fapforum.net)](http://fapforum.net)*: top 10M, forum, porn, ua*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://social.librem.one) [SocialLibremOne (https://social.librem.one)](https://social.librem.one)*: top 10M, tech*
1. ![](https://www.google.com/s2/favicons?domain=https://forums.footballindex.co.uk) [footballindex (https://forums.footballindex.co.uk)](https://forums.footballindex.co.uk)*: top 10M, forum, gb, in, sg, us*
1. ![](https://www.google.com/s2/favicons?domain=http://www.free-lancers.net) [Free-lancers (http://www.free-lancers.net)](http://www.free-lancers.net)*: top 10M, freelance, ru*
@@ -1150,7 +1174,6 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.bayoushooter.com) [Bayoushooter (https://www.bayoushooter.com)](https://www.bayoushooter.com)*: top 10M, forum, pk, us*
1. ![](https://www.google.com/s2/favicons?domain=https://nygunforum.com) [Nygunforum (https://nygunforum.com)](https://nygunforum.com)*: top 10M, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=http://www.astra-club.ru) [Astra-club (http://www.astra-club.ru)](http://www.astra-club.ru)*: top 10M, ru, ua*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://likee.com) [Likee (https://likee.com)](https://likee.com)*: top 10M, video*
1. ![](https://www.google.com/s2/favicons?domain=http://phrack.org) [Phrack (http://phrack.org)](http://phrack.org)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://esate.ru) [Esate (http://esate.ru)](http://esate.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://ieoc.com/) [Ieoc (https://ieoc.com/)](https://ieoc.com/)*: top 10M, us*
@@ -1177,7 +1200,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://mastodon.xyz/) [mastodon.xyz (https://mastodon.xyz/)](https://mastodon.xyz/)*: top 10M, th*
1. ![](https://www.google.com/s2/favicons?domain=https://www.gays.com) [Gays (https://www.gays.com)](https://www.gays.com)*: top 10M, in*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://transit-club.com) [transit-club.com (http://transit-club.com)](http://transit-club.com)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://favera.ru) [Favera (https://favera.ru)](https://favera.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://favera.ru) [Favera (https://favera.ru)](https://favera.ru)*: top 10M, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://soylentnews.org) [soylentnews (https://soylentnews.org)](https://soylentnews.org)*: top 10M, us*
1. ![](https://www.google.com/s2/favicons?domain=http://chan4chan.com/) [Chan4chan (http://chan4chan.com/)](http://chan4chan.com/)*: top 10M, hu*
1. ![](https://www.google.com/s2/favicons?domain=http://the-mainboard.com/index.php) [the-mainboard.com (http://the-mainboard.com/index.php)](http://the-mainboard.com/index.php)*: top 10M, forum, us*
@@ -1185,7 +1208,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.pitomec.ru) [Pitomec (https://www.pitomec.ru)](https://www.pitomec.ru)*: top 10M, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=http://autokadabra.ru/) [Autokadabra (http://autokadabra.ru/)](http://autokadabra.ru/)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://movie-forum.co) [Movie-forum (https://movie-forum.co)](https://movie-forum.co)*: top 10M, forum, pk*
1. ![](https://www.google.com/s2/favicons?domain=http://peopleandcountries.com) [PeopleAndCountries (http://peopleandcountries.com)](http://peopleandcountries.com)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://peopleandcountries.com) [PeopleAndCountries (http://peopleandcountries.com)](http://peopleandcountries.com)*: top 10M, forum, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://33bru.com/) [33bru (http://33bru.com/)](http://33bru.com/)*: top 10M, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://astrogalaxy.ru) [Astrogalaxy (https://astrogalaxy.ru)](https://astrogalaxy.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://maccentre.ru) [Maccentre (https://maccentre.ru)](https://maccentre.ru)*: top 10M, ru*
@@ -1197,7 +1220,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://lab.pentestit.ru/) [labpentestit (https://lab.pentestit.ru/)](https://lab.pentestit.ru/)*: top 10M, hacking, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://dieselmastera.ru) [dieselmastera.ru (http://dieselmastera.ru)](http://dieselmastera.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.avtolyubiteli.com) [Avtolyubiteli (https://forum.avtolyubiteli.com)](https://forum.avtolyubiteli.com)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.2fast4u.be) [2fast4u (https://www.2fast4u.be)](https://www.2fast4u.be)*: top 10M, nl*
1. ![](https://www.google.com/s2/favicons?domain=https://www.2fast4u.be) [2fast4u (https://www.2fast4u.be)](https://www.2fast4u.be)*: top 10M, nl*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://www.livetrack24.com) [LiveTrack24 (https://www.livetrack24.com)](https://www.livetrack24.com)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://chemistlab.ru) [Chemistlab (http://chemistlab.ru)](http://chemistlab.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://upbyte.net) [upbyte.net (http://upbyte.net)](http://upbyte.net)*: top 10M, ru*
@@ -1211,9 +1234,10 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://devtribe.ru) [Devtribe (https://devtribe.ru)](https://devtribe.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forest.ru/) [Forest (https://forest.ru/)](https://forest.ru/)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://shotbow.net) [Shotbow (https://shotbow.net)](https://shotbow.net)*: top 10M, ca, forum, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://101010.pl/) [101010.pl (https://101010.pl/)](https://101010.pl/)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=https://otechie.com) [Otechie (https://otechie.com)](https://otechie.com)*: top 10M, finance, us*
1. ![](https://www.google.com/s2/favicons?domain=http://www.volgogradru.com) [Volgogradru (http://www.volgogradru.com)](http://www.volgogradru.com)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://pilguy.com) [Pilguy (https://pilguy.com)](https://pilguy.com)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://pilguy.com) [Pilguy (https://pilguy.com)](https://pilguy.com)*: top 10M, forum, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://fullhub.ru/) [Fullhub (https://fullhub.ru/)](https://fullhub.ru/)*: top 10M, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://forum-b.ru) [forum-b.ru (https://forum-b.ru)](https://forum-b.ru)*: top 10M, forum, freelance, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://honda.org.ua) [Honda (https://honda.org.ua)](https://honda.org.ua)*: top 10M, ru, ua*
@@ -1272,7 +1296,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://uaodessa.com) [uaodessa.com (http://uaodessa.com)](http://uaodessa.com)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://www.oilcareer.ru) [Oilcareer (http://www.oilcareer.ru)](http://www.oilcareer.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://dr-denisov.ru) [dr-denisov.ru (http://dr-denisov.ru)](http://dr-denisov.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://fifasoccer.ru) [Fifasoccer (http://fifasoccer.ru)](http://fifasoccer.ru)*: top 10M, forum, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=http://fifasoccer.ru) [Fifasoccer (http://fifasoccer.ru)](http://fifasoccer.ru)*: top 10M, forum, ru, ua*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://forum.biohack.me) [biohack (https://forum.biohack.me)](https://forum.biohack.me)*: top 10M, forum*
1. ![](https://www.google.com/s2/favicons?domain=http://free-pass.ru) [free-pass.ru (http://free-pass.ru)](http://free-pass.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://forum.md/ru/) [md (https://forum.md/ru/)](https://forum.md/ru/)*: top 10M, forum, md, ru*
@@ -1280,6 +1304,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://markweinguitarlessons.com/forums/) [markweinguitarlessons.com (http://markweinguitarlessons.com/forums/)](http://markweinguitarlessons.com/forums/)*: top 10M, forum, hobby*
1. ![](https://www.google.com/s2/favicons?domain=https://bgforum.ru) [Bgforum (https://bgforum.ru)](https://bgforum.ru)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://samp-sektor.ru) [samp-sektor.ru (http://samp-sektor.ru)](http://samp-sektor.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=https://coder.social) [coder.social (https://coder.social)](https://coder.social)*: top 10M, coding*
1. ![](https://www.google.com/s2/favicons?domain=https://kuban.forum24.ru/) [KubanForum24 (https://kuban.forum24.ru/)](https://kuban.forum24.ru/)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://www.chevrolet-cruze-club.ru) [Chevrolet-cruze-club (http://www.chevrolet-cruze-club.ru)](http://www.chevrolet-cruze-club.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://avtoexamen.com) [avtoexamen.com (http://avtoexamen.com)](http://avtoexamen.com)*: top 10M*
@@ -1326,6 +1351,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://soslujivzi.ru) [soslujivzi.ru (http://soslujivzi.ru)](http://soslujivzi.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=https://www.interfaith.org) [Interfaith (https://www.interfaith.org)](https://www.interfaith.org)*: top 10M, forum*
1. ![](https://www.google.com/s2/favicons?domain=http://prizyvnikmoy.ru) [prizyvnikmoy.ru (http://prizyvnikmoy.ru)](http://prizyvnikmoy.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://en.worldis.me) [Worldis.me (http://en.worldis.me)](http://en.worldis.me)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://www.anapakurort.info) [Anapakurort (http://www.anapakurort.info)](http://www.anapakurort.info)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.mastera-forum.ru) [Mastera-forum (https://www.mastera-forum.ru)](https://www.mastera-forum.ru)*: top 10M, forum, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://old.rubezhnoe.com) [old.rubezhnoe.com (http://old.rubezhnoe.com)](http://old.rubezhnoe.com)*: top 10M, ua*
@@ -1355,7 +1381,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://brute.su) [Brute (https://brute.su)](https://brute.su)*: top 10M, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://p8ntballer-forums.com/) [p8ntballer-forums.com (http://p8ntballer-forums.com/)](http://p8ntballer-forums.com/)*: top 10M, forum*
1. ![](https://www.google.com/s2/favicons?domain=http://memory57.ucoz.ru) [memory57.ucoz.ru (http://memory57.ucoz.ru)](http://memory57.ucoz.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=https://plug.dj/) [Plug.DJ (https://plug.dj/)](https://plug.dj/)*: top 10M, fr, gb, kr, us*
1. ![](https://www.google.com/s2/favicons?domain=https://plug.dj/) [Plug.DJ (https://plug.dj/)](https://plug.dj/)*: top 10M, music*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://zapravdu.ru/) [Zapravdu (http://zapravdu.ru/)](http://zapravdu.ru/)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://ramta.0pk.ru) [Ramta (http://ramta.0pk.ru)](http://ramta.0pk.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://mediarepost.ru) [Mediarepost (https://mediarepost.ru)](https://mediarepost.ru)*: top 10M, ru*
@@ -1366,10 +1392,10 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://uaksu.forum24.ru/) [Uaksu (https://uaksu.forum24.ru/)](https://uaksu.forum24.ru/)*: top 10M, forum, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=http://0-3.ru) [0-3.RU (http://0-3.ru)](http://0-3.ru)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://www.forumsi.org) [Forumsi (http://www.forumsi.org)](http://www.forumsi.org)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.snooth.com/) [Snooth (https://www.snooth.com/)](https://www.snooth.com/)*: top 10M, in*
1. ![](https://www.google.com/s2/favicons?domain=https://www.snooth.com/) [Snooth (https://www.snooth.com/)](https://www.snooth.com/)*: top 10M, news*
1. ![](https://www.google.com/s2/favicons?domain=http://soft-deniz.ucoz.ru) [soft-deniz.ucoz.ru (http://soft-deniz.ucoz.ru)](http://soft-deniz.ucoz.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://oih.at.ua) [oih.at.ua (http://oih.at.ua)](http://oih.at.ua)*: top 10M, ua*
1. ![](https://www.google.com/s2/favicons?domain=http://gorodanapa.ru/) [Gorodanapa (http://gorodanapa.ru/)](http://gorodanapa.ru/)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://gorodanapa.ru/) [Gorodanapa (http://gorodanapa.ru/)](http://gorodanapa.ru/)*: top 10M, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://nsk66.ru) [nsk66.ru (http://nsk66.ru)](http://nsk66.ru)*: top 10M*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://stalker-zone.info) [Stalker-zone (http://stalker-zone.info)](http://stalker-zone.info)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://boxing.ru/) [Boxing (http://boxing.ru/)](http://boxing.ru/)*: top 10M, ru*
@@ -1390,6 +1416,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://www.billkiene.com) [Billkiene (https://www.billkiene.com)](https://www.billkiene.com)*: top 10M, forum, hobby*
1. ![](https://www.google.com/s2/favicons?domain=http://vento-club.com) [vento-club.com (http://vento-club.com)](http://vento-club.com)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://bce-tyt.ru) [bce-tyt.ru (http://bce-tyt.ru)](http://bce-tyt.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=https://tg.rip) [tg.rip (https://tg.rip)](https://tg.rip)*: top 10M, messaging*
1. ![](https://www.google.com/s2/favicons?domain=http://secret.kompas3d.su) [secret.kompas3d.su (http://secret.kompas3d.su)](http://secret.kompas3d.su)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://endoctor.ru) [endoctor.ru (http://endoctor.ru)](http://endoctor.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://night.kharkov.ua) [night.kharkov.ua (http://night.kharkov.ua)](http://night.kharkov.ua)*: top 10M*
@@ -1399,7 +1426,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://www.mactalk.com.au/) [Mactalk (http://www.mactalk.com.au/)](http://www.mactalk.com.au/)*: top 10M, au, in, pk*
1. ![](https://www.google.com/s2/favicons?domain=http://animal-hope.ru) [animal-hope.ru (http://animal-hope.ru)](http://animal-hope.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=https://sexforum.win) [Sexwin (https://sexforum.win)](https://sexforum.win)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://ttonlineviewer.com) [TikTok Online Viewer (https://ttonlineviewer.com)](https://ttonlineviewer.com)*: top 10M, us*
1. ![](https://www.google.com/s2/favicons?domain=https://ttonlineviewer.com) [TikTok Online Viewer (https://ttonlineviewer.com)](https://ttonlineviewer.com)*: top 10M, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://tavr-obrazovanie.ru) [tavr-obrazovanie.ru (http://tavr-obrazovanie.ru)](http://tavr-obrazovanie.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://studentur.com.ua) [studentur.com.ua (http://studentur.com.ua)](http://studentur.com.ua)*: top 10M, ua*
1. ![](https://www.google.com/s2/favicons?domain=https://offline.by) [Offline.by (https://offline.by)](https://offline.by)*: top 10M, forum, ru*
@@ -1407,7 +1434,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://diz-cs.ru) [diz-cs.ru (http://diz-cs.ru)](http://diz-cs.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=https://g-news.com.ua) [G-news (https://g-news.com.ua)](https://g-news.com.ua)*: top 10M, in, ua*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://igra-online.ucoz.com) [igra-online.ucoz.com (http://igra-online.ucoz.com)](http://igra-online.ucoz.com)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=https://joby.su) [Joby (https://joby.su)](https://joby.su)*: top 10M, freelance, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://joby.su) [Joby (https://joby.su)](https://joby.su)*: top 10M, freelance, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://forum.scuba-divers.ru/) [scuba (http://forum.scuba-divers.ru/)](http://forum.scuba-divers.ru/)*: top 10M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://boominfo.ru) [BoomInfo (https://boominfo.ru)](https://boominfo.ru)*: top 10M, ru, ua*
1. ![](https://www.google.com/s2/favicons?domain=http://chastysc.ucoz.ru) [chastysc.ucoz.ru (http://chastysc.ucoz.ru)](http://chastysc.ucoz.ru)*: top 10M, ru*
@@ -1417,7 +1444,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://rodobozhie.ru) [rodobozhie.ru (http://rodobozhie.ru)](http://rodobozhie.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://satwarez.ru) [satwarez.ru (http://satwarez.ru)](http://satwarez.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://nf-club.ru) [nf-club.ru (http://nf-club.ru)](http://nf-club.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://linuxmint.info) [linuxmint.info (http://linuxmint.info)](http://linuxmint.info)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://linuxmint.info) [linuxmint.info (http://linuxmint.info)](http://linuxmint.info)*: top 10M, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://kiabongo.info) [kiabongo.info (http://kiabongo.info)](http://kiabongo.info)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://koshtoris.at.ua) [koshtoris.at.ua (http://koshtoris.at.ua)](http://koshtoris.at.ua)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://xn--90anbhklk.xn--p1ai) [xn--90anbhklk.xn--p1ai (http://xn--90anbhklk.xn--p1ai)](http://xn--90anbhklk.xn--p1ai)*: top 10M*
@@ -1444,7 +1471,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://wolga24.at.ua) [wolga24.at.ua (http://wolga24.at.ua)](http://wolga24.at.ua)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://millerovo161.ru) [millerovo161.ru (http://millerovo161.ru)](http://millerovo161.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://videomuzon.ucoz.ru) [videomuzon.ucoz.ru (http://videomuzon.ucoz.ru)](http://videomuzon.ucoz.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=https://community.autolenta.ru) [Autolenta (https://community.autolenta.ru)](https://community.autolenta.ru)*: top 10M, auto, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://community.autolenta.ru) [Autolenta (https://community.autolenta.ru)](https://community.autolenta.ru)*: top 10M, auto, forum, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://amax-sb.ru) [amax-sb.ru (http://amax-sb.ru)](http://amax-sb.ru)*: top 10M*
1. ![](https://www.google.com/s2/favicons?domain=http://angelgothics.ru) [Angelgothics (http://angelgothics.ru)](http://angelgothics.ru)*: top 10M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://help-baby.org) [help-baby.org (http://help-baby.org)](http://help-baby.org)*: top 10M*
@@ -1522,23 +1549,52 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://74507.ucoz.ru) [74507.ucoz.ru (http://74507.ucoz.ru)](http://74507.ucoz.ru)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://apteka.ee) [AMUR (https://apteka.ee)](https://apteka.ee)*: top 100M, dating, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://alabay.forum24.ru) [Alabay (https://alabay.forum24.ru)](https://alabay.forum24.ru)*: top 100M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=) [Anilist ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://antipunk.com/) [Antipunk (https://antipunk.com/)](https://antipunk.com/)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=) [Arduino ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Artistsnclients ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=http://artpersona.org/) [Artpersona (http://artpersona.org/)](http://artpersona.org/)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=) [AvidCommunity ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://avtoforum.org) [Avtoforum (https://avtoforum.org)](https://avtoforum.org)*: top 100M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=) [Bandlab ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Bentbox ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Biggerpockets ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Bitwarden ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Blogi.pl ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Bugcrowd ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Caringbridge ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Castingcallclub ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Chomikuj.pl ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://3examplesite.ru) [CPlusPlus (https://3examplesite.ru)](https://3examplesite.ru)*: top 100M, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=) [Crowdin ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=http://www.casial.net) [Casial (http://www.casial.net)](http://www.casial.net)*: top 100M, de*
1. ![](https://www.google.com/s2/favicons?domain=https://www.casino-affiliate-forum.com) [Casino-affiliate-forum (https://www.casino-affiliate-forum.com)](https://www.casino-affiliate-forum.com)*: top 100M, de, forum*
1. ![](https://www.google.com/s2/favicons?domain=http://www.chess-russia.ru) [Chess-russia (http://www.chess-russia.ru)](http://www.chess-russia.ru)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://club-comedy.clan.su) [Club-comedy.clan.su (https://club-comedy.clan.su)](https://club-comedy.clan.su)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://www.cssomsk.ru) [Cssomsk (http://www.cssomsk.ru)](http://www.cssomsk.ru)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=) [Cults3d ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://cyberclock.cc) [Cyberclock (https://cyberclock.cc)](https://cyberclock.cc)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://www.cydak.ru) [Cydak (http://www.cydak.ru)](http://www.cydak.ru)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=) [Cytoid.io ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Demotywatory ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Dojoverse ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://www.designspiration.net/) [Designspiration (https://www.designspiration.net/)](https://www.designspiration.net/)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://dinsk.su) [Dinsk (https://dinsk.su)](https://dinsk.su)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://dinsk.su) [Dinsk (https://dinsk.su)](https://dinsk.su)*: top 100M, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://forum.djangoproject.co) [Djangoproject.co (https://forum.djangoproject.co)](https://forum.djangoproject.co)*: top 100M, coding, forum*
1. ![](https://www.google.com/s2/favicons?domain=https://www.dublikat.shop) [Dublikat (https://www.dublikat.shop)](https://www.dublikat.shop)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://eightbit.me/) [Eightbit (http://eightbit.me/)](http://eightbit.me/)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://enot-poloskun.ru/) [Enot-poloskun (https://enot-poloskun.ru/)](https://enot-poloskun.ru/)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=) [Fabswingers ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Faktopedia ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Fancentro ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Fansly ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Fedi.lewactwo.pl ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Forumprawne.org ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Fosstodon ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Fotka ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Friendfinder ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Friendfinder-x ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Furaffinity ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=http://www.fegatch.com/) [Fegatch (http://www.fegatch.com/)](http://www.fegatch.com/)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.filmo.gs/) [Filmogs (https://www.filmo.gs/)](https://www.filmo.gs/)*: top 100M, movies*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://forum.jambox.ru) [Forum.jambox.ru (https://forum.jambox.ru)](https://forum.jambox.ru)*: top 100M, forum, ru*
@@ -1549,19 +1605,31 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://gam1ng.com.br) [Gam1ng (https://gam1ng.com.br)](https://gam1ng.com.br)*: top 100M, br, webcam*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://www.garagepunk.com) [GaragePunk (https://www.garagepunk.com)](https://www.garagepunk.com)*: top 100M, us*
1. ![](https://www.google.com/s2/favicons?domain=http://www.gliger.ru) [Gliger (http://www.gliger.ru)](http://www.gliger.ru)*: top 100M, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=) [Gnome-vcs ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://forums.golf-monthly.co.uk/) [GolfMonthly (https://forums.golf-monthly.co.uk/)](https://forums.golf-monthly.co.uk/)*: top 100M, forum, gb, us*
1. ![](https://www.google.com/s2/favicons?domain=http://gothic.su) [Gothic (http://gothic.su)](http://gothic.su)*: top 100M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=) [Gradle ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://www.gunandgame.co) [Gunandgame (https://www.gunandgame.co)](https://www.gunandgame.co)*: top 100M, us*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=https://hackeralexaRank.com/) [HackeralexaRank (https://hackeralexaRank.com/)](https://hackeralexaRank.com/)*: top 100M*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=) [Hackerrank ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Hexrpg ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Inkbunny ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Ipolska.pl ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://www.ingunowners.com) [Ingunowners (https://www.ingunowners.com)](https://www.ingunowners.com)*: top 100M, forum, us*
1. ![](https://www.google.com/s2/favicons?domain=) [Jbzd ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Jeja.pl ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Jellyfin Weblate ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=http://jer.forum24.ru) [Jer.forum24.ru (http://jer.forum24.ru)](http://jer.forum24.ru)*: top 100M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=) [Joemonster ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Karab.in ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=) [Kotburger ()]()*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://lib.reviews) [LibReviews (https://lib.reviews)](https://lib.reviews)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://www.liebe69.de) [Liebe69 (https://www.liebe69.de)](https://www.liebe69.de)*: top 100M, de*
1. ![](https://www.google.com/s2/favicons?domain=https://lovemakeup.ru) [Lovemakeup (https://lovemakeup.ru)](https://lovemakeup.ru)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://macqa.ru) [Macqa (https://macqa.ru)](https://macqa.ru)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://magiimir.com) [Magiimir (https://magiimir.com)](https://magiimir.com)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://mamochki.by/) [Mamochki (https://mamochki.by/)](https://mamochki.by/)*: top 100M, by, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://mastersofcrypto.com) [Mastersofcrypto (https://mastersofcrypto.com)](https://mastersofcrypto.com)*: top 100M, forum*
1. ![](https://www.google.com/s2/favicons?domain=https://mastersofcrypto.com) [Mastersofcrypto (https://mastersofcrypto.com)](https://mastersofcrypto.com)*: top 100M, forum*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http:/mixlr.com/) [Mixlr (http:/mixlr.com/)](http:/mixlr.com/)*: top 100M, gb*
1. ![](https://www.google.com/s2/favicons?domain=https://www.munzee.com/) [Munzee (https://www.munzee.com/)](https://www.munzee.com/)*: top 100M, gb*
1. ![](https://www.google.com/s2/favicons?domain=http://murmansk-life.ru) [MurmanskLife (http://murmansk-life.ru)](http://murmansk-life.ru)*: top 100M, ru*
@@ -1624,7 +1692,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://fobia.at.ua) [fobia.at.ua (http://fobia.at.ua)](http://fobia.at.ua)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=http://forex-trader.do.am) [forex-trader.do.am (http://forex-trader.do.am)](http://forex-trader.do.am)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=http://forum-ssc.ucoz.ru) [forum-ssc.ucoz.ru (http://forum-ssc.ucoz.ru)](http://forum-ssc.ucoz.ru)*: top 100M, forum*
1. ![](https://www.google.com/s2/favicons?domain=http://forum.garminych.ru/) [garminych (http://forum.garminych.ru/)](http://forum.garminych.ru/)*: top 100M, forum, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://forum.garminych.ru/) [garminych (http://forum.garminych.ru/)](http://forum.garminych.ru/)*: top 100M, forum, ru*, search is disabled
1. ![](https://www.google.com/s2/favicons?domain=http://gebirgs.ucoz.ru) [gebirgs.ucoz.ru (http://gebirgs.ucoz.ru)](http://gebirgs.ucoz.ru)*: top 100M, forum, hobby, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://hackings.ru) [hackings.ru (http://hackings.ru)](http://hackings.ru)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=http://infopps.moy.su) [infopps.moy.su (http://infopps.moy.su)](http://infopps.moy.su)*: top 100M*
@@ -2258,8 +2326,8 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://freelance.ru) [freelance.ru (https://freelance.ru)](https://freelance.ru)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://freelansim.ru) [freelansim.ru (https://freelansim.ru)](https://freelansim.ru)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=http://fotolog.com) [fotolog.com (http://fotolog.com)](http://fotolog.com)*: top 100M, in*
1. ![](https://www.google.com/s2/favicons?domain=http://thoughts.com) [thoughts.com (http://thoughts.com)](http://thoughts.com)*: top 100M, in*
1. ![](https://www.google.com/s2/favicons?domain=https://hackernoon.com) [hackernoon.com (https://hackernoon.com)](https://hackernoon.com)*: top 100M, in, us*
1. ![](https://www.google.com/s2/favicons?domain=http://thoughts.com) [thoughts.com (http://thoughts.com)](http://thoughts.com)*: top 100M, blog*
1. ![](https://www.google.com/s2/favicons?domain=https://hackernoon.com) [hackernoon.com (https://hackernoon.com)](https://hackernoon.com)*: top 100M, news, us*
1. ![](https://www.google.com/s2/favicons?domain=https://intigriti.com) [Intigriti (https://intigriti.com)](https://intigriti.com)*: top 100M, hacking, in*
1. ![](https://www.google.com/s2/favicons?domain=https://yamaya.ru) [yamaya.ru (https://yamaya.ru)](https://yamaya.ru)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=https://www.tinkoff.ru/invest/) [Tinkoff Invest (https://www.tinkoff.ru/invest/)](https://www.tinkoff.ru/invest/)*: top 100M, ru*
@@ -2288,7 +2356,7 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://mednolit.ru) [mednolit.ru (http://mednolit.ru)](http://mednolit.ru)*: top 100M, ru*
1. ![](https://www.google.com/s2/favicons?domain=http://mikele-loconte.ru) [mikele-loconte.ru (http://mikele-loconte.ru)](http://mikele-loconte.ru)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=http://mkuniverse.ru) [mkuniverse.ru (http://mkuniverse.ru)](http://mkuniverse.ru)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://hashnode.com) [hashnode.com (https://hashnode.com)](https://hashnode.com)*: top 100M, in*
1. ![](https://www.google.com/s2/favicons?domain=https://hashnode.com) [hashnode (https://hashnode.com)](https://hashnode.com)*: top 100M, in*
1. ![](https://www.google.com/s2/favicons?domain=https://www.change.org) [www.change.org (https://www.change.org)](https://www.change.org)*: top 100M, us*
1. ![](https://www.google.com/s2/favicons?domain=https://www.ifunny.co) [www.ifunny.co (https://www.ifunny.co)](https://www.ifunny.co)*: top 100M, us*
1. ![](https://www.google.com/s2/favicons?domain=https://localcryptosapi.com) [LocalCryptos (https://localcryptosapi.com)](https://localcryptosapi.com)*: top 100M*
@@ -2531,6 +2599,12 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=http://weebly.com) [Weebly (http://weebly.com)](http://weebly.com)*: top 100M, business*
1. ![](https://www.google.com/s2/favicons?domain=http://answerszuvs3gg2l64e6hmnryudl5zgrmwm3vh65hzszdghblddvfiqd.onion) [HiddenAnswers (http://answerszuvs3gg2l64e6hmnryudl5zgrmwm3vh65hzszdghblddvfiqd.onion)](http://answerszuvs3gg2l64e6hmnryudl5zgrmwm3vh65hzszdghblddvfiqd.onion)*: top 100M, tor*
1. ![](https://www.google.com/s2/favicons?domain={username}.com) [.com ({username}.com)]({username}.com)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain={username}.pro) [.pro ({username}.pro)]({username}.pro)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain={username}.me) [.me ({username}.me)]({username}.me)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain={username}.biz) [.biz ({username}.biz)]({username}.biz)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain={username}.email) [.email ({username}.email)]({username}.email)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain={username}.guru) [.guru ({username}.guru)]({username}.guru)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain={username}.ddns.net) [.ddns.net ({username}.ddns.net)]({username}.ddns.net)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://galactictalk.org) [galactictalk.org (https://galactictalk.org)](https://galactictalk.org)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://discuss.bootstrapped.fm) [discuss.bootstrapped.fm (https://discuss.bootstrapped.fm)](https://discuss.bootstrapped.fm)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://discourse.mozilla.org) [discourse.mozilla.org (https://discourse.mozilla.org)](https://discourse.mozilla.org)*: top 100M*
@@ -2563,5 +2637,58 @@ Rank data fetched from Alexa by domains.
1. ![](https://www.google.com/s2/favicons?domain=https://rec.poker) [rec.poker (https://rec.poker)](https://rec.poker)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://uforum.uz) [uforum.uz (https://uforum.uz)](https://uforum.uz)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=http://dntrustmucd4mwec.onion) [DarkNet Trust (http://dntrustmucd4mwec.onion)](http://dntrustmucd4mwec.onion)*: top 100M, tor*
1. ![](https://www.google.com/s2/favicons?domain=http://i2pforum.i2p) [i2pforum (http://i2pforum.i2p)](http://i2pforum.i2p)*: top 100M, i2p*
1. ![](https://www.google.com/s2/favicons?domain=https://partnerkin.com) [partnerkin.com (https://partnerkin.com)](https://partnerkin.com)*: top 100M, finance*
1. ![](https://www.google.com/s2/favicons?domain=https://www.hozpitality.com) [hozpitality (https://www.hozpitality.com)](https://www.hozpitality.com)*: top 100M*
1. ![](https://www.google.com/s2/favicons?domain=https://kazanlashkigalab.com) [kazanlashkigalab.com (https://kazanlashkigalab.com)](https://kazanlashkigalab.com)*: top 100M, kz*
Alexa.com rank data fetched at (2021-05-31 21:26:56.886650 UTC)
The list was updated at (2022-03-07 16:44:18.939455 UTC)
## Statistics
Enabled/total sites: 2483/2638 = 94.12%
Incomplete checks: 523/1892 = 27.64% (false positive risks)
Top 20 profile URLs:
- (796) `{urlMain}/index/8-0-{username} (uCoz)`
- (229) `/{username}`
- (221) `{urlMain}{urlSubpath}/members/?username={username} (XenForo)`
- (144) `/user/{username}`
- (134) `{urlMain}{urlSubpath}/member.php?username={username} (vBulletin)`
- (101) `/profile/{username}`
- (87) `{urlMain}/u/{username}/summary (Discourse)`
- (75) `/users/{username}`
- (44) `{urlMain}{urlSubpath}/search.php?author={username} (phpBB/Search)`
- (41) `/members/?username={username}`
- (40) `/@{username}`
- (39) `SUBDOMAIN`
- (30) `/u/{username}`
- (27) `/members/{username}`
- (27) `{urlMain}{urlSubpath}/memberlist.php?username={username} (phpBB)`
- (18) `/forum/members/?username={username}`
- (18) `/forum/search.php?keywords=&terms=all&author={username}`
- (17) `/search.php?keywords=&terms=all&author={username}`
- (16) `/author/{username}`
- (14) `/people/{username}`
Top 20 tags:
- (271) `forum`
- (83) `NO_TAGS` (non-standard)
- (50) `gaming`
- (24) `photo`
- (24) `coding`
- (18) `news`
- (18) `blog`
- (18) `music`
- (15) `tech`
- (13) `freelance`
- (12) `sharing`
- (12) `finance`
- (11) `shopping`
- (10) `dating`
- (10) `art`
- (9) `hobby`
- (9) `movies`
- (7) `sport`
- (7) `hacking`
- (5) `stock`
+30
View File
@@ -0,0 +1,30 @@
name: maigret2
version: git
summary: SOCMINT / Instagram
description: |
Test Test Test
base: core18
confinement: strict
parts:
maigret2:
plugin: python
python-version: python3
source: .
stage-packages:
- python-six
apps:
maigret2:
command: bin/maigret
architectures:
- build-on: amd64
- build-on: i386
Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 607 KiB

After

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 773 KiB

After

Width:  |  Height:  |  Size: 351 KiB

+8 -6
View File
@@ -1,6 +1,8 @@
flake8==3.8.4
pytest==6.2.4
pytest-asyncio==0.14.0
pytest-cov==2.10.1
pytest-httpserver==1.0.0
pytest-rerunfailures==9.1.1
reportlab==3.6.6
flake8==4.0.1
pytest==7.0.1
pytest-asyncio==0.16.0;python_version<"3.7"
pytest-asyncio==0.18.2;python_version>="3.7"
pytest-cov==3.0.0
pytest-httpserver==1.0.4
pytest-rerunfailures==10.2
-4
View File
@@ -1,4 +0,0 @@
#!/bin/sh
coverage run --source=./maigret -m pytest tests
coverage report -m
coverage html
+5 -1
View File
@@ -7,10 +7,12 @@ from _pytest.mark import Mark
from maigret.sites import MaigretDatabase
from maigret.maigret import setup_arguments_parser
from maigret.settings import Settings
CUR_PATH = os.path.dirname(os.path.realpath(__file__))
JSON_FILE = os.path.join(CUR_PATH, '../maigret/resources/data.json')
SETTINGS_FILE = os.path.join(CUR_PATH, '../maigret/resources/settings.json')
TEST_JSON_FILE = os.path.join(CUR_PATH, 'db.json')
LOCAL_TEST_JSON_FILE = os.path.join(CUR_PATH, 'local.json')
empty_mark = Mark('', (), {})
@@ -59,7 +61,9 @@ def reports_autoclean():
@pytest.fixture(scope='session')
def argparser():
return setup_arguments_parser()
settings = Settings()
settings.load([SETTINGS_FILE])
return setup_arguments_parser(settings)
@pytest.fixture(scope="session")
+2 -1
View File
@@ -7,12 +7,13 @@ DEFAULT_ARGS: Dict[str, Any] = {
'connections': 100,
'cookie_file': None,
'csv': False,
'db_file': None,
'db_file': 'resources/data.json',
'debug': False,
'disable_extracting': False,
'disable_recursive_search': False,
'folderoutput': 'reports',
'html': False,
'graph': False,
'id_type': 'username',
'ignore_ids_list': [],
'info': False,
+3 -2
View File
@@ -1,15 +1,16 @@
"""Maigret data test functions"""
from maigret.utils import is_country_tag
from maigret.sites import SUPPORTED_TAGS
def test_tags_validity(default_db):
unknown_tags = set()
tags = default_db._tags
for site in default_db.sites:
for tag in filter(lambda x: not is_country_tag(x), site.tags):
if tag not in SUPPORTED_TAGS:
if tag not in tags:
unknown_tags.add(tag)
assert unknown_tags == set()
+4 -1
View File
@@ -63,7 +63,10 @@ async def test_asyncio_progressbar_queue_executor():
assert executor.execution_time < 0.5
executor = AsyncioProgressbarQueueExecutor(logger=logger, in_parallel=5)
assert await executor.run(tasks) == [0, 3, 6, 1, 4, 7, 9, 2, 5, 8]
assert await executor.run(tasks) in (
[0, 3, 6, 1, 4, 7, 9, 2, 5, 8],
[0, 3, 6, 1, 4, 9, 7, 2, 5, 8],
)
assert executor.execution_time > 0.3
assert executor.execution_time < 0.4
+13 -14
View File
@@ -9,7 +9,6 @@ from maigret.maigret import self_check, maigret
from maigret.maigret import (
extract_ids_from_page,
extract_ids_from_results,
extract_ids_from_url,
)
from maigret.sites import MaigretSite
from maigret.result import QueryResult, QueryStatus
@@ -20,7 +19,7 @@ RESULTS_EXAMPLE = {
'cookies': None,
'parsing_enabled': False,
'url_main': 'https://www.reddit.com/',
'username': 'Facebook',
'username': 'Skyeng',
},
'GooglePlayStore': {
'cookies': None,
@@ -29,8 +28,8 @@ RESULTS_EXAMPLE = {
'parsing_enabled': False,
'rank': 1,
'url_main': 'https://play.google.com/store',
'url_user': 'https://play.google.com/store/apps/developer?id=Facebook',
'username': 'Facebook',
'url_user': 'https://play.google.com/store/apps/developer?id=Skyeng',
'username': 'Skyeng',
},
}
@@ -53,7 +52,7 @@ def test_self_check_db_positive_enable(test_db):
logger = Mock()
test_db.sites[0].disabled = True
test_db.sites[0].username_claimed = 'Facebook'
test_db.sites[0].username_claimed = 'Skyeng'
assert test_db.sites[0].disabled is True
loop = asyncio.get_event_loop()
@@ -84,7 +83,7 @@ def test_self_check_db_negative_enabled(test_db):
logger = Mock()
test_db.sites[0].disabled = False
test_db.sites[0].username_claimed = 'Facebook'
test_db.sites[0].username_claimed = 'Skyeng'
assert test_db.sites[0].disabled is False
loop = asyncio.get_event_loop()
@@ -99,7 +98,7 @@ def test_self_check_db_negative_enabled(test_db):
def test_maigret_results(test_db):
logger = Mock()
username = 'Facebook'
username = 'Skyeng'
loop = asyncio.get_event_loop()
results = loop.run_until_complete(
maigret(username, site_dict=test_db.sites_dict, logger=logger, timeout=30)
@@ -144,18 +143,18 @@ def test_maigret_results(test_db):
def test_extract_ids_from_url(default_db):
assert extract_ids_from_url('https://www.reddit.com/user/test', default_db) == {
assert default_db.extract_ids_from_url('https://www.reddit.com/user/test') == {
'test': 'username'
}
assert extract_ids_from_url('https://vk.com/id123', default_db) == {'123': 'vk_id'}
assert extract_ids_from_url('https://vk.com/ida123', default_db) == {
assert default_db.extract_ids_from_url('https://vk.com/id123') == {'123': 'vk_id'}
assert default_db.extract_ids_from_url('https://vk.com/ida123') == {
'ida123': 'username'
}
assert extract_ids_from_url(
'https://my.mail.ru/yandex.ru/dipres8904/', default_db
assert default_db.extract_ids_from_url(
'https://my.mail.ru/yandex.ru/dipres8904/'
) == {'dipres8904': 'username'}
assert extract_ids_from_url(
'https://reviews.yandex.ru/user/adbced123', default_db
assert default_db.extract_ids_from_url(
'https://reviews.yandex.ru/user/adbced123'
) == {'adbced123': 'yandex_public_id'}
+24 -1
View File
@@ -115,7 +115,7 @@ def test_site_url_detector():
assert (
db.sites[0].url_regexp.pattern
== r'^https?://(www.)?forum\.amperka\.ru/members/\?username=(.+?)$'
== r'^https?://(www.|m.)?forum\.amperka\.ru/members/\?username=(.+?)$'
)
assert (
db.sites[0].detect_username('http://forum.amperka.ru/members/?username=test')
@@ -179,3 +179,26 @@ def test_ranked_sites_dict_id_type():
assert len(db.ranked_sites_dict()) == 2
assert len(db.ranked_sites_dict(id_type='username')) == 2
assert len(db.ranked_sites_dict(id_type='gaia_id')) == 1
def test_get_url_template():
site = MaigretSite(
"test",
{
"urlMain": "https://ya.ru/",
"url": "{urlMain}{urlSubpath}/members/?username={username}",
},
)
assert (
site.get_url_template()
== "{urlMain}{urlSubpath}/members/?username={username} (no engine)"
)
site = MaigretSite(
"test",
{
"urlMain": "https://ya.ru/",
"url": "https://{username}.ya.ru",
},
)
assert site.get_url_template() == "SUBDOMAIN"
+22 -15
View File
@@ -8,6 +8,7 @@ from maigret.utils import (
enrich_link_str,
URLMatcher,
get_dict_ascii_tree,
get_match_ratio,
)
@@ -72,7 +73,7 @@ def test_url_extract_main_part():
['/', ''],
]
url_regexp = re.compile('^https?://(www.)?flickr.com/photos/(.+?)$')
url_regexp = re.compile(r'^https?://(www\.)?flickr.com/photos/(.+?)$')
# combine parts variations
for url_parts in itertools.product(*parts):
url = ''.join(url_parts)
@@ -97,7 +98,7 @@ def test_url_make_profile_url_regexp():
# ensure all combinations match pattern
assert (
URLMatcher.make_profile_url_regexp(url).pattern
== r'^https?://(www.)?flickr\.com/photos/(.+?)$'
== r'^https?://(www.|m.)?flickr\.com/photos/(.+?)$'
)
@@ -122,17 +123,23 @@ def test_get_dict_ascii_tree():
assert (
ascii_tree
== """
uid: dXJpOm5vZGU6VXNlcjoyNjQwMzQxNQ==
legacy_id: 26403415
username: alexaimephotographycars
name: Alex Aimé
links:
www.instagram.com/street.reality.photography/
created_at: 2018-05-04T10:17:01.000+0000
image: https://drscdn.500px.org/user_avatar/26403415/q%3D85_w%3D300_h%3D300/v2?webp=true&v=2&sig=0235678a4f7b65e007e864033ebfaf5ef6d87fad34f80a8639d985320c20fe3b
image_bg: https://drscdn.500px.org/user_cover/26403415/q%3D65_m%3D2048/v2?webp=true&v=1&sig=bea411fb158391a4fdad498874ff17088f91257e59dfb376ff67e3a44c3a4201
website: www.instagram.com/street.reality.photography/
facebook_link: www.instagram.com/street.reality.photography/
instagram_username: Street.Reality.Photography
twitter_username: Alexaimephotogr"""
uid: dXJpOm5vZGU6VXNlcjoyNjQwMzQxNQ==
legacy_id: 26403415
username: alexaimephotographycars
name: Alex Aimé
links:
www.instagram.com/street.reality.photography/
created_at: 2018-05-04T10:17:01.000+0000
image: https://drscdn.500px.org/user_avatar/26403415/q%3D85_w%3D300_h%3D300/v2?webp=true&v=2&sig=0235678a4f7b65e007e864033ebfaf5ef6d87fad34f80a8639d985320c20fe3b
image_bg: https://drscdn.500px.org/user_cover/26403415/q%3D65_m%3D2048/v2?webp=true&v=1&sig=bea411fb158391a4fdad498874ff17088f91257e59dfb376ff67e3a44c3a4201
website: www.instagram.com/street.reality.photography/
facebook_link: www.instagram.com/street.reality.photography/
instagram_username: Street.Reality.Photography
twitter_username: Alexaimephotogr"""
)
def test_get_match_ratio():
fun = get_match_ratio(["test", "maigret", "username"])
assert fun("test") == 1
View File
+152
View File
@@ -0,0 +1,152 @@
#!/usr/bin/env python3
"""Maigret: Supported Site Listing with Alexa ranking and country tags
This module generates the listing of supported sites in file `SITES.md`
and pretty prints file with sites data.
"""
import aiohttp
import asyncio
import json
import sys
import requests
import logging
import threading
import xml.etree.ElementTree as ET
from datetime import datetime
from argparse import ArgumentParser, RawDescriptionHelpFormatter
import tqdm.asyncio
from maigret.maigret import get_response, site_self_check
from maigret.sites import MaigretSite, MaigretDatabase, MaigretEngine
from maigret.utils import CaseConverter
async def check_engine_of_site(site_name, sites_with_engines, future, engine_name, semaphore, logger):
async with semaphore:
response = await get_response(request_future=future,
site_name=site_name,
logger=logger)
html_text, status_code, error_text, expection_text = response
if html_text and engine_name in html_text:
sites_with_engines.append(site_name)
return True
return False
if __name__ == '__main__':
parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter
)
parser.add_argument("--base","-b", metavar="BASE_FILE",
dest="base_file", default="maigret/resources/data.json",
help="JSON file with sites data to update.")
parser.add_argument('--engine', '-e', help='check only selected engine', type=str)
args = parser.parse_args()
log_level = logging.INFO
logging.basicConfig(
format='[%(filename)s:%(lineno)d] %(levelname)-3s %(asctime)s %(message)s',
datefmt='%H:%M:%S',
level=log_level
)
logger = logging.getLogger('engines-check')
logger.setLevel(log_level)
db = MaigretDatabase()
sites_subset = db.load_from_file(args.base_file).sites
sites = {site.name: site for site in sites_subset}
with open(args.base_file, "r", encoding="utf-8") as data_file:
sites_info = json.load(data_file)
engines = sites_info['engines']
for engine_name, engine_data in engines.items():
if args.engine and args.engine != engine_name:
continue
if not 'presenseStrs' in engine_data:
print(f'No features to automatically detect sites on engine {engine_name}')
continue
engine_obj = MaigretEngine(engine_name, engine_data)
# setup connections for checking both engine and usernames
connector = aiohttp.TCPConnector(ssl=False)
connector.verify_ssl=False
session = aiohttp.ClientSession(connector=connector)
sem = asyncio.Semaphore(100)
loop = asyncio.get_event_loop()
tasks = []
# check sites without engine if they look like sites on this engine
new_engine_sites = []
for site_name, site_data in sites.items():
if site_data.engine:
continue
future = session.get(url=site_data.url_main,
allow_redirects=True,
timeout=10,
)
check_engine_coro = check_engine_of_site(site_name, new_engine_sites, future, engine_name, sem, logger)
future = asyncio.ensure_future(check_engine_coro)
tasks.append(future)
# progress bar
for f in tqdm.asyncio.tqdm.as_completed(tasks):
loop.run_until_complete(f)
print(f'Total detected {len(new_engine_sites)} sites on engine {engine_name}')
# dict with new found engine sites
new_sites = {site_name: sites[site_name] for site_name in new_engine_sites}
# update sites obj from engine
for site_name, site in new_sites.items():
site.request_future = None
site.engine = engine_name
site.update_from_engine(engine_obj)
async def update_site_data(site_name, site_data, all_sites, logger, no_progressbar):
updates = await site_self_check(site_name, site_data, logger, no_progressbar)
all_sites[site_name].update(updates)
tasks = []
# for new_site_name, new_site_data in new_sites.items():
# coro = update_site_data(new_site_name, new_site_data, new_sites, logger)
# future = asyncio.ensure_future(coro)
# tasks.append(future)
# asyncio.gather(*tasks)
for new_site_name, new_site_data in new_sites.items():
coro = update_site_data(new_site_name, new_site_data, new_sites, logger, no_progressbar=True)
loop.run_until_complete(coro)
updated_sites_count = 0
for s in new_sites:
site = new_sites[s]
site.request_future = None
if site.disabled:
print(f'{site.name} failed username checking of engine {engine_name}')
continue
site = site.strip_engine_data()
db.update_site(site)
updated_sites_count += 1
db.save_to_file(args.base_file)
print(f'Site "{s}": ' + json.dumps(site.json, indent=4))
print(f'Updated total {updated_sites_count} sites!')
print(f'Checking all sites on engine {engine_name}')
loop.run_until_complete(session.close())
print("\nFinished updating supported site listing!")
+280
View File
@@ -0,0 +1,280 @@
#!/usr/bin/env python3
import json
import random
import re
import tqdm.asyncio
from mock import Mock
import requests
from maigret.maigret import *
from maigret.result import QueryStatus
from maigret.sites import MaigretSite
URL_RE = re.compile(r"https?://(www\.)?")
TIMEOUT = 200
async def maigret_check(site, site_data, username, status, logger):
query_notify = Mock()
logger.debug(f'Checking {site}...')
for username, status in [(username, status)]:
results = await maigret(
username,
{site: site_data},
logger,
query_notify,
timeout=TIMEOUT,
forced=True,
no_progressbar=True,
)
if results[site]['status'].status != status:
if results[site]['status'].status == QueryStatus.UNKNOWN:
msg = site_data.absence_strs
etype = site_data.check_type
context = results[site]['status'].context
logger.debug(f'Error while searching {username} in {site}, must be claimed. Context: {context}')
# if site_data.get('errors'):
# continue
return False
if status == QueryStatus.CLAIMED:
logger.debug(f'Not found {username} in {site}, must be claimed')
logger.debug(results[site])
pass
else:
logger.debug(f'Found {username} in {site}, must be available')
logger.debug(results[site])
pass
return False
return site_data
async def check_and_add_maigret_site(site_data, semaphore, logger, ok_usernames, bad_usernames):
async with semaphore:
sitename = site_data.name
positive = False
negative = False
for ok_username in ok_usernames:
site_data.username_claimed = ok_username
status = QueryStatus.CLAIMED
if await maigret_check(sitename, site_data, ok_username, status, logger):
# print(f'{sitename} positive case is okay')
positive = True
break
for bad_username in bad_usernames:
site_data.username_unclaimed = bad_username
status = QueryStatus.AVAILABLE
if await maigret_check(sitename, site_data, bad_username, status, logger):
# print(f'{sitename} negative case is okay')
negative = True
break
if positive and negative:
site_data = site_data.strip_engine_data()
db.update_site(site_data)
print(site_data.json)
try:
db.save_to_file(args.base_file)
except Exception as e:
logging.error(e, exc_info=True)
print(f'Saved new site {sitename}...')
ok_sites.append(site_data)
if __name__ == '__main__':
parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter
)
parser.add_argument("--base", "-b", metavar="BASE_FILE",
dest="base_file", default="maigret/resources/data.json",
help="JSON file with sites data to update.")
parser.add_argument("--add-engine", dest="add_engine", help="Additional engine to check")
parser.add_argument("--only-engine", dest="only_engine", help="Use only this engine from detected to check")
parser.add_argument('--check', help='only check sites in database', action='store_true')
parser.add_argument('--random', help='shuffle list of urls', action='store_true', default=False)
parser.add_argument('--top', help='top count of records in file', type=int, default=10000)
parser.add_argument('--filter', help='substring to filter input urls', type=str, default='')
parser.add_argument('--username', help='preferable username to check with', type=str)
parser.add_argument(
"--info",
"-vv",
action="store_true",
dest="info",
default=False,
help="Display service information.",
)
parser.add_argument(
"--verbose",
"-v",
action="store_true",
dest="verbose",
default=False,
help="Display extra information and metrics.",
)
parser.add_argument(
"-d",
"--debug",
"-vvv",
action="store_true",
dest="debug",
default=False,
help="Saving debugging information and sites responses in debug.txt.",
)
parser.add_argument("urls_file",
metavar='URLS_FILE',
action="store",
help="File with base site URLs"
)
args = parser.parse_args()
log_level = logging.ERROR
if args.debug:
log_level = logging.DEBUG
elif args.info:
log_level = logging.INFO
elif args.verbose:
log_level = logging.WARNING
logging.basicConfig(
format='[%(filename)s:%(lineno)d] %(levelname)-3s %(asctime)s %(message)s',
datefmt='%H:%M:%S',
level=log_level
)
logger = logging.getLogger('engines-check')
logger.setLevel(log_level)
db = MaigretDatabase()
sites_subset = db.load_from_file(args.base_file).sites
sites = {site.name: site for site in sites_subset}
engines = db.engines
# TODO: usernames extractors
ok_usernames = ['alex', 'god', 'admin', 'red', 'blue', 'john']
if args.username:
ok_usernames = [args.username] + ok_usernames
bad_usernames = ['noonewouldeverusethis7']
with open(args.urls_file, 'r') as urls_file:
urls = urls_file.read().splitlines()
if args.random:
random.shuffle(urls)
urls = urls[:args.top]
raw_maigret_data = json.dumps({site.name: site.json for site in sites_subset})
new_sites = []
for site in tqdm.asyncio.tqdm(urls):
site_lowercase = site.lower()
domain_raw = URL_RE.sub('', site_lowercase).strip().strip('/')
domain_raw = domain_raw.split('/')[0]
if args.filter and args.filter not in domain_raw:
logger.debug('Site %s skipped due to filtering by "%s"', domain_raw, args.filter)
continue
if domain_raw in raw_maigret_data:
logger.debug(f'Site {domain_raw} already exists in the Maigret database!')
continue
if '"' in domain_raw:
logger.debug(f'Invalid site {domain_raw}')
continue
main_page_url = '/'.join(site.split('/', 3)[:3])
site_data = {
'url': site,
'urlMain': main_page_url,
'name': domain_raw,
}
try:
r = requests.get(main_page_url, timeout=5)
except:
r = None
pass
detected_engines = []
for e in engines:
strs_to_check = e.__dict__.get('presenseStrs')
if strs_to_check and r and r.text:
all_strs_in_response = True
for s in strs_to_check:
if not s in r.text:
all_strs_in_response = False
if all_strs_in_response:
engine_name = e.__dict__.get('name')
detected_engines.append(engine_name)
logger.info(f'Detected engine {engine_name} for site {main_page_url}')
if args.only_engine and args.only_engine in detected_engines:
detected_engines = [args.only_engine]
elif not detected_engines and args.add_engine:
logging.debug('Could not detect any engine, applying default engine %s...', args.add_engine)
detected_engines = [args.add_engine]
def create_site_from_engine(sitename, data, e):
site = MaigretSite(sitename, data)
site.update_from_engine(db.engines_dict[e])
site.engine = e
return site
for engine_name in detected_engines:
site = create_site_from_engine(domain_raw, site_data, engine_name)
new_sites.append(site)
logger.debug(site.json)
# if engine_name == "phpBB":
# site_data_with_subpath = dict(site_data)
# site_data_with_subpath["urlSubpath"] = "/forum"
# site = create_site_from_engine(domain_raw, site_data_with_subpath, engine_name)
# new_sites.append(site)
# except Exception as e:
# print(f'Error: {str(e)}')
# pass
print(f'Found {len(new_sites)}/{len(urls)} new sites')
if args.check:
for s in new_sites:
print(s.url_main)
sys.exit(0)
sem = asyncio.Semaphore(20)
loop = asyncio.get_event_loop()
ok_sites = []
tasks = []
for site in new_sites:
check_coro = check_and_add_maigret_site(site, sem, logger, ok_usernames, bad_usernames)
future = asyncio.ensure_future(check_coro)
tasks.append(future)
for f in tqdm.asyncio.tqdm.as_completed(tasks, timeout=TIMEOUT):
try:
loop.run_until_complete(f)
except asyncio.exceptions.TimeoutError:
pass
print(f'Found and saved {len(ok_sites)} sites!')
+36
View File
@@ -0,0 +1,36 @@
import sys
import difflib
import requests
a = requests.get(sys.argv[1]).text
b = requests.get(sys.argv[2]).text
tokens_a = set(a.split('"'))
tokens_b = set(b.split('"'))
a_minus_b = tokens_a.difference(tokens_b)
b_minus_a = tokens_b.difference(tokens_a)
print(a_minus_b)
print(b_minus_a)
print(len(a_minus_b))
print(len(b_minus_a))
desired_strings = ["username", "not found", "пользователь", "profile", "lastname", "firstname", "biography",
"birthday", "репутация", "информация", "e-mail"]
def get_match_ratio(x):
return round(max([
difflib.SequenceMatcher(a=x.lower(), b=y).ratio()
for y in desired_strings
]), 2)
RATIO = 0.6
print(sorted(a_minus_b, key=get_match_ratio, reverse=True)[:10])
print(sorted(b_minus_a, key=get_match_ratio, reverse=True)[:10])
+7 -3
View File
@@ -25,7 +25,7 @@ RANKS.update({
'100000000': '100M',
})
SEMAPHORE = threading.Semaphore(10)
SEMAPHORE = threading.Semaphore(20)
def get_rank(domain_to_query, site, print_errors=True):
with SEMAPHORE:
@@ -114,7 +114,7 @@ Rank data fetched from Alexa by domains.
sys.stdout.flush()
index = index + 1
sites_full_list = [(s, s.alexa_rank) for s in sites_subset]
sites_full_list = [(s, int(s.alexa_rank)) for s in sites_subset]
sites_full_list.sort(reverse=False, key=lambda x: x[1])
@@ -137,7 +137,11 @@ Rank data fetched from Alexa by domains.
site_file.write(f'1. {favicon} [{site}]({url_main})*: top {valid_rank}{tags}*{note}\n')
db.update_site(site)
site_file.write(f'\nAlexa.com rank data fetched at ({datetime.utcnow()} UTC)\n')
site_file.write(f'\nThe list was updated at ({datetime.utcnow()} UTC)\n')
db.save_to_file(args.base_file)
statistics_text = db.get_db_stats(is_markdown=True)
site_file.write('## Statistics\n\n')
site_file.write(statistics_text)
print("\nFinished updating supported site listing!")