An automated Telegram job matching bot and channel parser designed for Career Bridge Ethiopia. Automatically ingests job postings from a Telegram channel and delivers filtered, preference-based digests to job seekers.
# Career Bridge Ethiopia — Job Alert Bot (Telegram MVP)
A working prototype of a Telegram bot that onboards job seekers, collects
their preferences, and pushes matched job digests on a daily or weekly
schedule — built for low-data, mobile-first usage.
## What's included
| File | Purpose |
|---|---|
| `bot.py` | Main bot: onboarding flow, commands, digest sending, scheduling |
| `matching.py` | Rule-based matching engine that scores jobs against a user's preferences |
| `storage.py` | Simple JSON file storage for users + sent-history (swap for a real DB later) |
| `jobs_sample.json` | 10 sample Ethiopian job listings to test matching against |
| `requirements.txt` | Python dependencies |
## Quick start
1. **Create a bot on Telegram**
- Message @BotFather on Telegram
- Send `/newbot`, follow the prompts, and copy the token it gives you
2. **Install dependencies**
```bash
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
3. **Set your bot token**
```bash
export TELEGRAM_BOT_TOKEN="123456:ABC-your-token-here"
```
4. **Run it**
```bash
python bot.py
```
5. Open Telegram, find your bot, and send `/start`.
## Try it out
- `/start` — onboarding: pick sectors, location, role type, level, and how often you want updates
- `/mydigest` — get matched jobs immediately, on demand
- `/search accountant` — free-text search across all listings
- `/preferences` — see what's saved
- `/pause` / `/resume` — control scheduled sends
- `/unsubscribe` — delete your profile
## How matching works
`matching.py` scores every job against a user's saved preferences:
sector match is weighted highest (and acts as a hard filter — users won't
see jobs totally outside their chosen sectors), then location, role type,
and experience level add to the score. The 👍/👎 buttons on each job are
wired up and logged (`feedback_handler` in `bot.py`) — the natural next
step is turning that feedback into a per-user affinity score that feeds
back into the matching function. …