├── .gitignore ├── LICENSE ├── README.md ├── core ├── __init__.py ├── auto_complete.py ├── banner.py ├── color.py ├── help.py ├── internet.py ├── update.py └── updates.py ├── data.json ├── install.sh ├── modules ├── __init__.py ├── module_image.py ├── module_instagram.py ├── module_ip.py ├── module_mac.py ├── module_metadata.py ├── module_passbreach.py ├── module_phone.py ├── module_portscan.py └── module_whois.py ├── osinted.py ├── sherlock ├── __init__.py ├── data_bad_site.json ├── sherlock │ ├── __init__.py │ ├── notify.py │ ├── resources │ │ └── data.json │ ├── result.py │ ├── sherlock.py │ └── sites.py └── site_list.py └── sites.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | __pychache__ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OSINTed 2 | an easy to-use Open Source Intelligence framework 3 | --- 4 | # why? 5 | to make it super easy and fun to hunt down those targets! 6 | --- 7 | ## Trust me, you'll love it :) 8 | -------------------------------------------------------------------------------- /core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpookySec/OSINTed/3cc6beb76ddddfbabb278df4dade47f802dcbcea/core/__init__.py -------------------------------------------------------------------------------- /core/auto_complete.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import readline 4 | import glob 5 | 6 | commands = ["phoneinfo", "sherlockupdate", 7 | "whois", "ipinfo", 8 | "nslookup", "imagesearch", 9 | "maclookup", "passwordcheck", 10 | "portscan", "sherlock", 11 | "metadata", "instainfo", 12 | "help", "clear", 13 | "exit", "banner", 14 | "update", "whoami"] 15 | 16 | 17 | def completer(text, state): 18 | """ 19 | complete commands from the list above 20 | """ 21 | options = [i for i in commands if i.startswith(text)] 22 | if state < len(options): 23 | return options[state] 24 | else: 25 | return None 26 | 27 | def pathCompleter(text,state): 28 | """ 29 | This is the tab completer for systems paths. 30 | """ 31 | if '~' in text: 32 | text = os.path.expanduser('~') 33 | if os.path.isdir(text): 34 | text += '/' 35 | return [x for x in glob.glob(text + '*')][state] 36 | 37 | readline.set_completer_delims('\t') 38 | readline.parse_and_bind("tab: complete") 39 | 40 | def PathComplete(): 41 | readline.set_completer(pathCompleter) 42 | 43 | def CommandComplete(): 44 | readline.set_completer(completer) 45 | 46 | def HistoryClear(): 47 | readline.clear_history() -------------------------------------------------------------------------------- /core/banner.py: -------------------------------------------------------------------------------- 1 | from core.color import red, white 2 | banner = red + """ 3 | ▒▒▒▒▓▓ 4 | ▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 5 | ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 6 | ▓▓▒▒▓▓▒▒▒▒ ▓▓▓▓▓▓▓▓▓▓ Made by: @spooky_sec 7 | ▓▓▓▓▒▒▒▒▓▓ ▓▓▓▓▒▒▓▓▓▓ Version: 1.0 8 | ▒▒▓▓▓▓▒▒▓▓▓ ▓▓▓▒▒▓▓▓▓▓▓ 9 | ▓▓▓▓▓▓▒▒▓▓ ▓▓▓▓▓▓▓▓▓▓▓ 10 | ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓ ███████╗██╗███╗ ██╗████████╗███████╗██████╗ 11 | ▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓ ██╔════╝██║████╗ ██║╚══██╔══╝██╔════╝██╔══██╗ 12 | ▓▓▓▓▒▒▓▓▓▓ ▓▓▓▒▒▒▒▓▓▓▓ ███████╗██║██╔██╗ ██║ ██║ █████╗ ██║ ██║ 13 | ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ╚════██║██║██║╚██╗██║ ██║ ██╔══╝ ██║ ██║ 14 | ▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ███████║██║██║ ╚████║ ██║ ███████╗██████╔╝ 15 | ▓▓▓▓▓▓ ╚══════╝╚═╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝╚═════╝ 16 | """ -------------------------------------------------------------------------------- /core/color.py: -------------------------------------------------------------------------------- 1 | white = '\033[97m' 2 | green = '\033[92m' 3 | red = '\033[91m' 4 | yellow = '\033[93m' 5 | end = '\033[0m' 6 | info = '\033[93m[!] \033[0m' 7 | que = '\033[94m[?] \033[0m' 8 | bad = '\033[91m[-] \033[0m' 9 | good = '\033[32m[+] \033[0m' 10 | run = '\033[97m[~] \033[0m' -------------------------------------------------------------------------------- /core/help.py: -------------------------------------------------------------------------------- 1 | from core.color import white, yellow, green 2 | HelpMenu = f"""{white} Misc: 3 | {yellow} help:{green} prints this menu... duh! 4 | {yellow} banner:{green} prints the legendary banner 5 | {yellow} clear:{green} clears the terminal 6 | {yellow} exit:{green} exits instead of Ctrl+C 7 | {yellow} update:{green} updates using my magical update script 8 | {yellow} whoami:{green} hmm who even am I? 9 | {yellow} sherlockupdate:{green} updates the sherlock site list 10 | {white} Tools: 11 | {yellow} whois:{green} a more beautiful whois lookup 12 | {yellow} ipinfo:{green} the most annoying thing when it comes to OSINT made easy :) 13 | {yellow} nslookup:{green} nslookup, basic. 14 | {yellow} phoneinfo:{green} basic phone number information 15 | {yellow} portscan:{green} basic Nmap port scan 16 | {yellow} passwordcheck:{green} a personal favorite, check if the password has been breached before 17 | {yellow} imagesearch:{green} google reverse image search 18 | {yellow} maclookup:{green} I bet this will save you 16 hours of your life, trying to lookup a MAC address 19 | {yellow} instainfo:{green} heard of Instagram scraping before? 20 | {yellow} sherlock:{green} ah I just love this one, lookup a username across different social platforms 21 | {yellow} metadata:{green} extracts some meta data out of files""" 22 | -------------------------------------------------------------------------------- /core/internet.py: -------------------------------------------------------------------------------- 1 | import requests 2 | def CheckInternet(): 3 | try: 4 | requests.get("https://google.com") 5 | return True 6 | except: 7 | return False -------------------------------------------------------------------------------- /core/update.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import sys 4 | from requests import get 5 | from core.updates import updates 6 | 7 | 8 | def CheckUpdate(source): 9 | latestCommit = get(source).text 10 | if updates not in latestCommit: 11 | return True 12 | else: 13 | return False 14 | 15 | def NewStuff(source): 16 | latestCommit = get(source).text 17 | changelog = re.search(r"updates = \"(.*?)\"", latestCommit) 18 | changelog = changelog.group(1).split(":") 19 | return changelog 20 | 21 | def Update(): 22 | currentPath = os.getcwd().split("/") 23 | folder = currentPath[-1] 24 | path = "/".join(currentPath) 25 | os.system(f"git clone --quiet https://github.com/SpookySec/OSINTed {folder}") 26 | os.system(f"cp -r {path}/{folder}/* {path} && rm -r {path}/{folder}/ 2>/dev/null") -------------------------------------------------------------------------------- /core/updates.py: -------------------------------------------------------------------------------- 1 | updates = "Fixed a typo in osinted.py:Sorry guys, no new features :/" 2 | -------------------------------------------------------------------------------- /data.json: -------------------------------------------------------------------------------- 1 | { 2 | "SourceFile": "/home/hacconnoisseur/Pictures/postgres.png", 3 | "ExifTool:ExifToolVersion": 11.88, 4 | "File:Directory": "/home/hacconnoisseur/Pictures", 5 | "File:FileAccessDate": "2020:07:06 16:11:47+03:00", 6 | "File:FileInodeChangeDate": "2020:06:25 04:19:40+03:00", 7 | "File:FileModifyDate": "2020:06:25 04:19:40+03:00", 8 | "File:FileName": "postgres.png", 9 | "File:FilePermissions": "rw-rw-r--", 10 | "File:FileSize": "120 kB", 11 | "File:FileType": "PNG", 12 | "File:FileTypeExtension": "png", 13 | "File:MIMEType": "image/png", 14 | "PNG:BackgroundColor": "255 255 255", 15 | "PNG:BitDepth": 8, 16 | "PNG:ColorType": "RGB with Alpha", 17 | "PNG:Compression": "Deflate/Inflate", 18 | "PNG:Filter": "Adaptive", 19 | "PNG:ImageHeight": 1238, 20 | "PNG:ImageWidth": 1200, 21 | "PNG:Interlace": "Noninterlaced", 22 | "PNG:ModifyDate": "2011:03:16 04:56:40", 23 | "Composite:ImageSize": "1200x1238", 24 | "Composite:Megapixels": 1.5 25 | } 26 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if [[ $EUID -ne 0 ]]; then 3 | echo "[-] Please run as root" 4 | exit 1 5 | fi 6 | clear 7 | echo "Installing now..." 8 | sudo apt install whois 9 | sudo apt install exiftool 10 | python3 -m pip install requests 11 | python3 -m pip install mac-vendor-lookup 12 | python3 -m pip install readline 13 | python3 -m pip install phonenumbers 14 | python3 -m pip install whois 15 | python3 -m pip install pyhibp 16 | python3 -m pip install pyexifinfo 17 | python3 -m pip install requests_futures 18 | -------------------------------------------------------------------------------- /modules/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /modules/module_image.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import webbrowser 3 | 4 | def ReverseSearchImage(image): 5 | gurl='https://www.google.com/searchbyimage/upload' 6 | murl={'encoded_image': (image, open(image, 'rb')), 'image_content': ''} 7 | response = requests.post(gurl, files=murl, allow_redirects=False) 8 | fetchUrl = response.headers['Location'] 9 | return fetchUrl -------------------------------------------------------------------------------- /modules/module_instagram.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | class Instagram: 4 | def __init__(self, username): 5 | link = "https://www.instagram.com/"+username+"/?__a=1" 6 | self.parsed = requests.get(link).json() 7 | 8 | def username(self): 9 | return str(self.parsed["graphql"]["user"]["username"]) 10 | 11 | def user_id(self): 12 | return str(self.parsed["graphql"]["user"]["id"]) 13 | 14 | def fullname(self): 15 | return str(self.parsed["graphql"]["user"]["full_name"]) 16 | 17 | def followers(self): 18 | return str(self.parsed["graphql"]["user"]["edge_followed_by"]["count"]) 19 | 20 | def following(self): 21 | return str(self.parsed["graphql"]["user"]["edge_follow"]["count"]) 22 | 23 | def profile_pic(self): 24 | return str(self.parsed["graphql"]["user"]["profile_pic_url_hd"]) 25 | 26 | def bio(self): 27 | return str(self.parsed["graphql"]["user"]["biography"]) 28 | 29 | def posts(self): 30 | return str(self.parsed["graphql"]["user"]["edge_owner_to_timeline_media"]["count"]) 31 | 32 | def url(self): 33 | return str(self.parsed["graphql"]["user"]["external_url"]) 34 | 35 | def business(self): 36 | return str(self.parsed["graphql"]["user"]["is_business_account"]) 37 | 38 | def recently(self): 39 | return str(self.parsed["graphql"]["user"]["is_joined_recently"]) 40 | 41 | def private(self): 42 | return str(self.parsed["graphql"]["user"]["is_private"]) 43 | 44 | def verified(self): 45 | return str(self.parsed["graphql"]["user"]["is_verified"]) 46 | 47 | def business_category(self): 48 | return str(self.parsed["graphql"]["user"]["business_category_name"]) 49 | 50 | def isValid(self): 51 | try: 52 | str(self.parsed["graphql"]["user"]["username"]) 53 | return True 54 | except KeyError: 55 | return False 56 | -------------------------------------------------------------------------------- /modules/module_ip.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | class Ip: 4 | def __init__(self, ip_address): 5 | self.ip_address = ip_address 6 | 7 | def getInfo(self): 8 | """ 9 | Send a request to the api and get the info 10 | """ 11 | request = json.loads(requests.get(f"http://ip-api.com/json/{self.ip_address}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,zip,lat,lon,timezone,currency,isp,org,mobile,proxy,hosting").text) 12 | self.status = request["status"] 13 | self.continent = request["continent"] 14 | self.continentCode = request["continentCode"] 15 | self.country = request["country"] 16 | self.countryCode = request["countryCode"] 17 | self.region = request["region"] 18 | self.regionName = request["regionName"] 19 | self.city = request["city"] 20 | self.zipCode = str(request["zip"]) 21 | self.lat = str(request["lat"]) 22 | self.lon = str(request["lon"]) 23 | self.timezone = request["timezone"] 24 | self.currency = request["currency"] 25 | self.isp = request["isp"] 26 | self.mobile = str(request["mobile"]) 27 | self.proxy = str(request["proxy"]) 28 | self.hosting = str(request["hosting"]) 29 | def isValid(self): 30 | """ 31 | Checks if the ip is valid or not 32 | """ 33 | request = json.loads(requests.get(f"http://ip-api.com/json/{self.ip_address}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,zip,lat,lon,timezone,currency,isp,org,mobile,proxy,hosting").text) 34 | self.status = request["status"] 35 | if self.status != "success": 36 | self.message = request["message"] 37 | return False 38 | else: 39 | return True -------------------------------------------------------------------------------- /modules/module_mac.py: -------------------------------------------------------------------------------- 1 | from mac_vendor_lookup import MacLookup 2 | 3 | def GetVendor(address): 4 | return MacLookup().lookup(address) -------------------------------------------------------------------------------- /modules/module_metadata.py: -------------------------------------------------------------------------------- 1 | import pyexifinfo as p 2 | 3 | 4 | def GetType(image): 5 | type = p.get_json(image)[0]["File:FileTypeExtension"] 6 | return type 7 | 8 | class ImageJPG: 9 | """ 10 | Make an image object for JPG ONLY 11 | """ 12 | def __init__(self, image): 13 | self.data = p.get_json(image)[0] 14 | 15 | def GetMime(self): 16 | return str(self.data["File:MIMEType"]) 17 | 18 | def GetHeight(self): 19 | return str(self.data["File:ImageHeight"]) 20 | 21 | def GetWidth(self): 22 | return str(self.data["File:ImageWidth"]) 23 | 24 | def GetImageSize(self): 25 | return str(self.data["Composite:ImageSize"]) 26 | 27 | def GetXRes(self): 28 | return str(self.data["JFIF:XResolution"]) 29 | 30 | def GetYRes(self): 31 | return str(self.data["JFIF:YResolution"]) 32 | 33 | def GetJFIFVersion(self): 34 | return str(self.data["JFIF:JFIFVersion"]) 35 | 36 | def GetOrientation(self): 37 | return str(self.data["EXIF:Oreientation"]) 38 | 39 | def GetResUnit(self): 40 | return str(self.data["JFIF:ResolutionUnit"]) 41 | 42 | def GetFileSize(self): 43 | return str(self.data["File:FileSize"]) 44 | 45 | def GetPerms(self): 46 | return str(self.data["File:FilePermissions"]) 47 | 48 | def GetByteOrder(self): 49 | return str(self.data["File:ExifByteOrder"]) 50 | 51 | ''' 52 | class ImagePNG: 53 | def __init__(self, image): 54 | self.data = p.get_json(image)[0] 55 | 56 | def GetImageSize(self): 57 | return self.data["Composite:ImageSize"] 58 | 59 | def GetMime(self): 60 | return self.data["File:MIMEType"] 61 | ''' -------------------------------------------------------------------------------- /modules/module_passbreach.py: -------------------------------------------------------------------------------- 1 | import pyhibp 2 | from pyhibp import pwnedpasswords as pw 3 | pyhibp.set_user_agent(ua="OSINTed/1.0 (OSINT FrameWork @spooky_sec)") 4 | 5 | def CheckPassword(password): 6 | handle = pw.is_password_breached(password=f"{password}") 7 | return handle -------------------------------------------------------------------------------- /modules/module_phone.py: -------------------------------------------------------------------------------- 1 | import phonenumbers 2 | import requests 3 | from phonenumbers import geocoder 4 | from phonenumbers import carrier 5 | from phonenumbers import timezone 6 | 7 | 8 | 9 | class PhoneNumber: 10 | def __init__(self, number): 11 | self.number = number 12 | parsing = phonenumbers.parse(number) 13 | self.country = geocoder.description_for_number(parsing, "en") 14 | self.carrier = carrier.name_for_number(parsing, "en") 15 | 16 | number = phonenumbers.format_number( 17 | parsing, phonenumbers.PhoneNumberFormat.E164).replace('+', '') 18 | 19 | numberCountryCode = phonenumbers.format_number( 20 | parsing, phonenumbers.PhoneNumberFormat.INTERNATIONAL).split(' ')[0] 21 | 22 | self.localNumber = phonenumbers.format_number( 23 | parsing, phonenumbers.PhoneNumberFormat.E164).replace(numberCountryCode, '0') 24 | self.internationalNumber = phonenumbers.format_number( 25 | parsing, phonenumbers.PhoneNumberFormat.INTERNATIONAL) -------------------------------------------------------------------------------- /modules/module_portscan.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def PortScan(host): 4 | req = requests.get(f"https://api.hackertarget.com/nmap/?q={host}") 5 | return req.text -------------------------------------------------------------------------------- /modules/module_whois.py: -------------------------------------------------------------------------------- 1 | import whois 2 | 3 | class Domain: 4 | def __init__(self, domain): 5 | domainlookup = whois.query(domain) 6 | self.name_servers = list(domainlookup.name_servers) 7 | self.owner = str(domainlookup.registrar) 8 | self.servers = list(domainlookup.name_servers) 9 | self.creation = str(domainlookup.creation_date) 10 | self.experation = str(domainlookup.expiration_date) 11 | self.update = str(domainlookup.last_updated) -------------------------------------------------------------------------------- /osinted.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | import os 3 | import time 4 | import webbrowser 5 | import requests 6 | import socket 7 | import sys 8 | from mac_vendor_lookup import InvalidMacError 9 | from core.auto_complete import PathComplete, CommandComplete, HistoryClear, commands 10 | from core.color import * 11 | from modules.module_phone import PhoneNumber 12 | from modules.module_whois import Domain 13 | from modules.module_ip import Ip 14 | from modules.module_image import ReverseSearchImage 15 | from modules.module_mac import GetVendor 16 | from modules.module_passbreach import CheckPassword 17 | from modules.module_portscan import PortScan 18 | from modules.module_instagram import Instagram 19 | from modules.module_metadata import ImageJPG, GetType 20 | from urllib.error import HTTPError 21 | from sherlock.site_list import SherlockUpdate 22 | from sherlock.sherlock.sherlock import UserSearch 23 | from core.banner import banner 24 | from core.internet import CheckInternet 25 | from core.update import CheckUpdate, NewStuff, Update 26 | from core.help import HelpMenu 27 | 28 | print(info + white + "Checking for internet connection..." + end) 29 | if CheckInternet(): 30 | print(good + green + "You're connected!" + end) 31 | else: 32 | print(bad + red + "You're not connected!" + end) 33 | exit() 34 | time.sleep(0.3) 35 | os.system("clear") 36 | print(banner) 37 | while True: 38 | try: 39 | CommandComplete() 40 | cmd = input(yellow + "OSINTed> " + end) 41 | if cmd != "": 42 | 43 | # META DATA 44 | if cmd.split()[0] == "metadata": 45 | argv = cmd.split() 46 | if len(argv) != 1: 47 | print(info + yellow + "Usage: " + green + f"{argv[0]}") 48 | else: 49 | PathComplete() 50 | img = input(run + white + f"Path to file (use{green} Tab{white}): " + end) 51 | try: 52 | fileType = GetType(img) 53 | print(run + white + "Analyzing file...") 54 | if fileType == "jpg" or fileType == "jpeg": 55 | image = ImageJPG(img) 56 | print(good + white + "JFIF Version: " + yellow + image.GetJFIFVersion()) 57 | print(good + white + "MIME Type: " + yellow + image.GetMime()) 58 | print(good + white + "Image Height: " + yellow + image.GetHeight()) 59 | print(good + white + "Image Width: " + yellow + image.GetWidth()) 60 | print(good + white + "Image Size: " + yellow + image.GetImageSize()) 61 | print(good + white + "X Resolution: " + yellow + image.GetXRes()) 62 | print(good + white + "Y Resolution: " + yellow + image.GetYRes()) 63 | print(good + white + "Resolution Unit: " + yellow + image.GetResUnit()) 64 | print(good + white + "File Size: " + yellow + image.GetFileSize()) 65 | print(good + white + "File Permissions: " + yellow + image.GetPerms()) 66 | try: 67 | print(good + white + "Exif Byte Order: " + yellow + image.GetByteOrder()) 68 | except: 69 | pass 70 | try: 71 | print(good + white + "Orientation: " + yellow + image.GetOrientation()) 72 | except: 73 | pass 74 | else: 75 | print(bad + red + "Sorry, only supports JPG files currently!") 76 | print(bad + red + "Current file type: " + white + GetType(img)) 77 | except ValueError: 78 | print(bad + red + "File not found!" + end) 79 | except Exception as error: 80 | print(bad + red + "An unknown error as occurred...") 81 | print(bad + red + "Error: " + white + error) 82 | HistoryClear() 83 | CommandComplete() 84 | 85 | # INSTAGRAM OSINT 86 | if cmd.split()[0] == "instainfo": 87 | argv = cmd.split() 88 | if len(argv) != 2: 89 | print(info + yellow + "Usage: " + green + f"{argv[0]} ") 90 | print(good + white + "Example: " + green + f"{argv[0]} " + yellow + "instagram") 91 | else: 92 | try: 93 | username = Instagram(argv[1]) 94 | if username.isValid(): 95 | print(good + white + "User: " + yellow + argv[1] + white + " exists!" + end) 96 | print(run + white + "Getting information now..." + end) 97 | time.sleep(2) 98 | print(good + white + "Username: " + yellow + username.username()) 99 | print(good + white + "User ID: " + yellow + username.user_id()) 100 | print(good + white + "FullName: " + yellow + username.fullname()) 101 | print(good + white + "Followers: " + yellow + username.followers()) 102 | print(good + white + "Following: " + yellow + username.following()) 103 | print(good + white + "Posts: " + yellow + username.posts()) 104 | print(good + white + "Url: " + yellow + username.url()) 105 | print(good + white + "Is verified: " + yellow + username.verified()) 106 | print(good + white + "Is private: " + yellow + username.private()) 107 | print(good + white + "Is a business account: " + yellow + str(username.business())) 108 | if username.business(): 109 | print(good + white + "Business category: " + yellow + username.business_category()) 110 | print(good + white + "HD Profile picture: \n" + yellow + username.profile_pic()) 111 | 112 | print(good + white + "Biography: \n" + yellow + username.bio()) 113 | else: 114 | print(bad + red + "Username: " + yellow + argv[1] + red + " not found!") 115 | 116 | except: 117 | print(bad + red + "An unknown error has occurred!" + end) 118 | 119 | 120 | # USER LOOKUP 121 | if cmd.split()[0] == "sherlock": 122 | argv = cmd.split() 123 | if len(argv) != 2: 124 | print(info + yellow + "Usage: " + green + f"{argv[0]} ") 125 | print(good + white + "Example: " + green + f"{argv[0]} " + yellow + "username123") 126 | else: 127 | username = argv[1] 128 | UserSearch(username) 129 | 130 | # PORT SCAN 131 | if cmd.split()[0] == "portscan": 132 | argv = cmd.split() 133 | if len(argv) != 2: 134 | print(info + yellow + "Usage: " + green + f"{argv[0]} ") 135 | print(good + white + "Example: " + green + f"{argv[0]} " + yellow + "scanme.nmap.org") 136 | else: 137 | host = argv[1] 138 | scan = PortScan(host) 139 | if "error" in scan: 140 | print(bad + red + "An error has occurred!" + end) 141 | print(info + red + "Host format: " + yellow + "scanme.nmap.org" + end) 142 | else: 143 | print(run + white + "Scanning " + yellow + f"{host}\n" + end) 144 | print(scan) 145 | 146 | # PASSWORD BREACH 147 | if cmd.split()[0] == "passwordcheck": 148 | argv = cmd.split() 149 | if len(argv) != 2: 150 | print(info + yellow + "Usage: " + green + f"{argv[0]} ") 151 | print(good + white + "Example: " + green + f"{argv[0]} " + yellow + "password123") 152 | else: 153 | print(run + white + "Checking for password...") 154 | password = CheckPassword(argv[1]) 155 | time.sleep(1) 156 | if password: 157 | print(info + white + "Password has been used " + yellow + str(password) + white + " times!" + end) 158 | else: 159 | print(good + white + "You're good!" + end) 160 | 161 | # MAC ADDRESS LOOKUP 162 | if cmd.split()[0] == "maclookup": 163 | argv = cmd.split() 164 | if len(argv) != 2: 165 | print(info + yellow + "Usage: " + green + f"{argv[0]} ") 166 | print(good + white + "Example: " + green + f"{argv[0]} " + yellow + "11:22:33:44:55:66") 167 | else: 168 | try: 169 | vendor = GetVendor(argv[1]) 170 | print(run + white + "Vendor: " + end + vendor) 171 | except KeyError: 172 | print(bad + red + "MAC address not found!") 173 | except InvalidMacError: 174 | print(bad + red + "MAC address doesn't seem legit...") 175 | 176 | # IMAGE REVERSE SEARCH 177 | if cmd.split()[0] == "imagesearch": 178 | try: 179 | argv = cmd.split() 180 | if len(argv) != 1: 181 | print(info + yellow + "Usage: " + green + f"{argv[0]}" + end) 182 | else: 183 | PathComplete() 184 | img = input(good + white + f"Enter the path to the picture (use {green}Tab{end}): " + end) 185 | ext = img.split(".")[-1] 186 | if ext == "jpg" or ext == "png" or ext == "jpeg" or ext == "gif" or ext == "bmp" or ext == "tif" or ext == "webp": 187 | try: 188 | Url = ReverseSearchImage(img) 189 | while True: 190 | ask = input(que + white + "Would you like to open the result in browser [" + green + "Y" + white + "/" + red + "N" + white + "]: " + end) 191 | if ask.upper() == "Y": 192 | webbrowser.open_new(Url) 193 | break 194 | elif ask.upper() == "N": 195 | print(info + white + "Link: " + end + Url) 196 | break 197 | else: 198 | pass 199 | except: 200 | print(bad + red + "An error has occurred!" + end) 201 | else: 202 | print(bad + red + "Unsupported format!" + end) 203 | print(info + white + "Supported formats: " + yellow + "jpg, png, jpeg, gif, bmp, tif, webp") 204 | HistoryClear() 205 | CommandComplete() 206 | except KeyboardInterrupt: 207 | pass 208 | 209 | # IP INFO 210 | if cmd.split()[0] == "ipinfo": 211 | argv = cmd.split() 212 | if len(argv) != 2: 213 | print(info + yellow + "Usage: " + green + f"{argv[0]} " + end) 214 | print(good + white + "Example: " + green + f"{argv[0]} " + yellow + "8.8.8.8") 215 | else: 216 | ip_address = Ip(argv[1]) 217 | if not ip_address.isValid(): 218 | print(bad + red + "IP Doesn't seem to be valid!" + end) 219 | print(bad + red + "API message: " + white + ip_address.message + end) 220 | else: 221 | ip_address.getInfo() 222 | print(run + white + "Continent: " + end + ip_address.continent) 223 | print(run + white + "ContinentCode: " + end + ip_address.continentCode) 224 | print(run + white + "Country: " + end + ip_address.country) 225 | print(run + white + "CountryCode: " + end + ip_address.countryCode) 226 | print(run + white + "Region Name: " + end + ip_address.regionName) 227 | print(run + white + "Region: " + end + ip_address.region) 228 | print(run + white + "City: " + end + ip_address.city) 229 | print(run + white + "ZipCode: " + end + ip_address.zipCode) 230 | print(run + white + "Latitude: " + end + ip_address.lat) 231 | print(run + white + "Longitude: " + end + ip_address.lon) 232 | print(run + white + "TimeZone: " + end + ip_address.timezone) 233 | print(run + white + "Currency: " + end + ip_address.currency) 234 | print(run + white + "ISP: " + end + ip_address.isp) 235 | print(run + white + "Mobile: " + end + ip_address.mobile) 236 | print(run + white + "Proxy: " + end + ip_address.proxy) 237 | print(run + white + "Hosting Service: " + end + ip_address.hosting) 238 | 239 | # WHO IS 240 | if cmd.split()[0] == "whois": 241 | argv = cmd.split() 242 | if len(argv) != 2: 243 | print(info + yellow + "Usage: " + green + f"{argv[0]} " + end) 244 | print(good + white + "Example: " + green + f"{argv[0]} " + yellow + "www.google.com") 245 | else: 246 | try: 247 | domain = Domain(argv[1]) 248 | print(run + white + "Domain Owner: " + end + domain.owner) 249 | print(run + white + "Creation Date: " + end + domain.creation) 250 | print(run + white + "Expiration Date: " + end + domain.experation) 251 | print(run + white + "Last Update: " + end + domain.update) 252 | print(run + white + "Name Servers: " + end) 253 | for server in domain.name_servers: 254 | print(f"\t- {server}\n", end="") 255 | except: 256 | print(bad + red + "Domain doesn't seem to be valid!" + end) 257 | 258 | # NS LOOKUP 259 | if cmd.split()[0] == "nslookup": 260 | argv = cmd.split() 261 | if len(argv) != 2: 262 | print(info + yellow + "Usage: " + green + f"{argv[0]} " + end) 263 | print(good + white + "Example: " + green + f"{argv[0]} " + yellow + "www.google.com") 264 | else: 265 | domain = argv[1] 266 | 267 | ip_list = [] 268 | ais = socket.getaddrinfo(domain ,0,0,0,0) 269 | for result in ais: 270 | ip_list.append(result[-1][0]) 271 | ip_list = list(set(ip_list)) 272 | for ip in ip_list: 273 | print(good + white + "Found: " + yellow + ip + end) 274 | 275 | 276 | # PHONE NUMBER 277 | if cmd.split()[0] == "phoneinfo": 278 | argv = cmd.split() 279 | if len(argv) != 2: 280 | print(info + yellow + "Usage: " + green + f"{argv[0]} " + end) 281 | print(good + white + "Example: " + green + f"{argv[0]} " + yellow + "+11234567890") 282 | else: 283 | try: 284 | number = PhoneNumber(argv[1]) 285 | if number.carrier == "" and number.country == "": 286 | print(bad + red + "Number doesn't seem to be valid!" + end) 287 | else: 288 | print(good + green + "Getting info..." + end) 289 | time.sleep(1) 290 | print(run + white + "Carrier: " + end + number.carrier) 291 | print(run + white + "Country: " + end + number.country) 292 | print(run + white + "Local Format: " + end + number.localNumber) 293 | print(run + white + "International Format: " + end + number.internationalNumber) 294 | except: 295 | print(bad + red + "Number doesn't seem to be valid!" + end) 296 | 297 | 298 | # WHO AM I 299 | if cmd.split()[0] == "whoami": 300 | print(good + white + "Made by " + yellow + "@spooky_sec" + end) 301 | 302 | # BANNER 303 | if cmd.split()[0] == "banner": 304 | print(banner) 305 | 306 | # CLEAN 307 | if cmd.split()[0] == "clear": 308 | os.system("clear") 309 | 310 | # HELP 311 | if cmd.split()[0] == "help": 312 | print(HelpMenu) 313 | 314 | # UPDATE 315 | if cmd.split()[0] == "update": 316 | print(run + white + "Checking for updates..." + end) 317 | if CheckUpdate("https://raw.githubusercontent.com/SpookySec/OSINTed/master/core/updates.py"): 318 | print(good + white + "There's an update!" + end) 319 | new_stuff = NewStuff("https://raw.githubusercontent.com/SpookySec/OSINTed/master/core/updates.py") 320 | print(info + white + "New stuff: " + end) 321 | for thing in new_stuff: 322 | print(yellow + f"\t- {thing}\n", end="") 323 | while True: 324 | option = input(que + white + "Would you like to install the update [" + 325 | green + "Y" + white + "/" + red + "N" + white + "]: ") 326 | if option.upper() == "Y": 327 | print(info + white + "Updating..." + end) 328 | time.sleep(2) 329 | input(info + white + "Spam Enter to finish: ") 330 | Update() 331 | print(good + white + "Done!" + end) 332 | print(info + white + "Exiting..." + end) 333 | sys.exit(0) 334 | break 335 | elif option.upper() == "N": 336 | print(bad + white + "Too bad :(") 337 | break 338 | else: 339 | pass 340 | else: 341 | print(good + white + "You're up to date" + end) 342 | 343 | # SHERLOCK UPDATE 344 | if cmd.split()[0] == "sherlockupdate": 345 | print(info + white + "Updating Sherlock..." + end) 346 | time.sleep(1) 347 | SherlockUpdate() 348 | 349 | 350 | # EXIT 351 | if cmd.split()[0] == "exit": 352 | print(good + white + "GoodBye! :)" + end) 353 | break 354 | 355 | # COMMAND NOT FOUND 356 | if cmd.split()[0] not in commands: 357 | print(bad + red + "Use \"" + green + "help" + red + "\" to list available commands" + end) 358 | except KeyboardInterrupt: 359 | print("\n" + bad + red + "Use \"" + green + "exit" + red + "\" to exit" + end) 360 | pass 361 | -------------------------------------------------------------------------------- /sherlock/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpookySec/OSINTed/3cc6beb76ddddfbabb278df4dade47f802dcbcea/sherlock/__init__.py -------------------------------------------------------------------------------- /sherlock/data_bad_site.json: -------------------------------------------------------------------------------- 1 | { 2 | "9GAG": { 3 | "errorType": "status_code", 4 | "rank": 389, 5 | "url": "https://9gag.com/u/{}", 6 | "urlMain": "https://9gag.com/", 7 | "username_claimed": "blue", 8 | "username_unclaimed": "noonewouldeverusethis7" 9 | }, 10 | "AdobeForums": { 11 | "errorType": "status_code", 12 | "rank": 59, 13 | "url": "https://forums.adobe.com/people/{}", 14 | "urlMain": "https://forums.adobe.com/", 15 | "username_claimed": "jack", 16 | "username_unclaimed": "noonewouldeverusethis77777" 17 | }, 18 | "AngelList": { 19 | "errorType": "status_code", 20 | "rank": 5767, 21 | "url": "https://angel.co/{}", 22 | "urlMain": "https://angel.co/", 23 | "username_claimed": "blue", 24 | "username_unclaimed": "noonewouldeverusethis7" 25 | }, 26 | "Basecamp": { 27 | "errorMsg": "The account you were looking for doesn't exist", 28 | "errorType": "message", 29 | "rank": 4914, 30 | "url": "https://{}.basecamphq.com", 31 | "urlMain": "https://basecamp.com/", 32 | "username_claimed": "blue", 33 | "username_unclaimed": "noonewouldeverusethis7" 34 | }, 35 | "BlackPlanet": { 36 | "errorMsg": "My Hits", 37 | "errorType": "message", 38 | "rank": 110021, 39 | "url": "http://blackplanet.com/{}", 40 | "urlMain": "http://blackplanet.com/" 41 | }, 42 | "CapFriendly": { 43 | "errorMsg": "No User Found", 44 | "errorType": "message", 45 | "rank": 64100, 46 | "url": "https://www.capfriendly.com/users/{}", 47 | "urlMain": "https://www.capfriendly.com/", 48 | "username_claimed": "blue", 49 | "username_unclaimed": "noonewouldeverusethis" 50 | }, 51 | "Canva": { 52 | "errorType": "response_url", 53 | "errorUrl": "https://www.canva.com/{}", 54 | "rank": 128, 55 | "url": "https://www.canva.com/{}", 56 | "urlMain": "https://www.canva.com/", 57 | "username_claimed": "jenny", 58 | "username_unclaimed": "xgtrq" 59 | }, 60 | "Codementor": { 61 | "errorType": "status_code", 62 | "rank": 10252, 63 | "url": "https://www.codementor.io/@{}", 64 | "urlMain": "https://www.codementor.io/", 65 | "username_claimed": "blue", 66 | "username_unclaimed": "noonewouldeverusethis7" 67 | }, 68 | "Codepen": { 69 | "errorType": "status_code", 70 | "rank": 1359, 71 | "url": "https://codepen.io/{}", 72 | "urlMain": "https://codepen.io/", 73 | "username_claimed": "blue", 74 | "username_unclaimed": "noonewouldeverusethis7" 75 | }, 76 | "ColourLovers": { 77 | "errorType": "status_code", 78 | "rank": 21271, 79 | "url": "https://www.colourlovers.com/lover/{}", 80 | "urlMain": "https://www.colourlovers.com/", 81 | "username_claimed": "blue", 82 | "username_unclaimed": "noonewouldeverusethis7" 83 | }, 84 | "EVE Online": { 85 | "errorType": "response_url", 86 | "errorUrl": "https://eveonline.com", 87 | "rank": 15347, 88 | "url": "https://evewho.com/pilot/{}/", 89 | "urlMain": "https://eveonline.com", 90 | "username_claimed": "blue", 91 | "username_unclaimed": "noonewouldeverusethis7" 92 | }, 93 | "fanpop": { 94 | "errorType": "response_url", 95 | "errorUrl": "http://www.fanpop.com/", 96 | "rank": 9454, 97 | "url": "http://www.fanpop.com/fans/{}", 98 | "urlMain": "http://www.fanpop.com/", 99 | "username_claimed": "blue", 100 | "username_unclaimed": "noonewould_everusethis7" 101 | }, 102 | "Fotolog": { 103 | "errorType": "status_code", 104 | "rank": 47777, 105 | "url": "https://fotolog.com/{}", 106 | "urlMain": "https://fotolog.com/" 107 | }, 108 | "Foursquare": { 109 | "errorType": "status_code", 110 | "rank": 1843, 111 | "url": "https://foursquare.com/{}", 112 | "urlMain": "https://foursquare.com/", 113 | "username_claimed": "dens", 114 | "username_unclaimed": "noonewouldeverusethis7" 115 | }, 116 | "furaffinity": { 117 | "errorMsg": "user cannot be found", 118 | "errorType": "message", 119 | "rank": 0, 120 | "url": "https://www.furaffinity.net/user/{}", 121 | "urlMain": "https://www.furaffinity.net", 122 | "username_claimed": "blue", 123 | "username_unclaimed": "noonewouldeverusethis777777" 124 | }, 125 | "gpodder.net": { 126 | "errorType": "status_code", 127 | "rank": 2013984, 128 | "url": "https://gpodder.net/user/{}", 129 | "urlMain": "https://gpodder.net/", 130 | "username_claimed": "blue", 131 | "username_unclaimed": "noonewouldeverusethis7" 132 | }, 133 | "Imgur": { 134 | "errorType": "status_code", 135 | "rank": 74, 136 | "url": "https://imgur.com/user/{}", 137 | "urlMain": "https://imgur.com/", 138 | "username_claimed": "blue", 139 | "username_unclaimed": "noonewouldeverusethis7" 140 | }, 141 | "Investing.com": { 142 | "errorType": "status_code", 143 | "rank": 196, 144 | "url": "https://www.investing.com/traders/{}", 145 | "urlMain": "https://www.investing.com/", 146 | "username_claimed": "jenny", 147 | "username_unclaimed": "noonewouldeverusethis7" 148 | }, 149 | "Khan Academy": { 150 | "errorType": "status_code", 151 | "rank": 377, 152 | "url": "https://www.khanacademy.org/profile/{}", 153 | "urlMain": "https://www.khanacademy.org/", 154 | "username_claimed": "blue", 155 | "username_unclaimed": "noonewouldeverusethis7" 156 | }, 157 | "KiwiFarms": { 158 | "errorMsg": "The specified member cannot be found", 159 | "errorType": "message", 160 | "rank": 38737, 161 | "url": "https://kiwifarms.net/members/?username={}", 162 | "urlMain": "https://kiwifarms.net/", 163 | "username_claimed": "blue", 164 | "username_unclaimed": "noonewouldeverusethis" 165 | }, 166 | "linkedin.com": { 167 | "errorMsg": "This profile is not available", 168 | "errorType": "message", 169 | "rank": 0, 170 | "url": "https://www.linkedin.com/in/{}", 171 | "urlMain": "https://www.linkedin.com/", 172 | "username_claimed": "alex", 173 | "username_unclaimed": "noonewouldeverusethis7" 174 | }, 175 | "PayPal": { 176 | "errorType": "response_url", 177 | "errorUrl": "https://www.paypal.com/paypalme2/404", 178 | "rank": 18441, 179 | "url": "https://www.paypal.com/paypalme2/{}", 180 | "urlMain": "https://www.paypal.me/", 181 | "username_claimed": "blue", 182 | "username_unclaimed": "noneownsthisusername" 183 | }, 184 | "Pexels": { 185 | "errorType": "status_code", 186 | "rank": 745, 187 | "url": "https://www.pexels.com/@{}", 188 | "urlMain": "https://www.pexels.com/", 189 | "username_claimed": "bruno", 190 | "username_unclaimed": "noonewouldeverusethis7" 191 | }, 192 | "Pixabay": { 193 | "errorType": "status_code", 194 | "rank": 378, 195 | "url": "https://pixabay.com/en/users/{}", 196 | "urlMain": "https://pixabay.com/", 197 | "username_claimed": "blue", 198 | "username_unclaimed": "noonewouldeverusethis7" 199 | }, 200 | "PowerShell Gallery": { 201 | "errorType": "status_code", 202 | "rank": 163562, 203 | "url": "https://www.powershellgallery.com/profiles/{}", 204 | "urlMain": "https://www.powershellgallery.com", 205 | "username_claimed": "powershellteam", 206 | "username_unclaimed": "noonewouldeverusethis7" 207 | }, 208 | "Raidforums": { 209 | "errorMsg": "The member you specified is either invalid or doesn't exist.", 210 | "errorType": "message", 211 | "rank": 32435, 212 | "url": "https://raidforums.com/User-{}", 213 | "urlMain": "https://raidforums.com/", 214 | "username_claimed": "red", 215 | "username_unclaimed": "noonewouldeverusethis7" 216 | }, 217 | "RamblerDating": { 218 | "errorType": "response_url", 219 | "errorUrl": "https://dating.rambler.ru/page/{}", 220 | "rank": 322, 221 | "url": "https://dating.rambler.ru/page/{}", 222 | "urlMain": "https://dating.rambler.ru/", 223 | "username_claimed": "blue", 224 | "username_unclaimed": "noonewouldeverusethis7" 225 | }, 226 | "Shockwave": { 227 | "errorMsg": "Oh no! You just finished all of the games on the internet!", 228 | "errorType": "message", 229 | "rank": 35916, 230 | "url": "http://www.shockwave.com/member/profiles/{}.jsp", 231 | "urlMain": "http://www.shockwave.com/", 232 | "username_claimed": "blue", 233 | "username_unclaimed": "noonewouldeverusethis" 234 | }, 235 | "StreamMe": { 236 | "errorType": "status_code", 237 | "rank": 31702, 238 | "url": "https://www.stream.me/{}", 239 | "urlMain": "https://www.stream.me/", 240 | "username_claimed": "blue", 241 | "username_unclaimed": "noonewouldeverusethis7" 242 | }, 243 | "Teknik": { 244 | "errorMsg": "The user does not exist", 245 | "errorType": "message", 246 | "rank": 357163, 247 | "url": "https://user.teknik.io/{}", 248 | "urlMain": "https://teknik.io/", 249 | "username_claimed": "red", 250 | "username_unclaimed": "noonewouldeverusethis7" 251 | }, 252 | "TikTok": { 253 | "errorType": "status_code", 254 | "rank": 260, 255 | "url": "https://www.tiktok.com/@{}", 256 | "urlMain": "https://www.tiktok.com/", 257 | "username_claimed": "red", 258 | "username_unclaimed": "noonewouldeverusethis7" 259 | }, 260 | "YandexMarket": { 261 | "errorMsg": "\u0422\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0442", 262 | "errorType": "message", 263 | "rank": 47, 264 | "url": "https://market.yandex.ru/user/{}/achievements", 265 | "urlMain": "https://market.yandex.ru/", 266 | "username_claimed": "blue", 267 | "username_unclaimed": "noonewouldeverusethis7" 268 | }, 269 | "Insanejournal": { 270 | "errorMsg": "Unknown user", 271 | "errorType": "message", 272 | "rank": 29728, 273 | "url": "http://{}.insanejournal.com/profile", 274 | "urlMain": "insanejournal.com", 275 | "username_claimed": "blue", 276 | "username_unclaimed": "dlyr6cd" 277 | }, 278 | "Trip": { 279 | "errorType": "status_code", 280 | "rank": 2847, 281 | "url": "https://www.trip.skyscanner.com/user/{}", 282 | "urlMain": "https://www.trip.skyscanner.com/", 283 | "username_claimed": "blue", 284 | "username_unclaimed": "noonewouldeverusethis7" 285 | }, 286 | "SportsTracker": { 287 | "errorUrl": "https://www.sports-tracker.com/page-not-found", 288 | "errorType": "response_url", 289 | "rank": 93950, 290 | "url": "https://www.sports-tracker.com/view_profile/{}", 291 | "urlMain": "https://www.sports-tracker.com/", 292 | "username_claimed": "blue", 293 | "username_unclaimed": "noonewouldeveruse" 294 | }, 295 | "boingboing.net": { 296 | "errorType": "status_code", 297 | "rank": 5821, 298 | "url": "https://bbs.boingboing.net/u/{}", 299 | "urlMain": "https://boingboing.net/", 300 | "username_claimed": "admin", 301 | "username_unclaimed": "noonewouldeverusethis7" 302 | }, 303 | "Telegram": { 304 | "errorType": "response_url", 305 | "errorUrl": "https://telegram.org", 306 | "rank": 385, 307 | "url": "https://t.me/{}", 308 | "urlMain": "https://t.me/", 309 | "username_claimed": "saman", 310 | "username_unclaimed": "i_do_not_believe_this_account_exists_at_all" 311 | }, 312 | "elwoRU": { 313 | "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d", 314 | "errorType": "message", 315 | "rank": 254810, 316 | "url": "https://elwo.ru/index/8-0-{}", 317 | "urlMain": "https://elwo.ru/", 318 | "username_claimed": "red", 319 | "username_unclaimed": "noonewouldeverusethis7" 320 | }, 321 | "ingvarr.net.ru": { 322 | "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d", 323 | "errorType": "message", 324 | "rank": 107721, 325 | "url": "http://ingvarr.net.ru/index/8-0-{}", 326 | "urlMain": "http://ingvarr.net.ru/", 327 | "username_claimed": "red", 328 | "username_unclaimed": "noonewouldeverusethis7" 329 | } 330 | } 331 | 332 | -------------------------------------------------------------------------------- /sherlock/sherlock/__init__.py: -------------------------------------------------------------------------------- 1 | """Sherlock Module 2 | 3 | This module contains the main logic to search for usernames at social 4 | networks. 5 | """ 6 | -------------------------------------------------------------------------------- /sherlock/sherlock/notify.py: -------------------------------------------------------------------------------- 1 | """Sherlock Notify Module 2 | 3 | This module defines the objects for notifying the caller about the 4 | results of queries. 5 | """ 6 | from sherlock.sherlock.result import QueryStatus 7 | 8 | white = '\033[97m' 9 | green = '\033[92m' 10 | red = '\033[91m' 11 | yellow = '\033[93m' 12 | end = '\033[0m' 13 | info = '\033[93m[!] \033[0m' 14 | que = '\033[94m[?] \033[0m' 15 | bad = '\033[91m[-] \033[0m' 16 | good = '\033[32m[+] \033[0m' 17 | run = '\033[97m[~] \033[0m' 18 | 19 | 20 | class QueryNotify(): 21 | """Query Notify Object. 22 | 23 | Base class that describes methods available to notify the results of 24 | a query. 25 | It is intended that other classes inherit from this base class and 26 | override the methods to implement specific functionality. 27 | """ 28 | def __init__(self, result=None): 29 | """Create Query Notify Object. 30 | 31 | Contains information about a specific method of notifying the results 32 | of a query. 33 | 34 | Keyword Arguments: 35 | self -- This object. 36 | result -- Object of type QueryResult() containing 37 | results for this query. 38 | 39 | Return Value: 40 | Nothing. 41 | """ 42 | 43 | self.result = result 44 | 45 | return 46 | 47 | def start(self, message=None): 48 | """Notify Start. 49 | 50 | Notify method for start of query. This method will be called before 51 | any queries are performed. This method will typically be 52 | overridden by higher level classes that will inherit from it. 53 | 54 | Keyword Arguments: 55 | self -- This object. 56 | message -- Object that is used to give context to start 57 | of query. 58 | Default is None. 59 | 60 | Return Value: 61 | Nothing. 62 | """ 63 | 64 | return 65 | 66 | def update(self, result): 67 | """Notify Update. 68 | 69 | Notify method for query result. This method will typically be 70 | overridden by higher level classes that will inherit from it. 71 | 72 | Keyword Arguments: 73 | self -- This object. 74 | result -- Object of type QueryResult() containing 75 | results for this query. 76 | 77 | Return Value: 78 | Nothing. 79 | """ 80 | 81 | self.result = result 82 | 83 | return 84 | 85 | def finish(self, message=None): 86 | return 87 | 88 | def __str__(self): 89 | """Convert Object To String. 90 | 91 | Keyword Arguments: 92 | self -- This object. 93 | 94 | Return Value: 95 | Nicely formatted string to get information about this object. 96 | """ 97 | result = str(self.result) 98 | 99 | return result 100 | 101 | 102 | class QueryNotifyPrint(QueryNotify): 103 | """Query Notify Print Object. 104 | 105 | Query notify class that prints results. 106 | """ 107 | def __init__(self, result=None, verbose=False, print_found_only=False, 108 | color=True): 109 | """Create Query Notify Print Object. 110 | 111 | Contains information about a specific method of notifying the results 112 | of a query. 113 | 114 | Keyword Arguments: 115 | self -- This object. 116 | result -- Object of type QueryResult() containing 117 | results for this query. 118 | verbose -- Boolean indicating whether to give verbose output. 119 | print_found_only -- Boolean indicating whether to only print found sites. 120 | color -- Boolean indicating whether to color terminal output 121 | 122 | Return Value: 123 | Nothing. 124 | """ 125 | 126 | # Colorama module's initialization. 127 | return 128 | 129 | def start(self, message): 130 | title = "Checking username" 131 | print(run + white + f"{title}" + yellow + f" {message}" + white + " on:" + end) 132 | return 133 | 134 | def update(self, result): 135 | 136 | self.result = result 137 | 138 | #Output to the terminal is desired. 139 | if result.status == QueryStatus.CLAIMED: 140 | print(good + yellow + f"{self.result.site_name}: " + end + f"{self.result.site_url_user}") 141 | 142 | elif result.status == QueryStatus.AVAILABLE: 143 | print(bad + 144 | yellow + f"{self.result.site_name}:" + 145 | red + " Not found!" + end) 146 | elif result.status == QueryStatus.UNKNOWN: 147 | print( 148 | bad + yellow + f"{self.result.site_name}:" + 149 | red + f" {self.result.context}" + end) 150 | elif result.status == QueryStatus.ILLEGAL: 151 | msg = "Username illegal for this website!" 152 | print(bad + yellow + 153 | f"{self.result.site_name}:" + 154 | red + f" {msg}" + end) 155 | else: 156 | #It should be impossible to ever get here... 157 | raise ValueError(f" WOWWWW GOOOODLUCK YOU'RE A PRO TESTER... Unknown Query Status '{str(result.status)}' for " 158 | f"site '{self.result.site_name}'") 159 | 160 | return 161 | 162 | def __str__(self): 163 | """Convert Object To String. 164 | 165 | Keyword Arguments: 166 | self -- This object. 167 | 168 | Return Value: 169 | Nicely formatted string to get information about this object. 170 | """ 171 | result = str(self.result) 172 | 173 | return result 174 | -------------------------------------------------------------------------------- /sherlock/sherlock/resources/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "2Dimensions": { 3 | "errorType": "status_code", 4 | "rank": 0, 5 | "url": "https://2Dimensions.com/a/{}", 6 | "urlMain": "https://2Dimensions.com/", 7 | "username_claimed": "blue", 8 | "username_unclaimed": "noonewouldeverusethis7" 9 | }, 10 | "3dnews": { 11 | "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430.", 12 | "errorType": "message", 13 | "rank": 0, 14 | "url": "http://forum.3dnews.ru/member.php?username={}", 15 | "urlMain": "http://forum.3dnews.ru/", 16 | "username_claimed": "red", 17 | "username_unclaimed": "noonewouldeverusethis7" 18 | }, 19 | "4pda": { 20 | "errorMsg": "\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0412\u0430\u0448 \u043f\u043e\u0438\u0441\u043a \u043d\u0435 \u0434\u0430\u043b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.", 21 | "errorType": "message", 22 | "rank": 0, 23 | "url": "https://4pda.ru/forum/index.php?act=search&source=pst&noform=1&username={}", 24 | "urlMain": "https://4pda.ru/", 25 | "username_claimed": "green", 26 | "username_unclaimed": "noonewouldeverusethis7" 27 | }, 28 | "500px": { 29 | "errorMsg": "Oops! This page doesn\u2019t exist.", 30 | "errorType": "message", 31 | "rank": 0, 32 | "url": "https://500px.com/{}", 33 | "urlMain": "https://500px.com/", 34 | "username_claimed": "blue", 35 | "username_unclaimed": "noonewouldeverusethis7" 36 | }, 37 | "7Cups": { 38 | "errorType": "status_code", 39 | "rank": 0, 40 | "url": "https://www.7cups.com/@{}", 41 | "urlMain": "https://www.7cups.com/", 42 | "username_claimed": "blue", 43 | "username_unclaimed": "noonewouldeverusethis7" 44 | }, 45 | "About.me": { 46 | "errorType": "status_code", 47 | "rank": 0, 48 | "url": "https://about.me/{}", 49 | "urlMain": "https://about.me/", 50 | "username_claimed": "blue", 51 | "username_unclaimed": "noonewouldeverusethis7" 52 | }, 53 | "Academia.edu": { 54 | "errorType": "status_code", 55 | "rank": 0, 56 | "url": "https://independent.academia.edu/{}", 57 | "urlMain": "https://www.academia.edu/", 58 | "username_claimed": "blue", 59 | "username_unclaimed": "noonewouldeverusethis7" 60 | }, 61 | "Alik.cz": { 62 | "errorType": "status_code", 63 | "rank": 0, 64 | "url": "https://www.alik.cz/u/{}", 65 | "urlMain": "https://www.alik.cz/", 66 | "username_claimed": "julian", 67 | "username_unclaimed": "noonewouldeverusethis" 68 | }, 69 | "AllTrails": { 70 | "errorMsg": "User could not be found.", 71 | "errorType": "message", 72 | "rank": 0, 73 | "url": "https://www.alltrails.com/members/{}", 74 | "urlMain": "https://www.alltrails.com/", 75 | "username_claimed": "blue", 76 | "username_unclaimed": "noonewouldeverusethis" 77 | }, 78 | "Anobii": { 79 | "errorType": "response_url", 80 | "rank": 0, 81 | "url": "https://www.anobii.com/{}/profile", 82 | "urlMain": "https://www.anobii.com/", 83 | "username_claimed": "blue", 84 | "username_unclaimed": "noonewouldeverusethis7" 85 | }, 86 | "Aptoide": { 87 | "errorType": "status_code", 88 | "rank": 0, 89 | "url": "https://{}.en.aptoide.com/", 90 | "urlMain": "https://en.aptoide.com/", 91 | "username_claimed": "blue", 92 | "username_unclaimed": "noonewouldeverusethis7" 93 | }, 94 | "Archive.org": { 95 | "errorMsg": "cannot find account", 96 | "errorType": "message", 97 | "rank": 0, 98 | "url": "https://archive.org/details/@{}", 99 | "urlMain": "https://archive.org", 100 | "username_claimed": "blue", 101 | "username_unclaimed": "noonewould" 102 | }, 103 | "Asciinema": { 104 | "errorType": "status_code", 105 | "rank": 0, 106 | "url": "https://asciinema.org/~{}", 107 | "urlMain": "https://asciinema.org", 108 | "username_claimed": "red", 109 | "username_unclaimed": "noonewouldeverusethis7" 110 | }, 111 | "Ask Fedora": { 112 | "errorType": "status_code", 113 | "rank": 0, 114 | "url": "https://ask.fedoraproject.org/u/{}", 115 | "urlMain": "https://ask.fedoraproject.org/", 116 | "username_claimed": "red", 117 | "username_unclaimed": "noonewouldeverusethis7" 118 | }, 119 | "AskFM": { 120 | "errorMsg": "Well, apparently not anymore.", 121 | "errorType": "message", 122 | "rank": 0, 123 | "regexCheck": "^[a-zA-Z0-9_]{3,40}$", 124 | "url": "https://ask.fm/{}", 125 | "urlMain": "https://ask.fm/", 126 | "username_claimed": "blue", 127 | "username_unclaimed": "noonewouldeverusethis7" 128 | }, 129 | "Audiojungle": { 130 | "errorType": "status_code", 131 | "rank": 0, 132 | "url": "https://audiojungle.net/user/{}", 133 | "urlMain": "https://audiojungle.net/", 134 | "username_claimed": "blue", 135 | "username_unclaimed": "noonewouldeverusethis7" 136 | }, 137 | "Avizo": { 138 | "errorType": "response_url", 139 | "errorUrl": "https://www.avizo.cz/", 140 | "rank": 0, 141 | "url": "https://www.avizo.cz/{}/", 142 | "urlMain": "https://www.avizo.cz/", 143 | "username_claimed": "blue", 144 | "username_unclaimed": "noonewouldeverusethis" 145 | }, 146 | "BLIP.fm": { 147 | "errorType": "status_code", 148 | "rank": 0, 149 | "url": "https://blip.fm/{}", 150 | "urlMain": "https://blip.fm/", 151 | "username_claimed": "blue", 152 | "username_unclaimed": "noonewouldeverusethis7" 153 | }, 154 | "BOOTH": { 155 | "errorType": "response_url", 156 | "errorUrl": "https://booth.pm/", 157 | "rank": 0, 158 | "url": "https://{}.booth.pm/", 159 | "urlMain": "https://booth.pm/", 160 | "username_claimed": "blue", 161 | "username_unclaimed": "noonewouldeverusethis7" 162 | }, 163 | "Badoo": { 164 | "errorType": "status_code", 165 | "rank": 0, 166 | "url": "https://badoo.com/profile/{}", 167 | "urlMain": "https://badoo.com/", 168 | "username_claimed": "blue", 169 | "username_unclaimed": "noonewouldeverusethis7" 170 | }, 171 | "Bandcamp": { 172 | "errorType": "status_code", 173 | "rank": 0, 174 | "url": "https://www.bandcamp.com/{}", 175 | "urlMain": "https://www.bandcamp.com/", 176 | "username_claimed": "blue", 177 | "username_unclaimed": "noonewouldeverusethis7" 178 | }, 179 | "Bazar.cz": { 180 | "errorType": "response_url", 181 | "errorUrl": "https://www.bazar.cz/error404.aspx", 182 | "rank": 0, 183 | "url": "https://www.bazar.cz/{}/", 184 | "urlMain": "https://www.bazar.cz/", 185 | "username_claimed": "pianina", 186 | "username_unclaimed": "noonewouldeverusethis" 187 | }, 188 | "Behance": { 189 | "errorType": "status_code", 190 | "rank": 0, 191 | "url": "https://www.behance.net/{}", 192 | "urlMain": "https://www.behance.net/", 193 | "username_claimed": "blue", 194 | "username_unclaimed": "noonewouldeverusethis7" 195 | }, 196 | "BitBucket": { 197 | "errorType": "status_code", 198 | "rank": 0, 199 | "url": "https://bitbucket.org/{}/", 200 | "urlMain": "https://bitbucket.org/", 201 | "username_claimed": "white", 202 | "username_unclaimed": "noonewouldeverusethis7" 203 | }, 204 | "BitCoinForum": { 205 | "errorMsg": "The user whose profile you are trying to view does not exist.", 206 | "errorType": "message", 207 | "rank": 0, 208 | "url": "https://bitcoinforum.com/profile/{}", 209 | "urlMain": "https://bitcoinforum.com", 210 | "username_claimed": "bitcoinforum.com", 211 | "username_unclaimed": "noonewouldeverusethis7" 212 | }, 213 | "Blogger": { 214 | "errorType": "status_code", 215 | "rank": 0, 216 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", 217 | "url": "https://{}.blogspot.com", 218 | "urlMain": "https://www.blogger.com/", 219 | "username_claimed": "blue", 220 | "username_unclaimed": "noonewouldeverusethis7" 221 | }, 222 | "BodyBuilding": { 223 | "errorType": "response_url", 224 | "errorUrl": "https://bodyspace.bodybuilding.com/", 225 | "rank": 0, 226 | "url": "https://bodyspace.bodybuilding.com/{}", 227 | "urlMain": "https://bodyspace.bodybuilding.com/", 228 | "username_claimed": "blue", 229 | "username_unclaimed": "noonewouldeverusethis7" 230 | }, 231 | "Bookcrossing": { 232 | "errorType": "status_code", 233 | "rank": 0, 234 | "url": "https://www.bookcrossing.com/mybookshelf/{}/", 235 | "urlMain": "https://www.bookcrossing.com/", 236 | "username_claimed": "blue", 237 | "username_unclaimed": "noonewouldeverusethis" 238 | }, 239 | "BuyMeACoffee": { 240 | "errorType": "status_code", 241 | "rank": 0, 242 | "url": "https://buymeacoff.ee/{}", 243 | "urlMain": "https://www.buymeacoffee.com/", 244 | "urlProbe": "https://www.buymeacoffee.com/{}", 245 | "username_claimed": "red", 246 | "username_unclaimed": "noonewouldeverusethis7" 247 | }, 248 | "BuzzFeed": { 249 | "errorType": "status_code", 250 | "rank": 0, 251 | "url": "https://buzzfeed.com/{}", 252 | "urlMain": "https://buzzfeed.com/", 253 | "username_claimed": "blue", 254 | "username_unclaimed": "xgtrq" 255 | }, 256 | "CNET": { 257 | "errorType": "status_code", 258 | "rank": 0, 259 | "url": "https://www.cnet.com/profiles/{}/", 260 | "urlMain": "https://www.cnet.com/", 261 | "username_claimed": "blue", 262 | "username_unclaimed": "noonewouldeverusethis" 263 | }, 264 | "Carbonmade": { 265 | "errorType": "response_url", 266 | "errorUrl": "https://carbonmade.com/fourohfour?domain={}.carbonmade.com", 267 | "rank": 0, 268 | "url": "https://{}.carbonmade.com", 269 | "urlMain": "https://carbonmade.com/", 270 | "username_claimed": "jenny", 271 | "username_unclaimed": "noonewouldeverusethis7" 272 | }, 273 | "Career.habr": { 274 | "errorMsg": "

\u041e\u0448\u0438\u0431\u043a\u0430 404

", 275 | "errorType": "message", 276 | "rank": 0, 277 | "url": "https://career.habr.com/{}", 278 | "urlMain": "https://career.habr.com/", 279 | "username_claimed": "blue", 280 | "username_unclaimed": "noonewouldeverusethis7" 281 | }, 282 | "CashMe": { 283 | "errorType": "status_code", 284 | "rank": 0, 285 | "url": "https://cash.me/${}", 286 | "urlMain": "https://cash.me/", 287 | "username_claimed": "Jenny", 288 | "username_unclaimed": "noonewouldeverusethis7" 289 | }, 290 | "Cent": { 291 | "errorMsg": "Cent", 292 | "errorType": "message", 293 | "rank": 0, 294 | "url": "https://beta.cent.co/@{}", 295 | "urlMain": "https://cent.co/", 296 | "username_claimed": "blue", 297 | "username_unclaimed": "noonewouldeverusethis7" 298 | }, 299 | "Championat": { 300 | "errorType": "status_code", 301 | "rank": 0, 302 | "url": "https://www.championat.com/user/{}", 303 | "urlMain": "https://www.championat.com/", 304 | "username_claimed": "blue", 305 | "username_unclaimed": "noonewouldeverusethis7" 306 | }, 307 | "Chatujme.cz": { 308 | "errorMsg": "Neexistujic\u00ed profil", 309 | "errorType": "message", 310 | "rank": 0, 311 | "url": "https://profil.chatujme.cz/{}", 312 | "urlMain": "https://chatujme.cz/", 313 | "username_claimed": "david", 314 | "username_unclaimed": "noonewouldeverusethis" 315 | }, 316 | "Chess": { 317 | "errorMsg": "Missing page... somebody made a wrong move.", 318 | "errorType": "message", 319 | "rank": 0, 320 | "url": "https://www.chess.com/ru/member/{}", 321 | "urlMain": "https://www.chess.com/ru/", 322 | "username_claimed": "blue", 323 | "username_unclaimed": "noonewouldeverusethis7" 324 | }, 325 | "Cloob": { 326 | "errorType": "status_code", 327 | "rank": 0, 328 | "url": "https://www.cloob.com/name/{}", 329 | "urlMain": "https://www.cloob.com/", 330 | "username_claimed": "blue", 331 | "username_unclaimed": "noonewouldeverusethis7" 332 | }, 333 | "CloudflareCommunity": { 334 | "errorType": "status_code", 335 | "rank": 0, 336 | "url": "https://community.cloudflare.com/u/{}", 337 | "urlMain": "https://community.cloudflare.com/", 338 | "username_claimed": "blue", 339 | "username_unclaimed": "noonewouldeverusethis" 340 | }, 341 | "Clozemaster": { 342 | "errorType": "status_code", 343 | "rank": 0, 344 | "url": "https://www.clozemaster.com/players/{}", 345 | "urlMain": "https://www.clozemaster.com", 346 | "username_claimed": "green", 347 | "username_unclaimed": "noonewouldeverusethis7" 348 | }, 349 | "Codecademy": { 350 | "errorType": "status_code", 351 | "rank": 0, 352 | "url": "https://www.codecademy.com/profiles/{}", 353 | "urlMain": "https://www.codecademy.com/", 354 | "username_claimed": "blue", 355 | "username_unclaimed": "noonewouldeverusethis7" 356 | }, 357 | "Codechef": { 358 | "errorType": "response_url", 359 | "errorUrl": "https://www.codechef.com/", 360 | "rank": 0, 361 | "url": "https://www.codechef.com/users/{}", 362 | "urlMain": "https://www.codechef.com/", 363 | "username_claimed": "blue", 364 | "username_unclaimed": "noonewouldeverusethis7" 365 | }, 366 | "Coderwall": { 367 | "errorMsg": "404! Our feels when that url is used", 368 | "errorType": "message", 369 | "rank": 0, 370 | "url": "https://coderwall.com/{}", 371 | "urlMain": "https://coderwall.com/", 372 | "username_claimed": "jenny", 373 | "username_unclaimed": "noonewouldeverusethis7" 374 | }, 375 | "Codewars": { 376 | "errorType": "status_code", 377 | "rank": 0, 378 | "url": "https://www.codewars.com/users/{}", 379 | "urlMain": "https://www.codewars.com", 380 | "username_claimed": "example", 381 | "username_unclaimed": "noonewouldeverusethis7" 382 | }, 383 | "Contently": { 384 | "errorMsg": "We can't find that page!", 385 | "errorType": "message", 386 | "rank": 0, 387 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", 388 | "url": "https://{}.contently.com/", 389 | "urlMain": "https://contently.com/", 390 | "username_claimed": "jordanteicher", 391 | "username_unclaimed": "noonewouldeverusethis7" 392 | }, 393 | "Coroflot": { 394 | "errorType": "status_code", 395 | "rank": 0, 396 | "url": "https://www.coroflot.com/{}", 397 | "urlMain": "https://coroflot.com/", 398 | "username_claimed": "blue", 399 | "username_unclaimed": "noonewouldeverusethis7" 400 | }, 401 | "Cracked": { 402 | "errorType": "response_url", 403 | "errorUrl": "https://www.cracked.com/", 404 | "rank": 0, 405 | "url": "https://www.cracked.com/members/{}/", 406 | "urlMain": "https://www.cracked.com/", 407 | "username_claimed": "blue", 408 | "username_unclaimed": "noonewouldeverusethis" 409 | }, 410 | "CreativeMarket": { 411 | "errorType": "response_url", 412 | "errorUrl": "https://www.creativemarket.com/", 413 | "rank": 0, 414 | "url": "https://creativemarket.com/users/{}", 415 | "urlMain": "https://creativemarket.com/", 416 | "username_claimed": "blue", 417 | "username_unclaimed": "noonewouldeverusethis7" 418 | }, 419 | "Crevado": { 420 | "errorType": "status_code", 421 | "rank": 0, 422 | "url": "https://{}.crevado.com", 423 | "urlMain": "https://crevado.com/", 424 | "username_claimed": "blue", 425 | "username_unclaimed": "noonewouldeverusethis7" 426 | }, 427 | "Crunchyroll": { 428 | "errorType": "status_code", 429 | "rank": 0, 430 | "url": "https://www.crunchyroll.com/user/{}", 431 | "urlMain": "https://www.crunchyroll.com/", 432 | "username_claimed": "blue", 433 | "username_unclaimed": "noonewouldeverusethis7" 434 | }, 435 | "DEV Community": { 436 | "errorType": "status_code", 437 | "rank": 0, 438 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", 439 | "url": "https://dev.to/{}", 440 | "urlMain": "https://dev.to/", 441 | "username_claimed": "blue", 442 | "username_unclaimed": "noonewouldeverusethis7" 443 | }, 444 | "DailyMotion": { 445 | "errorType": "status_code", 446 | "rank": 0, 447 | "url": "https://www.dailymotion.com/{}", 448 | "urlMain": "https://www.dailymotion.com/", 449 | "username_claimed": "blue", 450 | "username_unclaimed": "noonewouldeverusethis7" 451 | }, 452 | "Designspiration": { 453 | "errorType": "status_code", 454 | "rank": 0, 455 | "url": "https://www.designspiration.net/{}/", 456 | "urlMain": "https://www.designspiration.net/", 457 | "username_claimed": "blue", 458 | "username_unclaimed": "noonewouldeverusethis7" 459 | }, 460 | "DeviantART": { 461 | "errorType": "status_code", 462 | "rank": 0, 463 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", 464 | "url": "https://{}.deviantart.com", 465 | "urlMain": "https://deviantart.com", 466 | "username_claimed": "blue", 467 | "username_unclaimed": "noonewouldeverusethis7" 468 | }, 469 | "Discogs": { 470 | "errorType": "status_code", 471 | "rank": 0, 472 | "url": "https://www.discogs.com/user/{}", 473 | "urlMain": "https://www.discogs.com/", 474 | "username_claimed": "blue", 475 | "username_unclaimed": "noonewouldeverusethis7" 476 | }, 477 | "Discuss.Elastic.co": { 478 | "errorType": "status_code", 479 | "rank": 0, 480 | "url": "https://discuss.elastic.co/u/{}", 481 | "urlMain": "https://discuss.elastic.co/", 482 | "username_claimed": "blue", 483 | "username_unclaimed": "noonewouldeverusethis7" 484 | }, 485 | "Disqus": { 486 | "errorType": "status_code", 487 | "rank": 0, 488 | "url": "https://disqus.com/{}", 489 | "urlMain": "https://disqus.com/", 490 | "username_claimed": "blue", 491 | "username_unclaimed": "noonewouldeverusethis7" 492 | }, 493 | "Docker Hub": { 494 | "errorType": "status_code", 495 | "rank": 0, 496 | "url": "https://hub.docker.com/u/{}/", 497 | "urlMain": "https://hub.docker.com/", 498 | "urlProbe": "https://hub.docker.com/v2/users/{}/", 499 | "username_claimed": "blue", 500 | "username_unclaimed": "noonewouldeverusethis7" 501 | }, 502 | "Dribbble": { 503 | "errorMsg": "Whoops, that page is gone.", 504 | "errorType": "message", 505 | "rank": 0, 506 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", 507 | "url": "https://dribbble.com/{}", 508 | "urlMain": "https://dribbble.com/", 509 | "username_claimed": "blue", 510 | "username_unclaimed": "noonewouldeverusethis7" 511 | }, 512 | "Duolingo": { 513 | "errorMsg": "{\"users\":[]}", 514 | "errorType": "message", 515 | "rank": 0, 516 | "url": "https://www.duolingo.com/profile/{}", 517 | "urlMain": "https://duolingo.com/", 518 | "urlProbe": "https://www.duolingo.com/2017-06-30/users?username={}", 519 | "username_claimed": "blue", 520 | "username_unclaimed": "noonewouldeverusethis7" 521 | }, 522 | "Ebay": { 523 | "errorMsg": "The User ID you entered was not found", 524 | "errorType": "message", 525 | "rank": 0, 526 | "url": "https://www.ebay.com/usr/{}", 527 | "urlMain": "https://www.ebay.com/", 528 | "username_claimed": "blue", 529 | "username_unclaimed": "noonewouldeverusethis7" 530 | }, 531 | "Ello": { 532 | "errorMsg": "We couldn't find the page you're looking for", 533 | "errorType": "message", 534 | "rank": 0, 535 | "url": "https://ello.co/{}", 536 | "urlMain": "https://ello.co/", 537 | "username_claimed": "blue", 538 | "username_unclaimed": "noonewouldeverusethis7" 539 | }, 540 | "Etsy": { 541 | "errorType": "status_code", 542 | "rank": 0, 543 | "url": "https://www.etsy.com/shop/{}", 544 | "urlMain": "https://www.etsy.com/", 545 | "username_claimed": "JennyKrafts", 546 | "username_unclaimed": "noonewouldeverusethis7" 547 | }, 548 | "Euw": { 549 | "errorMsg": "This summoner is not registered at OP.GG. Please check spelling.", 550 | "errorType": "message", 551 | "rank": 0, 552 | "url": "https://euw.op.gg/summoner/userName={}", 553 | "urlMain": "https://euw.op.gg/", 554 | "username_claimed": "blue", 555 | "username_unclaimed": "noonewouldeverusethis7" 556 | }, 557 | "EyeEm": { 558 | "errorType": "response_url", 559 | "errorUrl": "https://www.eyeem.com/", 560 | "rank": 0, 561 | "url": "https://www.eyeem.com/u/{}", 562 | "urlMain": "https://www.eyeem.com/", 563 | "username_claimed": "blue", 564 | "username_unclaimed": "noonewouldeverusethis7" 565 | }, 566 | "Facebook": { 567 | "errorType": "status_code", 568 | "rank": 0, 569 | "regexCheck": "^[a-zA-Z0-9\\.]{3,49}(?", 654 | "errorType": "message", 655 | "rank": 0, 656 | "url": "https://freelance.habr.com/freelancers/{}", 657 | "urlMain": "https://freelance.habr.com/", 658 | "username_claimed": "adam", 659 | "username_unclaimed": "noonewouldeverusethis7" 660 | }, 661 | "Freelancer.com": { 662 | "errorMsg": "\"users\":{}", 663 | "errorType": "message", 664 | "rank": 0, 665 | "url": "https://www.freelancer.com/api/users/0.1/users?usernames%5B%5D={}&compact=true", 666 | "urlMain": "https://www.freelancer.com/", 667 | "username_claimed": "red0xff", 668 | "username_unclaimed": "noonewouldeverusethis" 669 | }, 670 | "Freesound": { 671 | "errorType": "status_code", 672 | "rank": 0, 673 | "url": "https://freesound.org/people/{}/", 674 | "urlMain": "https://freesound.org/", 675 | "username_claimed": "blue", 676 | "username_unclaimed": "noonewouldeverusethis" 677 | }, 678 | "GDProfiles": { 679 | "errorType": "status_code", 680 | "rank": 0, 681 | "url": "https://gdprofiles.com/{}", 682 | "urlMain": "https://gdprofiles.com/", 683 | "username_claimed": "blue", 684 | "username_unclaimed": "noonewouldeverusethis" 685 | }, 686 | "Gamespot": { 687 | "errorType": "status_code", 688 | "rank": 0, 689 | "url": "https://www.gamespot.com/profile/{}/", 690 | "urlMain": "https://www.gamespot.com/", 691 | "username_claimed": "blue", 692 | "username_unclaimed": "noonewouldeverusethis" 693 | }, 694 | "Giphy": { 695 | "errorType": "status_code", 696 | "rank": 0, 697 | "url": "https://giphy.com/{}", 698 | "urlMain": "https://giphy.com/", 699 | "username_claimed": "blue", 700 | "username_unclaimed": "noonewouldeverusethis7" 701 | }, 702 | "GitHub": { 703 | "errorType": "status_code", 704 | "rank": 0, 705 | "regexCheck": "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$", 706 | "url": "https://www.github.com/{}", 707 | "urlMain": "https://www.github.com/", 708 | "username_claimed": "blue", 709 | "username_unclaimed": "noonewouldeverusethis7" 710 | }, 711 | "GitLab": { 712 | "errorMsg": "[]", 713 | "errorType": "message", 714 | "rank": 0, 715 | "url": "https://gitlab.com/{}", 716 | "urlMain": "https://gitlab.com/", 717 | "urlProbe": "https://gitlab.com/api/v4/users?username={}", 718 | "username_claimed": "blue", 719 | "username_unclaimed": "noonewouldeverusethis7" 720 | }, 721 | "Gitee": { 722 | "errorType": "status_code", 723 | "rank": 0, 724 | "url": "https://gitee.com/{}", 725 | "urlMain": "https://gitee.com/", 726 | "username_claimed": "wizzer", 727 | "username_unclaimed": "noonewouldeverusethis7" 728 | }, 729 | "GoodReads": { 730 | "errorType": "status_code", 731 | "rank": 0, 732 | "url": "https://www.goodreads.com/{}", 733 | "urlMain": "https://www.goodreads.com/", 734 | "username_claimed": "blue", 735 | "username_unclaimed": "noonewouldeverusethis7" 736 | }, 737 | "Gravatar": { 738 | "errorType": "status_code", 739 | "rank": 0, 740 | "url": "http://en.gravatar.com/{}", 741 | "urlMain": "http://en.gravatar.com/", 742 | "username_claimed": "blue", 743 | "username_unclaimed": "noonewouldeverusethis7" 744 | }, 745 | "Gumroad": { 746 | "errorMsg": "Page not found.", 747 | "errorType": "message", 748 | "rank": 0, 749 | "url": "https://www.gumroad.com/{}", 750 | "urlMain": "https://www.gumroad.com/", 751 | "username_claimed": "blue", 752 | "username_unclaimed": "noonewouldeverusethis7" 753 | }, 754 | "GunsAndAmmo": { 755 | "errorType": "status_code", 756 | "rank": 0, 757 | "url": "https://forums.gunsandammo.com/profile/{}", 758 | "urlMain": "https://gunsandammo.com/", 759 | "username_claimed": "adam", 760 | "username_unclaimed": "noonewouldeverusethis7" 761 | }, 762 | "GuruShots": { 763 | "errorType": "status_code", 764 | "rank": 0, 765 | "url": "https://gurushots.com/{}/photos", 766 | "urlMain": "https://gurushots.com/", 767 | "username_claimed": "blue", 768 | "username_unclaimed": "noonewouldeverusethis7" 769 | }, 770 | "HackTheBox": { 771 | "errorType": "status_code", 772 | "rank": 0, 773 | "url": "https://forum.hackthebox.eu/profile/{}", 774 | "urlMain": "https://forum.hackthebox.eu/", 775 | "username_claimed": "angar", 776 | "username_unclaimed": "noonewouldeverusethis" 777 | }, 778 | "HackerNews": { 779 | "errorMsg": "No such user.", 780 | "errorType": "message", 781 | "rank": 0, 782 | "url": "https://news.ycombinator.com/user?id={}", 783 | "urlMain": "https://news.ycombinator.com/", 784 | "username_claimed": "blue", 785 | "username_unclaimed": "noonewouldeverusethis7" 786 | }, 787 | "HackerOne": { 788 | "errorMsg": "Page not found", 789 | "errorType": "message", 790 | "rank": 0, 791 | "url": "https://hackerone.com/{}", 792 | "urlMain": "https://hackerone.com/", 793 | "username_claimed": "blue", 794 | "username_unclaimed": "noonewouldeverusethis7" 795 | }, 796 | "HackerRank": { 797 | "errorMsg": "Something went wrong", 798 | "errorType": "message", 799 | "rank": 0, 800 | "url": "https://hackerrank.com/{}", 801 | "urlMain": "https://hackerrank.com/", 802 | "username_claimed": "satznova", 803 | "username_unclaimed": "noonewouldeverusethis7" 804 | }, 805 | "House-Mixes.com": { 806 | "errorMsg": "Profile Not Found", 807 | "errorType": "message", 808 | "rank": 0, 809 | "regexCheck": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$", 810 | "url": "https://www.house-mixes.com/profile/{}", 811 | "urlMain": "https://www.house-mixes.com/", 812 | "username_claimed": "blue", 813 | "username_unclaimed": "noonewouldeverusethis7" 814 | }, 815 | "Houzz": { 816 | "errorMsg": "The page you requested was not found.", 817 | "errorType": "message", 818 | "rank": 0, 819 | "url": "https://houzz.com/user/{}", 820 | "urlMain": "https://houzz.com/", 821 | "username_claimed": "blue", 822 | "username_unclaimed": "noonewouldeverusethis7" 823 | }, 824 | "HubPages": { 825 | "errorType": "status_code", 826 | "rank": 0, 827 | "url": "https://hubpages.com/@{}", 828 | "urlMain": "https://hubpages.com/", 829 | "username_claimed": "blue", 830 | "username_unclaimed": "noonewouldeverusethis" 831 | }, 832 | "Hubski": { 833 | "errorMsg": "No such user", 834 | "errorType": "message", 835 | "rank": 0, 836 | "url": "https://hubski.com/user/{}", 837 | "urlMain": "https://hubski.com/", 838 | "username_claimed": "blue", 839 | "username_unclaimed": "noonewouldeverusethis7" 840 | }, 841 | "IFTTT": { 842 | "errorMsg": "The requested page or file does not exist", 843 | "errorType": "message", 844 | "rank": 0, 845 | "regexCheck": "^[A-Za-z0-9]{3,35}$", 846 | "url": "https://www.ifttt.com/p/{}", 847 | "urlMain": "https://www.ifttt.com/", 848 | "username_claimed": "blue", 849 | "username_unclaimed": "noonewouldeverusethis7" 850 | }, 851 | "ImageShack": { 852 | "errorType": "response_url", 853 | "errorUrl": "https://imageshack.us/", 854 | "rank": 0, 855 | "url": "https://imageshack.us/user/{}", 856 | "urlMain": "https://imageshack.us/", 857 | "username_claimed": "blue", 858 | "username_unclaimed": "noonewouldeverusethis7" 859 | }, 860 | "ImgUp.cz": { 861 | "errorType": "status_code", 862 | "rank": 0, 863 | "url": "https://imgup.cz/{}", 864 | "urlMain": "https://imgup.cz/", 865 | "username_claimed": "adam", 866 | "username_unclaimed": "noonewouldeverusethis" 867 | }, 868 | "Instagram": { 869 | "errorType": "status_code", 870 | "rank": 0, 871 | "request_head_only": false, 872 | "url": "https://www.instagram.com/{}", 873 | "urlMain": "https://www.instagram.com/", 874 | "username_claimed": "blue", 875 | "username_unclaimed": "noonewouldeverusethis7" 876 | }, 877 | "Instructables": { 878 | "errorMsg": "404: We're sorry, things break sometimes", 879 | "errorType": "message", 880 | "rank": 0, 881 | "url": "https://www.instructables.com/member/{}", 882 | "urlMain": "https://www.instructables.com/", 883 | "username_claimed": "blue", 884 | "username_unclaimed": "noonewouldeverusethis7" 885 | }, 886 | "Issuu": { 887 | "errorType": "status_code", 888 | "rank": 0, 889 | "url": "https://issuu.com/{}", 890 | "urlMain": "https://issuu.com/", 891 | "username_claimed": "jenny", 892 | "username_unclaimed": "noonewouldeverusethis7" 893 | }, 894 | "Itch.io": { 895 | "errorType": "status_code", 896 | "rank": 0, 897 | "url": "https://{}.itch.io/", 898 | "urlMain": "https://itch.io/", 899 | "username_claimed": "blue", 900 | "username_unclaimed": "noonewouldeverusethis7" 901 | }, 902 | "Jimdo": { 903 | "errorType": "status_code", 904 | "noPeriod": "True", 905 | "rank": 0, 906 | "url": "https://{}.jimdosite.com", 907 | "urlMain": "https://jimdosite.com/", 908 | "username_claimed": "jenny", 909 | "username_unclaimed": "noonewouldeverusethis7" 910 | }, 911 | "Kaggle": { 912 | "errorType": "status_code", 913 | "rank": 0, 914 | "url": "https://www.kaggle.com/{}", 915 | "urlMain": "https://www.kaggle.com/", 916 | "username_claimed": "dansbecker", 917 | "username_unclaimed": "noonewouldeverusethis7" 918 | }, 919 | "Kali community": { 920 | "errorMsg": "This user has not registered and therefore does not have a profile to view.", 921 | "errorType": "message", 922 | "rank": 0, 923 | "url": "https://forums.kali.org/member.php?username={}", 924 | "urlMain": "https://forums.kali.org/", 925 | "username_claimed": "blue", 926 | "username_unclaimed": "noonewouldeverusethis7" 927 | }, 928 | "KanoWorld": { 929 | "errorType": "status_code", 930 | "rank": 0, 931 | "url": "https://api.kano.me/progress/user/{}", 932 | "urlMain": "https://world.kano.me/", 933 | "username_claimed": "blue", 934 | "username_unclaimed": "noonewouldeverusethis7" 935 | }, 936 | "Keybase": { 937 | "errorType": "status_code", 938 | "rank": 0, 939 | "url": "https://keybase.io/{}", 940 | "urlMain": "https://keybase.io/", 941 | "username_claimed": "blue", 942 | "username_unclaimed": "noonewouldeverusethis7" 943 | }, 944 | "Kik": { 945 | "errorMsg": "The page you requested was not found", 946 | "errorType": "message", 947 | "rank": 0, 948 | "url": "https://ws2.kik.com/user/{}", 949 | "urlMain": "http://kik.me/", 950 | "username_claimed": "blue", 951 | "username_unclaimed": "noonewouldeverusethis7" 952 | }, 953 | "Kongregate": { 954 | "errorMsg": "Sorry, no account with that name was found.", 955 | "errorType": "message", 956 | "rank": 0, 957 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", 958 | "url": "https://www.kongregate.com/accounts/{}", 959 | "urlMain": "https://www.kongregate.com/", 960 | "username_claimed": "blue", 961 | "username_unclaimed": "noonewouldeverusethis7" 962 | }, 963 | "LOR": { 964 | "errorType": "status_code", 965 | "rank": 0, 966 | "url": "https://www.linux.org.ru/people/{}/profile", 967 | "urlMain": "https://linux.org.ru/", 968 | "username_claimed": "red", 969 | "username_unclaimed": "noonewouldeverusethis7" 970 | }, 971 | "Launchpad": { 972 | "errorType": "status_code", 973 | "rank": 0, 974 | "url": "https://launchpad.net/~{}", 975 | "urlMain": "https://launchpad.net/", 976 | "username_claimed": "blue", 977 | "username_unclaimed": "noonewouldeverusethis7" 978 | }, 979 | "LeetCode": { 980 | "errorType": "status_code", 981 | "rank": 0, 982 | "url": "https://leetcode.com/{}", 983 | "urlMain": "https://leetcode.com/", 984 | "username_claimed": "blue", 985 | "username_unclaimed": "noonewouldeverusethis7" 986 | }, 987 | "Letterboxd": { 988 | "errorMsg": "Sorry, we can\u2019t find the page you\u2019ve requested.", 989 | "errorType": "message", 990 | "rank": 0, 991 | "url": "https://letterboxd.com/{}", 992 | "urlMain": "https://letterboxd.com/", 993 | "username_claimed": "blue", 994 | "username_unclaimed": "noonewouldeverusethis7" 995 | }, 996 | "Lichess": { 997 | "errorMsg": "Page not found!", 998 | "errorType": "message", 999 | "rank": 0, 1000 | "url": "https://lichess.org/@/{}", 1001 | "urlMain": "https://lichess.org", 1002 | "username_claimed": "blue", 1003 | "username_unclaimed": "noonewouldeverusethis7" 1004 | }, 1005 | "LiveJournal": { 1006 | "errorType": "status_code", 1007 | "rank": 0, 1008 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", 1009 | "url": "https://{}.livejournal.com", 1010 | "urlMain": "https://www.livejournal.com/", 1011 | "username_claimed": "blue", 1012 | "username_unclaimed": "noonewouldeverusethis7" 1013 | }, 1014 | "Lobsters": { 1015 | "errorType": "status_code", 1016 | "rank": 0, 1017 | "regexCheck": "[A-Za-z0-9][A-Za-z0-9_-]{0,24}", 1018 | "url": "https://lobste.rs/u/{}", 1019 | "urlMain": "https://lobste.rs/", 1020 | "username_claimed": "jcs", 1021 | "username_unclaimed": "noonewouldeverusethis7" 1022 | }, 1023 | "Lolchess": { 1024 | "errorMsg": "No search results", 1025 | "errorType": "message", 1026 | "rank": 0, 1027 | "url": "https://lolchess.gg/profile/na/{}", 1028 | "urlMain": "https://lolchess.gg/", 1029 | "username_claimed": "blue", 1030 | "username_unclaimed": "noonewouldeverusethis7" 1031 | }, 1032 | "Medium": { 1033 | "errorType": "status_code", 1034 | "rank": 0, 1035 | "url": "https://medium.com/@{}", 1036 | "urlMain": "https://medium.com/", 1037 | "username_claimed": "blue", 1038 | "username_unclaimed": "noonewouldeverusethis7" 1039 | }, 1040 | "MeetMe": { 1041 | "errorType": "response_url", 1042 | "errorUrl": "https://www.meetme.com/", 1043 | "rank": 0, 1044 | "url": "https://www.meetme.com/{}", 1045 | "urlMain": "https://www.meetme.com/", 1046 | "username_claimed": "blue", 1047 | "username_unclaimed": "noonewouldeverusethis7" 1048 | }, 1049 | "Memrise": { 1050 | "errorType": "response_url", 1051 | "errorUrl": "https://www.memrise.com/", 1052 | "rank": 0, 1053 | "url": "https://www.memrise.com/user/{}/", 1054 | "urlMain": "https://www.memrise.com/", 1055 | "username_claimed": "blue", 1056 | "username_unclaimed": "noonewouldeverusethis7" 1057 | }, 1058 | "MixCloud": { 1059 | "errorType": "status_code", 1060 | "rank": 0, 1061 | "url": "https://www.mixcloud.com/{}/", 1062 | "urlMain": "https://www.mixcloud.com/", 1063 | "urlProbe": "https://api.mixcloud.com/{}/", 1064 | "username_claimed": "jenny", 1065 | "username_unclaimed": "noonewouldeverusethis7" 1066 | }, 1067 | "MyAnimeList": { 1068 | "errorType": "status_code", 1069 | "rank": 0, 1070 | "url": "https://myanimelist.net/profile/{}", 1071 | "urlMain": "https://myanimelist.net/", 1072 | "username_claimed": "blue", 1073 | "username_unclaimed": "noonewouldeverusethis7" 1074 | }, 1075 | "Myspace": { 1076 | "errorType": "status_code", 1077 | "rank": 0, 1078 | "url": "https://myspace.com/{}", 1079 | "urlMain": "https://myspace.com/", 1080 | "username_claimed": "blue", 1081 | "username_unclaimed": "noonewouldeverusethis7" 1082 | }, 1083 | "NICommunityForum": { 1084 | "errorMsg": "The specified member cannot be found", 1085 | "errorType": "message", 1086 | "rank": 0, 1087 | "url": "https://www.native-instruments.com/forum/members?username={}", 1088 | "urlMain": "https://www.native-instruments.com/forum/", 1089 | "username_claimed": "blue", 1090 | "username_unclaimed": "noonewouldeverusethis" 1091 | }, 1092 | "NPM": { 1093 | "errorType": "status_code", 1094 | "rank": 0, 1095 | "url": "https://www.npmjs.com/~{}", 1096 | "urlMain": "https://www.npmjs.com/", 1097 | "username_claimed": "kennethsweezy", 1098 | "username_unclaimed": "noonewould" 1099 | }, 1100 | "NPM-Package": { 1101 | "errorType": "status_code", 1102 | "rank": 0, 1103 | "url": "https://www.npmjs.com/package/{}", 1104 | "urlMain": "https://www.npmjs.com/", 1105 | "username_claimed": "blue", 1106 | "username_unclaimed": "noonewouldeverusethis7" 1107 | }, 1108 | "NameMC (Minecraft.net skins)": { 1109 | "errorMsg": "Profiles: 0 results", 1110 | "errorType": "message", 1111 | "rank": 0, 1112 | "url": "https://namemc.com/profile/{}", 1113 | "urlMain": "https://namemc.com/", 1114 | "username_claimed": "blue", 1115 | "username_unclaimed": "noonewouldeverusethis7" 1116 | }, 1117 | "NationStates Nation": { 1118 | "errorMsg": "Was this your nation? It may have ceased to exist due to inactivity, but can rise again!", 1119 | "errorType": "message", 1120 | "rank": 0, 1121 | "url": "https://nationstates.net/nation={}", 1122 | "urlMain": "https://nationstates.net", 1123 | "username_claimed": "the_holy_principality_of_saint_mark", 1124 | "username_unclaimed": "noonewould" 1125 | }, 1126 | "NationStates Region": { 1127 | "errorMsg": "does not exist.", 1128 | "errorType": "message", 1129 | "rank": 0, 1130 | "url": "https://nationstates.net/region={}", 1131 | "urlMain": "https://nationstates.net", 1132 | "username_claimed": "the_west_pacific", 1133 | "username_unclaimed": "noonewould" 1134 | }, 1135 | "Newgrounds": { 1136 | "errorType": "status_code", 1137 | "rank": 0, 1138 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", 1139 | "url": "https://{}.newgrounds.com", 1140 | "urlMain": "https://newgrounds.com", 1141 | "username_claimed": "blue", 1142 | "username_unclaimed": "noonewouldeverusethis7" 1143 | }, 1144 | "OK": { 1145 | "errorType": "status_code", 1146 | "rank": 0, 1147 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_.-]*$", 1148 | "url": "https://ok.ru/{}", 1149 | "urlMain": "https://ok.ru/", 1150 | "username_claimed": "ok", 1151 | "username_unclaimed": "noonewouldeverusethis7" 1152 | }, 1153 | "OpenCollective": { 1154 | "errorType": "status_code", 1155 | "rank": 0, 1156 | "url": "https://opencollective.com/{}", 1157 | "urlMain": "https://opencollective.com/", 1158 | "username_claimed": "sindresorhus", 1159 | "username_unclaimed": "noonewouldeverusethis7" 1160 | }, 1161 | "OpenStreetMap": { 1162 | "errorType": "status_code", 1163 | "rank": 0, 1164 | "url": "https://www.openstreetmap.org/user/{}", 1165 | "urlMain": "https://www.openstreetmap.org/", 1166 | "username_claimed": "blue", 1167 | "username_unclaimed": "noonewouldeverusethis7" 1168 | }, 1169 | "Oracle Community": { 1170 | "errorType": "status_code", 1171 | "rank": 0, 1172 | "url": "https://community.oracle.com/people/{}", 1173 | "urlMain": "https://community.oracle.com", 1174 | "username_claimed": "blue", 1175 | "username_unclaimed": "noonewouldeverusethis7" 1176 | }, 1177 | "Otzovik": { 1178 | "errorType": "status_code", 1179 | "rank": 0, 1180 | "url": "https://otzovik.com/profile/{}", 1181 | "urlMain": "https://otzovik.com/", 1182 | "username_claimed": "blue", 1183 | "username_unclaimed": "noonewouldeverusethis7" 1184 | }, 1185 | "OurDJTalk": { 1186 | "errorMsg": "The specified member cannot be found", 1187 | "errorType": "message", 1188 | "rank": 0, 1189 | "url": "https://ourdjtalk.com/members?username={}", 1190 | "urlMain": "https://ourdjtalk.com/", 1191 | "username_claimed": "steve", 1192 | "username_unclaimed": "noonewouldeverusethis" 1193 | }, 1194 | "PCGamer": { 1195 | "errorMsg": "The specified member cannot be found. Please enter a member's entire name.", 1196 | "errorType": "message", 1197 | "rank": 0, 1198 | "url": "https://forums.pcgamer.com/members/?username={}", 1199 | "urlMain": "https://pcgamer.com", 1200 | "username_claimed": "admin", 1201 | "username_unclaimed": "noonewouldeverusethis7" 1202 | }, 1203 | "PCPartPicker": { 1204 | "errorType": "status_code", 1205 | "rank": 0, 1206 | "url": "https://pcpartpicker.com/user/{}", 1207 | "urlMain": "https://pcpartpicker.com", 1208 | "username_claimed": "blue", 1209 | "username_unclaimed": "noonewouldeverusethis7" 1210 | }, 1211 | "PSNProfiles.com": { 1212 | "errorType": "response_url", 1213 | "errorUrl": "https://psnprofiles.com/?psnId={}", 1214 | "rank": 0, 1215 | "url": "https://psnprofiles.com/{}", 1216 | "urlMain": "https://psnprofiles.com/", 1217 | "username_claimed": "blue", 1218 | "username_unclaimed": "noonewouldeverusethis" 1219 | }, 1220 | "Packagist": { 1221 | "errorType": "response_url", 1222 | "errorUrl": "https://packagist.org/search/?q={}&reason=vendor_not_found", 1223 | "rank": 0, 1224 | "url": "https://packagist.org/packages/{}/", 1225 | "urlMain": "https://packagist.org/", 1226 | "username_claimed": "psr", 1227 | "username_unclaimed": "noonewouldeverusethis7" 1228 | }, 1229 | "Pastebin": { 1230 | "errorType": "response_url", 1231 | "errorUrl": "https://pastebin.com/index", 1232 | "rank": 0, 1233 | "url": "https://pastebin.com/u/{}", 1234 | "urlMain": "https://pastebin.com/", 1235 | "username_claimed": "blue", 1236 | "username_unclaimed": "noonewouldeverusethis7" 1237 | }, 1238 | "Patreon": { 1239 | "errorType": "status_code", 1240 | "rank": 0, 1241 | "url": "https://www.patreon.com/{}", 1242 | "urlMain": "https://www.patreon.com/", 1243 | "username_claimed": "blue", 1244 | "username_unclaimed": "noonewouldeverusethis7" 1245 | }, 1246 | "Periscope": { 1247 | "errorType": "status_code", 1248 | "rank": 0, 1249 | "url": "https://www.periscope.tv/{}/", 1250 | "urlMain": "https://www.periscope.tv/", 1251 | "username_claimed": "blue", 1252 | "username_unclaimed": "noonewouldeverusethis7" 1253 | }, 1254 | "Photobucket": { 1255 | "errorType": "status_code", 1256 | "rank": 0, 1257 | "url": "https://photobucket.com/user/{}/library", 1258 | "urlMain": "https://photobucket.com/", 1259 | "username_claimed": "blue", 1260 | "username_unclaimed": "noonewouldeverusethis7" 1261 | }, 1262 | "Pinkbike": { 1263 | "errorType": "status_code", 1264 | "rank": 0, 1265 | "url": "https://www.pinkbike.com/u/{}/", 1266 | "urlMain": "https://www.pinkbike.com/", 1267 | "username_claimed": "blue", 1268 | "username_unclaimed": "noonewouldeverusethis7" 1269 | }, 1270 | "Pinterest": { 1271 | "errorType": "status_code", 1272 | "rank": 0, 1273 | "url": "https://www.pinterest.com/{}/", 1274 | "urlMain": "https://www.pinterest.com/", 1275 | "username_claimed": "blue", 1276 | "username_unclaimed": "noonewouldeverusethis7" 1277 | }, 1278 | "PlayStore": { 1279 | "errorType": "status_code", 1280 | "rank": 0, 1281 | "url": "https://play.google.com/store/apps/developer?id={}", 1282 | "urlMain": "https://play.google.com/store", 1283 | "username_claimed": "Facebook", 1284 | "username_unclaimed": "noonewouldeverusethis7" 1285 | }, 1286 | "Pling": { 1287 | "errorType": "response_url", 1288 | "errorUrl": "https://www.pling.com/", 1289 | "rank": 0, 1290 | "url": "https://www.pling.com/u/{}/", 1291 | "urlMain": "https://www.pling.com/", 1292 | "username_claimed": "blue", 1293 | "username_unclaimed": "noonewouldeverusethis" 1294 | }, 1295 | "Plug.DJ": { 1296 | "errorType": "status_code", 1297 | "rank": 0, 1298 | "url": "https://plug.dj/@/{}", 1299 | "urlMain": "https://plug.dj/", 1300 | "username_claimed": "plug-dj-rock", 1301 | "username_unclaimed": "noonewouldeverusethis7" 1302 | }, 1303 | "Pokemon Showdown": { 1304 | "errorType": "status_code", 1305 | "rank": 0, 1306 | "url": "https://pokemonshowdown.com/users/{}", 1307 | "urlMain": "https://pokemonshowdown.com", 1308 | "username_claimed": "blue", 1309 | "username_unclaimed": "noonewouldeverusethis7" 1310 | }, 1311 | "PokerStrategy": { 1312 | "errorType": "status_code", 1313 | "rank": 0, 1314 | "url": "http://www.pokerstrategy.net/user/{}/profile/", 1315 | "urlMain": "http://www.pokerstrategy.net", 1316 | "username_claimed": "blue", 1317 | "username_unclaimed": "noonewouldeverusethis7" 1318 | }, 1319 | "Polygon": { 1320 | "errorType": "status_code", 1321 | "rank": 0, 1322 | "url": "https://www.polygon.com/users/{}", 1323 | "urlMain": "https://www.polygon.com/", 1324 | "username_claimed": "swiftstickler", 1325 | "username_unclaimed": "noonewouldeverusethis7" 1326 | }, 1327 | "ProductHunt": { 1328 | "errorMsg": "Product Hunt is a curation of the best new products", 1329 | "errorType": "message", 1330 | "rank": 0, 1331 | "url": "https://www.producthunt.com/@{}", 1332 | "urlMain": "https://www.producthunt.com/", 1333 | "username_claimed": "jenny", 1334 | "username_unclaimed": "noonewouldeverusethis7" 1335 | }, 1336 | "PromoDJ": { 1337 | "errorType": "status_code", 1338 | "rank": 0, 1339 | "url": "http://promodj.com/{}", 1340 | "urlMain": "http://promodj.com/", 1341 | "username_claimed": "blue", 1342 | "username_unclaimed": "noonewouldeverusethis" 1343 | }, 1344 | "Quora": { 1345 | "errorType": "response_url", 1346 | "errorUrl": "https://www.quora.com/profile/{}", 1347 | "rank": 0, 1348 | "url": "https://www.quora.com/profile/{}", 1349 | "urlMain": "https://www.quora.com/", 1350 | "username_claimed": "Matt-Riggsby", 1351 | "username_unclaimed": "noonewouldeverusethis7" 1352 | }, 1353 | "Rajce.net": { 1354 | "errorType": "status_code", 1355 | "rank": 0, 1356 | "url": "https://{}.rajce.idnes.cz/", 1357 | "urlMain": "https://www.rajce.idnes.cz/", 1358 | "username_claimed": "blue", 1359 | "username_unclaimed": "noonewouldeverusethis7" 1360 | }, 1361 | "Rate Your Music": { 1362 | "errorType": "status_code", 1363 | "rank": 0, 1364 | "url": "https://rateyourmusic.com/~{}", 1365 | "urlMain": "https://rateyourmusic.com/", 1366 | "username_claimed": "blue", 1367 | "username_unclaimed": "noonewouldeverusethis7" 1368 | }, 1369 | "Realmeye": { 1370 | "errorMsg": "Sorry, but we either:", 1371 | "errorType": "message", 1372 | "rank": 0, 1373 | "url": "https://www.realmeye.com/player/{}", 1374 | "urlMain": "https://www.realmeye.com/", 1375 | "username_claimed": "blue", 1376 | "username_unclaimed": "noonewouldeverusethis7" 1377 | }, 1378 | "Redbubble": { 1379 | "errorType": "status_code", 1380 | "rank": 0, 1381 | "url": "https://www.redbubble.com/people/{}", 1382 | "urlMain": "https://www.redbubble.com/", 1383 | "username_claimed": "blue", 1384 | "username_unclaimed": "noonewouldeverusethis77777" 1385 | }, 1386 | "Reddit": { 1387 | "errorType": "status_code", 1388 | "rank": 0, 1389 | "url": "https://www.reddit.com/user/{}", 1390 | "urlMain": "https://www.reddit.com/", 1391 | "username_claimed": "blue", 1392 | "username_unclaimed": "noonewouldeverusethis7" 1393 | }, 1394 | "Repl.it": { 1395 | "errorMsg": "404", 1396 | "errorType": "message", 1397 | "rank": 0, 1398 | "url": "https://repl.it/@{}", 1399 | "urlMain": "https://repl.it/", 1400 | "username_claimed": "blue", 1401 | "username_unclaimed": "noonewouldeverusethis7" 1402 | }, 1403 | "ResearchGate": { 1404 | "errorType": "response_url", 1405 | "errorUrl": "https://www.researchgate.net/directory/profiles", 1406 | "rank": 0, 1407 | "regexCheck": "\\w+_\\w+", 1408 | "url": "https://www.researchgate.net/profile/{}", 1409 | "urlMain": "https://www.researchgate.net/", 1410 | "username_claimed": "John_Smith", 1411 | "username_unclaimed": "noonewould_everusethis7" 1412 | }, 1413 | "ReverbNation": { 1414 | "errorMsg": "Sorry, we couldn't find that page", 1415 | "errorType": "message", 1416 | "rank": 0, 1417 | "url": "https://www.reverbnation.com/{}", 1418 | "urlMain": "https://www.reverbnation.com/", 1419 | "username_claimed": "blue", 1420 | "username_unclaimed": "noonewouldeverusethis7" 1421 | }, 1422 | "Roblox": { 1423 | "errorMsg": "Page cannot be found or no longer exists", 1424 | "errorType": "message", 1425 | "rank": 0, 1426 | "url": "https://www.roblox.com/user.aspx?username={}", 1427 | "urlMain": "https://www.roblox.com/", 1428 | "username_claimed": "bluewolfekiller", 1429 | "username_unclaimed": "noonewouldeverusethis7" 1430 | }, 1431 | "RubyGems": { 1432 | "errorType": "status_code", 1433 | "rank": 0, 1434 | "url": "https://rubygems.org/profiles/{}", 1435 | "urlMain": "https://rubygems.org/", 1436 | "username_claimed": "blue", 1437 | "username_unclaimed": "noonewouldeverusethis7" 1438 | }, 1439 | "Sbazar.cz": { 1440 | "errorType": "status_code", 1441 | "rank": 0, 1442 | "url": "https://www.sbazar.cz/{}", 1443 | "urlMain": "https://www.sbazar.cz/", 1444 | "username_claimed": "blue", 1445 | "username_unclaimed": "noonewouldeverusethis" 1446 | }, 1447 | "Scratch": { 1448 | "errorType": "status_code", 1449 | "rank": 0, 1450 | "url": "https://scratch.mit.edu/users/{}", 1451 | "urlMain": "https://scratch.mit.edu/", 1452 | "username_claimed": "griffpatch", 1453 | "username_unclaimed": "noonewould" 1454 | }, 1455 | "Scribd": { 1456 | "errorMsg": "Page not found", 1457 | "errorType": "message", 1458 | "rank": 0, 1459 | "url": "https://www.scribd.com/{}", 1460 | "urlMain": "https://www.scribd.com/", 1461 | "username_claimed": "blue", 1462 | "username_unclaimed": "noonewouldeverusethis7" 1463 | }, 1464 | "ShitpostBot5000": { 1465 | "errorType": "status_code", 1466 | "rank": 0, 1467 | "url": "https://www.shitpostbot.com/user/{}", 1468 | "urlMain": "https://www.shitpostbot.com/", 1469 | "username_claimed": "blue", 1470 | "username_unclaimed": "noonewouldeverusethis" 1471 | }, 1472 | "Signal": { 1473 | "errorMsg": "Oops! That page doesn\u2019t exist or is private.", 1474 | "errorType": "message", 1475 | "rank": 0, 1476 | "url": "https://community.signalusers.org/u/{}", 1477 | "urlMain": "https://community.signalusers.org", 1478 | "username_claimed": "jlund", 1479 | "username_unclaimed": "noonewouldeverusethis7" 1480 | }, 1481 | "Slack": { 1482 | "errorType": "status_code", 1483 | "rank": 0, 1484 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", 1485 | "url": "https://{}.slack.com", 1486 | "urlMain": "https://slack.com", 1487 | "username_claimed": "blue", 1488 | "username_unclaimed": "noonewouldeverusethis7" 1489 | }, 1490 | "SlideShare": { 1491 | "errorType": "status_code", 1492 | "rank": 0, 1493 | "url": "https://slideshare.net/{}", 1494 | "urlMain": "https://slideshare.net/", 1495 | "username_claimed": "blue", 1496 | "username_unclaimed": "noonewouldeverusethis7" 1497 | }, 1498 | "Smashcast": { 1499 | "errorType": "status_code", 1500 | "rank": 0, 1501 | "url": "https://www.smashcast.tv/api/media/live/{}", 1502 | "urlMain": "https://www.smashcast.tv/", 1503 | "username_claimed": "hello", 1504 | "username_unclaimed": "noonewouldeverusethis7" 1505 | }, 1506 | "Smule": { 1507 | "errorType": "status_code", 1508 | "rank": 0, 1509 | "url": "https://www.smule.com/{}", 1510 | "urlMain": "https://www.smule.com/", 1511 | "username_claimed": "blue", 1512 | "username_unclaimed": "noonewouldeverusethis7" 1513 | }, 1514 | "SoundCloud": { 1515 | "errorType": "status_code", 1516 | "rank": 0, 1517 | "url": "https://soundcloud.com/{}", 1518 | "urlMain": "https://soundcloud.com/", 1519 | "username_claimed": "blue", 1520 | "username_unclaimed": "noonewouldeverusethis7" 1521 | }, 1522 | "SourceForge": { 1523 | "errorType": "status_code", 1524 | "rank": 0, 1525 | "url": "https://sourceforge.net/u/{}", 1526 | "urlMain": "https://sourceforge.net/", 1527 | "username_claimed": "blue", 1528 | "username_unclaimed": "noonewouldeverusethis7" 1529 | }, 1530 | "Speedrun.com": { 1531 | "errorMsg": "not found.", 1532 | "errorType": "message", 1533 | "rank": 0, 1534 | "url": "https://speedrun.com/user/{}", 1535 | "urlMain": "https://speedrun.com/", 1536 | "username_claimed": "3Tau", 1537 | "username_unclaimed": "noonewould" 1538 | }, 1539 | "Splits.io": { 1540 | "errorType": "status_code", 1541 | "rank": 0, 1542 | "url": "https://splits.io/users/{}", 1543 | "urlMain": "https://splits.io", 1544 | "username_claimed": "cambosteve", 1545 | "username_unclaimed": "noonewould" 1546 | }, 1547 | "Sporcle": { 1548 | "errorType": "status_code", 1549 | "rank": 0, 1550 | "url": "https://www.sporcle.com/user/{}/people", 1551 | "urlMain": "https://www.sporcle.com/", 1552 | "username_claimed": "blue", 1553 | "username_unclaimed": "noonewouldeverusethis7" 1554 | }, 1555 | "SportsRU": { 1556 | "errorType": "status_code", 1557 | "rank": 0, 1558 | "url": "https://www.sports.ru/profile/{}/", 1559 | "urlMain": "https://www.sports.ru/", 1560 | "username_claimed": "blue", 1561 | "username_unclaimed": "noonewouldeverusethis7" 1562 | }, 1563 | "Spotify": { 1564 | "errorType": "status_code", 1565 | "rank": 0, 1566 | "url": "https://open.spotify.com/user/{}", 1567 | "urlMain": "https://open.spotify.com/", 1568 | "username_claimed": "blue", 1569 | "username_unclaimed": "noonewouldeverusethis7" 1570 | }, 1571 | "Star Citizen": { 1572 | "errorType": "status_code", 1573 | "rank": 0, 1574 | "url": "https://robertsspaceindustries.com/citizens/{}", 1575 | "urlMain": "https://robertsspaceindustries.com/", 1576 | "username_claimed": "blue", 1577 | "username_unclaimed": "noonewouldeverusethis7" 1578 | }, 1579 | "Steam": { 1580 | "errorMsg": "The specified profile could not be found", 1581 | "errorType": "message", 1582 | "rank": 0, 1583 | "url": "https://steamcommunity.com/id/{}", 1584 | "urlMain": "https://steamcommunity.com/", 1585 | "username_claimed": "blue", 1586 | "username_unclaimed": "noonewouldeverusethis7" 1587 | }, 1588 | "SteamGroup": { 1589 | "errorMsg": "No group could be retrieved for the given URL", 1590 | "errorType": "message", 1591 | "rank": 0, 1592 | "url": "https://steamcommunity.com/groups/{}", 1593 | "urlMain": "https://steamcommunity.com/", 1594 | "username_claimed": "blue", 1595 | "username_unclaimed": "noonewouldeverusethis7" 1596 | }, 1597 | "Steamid": { 1598 | "errorMsg": "
Profile not found
", 1599 | "errorType": "message", 1600 | "rank": 0, 1601 | "url": "https://steamid.uk/profile/{}", 1602 | "urlMain": "https://steamid.uk/", 1603 | "username_claimed": "blue", 1604 | "username_unclaimed": "noonewouldeverusethis7" 1605 | }, 1606 | "SublimeForum": { 1607 | "errorType": "status_code", 1608 | "rank": 0, 1609 | "url": "https://forum.sublimetext.com/u/{}", 1610 | "urlMain": "https://forum.sublimetext.com/", 1611 | "username_claimed": "blue", 1612 | "username_unclaimed": "noonewouldeverusethis" 1613 | }, 1614 | "T-MobileSupport": { 1615 | "errorType": "status_code", 1616 | "rank": 0, 1617 | "url": "https://support.t-mobile.com/people/{}", 1618 | "urlMain": "https://support.t-mobile.com", 1619 | "username_claimed": "blue", 1620 | "username_unclaimed": "noonewouldeverusethis7" 1621 | }, 1622 | "TamTam": { 1623 | "errorType": "response_url", 1624 | "errorUrl": "https://tamtam.chat/", 1625 | "rank": 0, 1626 | "url": "https://tamtam.chat/{}", 1627 | "urlMain": "https://tamtam.chat/", 1628 | "username_claimed": "blue", 1629 | "username_unclaimed": "noonewouldeverusethis7" 1630 | }, 1631 | "Taringa": { 1632 | "errorType": "status_code", 1633 | "rank": 0, 1634 | "url": "https://www.taringa.net/{}", 1635 | "urlMain": "https://taringa.net/", 1636 | "username_claimed": "blue", 1637 | "username_unclaimed": "noonewouldeverusethis7" 1638 | }, 1639 | "Tellonym.me": { 1640 | "errorType": "status_code", 1641 | "rank": 0, 1642 | "url": "https://tellonym.me/{}", 1643 | "urlMain": "https://tellonym.me/", 1644 | "username_claimed": "blue", 1645 | "username_unclaimed": "noonewouldeverusethis7" 1646 | }, 1647 | "Tinder": { 1648 | "errorMsg": "Looking for Someone?", 1649 | "errorType": "message", 1650 | "rank": 0, 1651 | "url": "https://www.gotinder.com/@{}", 1652 | "urlMain": "https://tinder.com/", 1653 | "username_claimed": "blue", 1654 | "username_unclaimed": "noonewouldeverusethis7" 1655 | }, 1656 | "TrackmaniaLadder": { 1657 | "errorMsg": "player unknown or invalid", 1658 | "errorType": "message", 1659 | "rank": 0, 1660 | "url": "http://en.tm-ladder.com/{}_rech.php", 1661 | "urlMain": "http://en.tm-ladder.com/index.php", 1662 | "username_claimed": "blue", 1663 | "username_unclaimed": "noonewouldeverusethis" 1664 | }, 1665 | "TradingView": { 1666 | "errorType": "status_code", 1667 | "rank": 0, 1668 | "url": "https://www.tradingview.com/u/{}/", 1669 | "urlMain": "https://www.tradingview.com/", 1670 | "username_claimed": "blue", 1671 | "username_unclaimed": "noonewouldeverusethis7" 1672 | }, 1673 | "Trakt": { 1674 | "errorType": "status_code", 1675 | "rank": 0, 1676 | "url": "https://www.trakt.tv/users/{}", 1677 | "urlMain": "https://www.trakt.tv/", 1678 | "username_claimed": "blue", 1679 | "username_unclaimed": "noonewouldeverusethis7" 1680 | }, 1681 | "TrashboxRU": { 1682 | "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d", 1683 | "errorType": "message", 1684 | "rank": 0, 1685 | "regexCheck": "^[A-Za-z0-9_-]{3,16}$", 1686 | "url": "https://trashbox.ru/users/{}", 1687 | "urlMain": "https://trashbox.ru/", 1688 | "username_claimed": "blue", 1689 | "username_unclaimed": "never-never-ever" 1690 | }, 1691 | "Trello": { 1692 | "errorMsg": "model not found", 1693 | "errorType": "message", 1694 | "rank": 0, 1695 | "url": "https://trello.com/{}", 1696 | "urlMain": "https://trello.com/", 1697 | "urlProbe": "https://trello.com/1/Members/{}", 1698 | "username_claimed": "blue", 1699 | "username_unclaimed": "noonewouldeverusethis7" 1700 | }, 1701 | "TripAdvisor": { 1702 | "errorMsg": "This page is on vacation\u2026", 1703 | "errorType": "message", 1704 | "rank": 0, 1705 | "url": "https://tripadvisor.com/members/{}", 1706 | "urlMain": "https://tripadvisor.com/", 1707 | "username_claimed": "blue", 1708 | "username_unclaimed": "noonewouldeverusethis7" 1709 | }, 1710 | "Twitch": { 1711 | "errorType": "status_code", 1712 | "rank": 0, 1713 | "url": "https://www.twitch.tv/{}", 1714 | "urlMain": "https://www.twitch.tv/", 1715 | "urlProbe": "https://m.twitch.tv/{}", 1716 | "username_claimed": "jenny", 1717 | "username_unclaimed": "noonewouldeverusethis7" 1718 | }, 1719 | "Typeracer": { 1720 | "errorMsg": "Profile Not Found", 1721 | "errorType": "message", 1722 | "rank": 0, 1723 | "url": "https://data.typeracer.com/pit/profile?user={}", 1724 | "urlMain": "https://typeracer.com", 1725 | "username_claimed": "blue", 1726 | "username_unclaimed": "noonewouldeverusethis7" 1727 | }, 1728 | "Ultimate-Guitar": { 1729 | "errorType": "status_code", 1730 | "rank": 0, 1731 | "url": "https://ultimate-guitar.com/u/{}", 1732 | "urlMain": "https://ultimate-guitar.com/", 1733 | "username_claimed": "blue", 1734 | "username_unclaimed": "noonewouldeverusethis7" 1735 | }, 1736 | "Unsplash": { 1737 | "errorType": "status_code", 1738 | "rank": 0, 1739 | "url": "https://unsplash.com/@{}", 1740 | "urlMain": "https://unsplash.com/", 1741 | "username_claimed": "jenny", 1742 | "username_unclaimed": "noonewouldeverusethis7" 1743 | }, 1744 | "VK": { 1745 | "errorType": "response_url", 1746 | "errorUrl": "https://www.quora.com/profile/{}", 1747 | "rank": 0, 1748 | "url": "https://vk.com/{}", 1749 | "urlMain": "https://vk.com/", 1750 | "username_claimed": "smith", 1751 | "username_unclaimed": "blah62831" 1752 | }, 1753 | "VSCO": { 1754 | "errorType": "status_code", 1755 | "rank": 0, 1756 | "url": "https://vsco.co/{}", 1757 | "urlMain": "https://vsco.co/", 1758 | "username_claimed": "blue", 1759 | "username_unclaimed": "noonewouldeverusethis7" 1760 | }, 1761 | "Velomania": { 1762 | "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430.", 1763 | "errorType": "message", 1764 | "rank": 0, 1765 | "url": "https://forum.velomania.ru/member.php?username={}", 1766 | "urlMain": "https://forum.velomania.ru/", 1767 | "username_claimed": "red", 1768 | "username_unclaimed": "noonewouldeverusethis7" 1769 | }, 1770 | "Venmo": { 1771 | "errorType": "status_code", 1772 | "rank": 0, 1773 | "url": "https://venmo.com/{}", 1774 | "urlMain": "https://venmo.com/", 1775 | "username_claimed": "jenny", 1776 | "username_unclaimed": "noonewouldeverusethis7" 1777 | }, 1778 | "Viadeo": { 1779 | "errorType": "status_code", 1780 | "rank": 0, 1781 | "url": "http://fr.viadeo.com/en/profile/{}", 1782 | "urlMain": "http://fr.viadeo.com/en/", 1783 | "username_claimed": "franck.patissier", 1784 | "username_unclaimed": "noonewouldeverusethis" 1785 | }, 1786 | "Vimeo": { 1787 | "errorType": "status_code", 1788 | "rank": 0, 1789 | "url": "https://vimeo.com/{}", 1790 | "urlMain": "https://vimeo.com/", 1791 | "username_claimed": "blue", 1792 | "username_unclaimed": "noonewouldeverusethis7" 1793 | }, 1794 | "Virgool": { 1795 | "errorMsg": "\u06f4\u06f0\u06f4", 1796 | "errorType": "message", 1797 | "rank": 0, 1798 | "url": "https://virgool.io/@{}", 1799 | "urlMain": "https://virgool.io/", 1800 | "username_claimed": "blue", 1801 | "username_unclaimed": "noonewouldeverusethis7" 1802 | }, 1803 | "VirusTotal": { 1804 | "errorMsg": "not found", 1805 | "errorType": "message", 1806 | "rank": 0, 1807 | "url": "https://www.virustotal.com/ui/users/{}/trusted_users", 1808 | "urlMain": "https://www.virustotal.com/", 1809 | "username_claimed": "blue", 1810 | "username_unclaimed": "noonewouldeverusethis7" 1811 | }, 1812 | "Wattpad": { 1813 | "errorMsg": "userError-404", 1814 | "errorType": "message", 1815 | "rank": 0, 1816 | "url": "https://www.wattpad.com/user/{}", 1817 | "urlMain": "https://www.wattpad.com/", 1818 | "username_claimed": "Dogstho7951", 1819 | "username_unclaimed": "noonewouldeverusethis7" 1820 | }, 1821 | "We Heart It": { 1822 | "errorMsg": "Oops! You've landed on a moving target!", 1823 | "errorType": "message", 1824 | "rank": 0, 1825 | "url": "https://weheartit.com/{}", 1826 | "urlMain": "https://weheartit.com/", 1827 | "username_claimed": "ventivogue", 1828 | "username_unclaimed": "noonewouldeverusethis7" 1829 | }, 1830 | "WebNode": { 1831 | "errorType": "status_code", 1832 | "rank": 0, 1833 | "url": "https://{}.webnode.cz/", 1834 | "urlMain": "https://www.webnode.cz/", 1835 | "username_claimed": "radkabalcarova", 1836 | "username_unclaimed": "noonewouldeverusethis7" 1837 | }, 1838 | "Whonix Forum": { 1839 | "errorType": "status_code", 1840 | "rank": 0, 1841 | "url": "https://forums.whonix.org/u/{}", 1842 | "urlMain": "https://forums.whonix.org/", 1843 | "username_claimed": "red", 1844 | "username_unclaimed": "noonewouldeverusethis7" 1845 | }, 1846 | "Wikidot": { 1847 | "errorMsg": "User does not exist.", 1848 | "errorType": "message", 1849 | "rank": 0, 1850 | "url": "http://www.wikidot.com/user:info/{}", 1851 | "urlMain": "http://www.wikidot.com/", 1852 | "username_claimed": "blue", 1853 | "username_unclaimed": "noonewouldeverusethis7" 1854 | }, 1855 | "Wikipedia": { 1856 | "errorMsg": "is not registered.", 1857 | "errorType": "message", 1858 | "rank": 0, 1859 | "url": "https://www.wikipedia.org/wiki/User:{}", 1860 | "urlMain": "https://www.wikipedia.org/", 1861 | "username_claimed": "Hoadlck", 1862 | "username_unclaimed": "noonewouldeverusethis7" 1863 | }, 1864 | "Wix": { 1865 | "errorType": "status_code", 1866 | "rank": 0, 1867 | "url": "https://{}.wix.com", 1868 | "urlMain": "https://wix.com/", 1869 | "username_claimed": "support", 1870 | "username_unclaimed": "noonewouldeverusethis7" 1871 | }, 1872 | "WordPress": { 1873 | "errorType": "response_url", 1874 | "errorUrl": "wordpress.com/typo/?subdomain=", 1875 | "rank": 0, 1876 | "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", 1877 | "url": "https://{}.wordpress.com/", 1878 | "urlMain": "https://wordpress.com", 1879 | "username_claimed": "blue", 1880 | "username_unclaimed": "noonewouldeverusethis7" 1881 | }, 1882 | "WordPressOrg": { 1883 | "errorType": "response_url", 1884 | "errorUrl": "https://wordpress.org", 1885 | "rank": 0, 1886 | "url": "https://profiles.wordpress.org/{}/", 1887 | "urlMain": "https://wordpress.org/", 1888 | "username_claimed": "blue", 1889 | "username_unclaimed": "noonewouldeverusethis7" 1890 | }, 1891 | "YouNow": { 1892 | "errorMsg": "No users found", 1893 | "errorType": "message", 1894 | "rank": 0, 1895 | "url": "https://www.younow.com/{}/", 1896 | "urlMain": "https://www.younow.com/", 1897 | "urlProbe": "https://api.younow.com/php/api/broadcast/info/user={}/", 1898 | "username_claimed": "blue", 1899 | "username_unclaimed": "noonewouldeverusethis7" 1900 | }, 1901 | "YouPic": { 1902 | "errorType": "status_code", 1903 | "rank": 0, 1904 | "url": "https://youpic.com/photographer/{}/", 1905 | "urlMain": "https://youpic.com/", 1906 | "username_claimed": "blue", 1907 | "username_unclaimed": "noonewouldeverusethis7" 1908 | }, 1909 | "YouTube": { 1910 | "errorMsg": "Not Found", 1911 | "errorType": "message", 1912 | "rank": 0, 1913 | "url": "https://www.youtube.com/{}", 1914 | "urlMain": "https://www.youtube.com/", 1915 | "username_claimed": "blue", 1916 | "username_unclaimed": "noonewouldeverusethis7" 1917 | }, 1918 | "Zhihu": { 1919 | "errorType": "response_url", 1920 | "errorUrl": "https://www.zhihu.com/people/{}", 1921 | "rank": 0, 1922 | "url": "https://www.zhihu.com/people/{}", 1923 | "urlMain": "https://www.zhihu.com/", 1924 | "username_claimed": "blue", 1925 | "username_unclaimed": "noonewouldeverusethis7" 1926 | }, 1927 | "Zomato": { 1928 | "errorType": "status_code", 1929 | "headers": { 1930 | "Accept-Language": "en-US,en;q=0.9" 1931 | }, 1932 | "rank": 0, 1933 | "url": "https://www.zomato.com/pl/{}/foodjourney", 1934 | "urlMain": "https://www.zomato.com/", 1935 | "username_claimed": "deepigoyal", 1936 | "username_unclaimed": "noonewouldeverusethis7" 1937 | }, 1938 | "akniga": { 1939 | "errorType": "status_code", 1940 | "rank": 0, 1941 | "url": "https://akniga.org/profile/{}", 1942 | "urlMain": "https://akniga.org/profile/blue/", 1943 | "username_claimed": "blue", 1944 | "username_unclaimed": "noonewouldeverusethis" 1945 | }, 1946 | "allmylinks": { 1947 | "errorMsg": "Page not found", 1948 | "errorType": "message", 1949 | "rank": 0, 1950 | "url": "https://allmylinks.com/{}", 1951 | "urlMain": "https://allmylinks.com/", 1952 | "username_claimed": "blue", 1953 | "username_unclaimed": "noonewouldeverusethis7" 1954 | }, 1955 | "aminoapp": { 1956 | "errorType": "status_code", 1957 | "rank": 0, 1958 | "url": "https://aminoapps.com/u/{}", 1959 | "urlMain": "https://aminoapps.com/", 1960 | "username_claimed": "blue", 1961 | "username_unclaimed": "noonewouldeverusethis77777" 1962 | }, 1963 | "authorSTREAM": { 1964 | "errorType": "status_code", 1965 | "rank": 0, 1966 | "url": "http://www.authorstream.com/{}/", 1967 | "urlMain": "http://www.authorstream.com/", 1968 | "username_claimed": "blue", 1969 | "username_unclaimed": "noonewouldeverusethis7" 1970 | }, 1971 | "babyRU": { 1972 | "errorMsg": "\u0423\u043f\u0441, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0438\u0441\u043a\u0430\u043b\u0438, \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442", 1973 | "errorType": "message", 1974 | "rank": 0, 1975 | "url": "https://www.baby.ru/u/{}/", 1976 | "urlMain": "https://www.baby.ru/", 1977 | "username_claimed": "blue", 1978 | "username_unclaimed": "noonewouldeverusethis" 1979 | }, 1980 | "babyblogRU": { 1981 | "errorType": "status_code", 1982 | "rank": 0, 1983 | "url": "https://www.babyblog.ru/user/info/{}", 1984 | "urlMain": "https://www.babyblog.ru/", 1985 | "username_claimed": "blue", 1986 | "username_unclaimed": "noonewouldeverusethis" 1987 | }, 1988 | "chaos.social": { 1989 | "errorType": "status_code", 1990 | "rank": 0, 1991 | "url": "https://chaos.social/@{}", 1992 | "urlMain": "https://chaos.social/", 1993 | "username_claimed": "rixx", 1994 | "username_unclaimed": "noonewouldeverusethis7" 1995 | }, 1996 | "couchsurfing": { 1997 | "errorType": "status_code", 1998 | "rank": 0, 1999 | "url": "https://www.couchsurfing.com/people/{}", 2000 | "urlMain": "https://www.couchsurfing.com/", 2001 | "username_claimed": "blue", 2002 | "username_unclaimed": "noonewouldeverusethis7" 2003 | }, 2004 | "d3RU": { 2005 | "errorType": "status_code", 2006 | "rank": 0, 2007 | "url": "https://d3.ru/user/{}/posts", 2008 | "urlMain": "https://d3.ru/", 2009 | "username_claimed": "blue", 2010 | "username_unclaimed": "noonewouldeverusethis7" 2011 | }, 2012 | "dailykos": { 2013 | "errorType": "status_code", 2014 | "rank": 0, 2015 | "url": "https://www.dailykos.com/user/{}", 2016 | "urlMain": "https://www.dailykos.com", 2017 | "username_claimed": "blue", 2018 | "username_unclaimed": "noonewouldeverusethis7" 2019 | }, 2020 | "datingRU": { 2021 | "errorType": "status_code", 2022 | "rank": 0, 2023 | "url": "http://dating.ru/{}", 2024 | "urlMain": "http://dating.ru", 2025 | "username_claimed": "blue", 2026 | "username_unclaimed": "noonewouldeverusethis7" 2027 | }, 2028 | "devRant": { 2029 | "errorType": "response_url", 2030 | "errorUrl": "https://devrant.com/", 2031 | "rank": 0, 2032 | "url": "https://devrant.com/users/{}", 2033 | "urlMain": "https://devrant.com/", 2034 | "username_claimed": "blue", 2035 | "username_unclaimed": "noonewouldeverusethis7" 2036 | }, 2037 | "drive2": { 2038 | "errorType": "status_code", 2039 | "rank": 0, 2040 | "url": "https://www.drive2.ru/users/{}", 2041 | "urlMain": "https://www.drive2.ru/", 2042 | "username_claimed": "blue", 2043 | "username_unclaimed": "noonewouldeverusethis7" 2044 | }, 2045 | "eGPU": { 2046 | "errorType": "status_code", 2047 | "rank": 0, 2048 | "url": "https://egpu.io/forums/profile/{}/", 2049 | "urlMain": "https://egpu.io/", 2050 | "username_claimed": "blue", 2051 | "username_unclaimed": "noonewouldeverusethis" 2052 | }, 2053 | "easyen": { 2054 | "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d", 2055 | "errorType": "message", 2056 | "rank": 0, 2057 | "url": "https://easyen.ru/index/8-0-{}", 2058 | "urlMain": "https://easyen.ru/", 2059 | "username_claimed": "wd", 2060 | "username_unclaimed": "noonewouldeverusethis7" 2061 | }, 2062 | "eintracht": { 2063 | "errorType": "status_code", 2064 | "rank": 0, 2065 | "url": "https://community.eintracht.de/fans/{}", 2066 | "urlMain": "https://eintracht.de", 2067 | "username_claimed": "blue", 2068 | "username_unclaimed": "noonewouldeverusethis7" 2069 | }, 2070 | "fixya": { 2071 | "errorType": "status_code", 2072 | "rank": 0, 2073 | "url": "https://www.fixya.com/users/{}", 2074 | "urlMain": "https://www.fixya.com", 2075 | "username_claimed": "adam", 2076 | "username_unclaimed": "noonewouldeverusethis7" 2077 | }, 2078 | "fl": { 2079 | "errorType": "status_code", 2080 | "rank": 0, 2081 | "url": "https://www.fl.ru/users/{}", 2082 | "urlMain": "https://www.fl.ru/", 2083 | "username_claimed": "blue", 2084 | "username_unclaimed": "noonewouldeverusethis7" 2085 | }, 2086 | "forum_guns": { 2087 | "errorMsg": "action=https://forum.guns.ru/forummisc/blog/search", 2088 | "errorType": "message", 2089 | "rank": 0, 2090 | "url": "https://forum.guns.ru/forummisc/blog/{}", 2091 | "urlMain": "https://forum.guns.ru/", 2092 | "username_claimed": "red", 2093 | "username_unclaimed": "noonewouldeverusethis7" 2094 | }, 2095 | "forumhouseRU": { 2096 | "errorMsg": "\u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f.", 2097 | "errorType": "message", 2098 | "rank": 0, 2099 | "url": "https://www.forumhouse.ru/members/?username={}", 2100 | "urlMain": "https://www.forumhouse.ru/", 2101 | "username_claimed": "red", 2102 | "username_unclaimed": "noonewouldeverusethis7" 2103 | }, 2104 | "geocaching": { 2105 | "errorType": "status_code", 2106 | "rank": 0, 2107 | "url": "https://www.geocaching.com/profile/?u={}", 2108 | "urlMain": "https://www.geocaching.com/", 2109 | "username_claimed": "blue", 2110 | "username_unclaimed": "noonewouldeverusethis7" 2111 | }, 2112 | "gfycat": { 2113 | "errorType": "status_code", 2114 | "rank": 0, 2115 | "url": "https://gfycat.com/@{}", 2116 | "urlMain": "https://gfycat.com/", 2117 | "username_claimed": "Test", 2118 | "username_unclaimed": "noonewouldeverusethis7" 2119 | }, 2120 | "habr": { 2121 | "errorType": "status_code", 2122 | "rank": 0, 2123 | "url": "https://habr.com/ru/users/{}", 2124 | "urlMain": "https://habr.com/", 2125 | "username_claimed": "blue", 2126 | "username_unclaimed": "noonewouldeverusethis7" 2127 | }, 2128 | "hackster": { 2129 | "errorType": "status_code", 2130 | "rank": 0, 2131 | "url": "https://www.hackster.io/{}", 2132 | "urlMain": "https://www.hackster.io", 2133 | "username_claimed": "blue", 2134 | "username_unclaimed": "noonewouldeverusethis7" 2135 | }, 2136 | "hunting": { 2137 | "errorMsg": "\u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f.", 2138 | "errorType": "message", 2139 | "rank": 0, 2140 | "url": "https://www.hunting.ru/forum/members/?username={}", 2141 | "urlMain": "https://www.hunting.ru/forum/", 2142 | "username_claimed": "red", 2143 | "username_unclaimed": "noonewouldeverusethis7" 2144 | }, 2145 | "iMGSRC.RU": { 2146 | "errorType": "response_url", 2147 | "errorUrl": "https://imgsrc.ru/", 2148 | "rank": 0, 2149 | "url": "https://imgsrc.ru/main/user.php?user={}", 2150 | "urlMain": "https://imgsrc.ru/", 2151 | "username_claimed": "blue", 2152 | "username_unclaimed": "noonewouldeverusethis7" 2153 | }, 2154 | "igromania": { 2155 | "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430.", 2156 | "errorType": "message", 2157 | "rank": 0, 2158 | "url": "http://forum.igromania.ru/member.php?username={}", 2159 | "urlMain": "http://forum.igromania.ru/", 2160 | "username_claimed": "blue", 2161 | "username_unclaimed": "noonewouldeverusethis7" 2162 | }, 2163 | "interpals": { 2164 | "errorMsg": "The requested user does not exist or is inactive", 2165 | "errorType": "message", 2166 | "rank": 0, 2167 | "url": "https://www.interpals.net/{}", 2168 | "urlMain": "https://www.interpals.net/", 2169 | "username_claimed": "blue", 2170 | "username_unclaimed": "noneownsthisusername" 2171 | }, 2172 | "irecommend": { 2173 | "errorType": "status_code", 2174 | "rank": 0, 2175 | "url": "https://irecommend.ru/users/{}", 2176 | "urlMain": "https://irecommend.ru/", 2177 | "username_claimed": "blue", 2178 | "username_unclaimed": "noonewouldeverusethis7" 2179 | }, 2180 | "jeuxvideo": { 2181 | "errorMsg": "Vous \u00eates", 2182 | "errorType": "message", 2183 | "rank": 0, 2184 | "url": "http://www.jeuxvideo.com/profil/{}?mode=infos", 2185 | "urlMain": "http://www.jeuxvideo.com", 2186 | "username_claimed": "adam", 2187 | "username_unclaimed": "noonewouldeverusethis7" 2188 | }, 2189 | "kwork": { 2190 | "errorType": "status_code", 2191 | "rank": 0, 2192 | "url": "https://kwork.ru/user/{}", 2193 | "urlMain": "https://www.kwork.ru/", 2194 | "username_claimed": "blue", 2195 | "username_unclaimed": "noonewouldeverusethis7" 2196 | }, 2197 | "labpentestit": { 2198 | "errorType": "response_url", 2199 | "errorUrl": "https://lab.pentestit.ru/{}", 2200 | "rank": 0, 2201 | "url": "https://lab.pentestit.ru/profile/{}", 2202 | "urlMain": "https://lab.pentestit.ru/", 2203 | "username_claimed": "CSV", 2204 | "username_unclaimed": "noonewouldeverusethis7" 2205 | }, 2206 | "last.fm": { 2207 | "errorType": "status_code", 2208 | "rank": 0, 2209 | "url": "https://last.fm/user/{}", 2210 | "urlMain": "https://last.fm/", 2211 | "username_claimed": "blue", 2212 | "username_unclaimed": "noonewouldeverusethis7" 2213 | }, 2214 | "leasehackr": { 2215 | "errorType": "status_code", 2216 | "rank": 0, 2217 | "url": "https://forum.leasehackr.com/u/{}/summary/", 2218 | "urlMain": "https://forum.leasehackr.com/", 2219 | "username_claimed": "adam", 2220 | "username_unclaimed": "noonewouldeverusethis" 2221 | }, 2222 | "livelib": { 2223 | "errorType": "status_code", 2224 | "rank": 0, 2225 | "url": "https://www.livelib.ru/reader/{}", 2226 | "urlMain": "https://www.livelib.ru/", 2227 | "username_claimed": "blue", 2228 | "username_unclaimed": "noonewouldeverusethis7" 2229 | }, 2230 | "mastodon.cloud": { 2231 | "errorType": "status_code", 2232 | "rank": 0, 2233 | "url": "https://mastodon.cloud/@{}", 2234 | "urlMain": "https://mastodon.cloud/", 2235 | "username_claimed": "TheAdmin", 2236 | "username_unclaimed": "noonewouldeverusethis7" 2237 | }, 2238 | "mastodon.social": { 2239 | "errorType": "status_code", 2240 | "rank": 0, 2241 | "url": "https://mastodon.social/@{}", 2242 | "urlMain": "https://chaos.social/", 2243 | "username_claimed": "Gargron", 2244 | "username_unclaimed": "noonewouldeverusethis7" 2245 | }, 2246 | "mastodon.technology": { 2247 | "errorType": "status_code", 2248 | "rank": 0, 2249 | "url": "https://mastodon.technology/@{}", 2250 | "urlMain": "https://mastodon.xyz/", 2251 | "username_claimed": "ashfurrow", 2252 | "username_unclaimed": "noonewouldeverusethis7" 2253 | }, 2254 | "mastodon.xyz": { 2255 | "errorType": "status_code", 2256 | "rank": 0, 2257 | "url": "https://mastodon.xyz/@{}", 2258 | "urlMain": "https://mastodon.xyz/", 2259 | "username_claimed": "TheKinrar", 2260 | "username_unclaimed": "noonewouldeverusethis7" 2261 | }, 2262 | "mercadolivre": { 2263 | "errorType": "status_code", 2264 | "rank": 0, 2265 | "url": "https://www.mercadolivre.com.br/perfil/{}", 2266 | "urlMain": "https://www.mercadolivre.com.br", 2267 | "username_claimed": "blue", 2268 | "username_unclaimed": "noonewouldeverusethis77777" 2269 | }, 2270 | "metacritic": { 2271 | "errorMsg": "User not found", 2272 | "errorType": "message", 2273 | "rank": 0, 2274 | "regexCheck": "^(?![-_])[A-Za-z0-9-_]{3,15}$", 2275 | "url": "https://www.metacritic.com/user/{}", 2276 | "urlMain": "https://www.metacritic.com/", 2277 | "username_claimed": "blue", 2278 | "username_unclaimed": "noonewould" 2279 | }, 2280 | "mixer.com": { 2281 | "errorType": "status_code", 2282 | "rank": 0, 2283 | "url": "https://mixer.com/{}", 2284 | "urlMain": "https://mixer.com/", 2285 | "urlProbe": "https://mixer.com/api/v1/channels/{}", 2286 | "username_claimed": "blue", 2287 | "username_unclaimed": "noonewouldeverusethis7" 2288 | }, 2289 | "moikrug": { 2290 | "errorType": "status_code", 2291 | "rank": 0, 2292 | "url": "https://moikrug.ru/{}", 2293 | "urlMain": "https://moikrug.ru/", 2294 | "username_claimed": "blue", 2295 | "username_unclaimed": "noonewouldeverusethis7" 2296 | }, 2297 | "mstdn.io": { 2298 | "errorType": "status_code", 2299 | "rank": 0, 2300 | "url": "https://mstdn.io/@{}", 2301 | "urlMain": "https://mstdn.io/", 2302 | "username_claimed": "blue", 2303 | "username_unclaimed": "noonewouldeverusethis7" 2304 | }, 2305 | "nightbot": { 2306 | "errorType": "status_code", 2307 | "rank": 0, 2308 | "url": "https://nightbot.tv/t/{}/commands", 2309 | "urlMain": "https://nightbot.tv/", 2310 | "urlProbe": "https://api.nightbot.tv/1/channels/t/{}", 2311 | "username_claimed": "green", 2312 | "username_unclaimed": "noonewouldeverusethis" 2313 | }, 2314 | "nnRU": { 2315 | "errorType": "status_code", 2316 | "rank": 0, 2317 | "url": "https://{}.www.nn.ru/", 2318 | "urlMain": "https://https://www.nn.ru/", 2319 | "username_claimed": "blue", 2320 | "username_unclaimed": "noonewouldeverusethis7" 2321 | }, 2322 | "notabug.org": { 2323 | "errorType": "status_code", 2324 | "rank": 0, 2325 | "url": "https://notabug.org/{}", 2326 | "urlMain": "https://notabug.org/", 2327 | "urlProbe": "https://notabug.org/{}/followers", 2328 | "username_claimed": "red", 2329 | "username_unclaimed": "noonewouldeverusethis7" 2330 | }, 2331 | "note": { 2332 | "errorType": "status_code", 2333 | "rank": 0, 2334 | "url": "https://note.com/{}", 2335 | "urlMain": "https://note.com/", 2336 | "username_claimed": "blue", 2337 | "username_unclaimed": "noonewouldeverusethis7" 2338 | }, 2339 | "opennet": { 2340 | "errorMsg": "\u0418\u043c\u044f \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e", 2341 | "errorType": "message", 2342 | "rank": 0, 2343 | "url": "https://www.opennet.ru/~{}", 2344 | "urlMain": "https://www.opennet.ru/", 2345 | "username_claimed": "anonismus", 2346 | "username_unclaimed": "noneownsthisusername" 2347 | }, 2348 | "opensource": { 2349 | "errorType": "status_code", 2350 | "rank": 0, 2351 | "url": "https://opensource.com/users/{}", 2352 | "urlMain": "https://opensource.com/", 2353 | "username_claimed": "red", 2354 | "username_unclaimed": "noonewouldeverusethis7" 2355 | }, 2356 | "osu!": { 2357 | "errorType": "status_code", 2358 | "rank": 0, 2359 | "url": "https://osu.ppy.sh/users/{}", 2360 | "urlMain": "https://osu.ppy.sh/", 2361 | "username_claimed": "blue", 2362 | "username_unclaimed": "noonewouldeverusethis7" 2363 | }, 2364 | "pedsovet": { 2365 | "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d", 2366 | "errorType": "message", 2367 | "rank": 0, 2368 | "url": "http://pedsovet.su/index/8-0-{}", 2369 | "urlMain": "http://pedsovet.su/", 2370 | "username_claimed": "blue", 2371 | "username_unclaimed": "noonewouldeverusethis7" 2372 | }, 2373 | "phpRU": { 2374 | "errorMsg": "\u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f.", 2375 | "errorType": "message", 2376 | "rank": 0, 2377 | "url": "https://php.ru/forum/members/?username={}", 2378 | "urlMain": "https://php.ru/forum/", 2379 | "username_claimed": "apple", 2380 | "username_unclaimed": "noonewouldeverusethis7" 2381 | }, 2382 | "pikabu": { 2383 | "errorType": "status_code", 2384 | "rank": 0, 2385 | "url": "https://pikabu.ru/@{}", 2386 | "urlMain": "https://pikabu.ru/", 2387 | "username_claimed": "blue", 2388 | "username_unclaimed": "noonewouldeverusethis7" 2389 | }, 2390 | "pr0gramm": { 2391 | "errorType": "status_code", 2392 | "rank": 0, 2393 | "url": "https://pr0gramm.com/api/profile/info?name={}", 2394 | "urlMain": "https://pr0gramm.com/", 2395 | "username_claimed": "cha0s", 2396 | "username_unclaimed": "noonewouldeverusethis123123123123123123" 2397 | }, 2398 | "pvpru": { 2399 | "errorType": "status_code", 2400 | "rank": 0, 2401 | "url": "https://pvpru.com/board/member.php?username={}&tab=aboutme#aboutme", 2402 | "urlMain": "https://pvpru.com/", 2403 | "username_claimed": "blue", 2404 | "username_unclaimed": "noonewouldeverusethis7" 2405 | }, 2406 | "radio_echo_msk": { 2407 | "errorType": "status_code", 2408 | "rank": 0, 2409 | "url": "https://echo.msk.ru/users/{}", 2410 | "urlMain": "https://echo.msk.ru/", 2411 | "username_claimed": "blue", 2412 | "username_unclaimed": "noonewouldeverusethis7" 2413 | }, 2414 | "radioskot": { 2415 | "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d", 2416 | "errorType": "message", 2417 | "rank": 0, 2418 | "url": "https://radioskot.ru/index/8-0-{}", 2419 | "urlMain": "https://radioskot.ru/", 2420 | "username_claimed": "red", 2421 | "username_unclaimed": "noonewouldeverusethis7" 2422 | }, 2423 | "satsisRU": { 2424 | "errorType": "status_code", 2425 | "rank": 0, 2426 | "url": "https://satsis.info/user/{}", 2427 | "urlMain": "https://satsis.info/", 2428 | "username_claimed": "red", 2429 | "username_unclaimed": "noonewouldeverusethis7" 2430 | }, 2431 | "segmentfault": { 2432 | "errorType": "status_code", 2433 | "rank": 0, 2434 | "url": "https://segmentfault.com/u/{}", 2435 | "urlMain": "https://segmentfault.com/", 2436 | "username_claimed": "bule", 2437 | "username_unclaimed": "noonewouldeverusethis7" 2438 | }, 2439 | "social.tchncs.de": { 2440 | "errorType": "status_code", 2441 | "rank": 0, 2442 | "url": "https://social.tchncs.de/@{}", 2443 | "urlMain": "https://social.tchncs.de/", 2444 | "username_claimed": "Milan", 2445 | "username_unclaimed": "noonewouldeverusethis7" 2446 | }, 2447 | "soylentnews": { 2448 | "errorMsg": "The user you requested does not exist, no matter how much you wish this might be the case.", 2449 | "errorType": "message", 2450 | "rank": 0, 2451 | "url": "https://soylentnews.org/~{}", 2452 | "urlMain": "https://soylentnews.org", 2453 | "username_claimed": "adam", 2454 | "username_unclaimed": "noonewouldeverusethis7" 2455 | }, 2456 | "sparkpeople": { 2457 | "errorMsg": "We couldn't find that user", 2458 | "errorType": "message", 2459 | "rank": 0, 2460 | "url": "https://www.sparkpeople.com/mypage.asp?id={}", 2461 | "urlMain": "https://www.sparkpeople.com", 2462 | "username_claimed": "adam", 2463 | "username_unclaimed": "noonewouldeverusethis7" 2464 | }, 2465 | "spletnik": { 2466 | "errorType": "status_code", 2467 | "rank": 0, 2468 | "url": "https://spletnik.ru/user/{}", 2469 | "urlMain": "https://spletnik.ru/", 2470 | "username_claimed": "blue", 2471 | "username_unclaimed": "noonewouldeverusethis7" 2472 | }, 2473 | "svidbook": { 2474 | "errorType": "status_code", 2475 | "rank": 0, 2476 | "url": "https://www.svidbook.ru/user/{}", 2477 | "urlMain": "https://www.svidbook.ru/", 2478 | "username_claimed": "green", 2479 | "username_unclaimed": "noonewouldeverusethis7" 2480 | }, 2481 | "toster": { 2482 | "errorType": "status_code", 2483 | "rank": 0, 2484 | "url": "https://www.toster.ru/user/{}/answers", 2485 | "urlMain": "https://www.toster.ru/", 2486 | "username_claimed": "adam", 2487 | "username_unclaimed": "noonewouldeverusethis7" 2488 | }, 2489 | "tracr.co": { 2490 | "errorMsg": "No search results", 2491 | "errorType": "message", 2492 | "rank": 0, 2493 | "regexCheck": "^[A-Za-z0-9]{2,32}$", 2494 | "url": "https://tracr.co/users/1/{}", 2495 | "urlMain": "https://tracr.co/", 2496 | "username_claimed": "blue", 2497 | "username_unclaimed": "noonewouldeverusethis7" 2498 | }, 2499 | "travellerspoint": { 2500 | "errorMsg": "Wooops. Sorry!", 2501 | "errorType": "message", 2502 | "rank": 0, 2503 | "url": "https://www.travellerspoint.com/users/{}", 2504 | "urlMain": "https://www.travellerspoint.com", 2505 | "username_claimed": "blue", 2506 | "username_unclaimed": "noonewouldeverusethis7" 2507 | }, 2508 | "uid": { 2509 | "errorType": "status_code", 2510 | "rank": 0, 2511 | "url": "http://uid.me/{}", 2512 | "urlMain": "https://uid.me/", 2513 | "username_claimed": "blue", 2514 | "username_unclaimed": "noonewouldeverusethis7" 2515 | }, 2516 | "warriorforum": { 2517 | "errorType": "status_code", 2518 | "rank": 0, 2519 | "url": "https://www.warriorforum.com/members/{}.html", 2520 | "urlMain": "https://www.warriorforum.com/", 2521 | "username_claimed": "blue", 2522 | "username_unclaimed": "noonewouldeverusethis77777" 2523 | }, 2524 | "windy": { 2525 | "errorType": "status_code", 2526 | "rank": 0, 2527 | "url": "https://community.windy.com/user/{}", 2528 | "urlMain": "https://windy.com/", 2529 | "username_claimed": "blue", 2530 | "username_unclaimed": "noonewouldeverusethis7" 2531 | } 2532 | } -------------------------------------------------------------------------------- /sherlock/sherlock/result.py: -------------------------------------------------------------------------------- 1 | """Sherlock Result Module 2 | 3 | This module defines various objects for recording the results of queries. 4 | """ 5 | from enum import Enum 6 | 7 | 8 | class QueryStatus(Enum): 9 | """Query Status Enumeration. 10 | 11 | Describes status of query about a given username. 12 | """ 13 | CLAIMED = "Claimed" #Username Detected 14 | AVAILABLE = "Available" #Username Not Detected 15 | UNKNOWN = "Unknown" #Error Occurred While Trying To Detect Username 16 | ILLEGAL = "Illegal" #Username Not Allowable For This Site 17 | 18 | def __str__(self): 19 | """Convert Object To String. 20 | 21 | Keyword Arguments: 22 | self -- This object. 23 | 24 | Return Value: 25 | Nicely formatted string to get information about this object. 26 | """ 27 | return self.value 28 | 29 | class QueryResult(): 30 | """Query Result Object. 31 | 32 | Describes result of query about a given username. 33 | """ 34 | def __init__(self, username, site_name, site_url_user, status, 35 | query_time=None, context=None): 36 | """Create Query Result Object. 37 | 38 | Contains information about a specific method of detecting usernames on 39 | a given type of web sites. 40 | 41 | Keyword Arguments: 42 | self -- This object. 43 | username -- String indicating username that query result 44 | was about. 45 | site_name -- String which identifies site. 46 | site_url_user -- String containing URL for username on site. 47 | NOTE: The site may or may not exist: this 48 | just indicates what the name would 49 | be, if it existed. 50 | status -- Enumeration of type QueryStatus() indicating 51 | the status of the query. 52 | query_time -- Time (in seconds) required to perform query. 53 | Default of None. 54 | context -- String indicating any additional context 55 | about the query. For example, if there was 56 | an error, this might indicate the type of 57 | error that occurred. 58 | Default of None. 59 | 60 | Return Value: 61 | Nothing. 62 | """ 63 | 64 | self.username = username 65 | self.site_name = site_name 66 | self.site_url_user = site_url_user 67 | self.status = status 68 | self.query_time = query_time 69 | self.context = context 70 | 71 | return 72 | 73 | def __str__(self): 74 | """Convert Object To String. 75 | 76 | Keyword Arguments: 77 | self -- This object. 78 | 79 | Return Value: 80 | Nicely formatted string to get information about this object. 81 | """ 82 | status = str(self.status) 83 | if self.context is not None: 84 | #There is extra context information available about the results. 85 | #Append it to the normal response text. 86 | status += f" ({self.context})" 87 | 88 | return status 89 | -------------------------------------------------------------------------------- /sherlock/sherlock/sherlock.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python3 2 | 3 | """ 4 | Sherlock: Find Usernames Across Social Networks Module 5 | 6 | This module contains the main logic to search for usernames at social 7 | networks. 8 | """ 9 | import os 10 | import re 11 | import sys 12 | from argparse import ArgumentParser, RawDescriptionHelpFormatter 13 | from time import monotonic 14 | 15 | import requests 16 | 17 | from requests_futures.sessions import FuturesSession 18 | from sherlock.sherlock.result import QueryStatus 19 | from sherlock.sherlock.result import QueryResult 20 | from sherlock.sherlock.notify import QueryNotifyPrint 21 | from sherlock.sherlock.sites import SitesInformation 22 | 23 | white = '\033[97m' 24 | green = '\033[92m' 25 | red = '\033[91m' 26 | yellow = '\033[93m' 27 | end = '\033[0m' 28 | info = '\033[93m[!] \033[0m' 29 | que = '\033[94m[?] \033[0m' 30 | bad = '\033[91m[-] \033[0m' 31 | good = '\033[32m[+] \033[0m' 32 | run = '\033[97m[~] \033[0m' 33 | 34 | class SherlockFuturesSession(FuturesSession): 35 | def request(self, method, url, hooks={}, *args, **kwargs): 36 | #Record the start time for the request. 37 | start = monotonic() 38 | 39 | def response_time(resp, *args, **kwargs): 40 | resp.elapsed = monotonic() - start 41 | 42 | return 43 | 44 | #Install hook to execute when response completes. 45 | #Make sure that the time measurement hook is first, so we will not 46 | #track any later hook's execution time. 47 | try: 48 | if isinstance(hooks['response'], list): 49 | hooks['response'].insert(0, response_time) 50 | elif isinstance(hooks['response'], tuple): 51 | #Convert tuple to list and insert time measurement hook first. 52 | hooks['response'] = list(hooks['response']) 53 | hooks['response'].insert(0, response_time) 54 | else: 55 | #Must have previously contained a single hook function, 56 | #so convert to list. 57 | hooks['response'] = [response_time, hooks['response']] 58 | except KeyError: 59 | #No response hook was already defined, so install it ourselves. 60 | hooks['response'] = [response_time] 61 | 62 | return super(SherlockFuturesSession, self).request(method, 63 | url, 64 | hooks=hooks, 65 | *args, **kwargs) 66 | 67 | def get_response(request_future, error_type, social_network): 68 | 69 | #Default for Response object if some failure occurs. 70 | response = None 71 | 72 | error_context = "General Unknown Error" 73 | expection_text = None 74 | try: 75 | response = request_future.result() 76 | if response.status_code: 77 | #status code exists in response object 78 | error_context = None 79 | except requests.exceptions.HTTPError as errh: 80 | error_context = "HTTP Error" 81 | expection_text = str(errh) 82 | except requests.exceptions.ProxyError as errp: 83 | error_context = "Proxy Error" 84 | expection_text = str(errp) 85 | except requests.exceptions.ConnectionError as errc: 86 | error_context = "Error Connecting" 87 | expection_text = str(errc) 88 | except requests.exceptions.Timeout as errt: 89 | error_context = "Timeout Error" 90 | expection_text = str(errt) 91 | except requests.exceptions.RequestException as err: 92 | error_context = "Unknown Error" 93 | expection_text = str(err) 94 | 95 | return response, error_context, expection_text 96 | 97 | 98 | def sherlock(username, site_data, query_notify): 99 | 100 | #Notify caller that we are starting the query. 101 | query_notify.start(username) 102 | 103 | underlying_session = requests.session() 104 | underlying_request = requests.Request() 105 | 106 | #Limit number of workers to 20. 107 | #This is probably vastly overkill. 108 | if len(site_data) >= 20: 109 | max_workers=20 110 | else: 111 | max_workers=len(site_data) 112 | 113 | #Create multi-threaded session for all requests. 114 | session = SherlockFuturesSession(max_workers=max_workers, 115 | session=underlying_session) 116 | 117 | 118 | # Results from analysis of all sites 119 | results_total = {} 120 | 121 | # First create futures for all requests. This allows for the requests to run in parallel 122 | for social_network, net_info in site_data.items(): 123 | 124 | # Results from analysis of this specific site 125 | results_site = {} 126 | 127 | # Record URL of main site 128 | results_site['url_main'] = net_info.get("urlMain") 129 | 130 | # A user agent is needed because some sites don't return the correct 131 | # information since they think that we are bots (Which we actually are...) 132 | headers = { 133 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0', 134 | } 135 | 136 | if "headers" in net_info: 137 | # Override/append any extra headers required by a given site. 138 | headers.update(net_info["headers"]) 139 | 140 | # URL of user on site (if it exists) 141 | url = net_info["url"].format(username) 142 | 143 | # Don't make request if username is invalid for the site 144 | regex_check = net_info.get("regexCheck") 145 | if regex_check and re.search(regex_check, username) is None: 146 | # No need to do the check at the site: this user name is not allowed. 147 | results_site['status'] = QueryResult(username, 148 | social_network, 149 | url, 150 | QueryStatus.ILLEGAL) 151 | results_site["url_user"] = "" 152 | results_site['http_status'] = "" 153 | results_site['response_text'] = "" 154 | query_notify.update(results_site['status']) 155 | else: 156 | # URL of user on site (if it exists) 157 | results_site["url_user"] = url 158 | url_probe = net_info.get("urlProbe") 159 | if url_probe is None: 160 | # Probe URL is normal one seen by people out on the web. 161 | url_probe = url 162 | else: 163 | # There is a special URL for probing existence separate 164 | # from where the user profile normally can be found. 165 | url_probe = url_probe.format(username) 166 | 167 | if (net_info["errorType"] == 'status_code' and 168 | net_info.get("request_head_only", True) == True): 169 | #In most cases when we are detecting by status code, 170 | #it is not necessary to get the entire body: we can 171 | #detect fine with just the HEAD response. 172 | request_method = session.head 173 | else: 174 | #Either this detect method needs the content associated 175 | #with the GET response, or this specific website will 176 | #not respond properly unless we request the whole page. 177 | request_method = session.get 178 | 179 | if net_info["errorType"] == "response_url": 180 | # Site forwards request to a different URL if username not 181 | # found. Disallow the redirect so we can capture the 182 | # http status from the original URL request. 183 | allow_redirects = False 184 | else: 185 | # Allow whatever redirect that the site wants to do. 186 | # The final result of the request will be what is available. 187 | allow_redirects = True 188 | 189 | # This future starts running the request in a new thread, doesn't block the main thread 190 | future = request_method(url=url_probe, headers=headers, 191 | allow_redirects=allow_redirects) 192 | 193 | # Store future in data for access later 194 | net_info["request_future"] = future 195 | 196 | # Add this site's results into final dictionary with all of the other results. 197 | results_total[social_network] = results_site 198 | 199 | # Open the file containing account links 200 | # Core logic: If tor requests, make them here. If multi-threaded requests, wait for responses 201 | for social_network, net_info in site_data.items(): 202 | 203 | # Retrieve results again 204 | results_site = results_total.get(social_network) 205 | 206 | # Retrieve other site information again 207 | url = results_site.get("url_user") 208 | status = results_site.get("status") 209 | if status is not None: 210 | # We have already determined the user doesn't exist here 211 | continue 212 | 213 | # Get the expected error type 214 | error_type = net_info["errorType"] 215 | 216 | # Retrieve future and ensure it has finished 217 | future = net_info["request_future"] 218 | r, error_text, expection_text = get_response(request_future=future, 219 | error_type=error_type, 220 | social_network=social_network) 221 | 222 | #Get response time for response of our request. 223 | try: 224 | response_time = r.elapsed 225 | except AttributeError: 226 | response_time = None 227 | 228 | # Attempt to get request information 229 | try: 230 | http_status = r.status_code 231 | except: 232 | http_status = "?" 233 | try: 234 | response_text = r.text.encode(r.encoding) 235 | except: 236 | response_text = "" 237 | 238 | if error_text is not None: 239 | result = QueryResult(username, 240 | social_network, 241 | url, 242 | QueryStatus.UNKNOWN, 243 | query_time=response_time, 244 | context=error_text) 245 | elif error_type == "message": 246 | error = net_info.get("errorMsg") 247 | # Checks if the error message is in the HTML 248 | if not error in r.text: 249 | result = QueryResult(username, 250 | social_network, 251 | url, 252 | QueryStatus.CLAIMED, 253 | query_time=response_time) 254 | else: 255 | result = QueryResult(username, 256 | social_network, 257 | url, 258 | QueryStatus.AVAILABLE, 259 | query_time=response_time) 260 | elif error_type == "status_code": 261 | # Checks if the status code of the response is 2XX 262 | if not r.status_code >= 300 or r.status_code < 200: 263 | result = QueryResult(username, 264 | social_network, 265 | url, 266 | QueryStatus.CLAIMED, 267 | query_time=response_time) 268 | else: 269 | result = QueryResult(username, 270 | social_network, 271 | url, 272 | QueryStatus.AVAILABLE, 273 | query_time=response_time) 274 | elif error_type == "response_url": 275 | # For this detection method, we have turned off the redirect. 276 | # So, there is no need to check the response URL: it will always 277 | # match the request. Instead, we will ensure that the response 278 | # code indicates that the request was successful (i.e. no 404, or 279 | # forward to some odd redirect). 280 | if 200 <= r.status_code < 300: 281 | result = QueryResult(username, 282 | social_network, 283 | url, 284 | QueryStatus.CLAIMED, 285 | query_time=response_time) 286 | else: 287 | result = QueryResult(username, 288 | social_network, 289 | url, 290 | QueryStatus.AVAILABLE, 291 | query_time=response_time) 292 | else: 293 | #It should be impossible to ever get here... 294 | raise ValueError(f"Unknown Error Type '{error_type}' for " 295 | f"site '{social_network}'") 296 | 297 | 298 | #Notify caller about results of query. 299 | query_notify.update(result) 300 | 301 | # Save status of request 302 | results_site['status'] = result 303 | 304 | # Save results from request 305 | results_site['http_status'] = http_status 306 | results_site['response_text'] = response_text 307 | 308 | # Add this site's results into final dictionary with all of the other results. 309 | results_total[social_network] = results_site 310 | 311 | #Notify caller that all queries are finished. 312 | query_notify.finish() 313 | 314 | return results_total 315 | 316 | 317 | def UserSearch(username): 318 | site_data_all = {} 319 | try: 320 | sites = SitesInformation(None) 321 | 322 | except Exception as error: 323 | print(f"ERROR: {error}") 324 | sys.exit(1) 325 | 326 | for site in sites: 327 | site_data_all[site.name] = site.information 328 | 329 | site_data = site_data_all 330 | 331 | query_notify = QueryNotifyPrint(result=None) 332 | results = sherlock(username, site_data, query_notify) 333 | exists_counter = 0 334 | for website_name in results: 335 | dictionary = results[website_name] 336 | if dictionary.get("status").status == QueryStatus.CLAIMED: 337 | exists_counter += 1 338 | 339 | print(good + white + f"Total websites username detected : {exists_counter}") -------------------------------------------------------------------------------- /sherlock/sherlock/sites.py: -------------------------------------------------------------------------------- 1 | """Sherlock Sites Information Module 2 | 3 | This module supports storing information about web sites. 4 | This is the raw data that will be used to search for usernames. 5 | """ 6 | import os 7 | import json 8 | import operator 9 | import requests 10 | import sys 11 | 12 | 13 | class SiteInformation(): 14 | def __init__(self, name, url_home, url_username_format, popularity_rank, 15 | username_claimed, username_unclaimed, 16 | information): 17 | """Create Site Information Object. 18 | 19 | Contains information about a specific web site. 20 | 21 | Keyword Arguments: 22 | self -- This object. 23 | name -- String which identifies site. 24 | url_home -- String containing URL for home of site. 25 | url_username_format -- String containing URL for Username format 26 | on site. 27 | NOTE: The string should contain the 28 | token "{}" where the username should 29 | be substituted. For example, a string 30 | of "https://somesite.com/users/{}" 31 | indicates that the individual 32 | usernames would show up under the 33 | "https://somesite.com/users/" area of 34 | the web site. 35 | popularity_rank -- Integer indicating popularity of site. 36 | In general, smaller numbers mean more 37 | popular ("0" or None means ranking 38 | information not available). 39 | username_claimed -- String containing username which is known 40 | to be claimed on web site. 41 | username_unclaimed -- String containing username which is known 42 | to be unclaimed on web site. 43 | information -- Dictionary containing all known information 44 | about web site. 45 | NOTE: Custom information about how to 46 | actually detect the existence of the 47 | username will be included in this 48 | dictionary. This information will 49 | be needed by the detection method, 50 | but it is only recorded in this 51 | object for future use. 52 | 53 | Return Value: 54 | Nothing. 55 | """ 56 | 57 | self.name = name 58 | self.url_home = url_home 59 | self.url_username_format = url_username_format 60 | 61 | if (popularity_rank is None) or (popularity_rank == 0): 62 | #We do not know the popularity, so make site go to bottom of list. 63 | popularity_rank = sys.maxsize 64 | self.popularity_rank = popularity_rank 65 | 66 | self.username_claimed = username_claimed 67 | self.username_unclaimed = username_unclaimed 68 | self.information = information 69 | 70 | return 71 | 72 | def __str__(self): 73 | """Convert Object To String. 74 | 75 | Keyword Arguments: 76 | self -- This object. 77 | 78 | Return Value: 79 | Nicely formatted string to get information about this object. 80 | """ 81 | 82 | return f"{self.name} ({self.url_home})" 83 | 84 | 85 | class SitesInformation(): 86 | def __init__(self, data_file_path=None): 87 | """Create Sites Information Object. 88 | 89 | Contains information about all supported web sites. 90 | 91 | Keyword Arguments: 92 | self -- This object. 93 | data_file_path -- String which indicates path to data file. 94 | The file name must end in ".json". 95 | 96 | There are 3 possible formats: 97 | * Absolute File Format 98 | For example, "c:/stuff/data.json". 99 | * Relative File Format 100 | The current working directory is used 101 | as the context. 102 | For example, "data.json". 103 | * URL Format 104 | For example, 105 | "https://example.com/data.json", or 106 | "http://example.com/data.json". 107 | 108 | An exception will be thrown if the path 109 | to the data file is not in the expected 110 | format, or if there was any problem loading 111 | the file. 112 | 113 | If this option is not specified, then a 114 | default site list will be used. 115 | 116 | Return Value: 117 | Nothing. 118 | """ 119 | 120 | if data_file_path is None: 121 | #Use internal default. 122 | data_file_path = \ 123 | os.path.join(os.path.dirname(os.path.realpath(__file__)), 124 | "resources/data.json" 125 | ) 126 | 127 | #Ensure that specified data file has correct extension. 128 | if ".json" != data_file_path[-5:].lower(): 129 | raise FileNotFoundError(f"Incorrect JSON file extension for " 130 | f"data file '{data_file_path}'." 131 | ) 132 | 133 | if ( ("http://" == data_file_path[:7].lower()) or 134 | ("https://" == data_file_path[:8].lower()) 135 | ): 136 | #Reference is to a URL. 137 | try: 138 | response = requests.get(url=data_file_path) 139 | except Exception as error: 140 | raise FileNotFoundError(f"Problem while attempting to access " 141 | f"data file URL '{data_file_path}': " 142 | f"{str(error)}" 143 | ) 144 | if response.status_code == 200: 145 | try: 146 | site_data = response.json() 147 | except Exception as error: 148 | raise ValueError(f"Problem parsing json contents at " 149 | f"'{data_file_path}': {str(error)}." 150 | ) 151 | else: 152 | raise FileNotFoundError(f"Bad response while accessing " 153 | f"data file URL '{data_file_path}'." 154 | ) 155 | else: 156 | #Reference is to a file. 157 | try: 158 | with open(data_file_path, "r", encoding="utf-8") as file: 159 | try: 160 | site_data = json.load(file) 161 | except Exception as error: 162 | raise ValueError(f"Problem parsing json contents at " 163 | f"'{data_file_path}': {str(error)}." 164 | ) 165 | except FileNotFoundError as error: 166 | raise FileNotFoundError(f"Problem while attempting to access " 167 | f"data file '{data_file_path}'." 168 | ) 169 | 170 | self.sites = {} 171 | 172 | #Add all of site information from the json file to internal site list. 173 | for site_name in site_data: 174 | try: 175 | #If popularity unknown, make site be at bottom of list. 176 | popularity_rank = site_data[site_name].get("rank", sys.maxsize) 177 | 178 | self.sites[site_name] = \ 179 | SiteInformation(site_name, 180 | site_data[site_name]["urlMain"], 181 | site_data[site_name]["url"], 182 | popularity_rank, 183 | site_data[site_name]["username_claimed"], 184 | site_data[site_name]["username_unclaimed"], 185 | site_data[site_name] 186 | ) 187 | except KeyError as error: 188 | raise ValueError(f"Problem parsing json contents at " 189 | f"'{data_file_path}': " 190 | f"Missing attribute {str(error)}." 191 | ) 192 | 193 | return 194 | 195 | def site_name_list(self, popularity_rank=False): 196 | """Get Site Name List. 197 | 198 | Keyword Arguments: 199 | self -- This object. 200 | popularity_rank -- Boolean indicating if list should be sorted 201 | by popularity rank. 202 | Default value is False. 203 | NOTE: List is sorted in ascending 204 | alphabetical order is popularity rank 205 | is not requested. 206 | 207 | Return Value: 208 | List of strings containing names of sites. 209 | """ 210 | 211 | if popularity_rank: 212 | #Sort in ascending popularity rank order. 213 | site_rank_name = \ 214 | sorted([(site.popularity_rank,site.name) for site in self], 215 | key=operator.itemgetter(0) 216 | ) 217 | site_names = [name for _,name in site_rank_name] 218 | else: 219 | #Sort in ascending alphabetical order. 220 | site_names = sorted([site.name for site in self], key=str.lower) 221 | 222 | return site_names 223 | 224 | def __iter__(self): 225 | """Iterator For Object. 226 | 227 | Keyword Arguments: 228 | self -- This object. 229 | 230 | Return Value: 231 | Iterator for sites object. 232 | """ 233 | 234 | for site_name in self.sites: 235 | yield self.sites[site_name] 236 | 237 | def __len__(self): 238 | """Length For Object. 239 | 240 | Keyword Arguments: 241 | self -- This object. 242 | 243 | Return Value: 244 | Length of sites object. 245 | """ 246 | return len(self.sites) 247 | -------------------------------------------------------------------------------- /sherlock/site_list.py: -------------------------------------------------------------------------------- 1 | """Sherlock: Supported Site Listing 2 | This module generates the listing of supported sites. 3 | """ 4 | import json 5 | import sys 6 | import requests 7 | white = '\033[97m' 8 | green = '\033[92m' 9 | red = '\033[91m' 10 | yellow = '\033[93m' 11 | end = '\033[0m' 12 | info = '\033[93m[!] \033[0m' 13 | que = '\033[94m[?] \033[0m' 14 | bad = '\033[91m[-] \033[0m' 15 | good = '\033[32m[+] \033[0m' 16 | run = '\033[97m[~] \033[0m' 17 | 18 | def SherlockUpdate(): 19 | pool = list() 20 | 21 | with open("sherlock/sherlock/resources/data.json", "r", encoding="utf-8") as data_file: 22 | data = json.load(data_file) 23 | 24 | 25 | with open("sites.md", "w") as site_file: 26 | data_length = len(data) 27 | site_file.write(f'## List Of Supported Sites ({data_length} Sites In Total!)\n') 28 | 29 | for social_network in data: 30 | url_main = data.get(social_network).get("urlMain") 31 | data.get(social_network)["rank"] = 0 32 | th = None 33 | pool.append((social_network, url_main, th)) 34 | 35 | index = 1 36 | for social_network, url_main, th in pool: 37 | site_file.write(f'{index}. [{social_network}]({url_main})\n') 38 | sys.stdout.write("\r{0}".format(good + white + "Updated " + yellow + f"{index} " + white + "out of " + yellow + f"{data_length} " + white + "entries" + end)) 39 | sys.stdout.flush() 40 | index = index + 1 41 | print() 42 | sorted_json_data = json.dumps(data, indent=2, sort_keys=True) 43 | 44 | with open("sherlock/sherlock/resources/data.json", "w") as data_file: 45 | data_file.write(sorted_json_data) 46 | 47 | print(good + white + "Finished updating supported site listing!") -------------------------------------------------------------------------------- /sites.md: -------------------------------------------------------------------------------- 1 | ## List Of Supported Sites (297 Sites In Total!) 2 | 1. [2Dimensions](https://2Dimensions.com/) 3 | 2. [3dnews](http://forum.3dnews.ru/) 4 | 3. [4pda](https://4pda.ru/) 5 | 4. [500px](https://500px.com/) 6 | 5. [7Cups](https://www.7cups.com/) 7 | 6. [About.me](https://about.me/) 8 | 7. [Academia.edu](https://www.academia.edu/) 9 | 8. [Alik.cz](https://www.alik.cz/) 10 | 9. [AllTrails](https://www.alltrails.com/) 11 | 10. [Anobii](https://www.anobii.com/) 12 | 11. [Aptoide](https://en.aptoide.com/) 13 | 12. [Archive.org](https://archive.org) 14 | 13. [Asciinema](https://asciinema.org) 15 | 14. [Ask Fedora](https://ask.fedoraproject.org/) 16 | 15. [AskFM](https://ask.fm/) 17 | 16. [Audiojungle](https://audiojungle.net/) 18 | 17. [Avizo](https://www.avizo.cz/) 19 | 18. [BLIP.fm](https://blip.fm/) 20 | 19. [BOOTH](https://booth.pm/) 21 | 20. [Badoo](https://badoo.com/) 22 | 21. [Bandcamp](https://www.bandcamp.com/) 23 | 22. [Bazar.cz](https://www.bazar.cz/) 24 | 23. [Behance](https://www.behance.net/) 25 | 24. [BitBucket](https://bitbucket.org/) 26 | 25. [BitCoinForum](https://bitcoinforum.com) 27 | 26. [Blogger](https://www.blogger.com/) 28 | 27. [BodyBuilding](https://bodyspace.bodybuilding.com/) 29 | 28. [Bookcrossing](https://www.bookcrossing.com/) 30 | 29. [BuyMeACoffee](https://www.buymeacoffee.com/) 31 | 30. [BuzzFeed](https://buzzfeed.com/) 32 | 31. [CNET](https://www.cnet.com/) 33 | 32. [Carbonmade](https://carbonmade.com/) 34 | 33. [Career.habr](https://career.habr.com/) 35 | 34. [CashMe](https://cash.me/) 36 | 35. [Cent](https://cent.co/) 37 | 36. [Championat](https://www.championat.com/) 38 | 37. [Chatujme.cz](https://chatujme.cz/) 39 | 38. [Chess](https://www.chess.com/ru/) 40 | 39. [Cloob](https://www.cloob.com/) 41 | 40. [CloudflareCommunity](https://community.cloudflare.com/) 42 | 41. [Clozemaster](https://www.clozemaster.com) 43 | 42. [Codecademy](https://www.codecademy.com/) 44 | 43. [Codechef](https://www.codechef.com/) 45 | 44. [Coderwall](https://coderwall.com/) 46 | 45. [Codewars](https://www.codewars.com) 47 | 46. [Contently](https://contently.com/) 48 | 47. [Coroflot](https://coroflot.com/) 49 | 48. [Cracked](https://www.cracked.com/) 50 | 49. [CreativeMarket](https://creativemarket.com/) 51 | 50. [Crevado](https://crevado.com/) 52 | 51. [Crunchyroll](https://www.crunchyroll.com/) 53 | 52. [DEV Community](https://dev.to/) 54 | 53. [DailyMotion](https://www.dailymotion.com/) 55 | 54. [Designspiration](https://www.designspiration.net/) 56 | 55. [DeviantART](https://deviantart.com) 57 | 56. [Discogs](https://www.discogs.com/) 58 | 57. [Discuss.Elastic.co](https://discuss.elastic.co/) 59 | 58. [Disqus](https://disqus.com/) 60 | 59. [Docker Hub](https://hub.docker.com/) 61 | 60. [Dribbble](https://dribbble.com/) 62 | 61. [Duolingo](https://duolingo.com/) 63 | 62. [Ebay](https://www.ebay.com/) 64 | 63. [Ello](https://ello.co/) 65 | 64. [Etsy](https://www.etsy.com/) 66 | 65. [Euw](https://euw.op.gg/) 67 | 66. [EyeEm](https://www.eyeem.com/) 68 | 67. [Facebook](https://www.facebook.com/) 69 | 68. [Facenama](https://facenama.com/) 70 | 69. [Fandom](https://www.fandom.com/) 71 | 70. [Filmogs](https://www.filmo.gs/) 72 | 71. [Fiverr](https://www.fiverr.com/) 73 | 72. [Flickr](https://www.flickr.com/) 74 | 73. [Flightradar24](https://www.flightradar24.com/) 75 | 74. [Flipboard](https://flipboard.com/) 76 | 75. [Football](https://www.rusfootball.info/) 77 | 76. [FortniteTracker](https://fortnitetracker.com/challenges) 78 | 77. [Freelance.habr](https://freelance.habr.com/) 79 | 78. [Freelancer.com](https://www.freelancer.com/) 80 | 79. [Freesound](https://freesound.org/) 81 | 80. [GDProfiles](https://gdprofiles.com/) 82 | 81. [Gamespot](https://www.gamespot.com/) 83 | 82. [Giphy](https://giphy.com/) 84 | 83. [GitHub](https://www.github.com/) 85 | 84. [GitLab](https://gitlab.com/) 86 | 85. [Gitee](https://gitee.com/) 87 | 86. [GoodReads](https://www.goodreads.com/) 88 | 87. [Gravatar](http://en.gravatar.com/) 89 | 88. [Gumroad](https://www.gumroad.com/) 90 | 89. [GunsAndAmmo](https://gunsandammo.com/) 91 | 90. [GuruShots](https://gurushots.com/) 92 | 91. [HackTheBox](https://forum.hackthebox.eu/) 93 | 92. [HackerNews](https://news.ycombinator.com/) 94 | 93. [HackerOne](https://hackerone.com/) 95 | 94. [HackerRank](https://hackerrank.com/) 96 | 95. [House-Mixes.com](https://www.house-mixes.com/) 97 | 96. [Houzz](https://houzz.com/) 98 | 97. [HubPages](https://hubpages.com/) 99 | 98. [Hubski](https://hubski.com/) 100 | 99. [IFTTT](https://www.ifttt.com/) 101 | 100. [ImageShack](https://imageshack.us/) 102 | 101. [ImgUp.cz](https://imgup.cz/) 103 | 102. [Instagram](https://www.instagram.com/) 104 | 103. [Instructables](https://www.instructables.com/) 105 | 104. [Issuu](https://issuu.com/) 106 | 105. [Itch.io](https://itch.io/) 107 | 106. [Jimdo](https://jimdosite.com/) 108 | 107. [Kaggle](https://www.kaggle.com/) 109 | 108. [Kali community](https://forums.kali.org/) 110 | 109. [KanoWorld](https://world.kano.me/) 111 | 110. [Keybase](https://keybase.io/) 112 | 111. [Kik](http://kik.me/) 113 | 112. [Kongregate](https://www.kongregate.com/) 114 | 113. [LOR](https://linux.org.ru/) 115 | 114. [Launchpad](https://launchpad.net/) 116 | 115. [LeetCode](https://leetcode.com/) 117 | 116. [Letterboxd](https://letterboxd.com/) 118 | 117. [Lichess](https://lichess.org) 119 | 118. [LiveJournal](https://www.livejournal.com/) 120 | 119. [Lobsters](https://lobste.rs/) 121 | 120. [Lolchess](https://lolchess.gg/) 122 | 121. [Medium](https://medium.com/) 123 | 122. [MeetMe](https://www.meetme.com/) 124 | 123. [Memrise](https://www.memrise.com/) 125 | 124. [MixCloud](https://www.mixcloud.com/) 126 | 125. [MyAnimeList](https://myanimelist.net/) 127 | 126. [Myspace](https://myspace.com/) 128 | 127. [NICommunityForum](https://www.native-instruments.com/forum/) 129 | 128. [NPM](https://www.npmjs.com/) 130 | 129. [NPM-Package](https://www.npmjs.com/) 131 | 130. [NameMC (Minecraft.net skins)](https://namemc.com/) 132 | 131. [NationStates Nation](https://nationstates.net) 133 | 132. [NationStates Region](https://nationstates.net) 134 | 133. [Newgrounds](https://newgrounds.com) 135 | 134. [OK](https://ok.ru/) 136 | 135. [OpenCollective](https://opencollective.com/) 137 | 136. [OpenStreetMap](https://www.openstreetmap.org/) 138 | 137. [Oracle Community](https://community.oracle.com) 139 | 138. [Otzovik](https://otzovik.com/) 140 | 139. [OurDJTalk](https://ourdjtalk.com/) 141 | 140. [PCGamer](https://pcgamer.com) 142 | 141. [PCPartPicker](https://pcpartpicker.com) 143 | 142. [PSNProfiles.com](https://psnprofiles.com/) 144 | 143. [Packagist](https://packagist.org/) 145 | 144. [Pastebin](https://pastebin.com/) 146 | 145. [Patreon](https://www.patreon.com/) 147 | 146. [Periscope](https://www.periscope.tv/) 148 | 147. [Photobucket](https://photobucket.com/) 149 | 148. [Pinkbike](https://www.pinkbike.com/) 150 | 149. [Pinterest](https://www.pinterest.com/) 151 | 150. [PlayStore](https://play.google.com/store) 152 | 151. [Pling](https://www.pling.com/) 153 | 152. [Plug.DJ](https://plug.dj/) 154 | 153. [Pokemon Showdown](https://pokemonshowdown.com) 155 | 154. [PokerStrategy](http://www.pokerstrategy.net) 156 | 155. [Polygon](https://www.polygon.com/) 157 | 156. [ProductHunt](https://www.producthunt.com/) 158 | 157. [PromoDJ](http://promodj.com/) 159 | 158. [Quora](https://www.quora.com/) 160 | 159. [Rajce.net](https://www.rajce.idnes.cz/) 161 | 160. [Rate Your Music](https://rateyourmusic.com/) 162 | 161. [Realmeye](https://www.realmeye.com/) 163 | 162. [Redbubble](https://www.redbubble.com/) 164 | 163. [Reddit](https://www.reddit.com/) 165 | 164. [Repl.it](https://repl.it/) 166 | 165. [ResearchGate](https://www.researchgate.net/) 167 | 166. [ReverbNation](https://www.reverbnation.com/) 168 | 167. [Roblox](https://www.roblox.com/) 169 | 168. [RubyGems](https://rubygems.org/) 170 | 169. [Sbazar.cz](https://www.sbazar.cz/) 171 | 170. [Scratch](https://scratch.mit.edu/) 172 | 171. [Scribd](https://www.scribd.com/) 173 | 172. [ShitpostBot5000](https://www.shitpostbot.com/) 174 | 173. [Signal](https://community.signalusers.org) 175 | 174. [Slack](https://slack.com) 176 | 175. [SlideShare](https://slideshare.net/) 177 | 176. [Smashcast](https://www.smashcast.tv/) 178 | 177. [Smule](https://www.smule.com/) 179 | 178. [SoundCloud](https://soundcloud.com/) 180 | 179. [SourceForge](https://sourceforge.net/) 181 | 180. [Speedrun.com](https://speedrun.com/) 182 | 181. [Splits.io](https://splits.io) 183 | 182. [Sporcle](https://www.sporcle.com/) 184 | 183. [SportsRU](https://www.sports.ru/) 185 | 184. [Spotify](https://open.spotify.com/) 186 | 185. [Star Citizen](https://robertsspaceindustries.com/) 187 | 186. [Steam](https://steamcommunity.com/) 188 | 187. [SteamGroup](https://steamcommunity.com/) 189 | 188. [Steamid](https://steamid.uk/) 190 | 189. [SublimeForum](https://forum.sublimetext.com/) 191 | 190. [T-MobileSupport](https://support.t-mobile.com) 192 | 191. [TamTam](https://tamtam.chat/) 193 | 192. [Taringa](https://taringa.net/) 194 | 193. [Tellonym.me](https://tellonym.me/) 195 | 194. [Tinder](https://tinder.com/) 196 | 195. [TrackmaniaLadder](http://en.tm-ladder.com/index.php) 197 | 196. [TradingView](https://www.tradingview.com/) 198 | 197. [Trakt](https://www.trakt.tv/) 199 | 198. [TrashboxRU](https://trashbox.ru/) 200 | 199. [Trello](https://trello.com/) 201 | 200. [TripAdvisor](https://tripadvisor.com/) 202 | 201. [Twitch](https://www.twitch.tv/) 203 | 202. [Typeracer](https://typeracer.com) 204 | 203. [Ultimate-Guitar](https://ultimate-guitar.com/) 205 | 204. [Unsplash](https://unsplash.com/) 206 | 205. [VK](https://vk.com/) 207 | 206. [VSCO](https://vsco.co/) 208 | 207. [Velomania](https://forum.velomania.ru/) 209 | 208. [Venmo](https://venmo.com/) 210 | 209. [Viadeo](http://fr.viadeo.com/en/) 211 | 210. [Vimeo](https://vimeo.com/) 212 | 211. [Virgool](https://virgool.io/) 213 | 212. [VirusTotal](https://www.virustotal.com/) 214 | 213. [Wattpad](https://www.wattpad.com/) 215 | 214. [We Heart It](https://weheartit.com/) 216 | 215. [WebNode](https://www.webnode.cz/) 217 | 216. [Whonix Forum](https://forums.whonix.org/) 218 | 217. [Wikidot](http://www.wikidot.com/) 219 | 218. [Wikipedia](https://www.wikipedia.org/) 220 | 219. [Wix](https://wix.com/) 221 | 220. [WordPress](https://wordpress.com) 222 | 221. [WordPressOrg](https://wordpress.org/) 223 | 222. [YouNow](https://www.younow.com/) 224 | 223. [YouPic](https://youpic.com/) 225 | 224. [YouTube](https://www.youtube.com/) 226 | 225. [Zhihu](https://www.zhihu.com/) 227 | 226. [Zomato](https://www.zomato.com/) 228 | 227. [akniga](https://akniga.org/profile/blue/) 229 | 228. [allmylinks](https://allmylinks.com/) 230 | 229. [aminoapp](https://aminoapps.com/) 231 | 230. [authorSTREAM](http://www.authorstream.com/) 232 | 231. [babyRU](https://www.baby.ru/) 233 | 232. [babyblogRU](https://www.babyblog.ru/) 234 | 233. [chaos.social](https://chaos.social/) 235 | 234. [couchsurfing](https://www.couchsurfing.com/) 236 | 235. [d3RU](https://d3.ru/) 237 | 236. [dailykos](https://www.dailykos.com) 238 | 237. [datingRU](http://dating.ru) 239 | 238. [devRant](https://devrant.com/) 240 | 239. [drive2](https://www.drive2.ru/) 241 | 240. [eGPU](https://egpu.io/) 242 | 241. [easyen](https://easyen.ru/) 243 | 242. [eintracht](https://eintracht.de) 244 | 243. [fixya](https://www.fixya.com) 245 | 244. [fl](https://www.fl.ru/) 246 | 245. [forum_guns](https://forum.guns.ru/) 247 | 246. [forumhouseRU](https://www.forumhouse.ru/) 248 | 247. [geocaching](https://www.geocaching.com/) 249 | 248. [gfycat](https://gfycat.com/) 250 | 249. [habr](https://habr.com/) 251 | 250. [hackster](https://www.hackster.io) 252 | 251. [hunting](https://www.hunting.ru/forum/) 253 | 252. [iMGSRC.RU](https://imgsrc.ru/) 254 | 253. [igromania](http://forum.igromania.ru/) 255 | 254. [interpals](https://www.interpals.net/) 256 | 255. [irecommend](https://irecommend.ru/) 257 | 256. [jeuxvideo](http://www.jeuxvideo.com) 258 | 257. [kwork](https://www.kwork.ru/) 259 | 258. [labpentestit](https://lab.pentestit.ru/) 260 | 259. [last.fm](https://last.fm/) 261 | 260. [leasehackr](https://forum.leasehackr.com/) 262 | 261. [livelib](https://www.livelib.ru/) 263 | 262. [mastodon.cloud](https://mastodon.cloud/) 264 | 263. [mastodon.social](https://chaos.social/) 265 | 264. [mastodon.technology](https://mastodon.xyz/) 266 | 265. [mastodon.xyz](https://mastodon.xyz/) 267 | 266. [mercadolivre](https://www.mercadolivre.com.br) 268 | 267. [metacritic](https://www.metacritic.com/) 269 | 268. [mixer.com](https://mixer.com/) 270 | 269. [moikrug](https://moikrug.ru/) 271 | 270. [mstdn.io](https://mstdn.io/) 272 | 271. [nightbot](https://nightbot.tv/) 273 | 272. [nnRU](https://https://www.nn.ru/) 274 | 273. [notabug.org](https://notabug.org/) 275 | 274. [note](https://note.com/) 276 | 275. [opennet](https://www.opennet.ru/) 277 | 276. [opensource](https://opensource.com/) 278 | 277. [osu!](https://osu.ppy.sh/) 279 | 278. [pedsovet](http://pedsovet.su/) 280 | 279. [phpRU](https://php.ru/forum/) 281 | 280. [pikabu](https://pikabu.ru/) 282 | 281. [pr0gramm](https://pr0gramm.com/) 283 | 282. [pvpru](https://pvpru.com/) 284 | 283. [radio_echo_msk](https://echo.msk.ru/) 285 | 284. [radioskot](https://radioskot.ru/) 286 | 285. [satsisRU](https://satsis.info/) 287 | 286. [segmentfault](https://segmentfault.com/) 288 | 287. [social.tchncs.de](https://social.tchncs.de/) 289 | 288. [soylentnews](https://soylentnews.org) 290 | 289. [sparkpeople](https://www.sparkpeople.com) 291 | 290. [spletnik](https://spletnik.ru/) 292 | 291. [svidbook](https://www.svidbook.ru/) 293 | 292. [toster](https://www.toster.ru/) 294 | 293. [tracr.co](https://tracr.co/) 295 | 294. [travellerspoint](https://www.travellerspoint.com) 296 | 295. [uid](https://uid.me/) 297 | 296. [warriorforum](https://www.warriorforum.com/) 298 | 297. [windy](https://windy.com/) 299 | --------------------------------------------------------------------------------