Compare commits
194 Commits
feat/no-txt
...
clean-up
| Author | SHA1 | Date | |
|---|---|---|---|
| b5e891550c | |||
| 190c2af514 | |||
| 8175af39ae | |||
| 574aeb4ac5 | |||
| 382bc3210a | |||
| 17c443af19 | |||
| 9d6c47fdb4 | |||
| 10bed20e70 | |||
| fd3833b744 | |||
| 8f8ebf3c15 | |||
| 4253014085 | |||
| 725c68907a | |||
| c66d10bfed | |||
| e0002779b4 | |||
| 8f1308b90d | |||
| e856b05c2c | |||
| fe9e750dab | |||
| 842ae1f754 | |||
| 339634f7bc | |||
| c1632693bb | |||
| e19cb32009 | |||
| b69c8ef940 | |||
| 2724711060 | |||
| 0a68ab7f4c | |||
| 8675178be1 | |||
| 9bafb8a280 | |||
| 8e5549862a | |||
| 8797fcd517 | |||
| 0995d4d669 | |||
| 6c0c273a0b | |||
| 3eeba790fd | |||
| 61a29ec373 | |||
| 9fbbbf7c73 | |||
| 331b68d909 | |||
| 8c3e093561 | |||
| e35e5e3af1 | |||
| 906287b305 | |||
| 0dbb6abcc5 | |||
| 03e097cc82 | |||
| 91c1964918 | |||
| 373f3d389a | |||
| 828c47109d | |||
| 94245b25df | |||
| 734542f0af | |||
| 1f8166ba9f | |||
| 6f1ddaa615 | |||
| 7ee2891517 | |||
| b893e4aa20 | |||
| eff869906a | |||
| 2a0107e189 | |||
| 5d8c4de212 | |||
| 1f9d7e8373 | |||
| 184470f871 | |||
| 342dbc85cc | |||
| 457e16e84f | |||
| 43b3736b75 | |||
| 64a49ffe17 | |||
| 0afd2006c6 | |||
| 3c270173a7 | |||
| 8d73f9ef4c | |||
| 472c086805 | |||
| 400c277f24 | |||
| e759564550 | |||
| deebe7137c | |||
| cb14ccbaaf | |||
| eb892795e9 | |||
| 09de90066b | |||
| cd1f27c12b | |||
| b837de8358 | |||
| 7a70f35883 | |||
| 4b17dae385 | |||
| efefe3f54a | |||
| 4b70a1fc25 | |||
| a7893f399e | |||
| 1cb6c12851 | |||
| c4f7485ecf | |||
| 228f50413e | |||
| d1867b1b51 | |||
| 6d2497582e | |||
| 885c43b8af | |||
| 8ad47b0b23 | |||
| e93af99424 | |||
| 5862ab4f92 | |||
| 4110cac45c | |||
| d66b18e8ae | |||
| b532fc6a38 | |||
| 99cf073835 | |||
| ec7e1b8b81 | |||
| a4aab38901 | |||
| 5202900618 | |||
| 26444a98ad | |||
| bced3242f3 | |||
| 08aabdad76 | |||
| 170ee0b928 | |||
| 2c9a54438a | |||
| 84f4886809 | |||
| e26fd6b643 | |||
| ce5de20f80 | |||
| 3ff2d135b5 | |||
| 1e65b4a209 | |||
| db3545b7b0 | |||
| 1898a0c4a9 | |||
| 0d32357b10 | |||
| 1be2abb056 | |||
| fb392534ef | |||
| bd49aac9d1 | |||
| 94838863fd | |||
| 79973a58ea | |||
| b9a72b55ca | |||
| ef55f7ddd3 | |||
| 28b78e7ddd | |||
| d2072e2cac | |||
| 3edb73cb23 | |||
| 6d1280ee9d | |||
| 0c457e590a | |||
| dc307fc0fd | |||
| d6256e9fc6 | |||
| 1645828527 | |||
| e774b08dc5 | |||
| 99067b2e59 | |||
| f039b50c4e | |||
| 7d5bd97142 | |||
| 70b5055631 | |||
| 1be25e70df | |||
| 9000575f7c | |||
| 220ebf935c | |||
| 959c4a2b26 | |||
| 443d43df21 | |||
| 80080cd57c | |||
| 80922a93fa | |||
| 45494fc74b | |||
| d92e2339a1 | |||
| 659bf92d99 | |||
| 3e4d9bcd85 | |||
| d3076cdfe0 | |||
| 51436cefe8 | |||
| 08a8177286 | |||
| e6d5fd64e0 | |||
| ac9f3a7fd5 | |||
| 289ab28b98 | |||
| 46ad6c9a5e | |||
| d20dcbe8db | |||
| 70c3c84196 | |||
| 53840c6a98 | |||
| 068fff8711 | |||
| 5735d01804 | |||
| f60de0d8f8 | |||
| cb3ab91492 | |||
| 4eea79ed6a | |||
| 03c051a525 | |||
| eccdf80b95 | |||
| eb51bf9b1a | |||
| 5d7b438fd6 | |||
| ef0b97fb57 | |||
| c6c3522159 | |||
| 2908c8eaa8 | |||
| f05b8e0ed6 | |||
| 01bca6b39f | |||
| d2835e56a4 | |||
| 0cf110e69e | |||
| a88adb0488 | |||
| 4010a58dde | |||
| b9e28b9b23 | |||
| d0e005da23 | |||
| 7a4f19e6b3 | |||
| f958e7b96f | |||
| 4c99bf3b75 | |||
| e3066a1d7a | |||
| f0510a169a | |||
| 738df6c362 | |||
| 83a38db110 | |||
| 9e3448d992 | |||
| 70e3c0ddd8 | |||
| 017c08a45d | |||
| f32f4ffaee | |||
| 7379ba7b19 | |||
| 3aeb6d6356 | |||
| e44fe49c8f | |||
| 4d00884d8c | |||
| b99719ce60 | |||
| 3079e7a218 | |||
| 94c013886a | |||
| c5e209d78e | |||
| 3e653c46b0 | |||
| 91f3b16993 | |||
| 0f3df0f4da | |||
| 876e58b159 | |||
| 4fe41f09ff | |||
| 4706323976 | |||
| 4721c7f553 | |||
| 193de54b6d | |||
| 2016892e64 | |||
| 44ad8f506a | |||
| cfa4097df9 |
+1
-1
@@ -65,7 +65,7 @@ The Actor provides three types of outputs:
|
||||
| Field | Type | Required | Description |
|
||||
|-------|------|----------|-------------|
|
||||
| `username` | string | Yes | Username the search was conducted for |
|
||||
| `links` | arrray | Yes | Array with found links to the social media |
|
||||
| `links` | array | Yes | Array with found links to the social media |
|
||||
| `links[]`| string | No | URL to the account
|
||||
|
||||
### Example Dataset Item (JSON)
|
||||
|
||||
@@ -11,6 +11,7 @@ on:
|
||||
- '**/*.py'
|
||||
- '**/*.ini'
|
||||
- '**/*.toml'
|
||||
- 'Dockerfile'
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
@@ -21,15 +22,17 @@ on:
|
||||
- '**/*.py'
|
||||
- '**/*.ini'
|
||||
- '**/*.toml'
|
||||
- 'Dockerfile'
|
||||
|
||||
jobs:
|
||||
tox-lint:
|
||||
# Linting is ran through tox to ensure that the same linter is used by local runners
|
||||
runs-on: ubuntu-latest
|
||||
# Linting is run through tox to ensure that the same linter
|
||||
# is used by local runners
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Set up linting environment
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- name: Install tox and related dependencies
|
||||
@@ -41,7 +44,8 @@ jobs:
|
||||
tox-matrix:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false # We want to know what specicic versions it fails on
|
||||
# We want to know what specific versions it fails on
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [
|
||||
ubuntu-latest,
|
||||
@@ -53,11 +57,13 @@ jobs:
|
||||
'3.11',
|
||||
'3.12',
|
||||
'3.13',
|
||||
'3.14',
|
||||
'3.14t',
|
||||
]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Set up environment ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install tox and related dependencies
|
||||
@@ -67,3 +73,22 @@ jobs:
|
||||
pip install tox-gh-actions
|
||||
- name: Run tox
|
||||
run: tox
|
||||
docker-build-test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v6
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Get version from pyproject.toml
|
||||
id: get-version
|
||||
run: |
|
||||
VERSION=$(grep -m1 'version = ' pyproject.toml | cut -d'"' -f2)
|
||||
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||
- name: Build Docker image
|
||||
run: |
|
||||
docker build \
|
||||
--build-arg VERSION_TAG=${{ steps.get-version.outputs.version }} \
|
||||
-t sherlock-test:latest .
|
||||
- name: Test Docker image runs
|
||||
run: docker run --rm sherlock-test:latest --version
|
||||
|
||||
@@ -17,29 +17,40 @@ jobs:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
# Checkout the base branch but fetch all history to avoid a second fetch call
|
||||
ref: ${{ github.base_ref }}
|
||||
fetch-depth: 1
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.13'
|
||||
python-version: "3.13"
|
||||
|
||||
- name: Install Poetry
|
||||
uses: abatilo/actions-poetry@v4
|
||||
with:
|
||||
poetry-version: 'latest'
|
||||
poetry-version: "latest"
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
poetry install --no-interaction --with dev
|
||||
|
||||
- name: Drop in place updated manifest from base
|
||||
- name: Prepare JSON versions for comparison
|
||||
run: |
|
||||
cp sherlock_project/resources/data.json data.json.base
|
||||
git fetch origin pull/${{ github.event.pull_request.number }}/head:pr --depth=1
|
||||
git show pr:sherlock_project/resources/data.json > sherlock_project/resources/data.json
|
||||
cp sherlock_project/resources/data.json data.json.head
|
||||
# Fetch only the PR's branch head (single network call in this step)
|
||||
git fetch origin pull/${{ github.event.pull_request.number }}/head:pr
|
||||
|
||||
# Find the merge-base commit between the target branch and the PR branch
|
||||
MERGE_BASE=$(git merge-base origin/${{ github.base_ref }} pr)
|
||||
echo "Comparing PR head against merge-base commit: $MERGE_BASE"
|
||||
|
||||
# Safely extract the file from the PR's head and the merge-base commit
|
||||
git show pr:sherlock_project/resources/data.json > data.json.head
|
||||
git show $MERGE_BASE:sherlock_project/resources/data.json > data.json.base
|
||||
|
||||
# CRITICAL FIX: Overwrite the checked-out data.json with the one from the PR
|
||||
# This ensures that pytest runs against the new, updated file.
|
||||
cp data.json.head sherlock_project/resources/data.json
|
||||
|
||||
- name: Discover modified targets
|
||||
id: discover-modified
|
||||
@@ -47,8 +58,16 @@ jobs:
|
||||
CHANGED=$(
|
||||
python - <<'EOF'
|
||||
import json
|
||||
with open("data.json.base") as f: base = json.load(f)
|
||||
with open("data.json.head") as f: head = json.load(f)
|
||||
import sys
|
||||
try:
|
||||
with open("data.json.base") as f: base = json.load(f)
|
||||
with open("data.json.head") as f: head = json.load(f)
|
||||
except FileNotFoundError as e:
|
||||
print(f"Error: Could not find {e.filename}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Error: Could not decode JSON from a file - {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
changed = []
|
||||
for k, v in head.items():
|
||||
@@ -63,6 +82,13 @@ jobs:
|
||||
echo -e ">>> Changed targets: \n$(echo $CHANGED | tr ',' '\n')"
|
||||
echo "changed_targets=$CHANGED" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Validate remote manifest against local schema
|
||||
if: steps.discover-modified.outputs.changed_targets != ''
|
||||
run: |
|
||||
poetry run pytest tests/test_manifest.py::test_validate_manifest_against_local_schema
|
||||
|
||||
# --- The rest of the steps below are unchanged ---
|
||||
|
||||
- name: Validate modified targets
|
||||
if: steps.discover-modified.outputs.changed_targets != ''
|
||||
continue-on-error: true
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
# 3. Build image with BOTH latest and version tags
|
||||
# i.e. `docker build -t sherlock/sherlock:0.16.0 -t sherlock/sherlock:latest .`
|
||||
|
||||
FROM python:3.12-slim-bullseye as build
|
||||
FROM python:3.12-slim-bullseye AS build
|
||||
WORKDIR /sherlock
|
||||
|
||||
RUN pip3 install --no-cache-dir --upgrade pip
|
||||
|
||||
+17
-11
@@ -1,39 +1,45 @@
|
||||
#!/usr/bin/env python
|
||||
# This module generates the listing of supported sites which can be found in
|
||||
# sites.md. It also organizes all the sites in alphanumeric order
|
||||
# sites.mdx. It also organizes all the sites in alphanumeric order
|
||||
import json
|
||||
import os
|
||||
|
||||
|
||||
DATA_REL_URI: str = "sherlock_project/resources/data.json"
|
||||
|
||||
DEFAULT_ENCODING = "utf-8"
|
||||
|
||||
# Read the data.json file
|
||||
with open(DATA_REL_URI, "r", encoding="utf-8") as data_file:
|
||||
with open(DATA_REL_URI, "r", encoding=DEFAULT_ENCODING) as data_file:
|
||||
data: dict = json.load(data_file)
|
||||
|
||||
# Removes schema-specific keywords for proper processing
|
||||
social_networks: dict = dict(data)
|
||||
social_networks = data.copy()
|
||||
social_networks.pop('$schema', None)
|
||||
|
||||
# Sort the social networks in alphanumeric order
|
||||
social_networks: list = sorted(social_networks.items())
|
||||
social_networks = sorted(social_networks.items())
|
||||
|
||||
# Make output dir where the site list will be written
|
||||
os.mkdir("output")
|
||||
|
||||
# Write the list of supported sites to sites.md
|
||||
with open("output/sites.mdx", "w") as site_file:
|
||||
site_file.write("---\ntitle: 'List of supported sites'\nsidebarTitle: 'Supported sites'\nicon: 'globe'\ndescription: 'Sherlock currently supports **400+** sites'\n---\n\n")
|
||||
# Write the list of supported sites to sites.mdx
|
||||
with open("output/sites.mdx", "w", encoding=DEFAULT_ENCODING) as site_file:
|
||||
site_file.write("---\n")
|
||||
site_file.write("title: 'List of supported sites'\n")
|
||||
site_file.write("sidebarTitle: 'Supported sites'\n")
|
||||
site_file.write("icon: 'globe'\n")
|
||||
site_file.write("description: 'Sherlock currently supports **400+** sites'\n")
|
||||
site_file.write("---\n\n")
|
||||
|
||||
for social_network, info in social_networks:
|
||||
url_main = info["urlMain"]
|
||||
is_nsfw = "**(NSFW)**" if info.get("isNSFW") else ""
|
||||
site_file.write(f"1. [{social_network}]({url_main}) {is_nsfw}\n")
|
||||
|
||||
# Overwrite the data.json file with sorted data
|
||||
with open(DATA_REL_URI, "w") as data_file:
|
||||
with open(DATA_REL_URI, "w", encoding=DEFAULT_ENCODING) as data_file:
|
||||
sorted_data = json.dumps(data, indent=2, sort_keys=True)
|
||||
data_file.write(sorted_data)
|
||||
data_file.write("\n")
|
||||
data_file.write("\n") # Keep the newline after writing data
|
||||
|
||||
print("Finished updating supported site listing!")
|
||||
|
||||
|
||||
+4
-22
@@ -23,11 +23,11 @@
|
||||
|
||||
> [!WARNING]
|
||||
> Packages for ParrotOS and Ubuntu 24.04, maintained by a third party, appear to be __broken__.
|
||||
> Users of these systems should defer to pipx/pip or Docker.
|
||||
> Users of these systems should defer to [`uv`](https://docs.astral.sh/uv/)/`pipx`/`pip` or Docker.
|
||||
|
||||
| Method | Notes |
|
||||
| - | - |
|
||||
| `pipx install sherlock-project` | `pip` may be used in place of `pipx` |
|
||||
| `pipx install sherlock-project` | `pip` or [`uv`](https://docs.astral.sh/uv/) may be used in place of `pipx` |
|
||||
| `docker run -it --rm sherlock/sherlock` |
|
||||
| `dnf install sherlock-project` | |
|
||||
|
||||
@@ -97,24 +97,6 @@ optional arguments:
|
||||
--local, -l Force the use of the local data.json file.
|
||||
--nsfw Include checking of NSFW sites from default list.
|
||||
```
|
||||
## Apify Actor Usage [](https://apify.com/netmilk/sherlock?fpr=sherlock)
|
||||
|
||||
<a href="https://apify.com/netmilk/sherlock?fpr=sherlock"><img src="https://apify.com/ext/run-on-apify.png" alt="Run Sherlock Actor on Apify" width="176" height="39" /></a>
|
||||
|
||||
You can run Sherlock in the cloud without installation using the [Sherlock Actor](https://apify.com/netmilk/sherlock?fpr=sherlock) on [Apify](https://apify.com?fpr=sherlock) free of charge.
|
||||
|
||||
``` bash
|
||||
$ echo '{"usernames":["user123"]}' | apify call -so netmilk/sherlock
|
||||
[{
|
||||
"username": "user123",
|
||||
"links": [
|
||||
"https://www.1337x.to/user/user123/",
|
||||
...
|
||||
]
|
||||
}]
|
||||
```
|
||||
|
||||
Read more about the [Sherlock Actor](../.actor/README.md), including how to use it programmatically via the Apify [API](https://apify.com/netmilk/sherlock/api?fpr=sherlock), [CLI](https://docs.apify.com/cli/?fpr=sherlock) and [JS/TS and Python SDKs](https://docs.apify.com/sdk?fpr=sherlock).
|
||||
|
||||
## Credits
|
||||
|
||||
@@ -124,7 +106,7 @@ Thank you to everyone who has contributed to Sherlock! ❤️
|
||||
<img src="https://contrib.rocks/image?&columns=25&max=10000&&repo=sherlock-project/sherlock" alt="contributors"/>
|
||||
</a>
|
||||
|
||||
## Star history
|
||||
## Star History
|
||||
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=sherlock-project/sherlock&type=Date&theme=dark" />
|
||||
@@ -135,7 +117,7 @@ Thank you to everyone who has contributed to Sherlock! ❤️
|
||||
## License
|
||||
|
||||
MIT © Sherlock Project<br/>
|
||||
Original Creator - [Siddharth Dushantha](https://github.com/sdushantha)
|
||||
Creator - [Siddharth Dushantha](https://github.com/sdushantha)
|
||||
|
||||
<!-- Reference Links -->
|
||||
|
||||
|
||||
+4
-4
@@ -29,6 +29,10 @@ classifiers = [
|
||||
"Natural Language :: English",
|
||||
"Operating System :: OS Independent",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Programming Language :: Python :: 3.10",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12",
|
||||
"Programming Language :: Python :: 3.13",
|
||||
"Topic :: Security"
|
||||
]
|
||||
homepage = "https://sherlockproject.xyz/"
|
||||
@@ -46,14 +50,10 @@ PySocks = "^1.7.0"
|
||||
requests = "^2.22.0"
|
||||
requests-futures = "^1.0.0"
|
||||
stem = "^1.8.0"
|
||||
torrequest = "^0.1.0"
|
||||
pandas = "^2.2.1"
|
||||
openpyxl = "^3.0.10"
|
||||
tomli = "^2.2.1"
|
||||
|
||||
[tool.poetry.extras]
|
||||
tor = ["torrequest"]
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
jsonschema = "^4.0.0"
|
||||
rstr = "^3.2.2"
|
||||
|
||||
@@ -79,13 +79,13 @@
|
||||
"username_claimed": "pink"
|
||||
},
|
||||
"AllMyLinks": {
|
||||
"errorMsg": "Page not found",
|
||||
"errorType": "message",
|
||||
"regexCheck": "^[a-z0-9][a-z0-9-]{2,32}$",
|
||||
"url": "https://allmylinks.com/{}",
|
||||
"urlMain": "https://allmylinks.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"errorMsg": "Page not found",
|
||||
"errorType": "message",
|
||||
"regexCheck": "^[a-z0-9][a-z0-9-]{2,32}$",
|
||||
"url": "https://allmylinks.com/{}",
|
||||
"urlMain": "https://allmylinks.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"AniWorld": {
|
||||
"errorMsg": "Dieses Profil ist nicht verf\u00fcgbar",
|
||||
"errorType": "message",
|
||||
@@ -149,6 +149,12 @@
|
||||
"urlProbe": "https://archive.org/details/@{}?noscript=true",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Arduino Forum": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://forum.arduino.cc/u/{}/summary",
|
||||
"urlMain": "https://forum.arduino.cc/",
|
||||
"username_claimed": "system"
|
||||
},
|
||||
"ArtStation": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.artstation.com/{}",
|
||||
@@ -173,6 +179,12 @@
|
||||
"urlMain": "https://atcoder.jp/",
|
||||
"username_claimed": "ksun48"
|
||||
},
|
||||
"Vjudge": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://VJudge.net/user/{}",
|
||||
"urlMain": "https://VJudge.net/",
|
||||
"username_claimed": "tokitsukaze"
|
||||
},
|
||||
"Audiojungle": {
|
||||
"errorType": "status_code",
|
||||
"regexCheck": "^[a-zA-Z0-9_]+$",
|
||||
@@ -193,6 +205,13 @@
|
||||
"urlMain": "https://www.avizo.cz/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"AWS Skills Profile": {
|
||||
"errorType": "message",
|
||||
"errorMsg": "shareProfileAccepted\":false",
|
||||
"url": "https://skillsprofile.skillbuilder.aws/user/{}/",
|
||||
"urlMain": "https://skillsprofile.skillbuilder.aws",
|
||||
"username_claimed": "mayank04pant"
|
||||
},
|
||||
"BOOTH": {
|
||||
"errorType": "response_url",
|
||||
"errorUrl": "https://booth.pm/",
|
||||
@@ -259,7 +278,8 @@
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Blitz Tactics": {
|
||||
"errorType": "status_code",
|
||||
"errorMsg": "That page doesn't exist",
|
||||
"errorType": "message",
|
||||
"url": "https://blitztactics.com/{}",
|
||||
"urlMain": "https://blitztactics.com/",
|
||||
"username_claimed": "Lance5500"
|
||||
@@ -278,14 +298,6 @@
|
||||
"urlMain": "https://bsky.app/",
|
||||
"username_claimed": "mcuban"
|
||||
},
|
||||
"BoardGameGeek": {
|
||||
"errorType": "message",
|
||||
"regexCheck": "^[a-zA-Z0-9_]*$",
|
||||
"errorMsg": "User not found",
|
||||
"url": "https://boardgamegeek.com/user/{}",
|
||||
"urlMain": "https://boardgamegeek.com",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"BongaCams": {
|
||||
"errorType": "status_code",
|
||||
"isNSFW": true,
|
||||
@@ -299,12 +311,27 @@
|
||||
"urlMain": "https://www.bookcrossing.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"BoardGameGeek": {
|
||||
"errorMsg": "\"isValid\":true",
|
||||
"errorType": "message",
|
||||
"url": "https://boardgamegeek.com/user/{}",
|
||||
"urlMain": "https://boardgamegeek.com/",
|
||||
"urlProbe": "https://api.geekdo.com/api/accounts/validate/username?username={}",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"BraveCommunity": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://community.brave.com/u/{}/",
|
||||
"urlMain": "https://community.brave.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"BreachSta.rs Forum": {
|
||||
"errorMsg": "<title>Error - BreachStars</title>",
|
||||
"errorType": "message",
|
||||
"url": "https://breachsta.rs/profile/{}",
|
||||
"urlMain": "https://breachsta.rs/",
|
||||
"username_claimed": "Sleepybubble"
|
||||
},
|
||||
"BugCrowd": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://bugcrowd.com/{}",
|
||||
@@ -325,6 +352,12 @@
|
||||
"urlMain": "https://buzzfeed.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Cfx.re Forum": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://forum.cfx.re/u/{}/summary",
|
||||
"urlMain": "https://forum.cfx.re",
|
||||
"username_claimed": "hightowerlssd"
|
||||
},
|
||||
"CGTrader": {
|
||||
"errorType": "status_code",
|
||||
"regexCheck": "^[^.]*?$",
|
||||
@@ -414,7 +447,7 @@
|
||||
"Chess": {
|
||||
"errorMsg": "Username is valid",
|
||||
"errorType": "message",
|
||||
"regexCheck": "^[a-z1-9]{3,25}$",
|
||||
"regexCheck": "^[a-zA-Z0-9_]{3,25}$",
|
||||
"url": "https://www.chess.com/member/{}",
|
||||
"urlMain": "https://www.chess.com/",
|
||||
"urlProbe": "https://www.chess.com/callback/user/valid?username={}",
|
||||
@@ -505,12 +538,29 @@
|
||||
"urlMain": "https://coderwall.com",
|
||||
"username_claimed": "hacker"
|
||||
},
|
||||
"CodeSandbox": {
|
||||
"errorType": "message",
|
||||
"errorMsg": "Could not find user with username",
|
||||
"regexCheck": "^[a-zA-Z0-9_-]{3,30}$",
|
||||
"url": "https://codesandbox.io/u/{}",
|
||||
"urlProbe": "https://codesandbox.io/api/v1/users/{}",
|
||||
"urlMain": "https://codesandbox.io",
|
||||
"username_claimed": "icyjoseph"
|
||||
},
|
||||
"Codewars": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.codewars.com/users/{}",
|
||||
"urlMain": "https://www.codewars.com",
|
||||
"username_claimed": "example"
|
||||
},
|
||||
"Codolio": {
|
||||
"errorType": "message",
|
||||
"errorMsg": "<title>Page Not Found | Codolio</title>",
|
||||
"url": "https://codolio.com/profile/{}",
|
||||
"urlMain": "https://codolio.com/",
|
||||
"username_claimed": "testuser",
|
||||
"regexCheck": "^[a-zA-Z0-9_-]{3,30}$"
|
||||
},
|
||||
"Coinvote": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://coinvote.cc/profile/{}",
|
||||
@@ -537,6 +587,13 @@
|
||||
"urlMain": "https://coroflot.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Cplusplus": {
|
||||
"errorType": "message",
|
||||
"errorMsg": "<title>404 Page Not Found</title>",
|
||||
"url": "https://cplusplus.com/user/{}",
|
||||
"urlMain": "https://cplusplus.com",
|
||||
"username_claimed": "mbozzi"
|
||||
},
|
||||
"Cracked": {
|
||||
"errorType": "response_url",
|
||||
"errorUrl": "https://www.cracked.com/",
|
||||
@@ -544,6 +601,19 @@
|
||||
"urlMain": "https://www.cracked.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Cracked Forum": {
|
||||
"errorMsg": "The member you specified is either invalid or doesn't exist",
|
||||
"errorType": "message",
|
||||
"url": "https://cracked.sh/{}",
|
||||
"urlMain": "https://cracked.sh/",
|
||||
"username_claimed": "Blue"
|
||||
},
|
||||
"Credly": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.credly.com/users/{}",
|
||||
"urlMain": "https://www.credly.com/",
|
||||
"username_claimed": "credly"
|
||||
},
|
||||
"Crevado": {
|
||||
"errorType": "status_code",
|
||||
"regexCheck": "^[\\w@-]+?$",
|
||||
@@ -558,6 +628,13 @@
|
||||
"urlMain": "https://crowdin.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"CryptoHack": {
|
||||
"errorType": "response_url",
|
||||
"errorUrl": "https://cryptohack.org/",
|
||||
"url": "https://cryptohack.org/user/{}/",
|
||||
"urlMain": "https://cryptohack.org/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Cryptomator Forum": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://community.cryptomator.org/u/{}",
|
||||
@@ -613,21 +690,21 @@
|
||||
"urlMain": "https://www.dealabs.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"DeviantArt": {
|
||||
"errorType": "message",
|
||||
"errorMsg": "Llama Not Found",
|
||||
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
|
||||
"url": "https://www.deviantart.com/{}",
|
||||
"urlMain": "https://www.deviantart.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"DeviantArt": {
|
||||
"errorType": "message",
|
||||
"errorMsg": "Llama Not Found",
|
||||
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
|
||||
"url": "https://www.deviantart.com/{}",
|
||||
"urlMain": "https://www.deviantart.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"DigitalSpy": {
|
||||
"errorMsg": "The page you were looking for could not be found.",
|
||||
"errorType": "message",
|
||||
"url": "https://forums.digitalspy.com/profile/{}",
|
||||
"urlMain": "https://forums.digitalspy.com/",
|
||||
"username_claimed": "blue",
|
||||
"regexCheck": "^\\w{3,20}$"
|
||||
"errorMsg": "The page you were looking for could not be found.",
|
||||
"errorType": "message",
|
||||
"url": "https://forums.digitalspy.com/profile/{}",
|
||||
"urlMain": "https://forums.digitalspy.com/",
|
||||
"username_claimed": "blue",
|
||||
"regexCheck": "^\\w{3,20}$"
|
||||
},
|
||||
"Discogs": {
|
||||
"errorType": "status_code",
|
||||
@@ -640,10 +717,7 @@
|
||||
"url": "https://discord.com",
|
||||
"urlMain": "https://discord.com/",
|
||||
"urlProbe": "https://discord.com/api/v9/unique-username/username-attempt-unauthed",
|
||||
"errorMsg": [
|
||||
"{\"taken\":false}",
|
||||
"The resource is being rate limited"
|
||||
],
|
||||
"errorMsg": ["{\"taken\":false}", "The resource is being rate limited"],
|
||||
"request_method": "POST",
|
||||
"request_payload": {
|
||||
"username": "{}"
|
||||
@@ -653,12 +727,28 @@
|
||||
},
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Discord.bio": {
|
||||
"errorType": "message",
|
||||
"errorMsg": "<title>Server Error (500)</title>",
|
||||
"url": "https://discords.com/api-v2/bio/details/{}",
|
||||
"urlMain": "https://discord.bio/",
|
||||
"username_claimed": "robert"
|
||||
},
|
||||
"Discuss.Elastic.co": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://discuss.elastic.co/u/{}",
|
||||
"urlMain": "https://discuss.elastic.co/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Diskusjon.no": {
|
||||
"errorMsg": "{\"result\":\"ok\"}",
|
||||
"errorType": "message",
|
||||
"regexCheck": "^[a-zA-Z0-9_.-]{3,40}$",
|
||||
"urlProbe": "https://www.diskusjon.no/?app=core&module=system&controller=ajax&do=usernameExists&input={}",
|
||||
"url": "https://www.diskusjon.no",
|
||||
"urlMain": "https://www.diskusjon.no",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Disqus": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://disqus.com/{}",
|
||||
@@ -683,7 +773,6 @@
|
||||
"Duolingo": {
|
||||
"errorMsg": "{\"users\":[]}",
|
||||
"errorType": "message",
|
||||
|
||||
"url": "https://www.duolingo.com/profile/{}",
|
||||
"urlMain": "https://duolingo.com/",
|
||||
"urlProbe": "https://www.duolingo.com/2017-06-30/users?username={}",
|
||||
@@ -856,6 +945,12 @@
|
||||
"urlMain": "https://www.gamespot.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"GameFAQs": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://gamefaqs.gamespot.com/community/{}",
|
||||
"urlMain": "https://gamefaqs.gamespot.com",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"GeeksforGeeks": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://auth.geeksforgeeks.org/user/{}",
|
||||
@@ -915,6 +1010,14 @@
|
||||
"urlMain": "https://www.github.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Warframe Market": {
|
||||
"errorType": "status_code",
|
||||
"request_method": "GET",
|
||||
"url": "https://warframe.market/profile/{}",
|
||||
"urlMain": "https://warframe.market/",
|
||||
"urlProbe": "https://api.warframe.market/v2/user/{}",
|
||||
"username_claimed": "kaiallalone"
|
||||
},
|
||||
"GitLab": {
|
||||
"errorMsg": "[]",
|
||||
"errorType": "message",
|
||||
@@ -1004,18 +1107,14 @@
|
||||
"username_claimed": "blazezaria"
|
||||
},
|
||||
"HackerEarth": {
|
||||
"errorMsg": "404. URL not found.",
|
||||
"errorType": "message",
|
||||
"errorType": "status_code",
|
||||
"url": "https://hackerearth.com/@{}",
|
||||
"urlMain": "https://hackerearth.com/",
|
||||
"username_claimed": "naveennamani877"
|
||||
},
|
||||
"HackerNews": {
|
||||
"__comment__": "First errMsg invalid, second errMsg rate limited. Not ideal. Adjust for better rate limit filtering.",
|
||||
"errorMsg": [
|
||||
"No such user.",
|
||||
"Sorry."
|
||||
],
|
||||
"errorMsg": ["No such user.", "Sorry."],
|
||||
"errorType": "message",
|
||||
"url": "https://news.ycombinator.com/user?id={}",
|
||||
"urlMain": "https://news.ycombinator.com/",
|
||||
@@ -1036,6 +1135,18 @@
|
||||
"urlMain": "https://hackerrank.com/",
|
||||
"username_claimed": "satznova"
|
||||
},
|
||||
"HackerSploit": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://forum.hackersploit.org/u/{}",
|
||||
"urlMain": "https://forum.hackersploit.org/",
|
||||
"username_claimed": "hackersploit"
|
||||
},
|
||||
"HackMD": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://hackmd.io/@{}",
|
||||
"urlMain": "https://hackmd.io/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Harvard Scholar": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://scholar.harvard.edu/{}",
|
||||
@@ -1056,6 +1167,13 @@
|
||||
"urlMain": "https://www.heavy-r.com/",
|
||||
"username_claimed": "kilroy222"
|
||||
},
|
||||
"Hive Blog": {
|
||||
"errorMsg": "<title>User Not Found - Hive</title>",
|
||||
"errorType": "message",
|
||||
"url": "https://hive.blog/@{}",
|
||||
"urlMain": "https://hive.blog/",
|
||||
"username_claimed": "mango-juice"
|
||||
},
|
||||
"Holopin": {
|
||||
"errorMsg": "true",
|
||||
"errorType": "message",
|
||||
@@ -1107,6 +1225,12 @@
|
||||
"urlMain": "https://www.ifttt.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Ifunny": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://ifunny.co/user/{}",
|
||||
"urlMain": "https://ifunny.co/",
|
||||
"username_claimed": "agua"
|
||||
},
|
||||
"IRC-Galleria": {
|
||||
"errorType": "response_url",
|
||||
"errorUrl": "https://irc-galleria.net/users/search?username={}",
|
||||
@@ -1141,6 +1265,12 @@
|
||||
"urlProbe": "https://api.imgur.com/account/v1/accounts/{}?client_id=546c25a59c58ad7",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"imood": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.imood.com/users/{}",
|
||||
"urlMain": "https://www.imood.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Instagram": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://instagram.com/{}",
|
||||
@@ -1217,6 +1347,13 @@
|
||||
"urlMain": "https://discourse.joplinapp.org/",
|
||||
"username_claimed": "laurent"
|
||||
},
|
||||
"Jupyter Community Forum": {
|
||||
"errorMsg": "Oops! That page doesn’t exist or is private.",
|
||||
"errorType": "message",
|
||||
"url": "https://discourse.jupyter.org/u/{}/summary",
|
||||
"urlMain": "https://discourse.jupyter.org",
|
||||
"username_claimed": "choldgraf"
|
||||
},
|
||||
"Kaggle": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.kaggle.com/{}",
|
||||
@@ -1226,7 +1363,9 @@
|
||||
"kaskus": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.kaskus.co.id/@{}",
|
||||
"urlMain": "https://www.kaskus.co.id/",
|
||||
"urlMain": "https://www.kaskus.co.id",
|
||||
"urlProbe": "https://www.kaskus.co.id/api/users?username={}",
|
||||
"request_method": "GET",
|
||||
"username_claimed": "l0mbart"
|
||||
},
|
||||
"Keybase": {
|
||||
@@ -1261,6 +1400,15 @@
|
||||
"urlMain": "https://www.kongregate.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Kvinneguiden": {
|
||||
"errorMsg": "{\"result\":\"ok\"}",
|
||||
"errorType": "message",
|
||||
"regexCheck": "^[a-zA-Z0-9_.-]{3,18}$",
|
||||
"urlProbe": "https://forum.kvinneguiden.no/?app=core&module=system&controller=ajax&do=usernameExists&input={}",
|
||||
"url": "https://forum.kvinneguiden.no",
|
||||
"urlMain": "https://forum.kvinneguiden.no",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"LOR": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.linux.org.ru/people/{}/profile",
|
||||
@@ -1268,7 +1416,7 @@
|
||||
"username_claimed": "red"
|
||||
},
|
||||
"Laracast": {
|
||||
"errorType":"status_code",
|
||||
"errorType": "status_code",
|
||||
"url": "https://laracasts.com/@{}",
|
||||
"urlMain": "https://laracasts.com/",
|
||||
"regexCheck": "^[a-zA-Z0-9_-]{3,}$",
|
||||
@@ -1286,12 +1434,20 @@
|
||||
"urlMain": "https://leetcode.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"LessWrong": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.lesswrong.com/users/@{}",
|
||||
"urlMain": "https://www.lesswrong.com/",
|
||||
"LemmyWorld": {
|
||||
"errorType": "message",
|
||||
"errorMsg": "<h1>Error!</h1>",
|
||||
"url": "https://lemmy.world/u/{}",
|
||||
"urlMain": "https://lemmy.world",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"LessWrong": {
|
||||
"url": "https://www.lesswrong.com/users/{}",
|
||||
"urlMain": "https://www.lesswrong.com/",
|
||||
"errorType": "response_url",
|
||||
"errorUrl": "https://www.lesswrong.com/",
|
||||
"username_claimed": "habryka"
|
||||
},
|
||||
"Letterboxd": {
|
||||
"errorMsg": "Sorry, we can\u2019t find the page you\u2019ve requested.",
|
||||
"errorType": "message",
|
||||
@@ -1315,8 +1471,13 @@
|
||||
"urlMain": "https://lichess.org",
|
||||
"username_claimed": "john"
|
||||
},
|
||||
"LinkedIn": {
|
||||
"LinkedIn": {
|
||||
"errorType": "status_code",
|
||||
"headers": {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
||||
"Accept-Language": "en-US,en;q=0.9",
|
||||
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
|
||||
},
|
||||
"regexCheck": "^[a-zA-Z0-9]{3,100}$",
|
||||
"request_method": "GET",
|
||||
"url": "https://linkedin.com/in/{}",
|
||||
@@ -1401,6 +1562,7 @@
|
||||
"Minecraft": {
|
||||
"errorMsg": "Couldn't find any profile with name",
|
||||
"errorType": "message",
|
||||
"regexCheck": "^.{1,25}$",
|
||||
"url": "https://api.mojang.com/users/profiles/minecraft/{}",
|
||||
"urlMain": "https://minecraft.net/",
|
||||
"username_claimed": "blue"
|
||||
@@ -1433,6 +1595,13 @@
|
||||
"urlMain": "https://www.motorradfrage.net/",
|
||||
"username_claimed": "gutefrage"
|
||||
},
|
||||
"MuseScore": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://musescore.com/{}",
|
||||
"urlMain": "https://musescore.com/",
|
||||
"username_claimed": "arrangeme",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"MyAnimeList": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://myanimelist.net/profile/{}",
|
||||
@@ -1446,12 +1615,12 @@
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Mydramalist": {
|
||||
"errorMsg": "The requested page was not found",
|
||||
"errorType": "message",
|
||||
"url": "https://www.mydramalist.com/profile/{}",
|
||||
"urlMain": "https://mydramalist.com",
|
||||
"username_claimed": "elhadidy12398"
|
||||
},
|
||||
"errorMsg": "The requested page was not found",
|
||||
"errorType": "message",
|
||||
"url": "https://www.mydramalist.com/profile/{}",
|
||||
"urlMain": "https://mydramalist.com",
|
||||
"username_claimed": "elhadidy12398"
|
||||
},
|
||||
"Myspace": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://myspace.com/{}",
|
||||
@@ -1546,18 +1715,36 @@
|
||||
"urlProbe": "https://notabug.org/{}/followers",
|
||||
"username_claimed": "red"
|
||||
},
|
||||
"Nothing Community": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://nothing.community/u/{}",
|
||||
"urlMain": "https://nothing.community/",
|
||||
"username_claimed": "Carl"
|
||||
},
|
||||
"Nyaa.si": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://nyaa.si/user/{}",
|
||||
"urlMain": "https://nyaa.si/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Open Collective": {
|
||||
"errorMsg": "Oops! Page not found",
|
||||
"ObservableHQ": {
|
||||
"errorType": "message",
|
||||
"errorMsg": "Page not found",
|
||||
"url": "https://observablehq.com/@{}",
|
||||
"urlMain": "https://observablehq.com/",
|
||||
"username_claimed": "mbostock"
|
||||
},
|
||||
"Open Collective": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://opencollective.com/{}",
|
||||
"urlMain": "https://opencollective.com/",
|
||||
"username_claimed": "pylapp"
|
||||
"username_claimed": "sindresorhus"
|
||||
},
|
||||
"OpenGameArt": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://opengameart.org/users/{}",
|
||||
"urlMain": "https://opengameart.org",
|
||||
"username_claimed": "ski"
|
||||
},
|
||||
"OpenStreetMap": {
|
||||
"errorType": "status_code",
|
||||
@@ -1566,6 +1753,13 @@
|
||||
"urlMain": "https://www.openstreetmap.org/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Odysee": {
|
||||
"errorMsg": "<link rel=\"canonical\" content=\"odysee.com\"/>",
|
||||
"errorType": "message",
|
||||
"url": "https://odysee.com/@{}",
|
||||
"urlMain": "https://odysee.com/",
|
||||
"username_claimed": "Odysee"
|
||||
},
|
||||
"Opensource": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://opensource.com/users/{}",
|
||||
@@ -1614,6 +1808,13 @@
|
||||
"urlMain": "https://pastebin.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Patched": {
|
||||
"errorMsg": "The member you specified is either invalid or doesn't exist.",
|
||||
"errorType": "message",
|
||||
"url": "https://patched.sh/User/{}",
|
||||
"urlMain": "https://patched.sh/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Patreon": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.patreon.com/{}",
|
||||
@@ -1627,12 +1828,68 @@
|
||||
"urlMain": "https://pentesterlab.com/",
|
||||
"username_claimed": "0day"
|
||||
},
|
||||
"PepperIT": {
|
||||
"errorMsg": "La pagina che hai provato a raggiungere non si trova qui",
|
||||
"errorType": "message",
|
||||
"url": "https://www.pepper.it/profile/{}/overview",
|
||||
"urlMain": "https://www.pepper.it",
|
||||
"username_claimed": "asoluinostrisca"
|
||||
"HotUKdeals": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.hotukdeals.com/profile/{}",
|
||||
"urlMain": "https://www.hotukdeals.com/",
|
||||
"username_claimed": "Blue",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"Mydealz": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.mydealz.de/profile/{}",
|
||||
"urlMain": "https://www.mydealz.de/",
|
||||
"username_claimed": "blue",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"Chollometro": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.chollometro.com/profile/{}",
|
||||
"urlMain": "https://www.chollometro.com/",
|
||||
"username_claimed": "blue",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"PepperNL": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://nl.pepper.com/profile/{}",
|
||||
"urlMain": "https://nl.pepper.com/",
|
||||
"username_claimed": "Dynaw",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"PepperPL": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.pepper.pl/profile/{}",
|
||||
"urlMain": "https://www.pepper.pl/",
|
||||
"username_claimed": "FireChicken",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"Preisjaeger": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.preisjaeger.at/profile/{}",
|
||||
"urlMain": "https://www.preisjaeger.at/",
|
||||
"username_claimed": "Stefan",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"Pepperdeals": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.pepperdeals.se/profile/{}",
|
||||
"urlMain": "https://www.pepperdeals.se/",
|
||||
"username_claimed": "Mark",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"PepperealsUS": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.pepperdeals.com/profile/{}",
|
||||
"urlMain": "https://www.pepperdeals.com/",
|
||||
"username_claimed": "Stepan",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"Promodescuentos": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.promodescuentos.com/profile/{}",
|
||||
"urlMain": "https://www.promodescuentos.com/",
|
||||
"username_claimed": "blue",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"Periscope": {
|
||||
"errorType": "status_code",
|
||||
@@ -1727,11 +1984,11 @@
|
||||
"username_claimed": "pylapp"
|
||||
},
|
||||
"Pychess": {
|
||||
"errorType": "message",
|
||||
"errorMsg": "404",
|
||||
"url": "https://www.pychess.org/@/{}",
|
||||
"urlMain": "https://www.pychess.org",
|
||||
"username_claimed": "gbtami"
|
||||
"errorType": "message",
|
||||
"errorMsg": "404",
|
||||
"url": "https://www.pychess.org/@/{}",
|
||||
"urlMain": "https://www.pychess.org",
|
||||
"username_claimed": "gbtami"
|
||||
},
|
||||
"PromoDJ": {
|
||||
"errorType": "status_code",
|
||||
@@ -1739,6 +1996,12 @@
|
||||
"urlMain": "http://promodj.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Pronouns.page": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://pronouns.page/@{}",
|
||||
"urlMain": "https://pronouns.page/",
|
||||
"username_claimed": "andrea"
|
||||
},
|
||||
"PyPi": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://pypi.org/user/{}",
|
||||
@@ -1746,6 +2009,13 @@
|
||||
"urlMain": "https://pypi.org",
|
||||
"username_claimed": "Blue"
|
||||
},
|
||||
"Python.org Discussions": {
|
||||
"errorMsg": "Oops! That page doesn’t exist or is private.",
|
||||
"errorType": "message",
|
||||
"url": "https://discuss.python.org/u/{}/summary",
|
||||
"urlMain": "https://discuss.python.org",
|
||||
"username_claimed": "pablogsal"
|
||||
},
|
||||
"Rajce.net": {
|
||||
"errorType": "status_code",
|
||||
"regexCheck": "^[\\w@-]+?$",
|
||||
@@ -1794,6 +2064,13 @@
|
||||
"urlMain": "https://www.reddit.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Realmeye": {
|
||||
"errorMsg": "Sorry, but we either:",
|
||||
"errorType": "message",
|
||||
"url": "https://www.realmeye.com/player/{}",
|
||||
"urlMain": "https://www.realmeye.com/",
|
||||
"username_claimed": "rotmg"
|
||||
},
|
||||
"Reisefrage": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.reisefrage.net/nutzer/{}",
|
||||
@@ -1841,6 +2118,13 @@
|
||||
"urlMain": "https://royalcams.com",
|
||||
"username_claimed": "asuna-black"
|
||||
},
|
||||
"Ruby Forums": {
|
||||
"errorMsg": "Oops! That page doesn’t exist or is private.",
|
||||
"errorType": "message",
|
||||
"url": "https://ruby-forum.com/u/{}/summary",
|
||||
"urlMain": "https://ruby-forums.com",
|
||||
"username_claimed": "rishard"
|
||||
},
|
||||
"RubyGems": {
|
||||
"errorType": "status_code",
|
||||
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]{1,40}",
|
||||
@@ -1888,6 +2172,18 @@
|
||||
"urlMain": "https://www.scribd.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"SEOForum": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://seoforum.com/@{}",
|
||||
"urlMain": "https://www.seoforum.com/",
|
||||
"username_claimed": "ko"
|
||||
},
|
||||
"Shelf": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.shelf.im/{}",
|
||||
"urlMain": "https://www.shelf.im/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"ShitpostBot5000": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.shitpostbot.com/user/{}",
|
||||
@@ -2041,7 +2337,6 @@
|
||||
},
|
||||
"Spotify": {
|
||||
"errorType": "status_code",
|
||||
|
||||
"url": "https://open.spotify.com/user/{}",
|
||||
"urlMain": "https://open.spotify.com/",
|
||||
"username_claimed": "blue"
|
||||
@@ -2053,6 +2348,13 @@
|
||||
"urlMain": "https://robertsspaceindustries.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Status Cafe": {
|
||||
"errorMsg": "Page Not Found",
|
||||
"errorType": "message",
|
||||
"url": "https://status.cafe/users/{}",
|
||||
"urlMain": "https://status.cafe/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Steam Community (Group)": {
|
||||
"errorMsg": "No group could be retrieved for the given URL",
|
||||
"errorType": "message",
|
||||
@@ -2088,6 +2390,22 @@
|
||||
"urlProbe": "https://ch.tetr.io/api/users/{}",
|
||||
"username_claimed": "osk"
|
||||
},
|
||||
"TheMovieDB": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.themoviedb.org/u/{}",
|
||||
"urlMain": "https://www.themoviedb.org/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"TikTok": {
|
||||
"url": "https://www.tiktok.com/@{}",
|
||||
"urlMain": "https://www.tiktok.com",
|
||||
"errorType": "message",
|
||||
"errorMsg": [
|
||||
"\"statusCode\":10221",
|
||||
"Govt. of India decided to block 59 apps"
|
||||
],
|
||||
"username_claimed": "charlidamelio"
|
||||
},
|
||||
"Tiendanube": {
|
||||
"url": "https://{}.mitiendanube.com/",
|
||||
"urlMain": "https://www.tiendanube.com/",
|
||||
@@ -2100,7 +2418,13 @@
|
||||
"urlMain": "https://topcoder.com/",
|
||||
"username_claimed": "USER",
|
||||
"urlProbe": "https://api.topcoder.com/v5/members/{}",
|
||||
"regexCheck": "[a-zA-Z0-9 ]"
|
||||
"regexCheck": "^[a-zA-Z0-9_.]+$"
|
||||
},
|
||||
"Topmate": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://topmate.io/{}",
|
||||
"urlMain": "https://topmate.io/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"TRAKTRAIN": {
|
||||
"errorType": "status_code",
|
||||
@@ -2132,6 +2456,13 @@
|
||||
"urlMain": "https://tenor.com/",
|
||||
"username_claimed": "red"
|
||||
},
|
||||
"Terraria Forums": {
|
||||
"errorMsg": "The following members could not be found",
|
||||
"errorType": "message",
|
||||
"url": "https://forums.terraria.org/index.php?search/42798315/&c[users]={}&o=relevance",
|
||||
"urlMain": "https://forums.terraria.org/index.php",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"ThemeForest": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://themeforest.net/user/{}",
|
||||
@@ -2208,6 +2539,21 @@
|
||||
"urlMain": "https://tweakers.net",
|
||||
"username_claimed": "femme"
|
||||
},
|
||||
"Twitch": {
|
||||
"errorMsg": "content='Twitch is the world's leading video platform and community for gamers.'",
|
||||
"errorType": "message",
|
||||
"url": "https://www.twitch.tv/{}",
|
||||
"urlMain": "https://www.twitch.tv",
|
||||
"username_claimed": "xqc"
|
||||
},
|
||||
|
||||
"Trovo": {
|
||||
"errorMsg": "Uh Ohhh...",
|
||||
"errorType": "message",
|
||||
"url": "https://trovo.live/s/{}/",
|
||||
"urlMain": "https://trovo.live",
|
||||
"username_claimed": "Aimilios"
|
||||
},
|
||||
"Twitter": {
|
||||
"errorMsg": [
|
||||
"<div class=\"error-panel\"><span>User ",
|
||||
@@ -2246,6 +2592,13 @@
|
||||
"urlMain": "https://untappd.com/",
|
||||
"username_claimed": "untappd"
|
||||
},
|
||||
"Valorant Forums": {
|
||||
"errorMsg": "The page you requested could not be found.",
|
||||
"errorType": "message",
|
||||
"url": "https://valorantforums.com/u/{}",
|
||||
"urlMain": "https://valorantforums.com",
|
||||
"username_claimed": "Wolves"
|
||||
},
|
||||
"VK": {
|
||||
"errorType": "response_url",
|
||||
"errorUrl": "https://www.quora.com/profile/{}",
|
||||
@@ -2273,9 +2626,7 @@
|
||||
"username_claimed": "red"
|
||||
},
|
||||
"Venmo": {
|
||||
"errorMsg": [
|
||||
"Venmo | Page Not Found"
|
||||
],
|
||||
"errorMsg": ["Venmo | Page Not Found"],
|
||||
"errorType": "message",
|
||||
"headers": {
|
||||
"Host": "account.venmo.com"
|
||||
@@ -2320,6 +2671,12 @@
|
||||
"urlMain": "https://discourse.wicg.io/",
|
||||
"username_claimed": "stefano"
|
||||
},
|
||||
"Wakatime": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://wakatime.com/@{}",
|
||||
"urlMain": "https://wakatime.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Warrior Forum": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.warriorforum.com/members/{}.html",
|
||||
@@ -2464,7 +2821,6 @@
|
||||
},
|
||||
"YouTube": {
|
||||
"errorType": "status_code",
|
||||
|
||||
"url": "https://www.youtube.com/@{}",
|
||||
"urlMain": "https://www.youtube.com/",
|
||||
"username_claimed": "youtube"
|
||||
@@ -2687,6 +3043,12 @@
|
||||
"urlMain": "https://mastodon.xyz/",
|
||||
"username_claimed": "TheKinrar"
|
||||
},
|
||||
"mstdn.social": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://mstdn.social/@{}",
|
||||
"urlMain": "https://mstdn.social/",
|
||||
"username_claimed": "MagicLike"
|
||||
},
|
||||
"mercadolivre": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://www.mercadolivre.com.br/perfil/{}",
|
||||
@@ -2719,6 +3081,12 @@
|
||||
"urlMain": "https://www.nairaland.com/",
|
||||
"username_claimed": "red"
|
||||
},
|
||||
"n8n Community": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://community.n8n.io/u/{}/summary",
|
||||
"urlMain": "https://community.n8n.io/",
|
||||
"username_claimed": "n8n"
|
||||
},
|
||||
"nnRU": {
|
||||
"errorType": "status_code",
|
||||
"regexCheck": "^[\\w@-]+?$",
|
||||
@@ -2773,6 +3141,14 @@
|
||||
"urlMain": "https://pikabu.ru/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"Pinterest": {
|
||||
"errorType": "status_code",
|
||||
"errorUrl": "https://www.pinterest.com/",
|
||||
"url": "https://www.pinterest.com/{}/",
|
||||
"urlProbe": "https://www.pinterest.com/oembed.json?url=https://www.pinterest.com/{}/",
|
||||
"urlMain": "https://www.pinterest.com/",
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"pr0gramm": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://pr0gramm.com/user/{}",
|
||||
@@ -2838,7 +3214,7 @@
|
||||
"url": "https://{}.tumblr.com/",
|
||||
"urlMain": "https://www.tumblr.com/",
|
||||
"username_claimed": "goku"
|
||||
},
|
||||
},
|
||||
"uid": {
|
||||
"errorType": "status_code",
|
||||
"url": "http://uid.me/{}",
|
||||
@@ -2865,13 +3241,6 @@
|
||||
"urlMain": "https://znanylekarz.pl",
|
||||
"username_claimed": "janusz-nowak"
|
||||
},
|
||||
"Bluesky": {
|
||||
"errorType": "status_code",
|
||||
"url": "https://bsky.app/profile/{}.bsky.social",
|
||||
"urlProbe": "https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor={}.bsky.social",
|
||||
"urlMain": "https://bsky.app/",
|
||||
"username_claimed": "mcuban"
|
||||
},
|
||||
"Platzi": {
|
||||
"errorType": "status_code",
|
||||
"errorCode": 404,
|
||||
@@ -2879,5 +3248,36 @@
|
||||
"urlMain": "https://platzi.com/",
|
||||
"username_claimed": "freddier",
|
||||
"request_method": "GET"
|
||||
},
|
||||
"BabyRu": {
|
||||
"url": "https://www.baby.ru/u/{}",
|
||||
"urlMain": "https://www.baby.ru/",
|
||||
"errorType": "message",
|
||||
"errorMsg": [
|
||||
"\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0438\u0441\u043a\u0430\u043b\u0438, \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430",
|
||||
"\u0414\u043e\u0441\u0442\u0443\u043f \u0441 \u0432\u0430\u0448\u0435\u0433\u043e IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d"
|
||||
],
|
||||
"username_claimed": "example"
|
||||
},
|
||||
"Wowhead": {
|
||||
"url": "https://wowhead.com/user={}",
|
||||
"urlMain": "https://wowhead.com/",
|
||||
"errorType": "status_code",
|
||||
"errorCode": 404,
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"addons.wago.io": {
|
||||
"url": "https://addons.wago.io/user/{}",
|
||||
"urlMain": "https://addons.wago.io/",
|
||||
"errorType": "status_code",
|
||||
"errorCode": 404,
|
||||
"username_claimed": "blue"
|
||||
},
|
||||
"CurseForge": {
|
||||
"url": "https://www.curseforge.com/members/{}/projects",
|
||||
"urlMain": "https://www.curseforge.com.",
|
||||
"errorType": "status_code",
|
||||
"errorCode": 404,
|
||||
"username_claimed": "blue"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,8 +171,6 @@ def sherlock(
|
||||
username: str,
|
||||
site_data: dict[str, dict[str, str]],
|
||||
query_notify: QueryNotify,
|
||||
tor: bool = False,
|
||||
unique_tor: bool = False,
|
||||
dump_response: bool = False,
|
||||
proxy: Optional[str] = None,
|
||||
timeout: int = 60,
|
||||
@@ -188,8 +186,6 @@ def sherlock(
|
||||
query_notify -- Object with base type of QueryNotify().
|
||||
This will be used to notify the caller about
|
||||
query results.
|
||||
tor -- Boolean indicating whether to use a tor circuit for the requests.
|
||||
unique_tor -- Boolean indicating whether to use a new tor circuit for each request.
|
||||
proxy -- String indicating the proxy URL
|
||||
timeout -- Time in seconds to wait before timing out request.
|
||||
Default is 60 seconds.
|
||||
@@ -210,32 +206,9 @@ def sherlock(
|
||||
|
||||
# Notify caller that we are starting the query.
|
||||
query_notify.start(username)
|
||||
# Create session based on request methodology
|
||||
if tor or unique_tor:
|
||||
try:
|
||||
from torrequest import TorRequest # noqa: E402
|
||||
except ImportError:
|
||||
print("Important!")
|
||||
print("> --tor and --unique-tor are now DEPRECATED, and may be removed in a future release of Sherlock.")
|
||||
print("> If you've installed Sherlock via pip, you can include the optional dependency via `pip install 'sherlock-project[tor]'`.")
|
||||
print("> Other packages should refer to their documentation, or install it separately with `pip install torrequest`.\n")
|
||||
sys.exit(query_notify.finish())
|
||||
|
||||
print("Important!")
|
||||
print("> --tor and --unique-tor are now DEPRECATED, and may be removed in a future release of Sherlock.")
|
||||
|
||||
# Requests using Tor obfuscation
|
||||
try:
|
||||
underlying_request = TorRequest()
|
||||
except OSError:
|
||||
print("Tor not found in system path. Unable to continue.\n")
|
||||
sys.exit(query_notify.finish())
|
||||
|
||||
underlying_session = underlying_request.session
|
||||
else:
|
||||
# Normal requests
|
||||
underlying_session = requests.session()
|
||||
underlying_request = requests.Request()
|
||||
# Normal requests
|
||||
underlying_session = requests.session()
|
||||
|
||||
# Limit number of workers to 20.
|
||||
# This is probably vastly overkill.
|
||||
@@ -359,15 +332,10 @@ def sherlock(
|
||||
# Store future in data for access later
|
||||
net_info["request_future"] = future
|
||||
|
||||
# Reset identify for tor (if needed)
|
||||
if unique_tor:
|
||||
underlying_request.reset_identity()
|
||||
|
||||
# Add this site's results into final dictionary with all the other results.
|
||||
results_total[social_network] = results_site
|
||||
|
||||
# Open the file containing account links
|
||||
# Core logic: If tor requests, make them here. If multi-threaded requests, wait for responses
|
||||
for social_network, net_info in site_data.items():
|
||||
# Retrieve results again
|
||||
results_site = results_total.get(social_network)
|
||||
@@ -600,22 +568,6 @@ def main():
|
||||
dest="output",
|
||||
help="If using single username, the output of the result will be saved to this file.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--tor",
|
||||
"-t",
|
||||
action="store_true",
|
||||
dest="tor",
|
||||
default=False,
|
||||
help="Make requests over Tor; increases runtime; requires Tor to be installed and in system path.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--unique-tor",
|
||||
"-u",
|
||||
action="store_true",
|
||||
dest="unique_tor",
|
||||
default=False,
|
||||
help="Make requests over Tor with new Tor circuit after each request; increases runtime; requires Tor to be installed and in system path.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--csv",
|
||||
action="store_true",
|
||||
@@ -769,22 +721,10 @@ def main():
|
||||
except Exception as error:
|
||||
print(f"A problem occurred while checking for an update: {error}")
|
||||
|
||||
# Argument check
|
||||
# TODO regex check on args.proxy
|
||||
if args.tor and (args.proxy is not None):
|
||||
raise Exception("Tor and Proxy cannot be set at the same time.")
|
||||
|
||||
# Make prompts
|
||||
if args.proxy is not None:
|
||||
print("Using the proxy: " + args.proxy)
|
||||
|
||||
if args.tor or args.unique_tor:
|
||||
print("Using Tor to make requests")
|
||||
|
||||
print(
|
||||
"Warning: some websites might refuse connecting over Tor, so note that using this option might increase connection errors."
|
||||
)
|
||||
|
||||
if args.no_color:
|
||||
# Disable color output.
|
||||
init(strip=True, convert=False)
|
||||
@@ -885,8 +825,6 @@ def main():
|
||||
username,
|
||||
site_data,
|
||||
query_notify,
|
||||
tor=args.tor,
|
||||
unique_tor=args.unique_tor,
|
||||
dump_response=args.dump_response,
|
||||
proxy=args.proxy,
|
||||
timeout=args.timeout,
|
||||
@@ -987,8 +925,8 @@ def main():
|
||||
{
|
||||
"username": usernames,
|
||||
"name": names,
|
||||
"url_main": url_main,
|
||||
"url_user": url_user,
|
||||
"url_main": [f'=HYPERLINK(\"{u}\")' for u in url_main],
|
||||
"url_user": [f'=HYPERLINK(\"{u}\")' for u in url_user],
|
||||
"exists": exists,
|
||||
"http_status": http_status,
|
||||
"response_time_s": response_time_s,
|
||||
|
||||
@@ -16,6 +16,7 @@ def set_pattern_upper_bound(pattern: str, upper_bound: int = FALSE_POSITIVE_QUAN
|
||||
"""Set upper bound for regex patterns that use quantifiers such as `+` `*` or `{n,}`."""
|
||||
def replace_upper_bound(match: re.Match) -> str: # type: ignore
|
||||
lower_bound: int = int(match.group(1)) if match.group(1) else 0 # type: ignore
|
||||
nonlocal upper_bound
|
||||
upper_bound = upper_bound if lower_bound < upper_bound else lower_bound # type: ignore # noqa: F823
|
||||
return f'{{{lower_bound},{upper_bound}}}'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user