├── .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 |
--------------------------------------------------------------------------------