A semi-automated outreach toolkit for recruiting University of Waterloo (UW) Computer Science and Engineering students to join Electrium Mobility.
Note: This project is intended for educational purposes. It is still in development and should be used responsibly.
Outreach-Tool/
├── README.md
├── requirements.txt
├── .env.example
├── scraper.py
├── message_generator.py
├── outreach.py
└── main.py
- Uses Playwright to scrape LinkedIn search results for a query (like “University of Waterloo Computer Science”).
- Extracts:
NameHeadlineProfile link
- Saves results to SQLite (default:
outreach.db) or CSV.
✅ Command:
python main.py scrape --query "University of Waterloo Computer Science" --max 50- Creates human-sounding outreach messages.
- Avoids spam style, avoids links in the first message.
- Optionally uses OpenAI (if
OPENAI_API_KEYis set) for smarter personalization.
✅ Command:
python main.py generate --db outreach.db --max 25- Logs the message contents.
- Ensures random delays (30–120s).
- Enforces daily cap 20–30 messages.
- Prevents duplicate messages (by profile).
✅ Dry-run:
python main.py outreach --db outreach.db --dry-run✅ Real-run (records as “sent”):
python main.py outreach --db outreach.db- ✅ Randomized delays (
30–120s) - ✅ Daily sending cap (default: 25)
- ✅ Prevents duplicates (only 1 message per profile)
- ✅ No links in first outreach message
- ✅ Logs everything in
outreach.db - ✅ Doesn’t send actual LinkedIn messages (safe)
- Scrapes LinkedIn search results using Playwright
- Saves profile info into SQLite/CSV
- Generates personalized outreach text
- Optional OpenAI integration (
OPENAI_API_KEY)
- Handles enqueueing, queuing, logging, and simulated sending
- Rate-limit logic + daily cap + logging + no duplicates
- CLI entry point with 3 subcommands:
scrapegenerateoutreach
python -m venv .venv
.\\.venv\\Scripts\\activatepip install -r requirements.txt
python -m playwright installCopy .env.example → .env and fill in your credentials.