{"id":15037668,"url":"https://github.com/m8sec/crosslinked","last_synced_at":"2025-05-14T03:09:58.069Z","repository":{"id":38291560,"uuid":"187035044","full_name":"m8sec/CrossLinked","owner":"m8sec","description":"LinkedIn enumeration tool to extract valid employee names from an organization through search engine scraping","archived":false,"fork":false,"pushed_at":"2024-11-26T12:52:16.000Z","size":89,"stargazers_count":1375,"open_issues_count":7,"forks_count":188,"subscribers_count":28,"default_branch":"master","last_synced_at":"2025-05-11T14:16:56.130Z","etag":null,"topics":["enumeration","linkedin-scraper","osint","pentest-scripts","pentest-tool","python3","username-generator","webscraping"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/m8sec.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2019-05-16T13:36:36.000Z","updated_at":"2025-05-10T10:43:13.000Z","dependencies_parsed_at":"2024-02-12T17:28:34.911Z","dependency_job_id":"a3d23a34-ca7a-417b-8328-24e68e9d195e","html_url":"https://github.com/m8sec/CrossLinked","commit_stats":{"total_commits":29,"total_committers":6,"mean_commits":4.833333333333333,"dds":0.4482758620689655,"last_synced_commit":"4128f70a30f5320ca10fb40b2a3b2072e5d8fdcf"},"previous_names":["m8r0wn/crosslinked"],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m8sec%2FCrossLinked","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m8sec%2FCrossLinked/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m8sec%2FCrossLinked/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m8sec%2FCrossLinked/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/m8sec","download_url":"https://codeload.github.com/m8sec/CrossLinked/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254059511,"owners_count":22007769,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["enumeration","linkedin-scraper","osint","pentest-scripts","pentest-tool","python3","username-generator","webscraping"],"created_at":"2024-09-24T20:35:17.117Z","updated_at":"2025-05-14T03:09:53.041Z","avatar_url":"https://github.com/m8sec.png","language":"Python","readme":"\u003cdiv align=\"center\"\u003e\n    \u003ch1\u003eCrossLinked\u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.twitter.com/m8sec\"\u003e\u003cimg src=\"https://img.shields.io/badge/Twitter-@m8sec-blue?style=plastic\u0026logo=twitter\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n    \u003ca href=\"/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-GPL%20v3.0-green.svg?style=plastic\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n\u003c/p\u003e\n\n\nCrossLinked is a LinkedIn enumeration tool that uses search engine scraping to collect valid employee names from an \norganization. This technique provides accurate results without the use of API keys, credentials, or accessing \nLinkedIn directly!\n\n\n## Table of Contents\n- [Install](#install)\n- [Prerequisites](#prerequisites)\n    + [Naming Format](#naming-format)\n    + [Advanced Formatting](#advanced-formatting)\n- [Search](#search)\n  * [Example Usage](#example-usage)\n  * [Screenshots](#screenshots)\n- [Parse](#parse)\n  * [Example Usage](#example-usage-1)\n  * [Screenshots](#screenshots-1)\n- [Additional Options](#additional-options)\n  * [Proxy Rotation](#proxy-rotation)\n- [Command-Line Arguments](#command-line-arguments)\n- [Contribute](#contribute)\n\n# Install\n### PyPi\nInstall the last stable release from PyPi:\n```commandline\npip3 install crosslinked\n```\n\n### Poetry\nInstall and run the latest code using [Poetry](https://python-poetry.org/docs/#installing-with-the-official-installer):\n```bash\ngit clone https://github.com/m8sec/crosslinked\ncd crosslinked\npoetry install\npoetry run crosslinked -h\n```\n\n### Python\nInstall the most recent code from GitHub:\n```bash\ngit clone https://github.com/m8sec/crosslinked\ncd crosslinked\npip3 install .\n```\n\n# Prerequisites\nCrossLinked assumes the organization's account naming convention has already been identified. This is required for execution and should be added to the CMD args based on your expected output. See the [Naming Format](#naming-format) and [Example Usage](#example-usage) sections below:\n\n### Naming Format\n```text\n{first.{last}           = john.smith\nCMP\\{first}{l}          = CMP\\johns\n{f}{last}@company.com   = jsmith@company.com\n```\n\n\u003e 🦖 ***Still Stuck?** Metadata is always a good place to check for hidden information such as account naming convention. see [PyMeta](https://github.com/m8sec/pymeta) for more.*\n\u003cbr\u003e\n\n\n### Advanced Formatting\n:boom: **New Feature** :boom:\n\nTo be compatible with alternate naming conventions CrossLinked allows users to control the index position of the name extracted from search text. Should the name not be long enough, or errors encountered with the search string, CrossLinked will revert back to its default format.\n\n***Note**: the search string array starts at `0`. Negative numbers can also be used to count backwards from the last value.*\n\n```\n# Default output\npython3 crosslinked.py -f '{first}.{last}@company.com' Company\nJohn David Smith = john.smith@company.com\n\n# Use the second-to-last name as \"last\"\npython3 crosslinked.py -f '{0:first}.{-2:last}@company.com' Company\nJohn David Smith    = john.david@company.com\nJane Doe            = jane.doe@company.com\n\n# Use the second item in the array as \"last\"\npython3 crosslinked.py -f '{first}.{1:last}@company.com' Company\nJohn David Smith    = john.david@company.com\nJane Doe            = jane.doe@company.com\n```\n\n\n# Search\nBy default, CrossLinked will use `google` and `bing` search engines to identify employees of the target organization. After execution, two files (`names.txt` \u0026 `names.csv`) will appear in the current directory, unless modified in the CMD args.\n\n* *names.txt* - List of unique user accounts in the specified format.\n* *names.csv* - Raw search data. See the `Parse` section below for more.\n\n\n## Example Usage\n```bash\npython3 crosslinked.py -f '{first}.{last}@domain.com' company_name\n```\n\n\n```bash\npython3 crosslinked.py -f 'domain\\{f}{last}' -t 15 -j 2 company_name\n```\n\u003e ⚠️ For best results, use the company name as it appears on LinkedIn `\"Target Company\"` not the domain name.\n\n\n## Screenshots\n![](https://user-images.githubusercontent.com/13889819/190488899-0f4bea2d-6c31-422f-adce-b56f7be3d906.png)\n\n\n# Parse\n*Account naming convention changed after execution and now your hitting CAPTCHA requests? No Problem!*\n\nCrossLinked includes a `names.csv` output file, which stores all scraping data including: `name`, `job title`, and `url`. This can be ingested and parsed to reformat user accounts as needed.\n\n\n## Example Usage\n```\npython3 crosslinked.py -f '{f}{last}@domain.com' names.csv\n```\n\n## Screenshots\n![](https://user-images.githubusercontent.com/13889819/190494309-c6da8cdc-4312-4e53-a0bb-1fffbc9698e4.png)\n\n\n# Additional Options\n## Proxy Rotation\nThe latest version of CrossLinked provides proxy support to rotate source addresses. Users can input a single proxy with `--proxy 127.0.0.1:8080` or use multiple via `--proxy-file proxies.txt`.\n\n\n```bash\n\u003e cat proxies.txt\n127.0.0.1:8080\nsocks4://111.111.111.111\nsocks5://222.222.222.222\n\n\u003e python3 crosslinked.py --proxy-file proxies.txt -f '{first}.{last}@company.com' -t 10 \"Company\"\n```\n\u003e ⚠️ `HTTP/S` proxies can be added by IP:Port notation. However, socks proxies will require a `socks4://` or `socks5://` prefix.*\n\n\n# Command-Line Arguments\n```\npositional arguments:\n  company_name        Target company name\n\noptional arguments:\n  -h, --help          show help message and exit\n  -t TIMEOUT          Max timeout per search (Default=15)\n  -j JITTER           Jitter between requests (Default=1)\n\nSearch arguments:\n  --search ENGINE     Search Engine (Default='google,bing')\n\nOutput arguments:\n  -f NFORMAT          Format names, ex: 'domain\\{f}{last}', '{first}.{last}@domain.com'\n  -o OUTFILE          Change name of output file (omit_extension)\n\nProxy arguments:\n  --proxy PROXY       Proxy requests (IP:Port)\n  --proxy-file PROXY  Load proxies from file for rotation\n```\n\n\n# Contribute\nContribute to the project by:\n* Like and share the tool!\n* Create an issue to report any problems or, better yet, initiate a PR.\n* Reach out with any potential features or improvements [@m8sec](https://twitter.com/m8sec).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm8sec%2Fcrosslinked","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fm8sec%2Fcrosslinked","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm8sec%2Fcrosslinked/lists"}