ΠΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠΊΡΠΏΠΎΡΡΠ° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ² ΠΠΠΎΠ½ΡΠ°ΠΊΡΠ΅
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° β’ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ β’ Roadmap β’ ΠΠΊΠ»Π°Π΄
- π ΠΠΊΡΠΏΠΎΡΡ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΡΡΠΎΡΠΈΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³Π° Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ
- βοΈ ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°ΡΡΠΈ ΠΏΠΎ Π»ΠΈΠΌΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (Π΄Π»Ρ Telegram)
- π Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ: ΡΠΎΡΠΎ, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ, ΡΡΠΈΠΊΠ΅ΡΡ, Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ
- β‘ ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ Π·Π°ΠΏΡΡΠΊΠΎΠ²
- π Π€ΠΈΠ»ΡΡΡΠ°ΡΠΈΡ ΠΏΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ Π΄Π°Ρ
- π ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ°
- π ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ΅ Ρ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π° Π²
.env
- ΠΠΊΡΠΏΠΎΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² TXT
- Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π»ΠΈΠΌΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²
- Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ (photo, doc, sticker, animation)
- ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ
- Π€ΠΈΠ»ΡΡΡΠ°ΡΠΈΡ ΠΏΠΎ Π΄Π°ΡΠ°ΠΌ
- CLI ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· YAML
- ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ (.env)
- Unit ΡΠ΅ΡΡΡ (pytest)
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΡΡ
- Code coverage > 80%
- CI/CD pipeline (GitHub Actions)
- ΠΠΈΠ½ΡΠ΅ΡΡ (ruff, mypy)
- pre-commit hooks
- Dockerfile
- docker-compose.yml
- Docker Hub ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ
- Makefile Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄
- ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ HTML-ΠΎΡΡΡΡΠΎΠ²
- ΠΡΠ°ΡΠΈΠΊ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΏΠΎ Π΄Π½ΡΠΌ/ΠΌΠ΅ΡΡΡΠ°ΠΌ
- ΠΠ±Π»Π°ΠΊΠΎ ΡΠ»ΠΎΠ² (wordcloud)
- Π’ΠΎΠΏ ΡΠ»ΠΎΠ² ΠΈ ΡΠΌΠΎΠ΄Π·ΠΈ
- Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΏΠΎ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ
- "Π’Π΅ΠΏΠ»ΠΎΠ²Π°Ρ ΠΊΠ°ΡΡΠ°" ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠΊΠΈ
- FastAPI backend
- Next.js frontend
- ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· VK OAuth
- ΠΡΠ±ΠΎΡ Π΄ΠΈΠ°Π»ΠΎΠ³Π° ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°
- ΠΡΠΎΠ³ΡΠ΅ΡΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (WebSocket)
- Π‘ΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ Π°ΡΡ ΠΈΠ²Π°
- HTML-ΡΠΊΡΠΏΠΎΡΡ Ρ Π°Π²Π°ΡΠ°ΡΠ°ΠΌΠΈ
- JSON-ΡΠΊΡΠΏΠΎΡΡ
- PDF-ΡΠΊΡΠΏΠΎΡΡ
- ZIP-Π°ΡΡ ΠΈΠ² Ρ ΠΌΠ΅Π΄ΠΈΠ°
- ΠΠΊΡΠΏΠΎΡΡ Π²ΠΈΠ΄Π΅ΠΎ/Π°ΡΠ΄ΠΈΠΎ
- Telegram Bot
- ΠΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ (cron)
- Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ
- PyPI ΠΏΠ°ΠΊΠ΅Ρ
- API Π΄Π»Ρ ΡΡΠΎΡΠΎΠ½Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
- ΠΡΠ»ΡΡΠΈΡΠ·ΡΡΠ½ΠΎΡΡΡ (EN/RU)
- ΠΠ°ΠΊΠ΅ΡΠ½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²
- Π¨ΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΊΡΠΏΠΎΡΡΠ°
- ΠΠΌΠΏΠΎΡΡ Π² Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅ΡΡ
- Cloud-Π²Π΅ΡΡΠΈΡ
vk_exporter/
βββ main.py # Π’ΠΎΡΠΊΠ° Π²Ρ
ΠΎΠ΄Π°
βββ config.py # ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
βββ vk_client.py # ΠΠ»ΠΈΠ΅Π½Ρ VK API
βββ config.yaml # Π€Π°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
βββ config.yaml.example # ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
βββ .env # ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ (ΡΠΎΠΊΠ΅Π½)
βββ .env.example # ΠΡΠΈΠΌΠ΅Ρ .env
βββ .gitignore
βββ requirements.txt # ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
βββ README.md # ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
βββ utils/
β βββ __init__.py
β βββ logger.py # ΠΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
β βββ cache.py # ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ
βββ exporters/
β βββ __init__.py
β βββ txt_exporter.py # ΠΠΊΡΠΏΠΎΡΡ Π² TXT
β βββ attachments.py # Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ
βββ export/ # Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠΊΡΠΏΠΎΡΡΠ°
βββ dialog_001.txt
βββ dialog_002.txt
βββ attachments/
β βββ 2024-01-01-120000.jpg
β βββ ...
βββ .cache.json # ΠΡΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ
βββ export.log # ΠΠΎΠ³ ΡΠΊΡΠΏΠΎΡΡΠ°
- Python 3.10+
- ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈΠ· requirements.txt
- ΠΠ»ΠΎΠ½ΠΈΡΡΠΉΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
git clone <repository-url>
cd vk_exporter- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅
python -m venv venv
# Windows
venv\Scripts\activate
# Linux/macOS
source venv/bin/activate- Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
pip install -r requirements.txt- ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
cp .env.example .envΠΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΠΉΡΠ΅ .env:
VK_TOKEN=your_vk_access_token_here
VK_PEER_ID=123456789- (ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ) ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ config.yaml
cp config.yaml.example config.yaml- ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π½Π° https://vk.com/dev
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Standalone-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
- ΠΠΎΠ»ΡΡΠΈΡΠ΅ access token Ρ ΠΏΡΠ°Π²Π°ΠΌΠΈ
messagesΡΠ΅ΡΠ΅Π· Implicit Flow:
https://oauth.vk.com/authorize?client_id=YOUR_APP_ID&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=messages&response_type=token&v=5.131
- ΠΠΎΡΠ»Π΅ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΡΠΎΠΊΠ΅Π½ ΠΈΠ· URL Π²
.env
python main.pypython main.py --from-date 2024-01-01 --to-date 2024-12-31python main.py --no-attachmentspython main.py --no-cachepython main.py --config /path/to/config.yamlpython main.py --help| ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ | ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ |
|---|---|---|
VK_TOKEN |
Access token VK API | β |
VK_PEER_ID |
ID ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³Π° | β |
export:
out_dir: "export" # ΠΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π΄Π»Ρ ΡΠΊΡΠΏΠΎΡΡΠ°
attachments_dir: "attachments" # ΠΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π΄Π»Ρ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ
txt_prefix: "dialog" # ΠΡΠ΅ΡΠΈΠΊΡ ΠΈΠΌΡΠ½ ΡΠ°ΠΉΠ»ΠΎΠ²
limits:
telegram_txt_chars: 3800 # ΠΠΈΠΌΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π½Π° ΡΠ°ΠΉΠ» (Telegram)
format:
datetime: "%Y-%m-%d %H:%M:%S" # Π€ΠΎΡΠΌΠ°Ρ Π΄Π°ΡΡ/Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
filename_mask: "%Y-%m-%d-%H%M%S" # ΠΠ°ΡΠΊΠ° ΠΈΠΌΡΠ½ ΡΠ°ΠΉΠ»ΠΎΠ² Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ
options:
save_attachments: true # Π‘ΠΎΡ
ΡΠ°Π½ΡΡΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ
generate_txt: true # ΠΠ΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ TXTΠΡΠΎΠ΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ JSON-ΡΠ°ΠΉΠ» .cache.json Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠΆΠ΅ ΡΠΊΠ°ΡΠ°Π½Π½ΡΡ
Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ:
- Π₯ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ URL Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΠΎΠ²
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΎΠΏΡΡΠΊ ΡΠΆΠ΅ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²
- Π£ΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ Π·Π°ΠΏΡΡΠΊΠΎΠ² ΡΠΊΡΠΏΠΎΡΡΠ°
| Π’ΠΈΠΏ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
photo |
Π€ΠΎΡΠΎΠ³ΡΠ°ΡΠΈΠΈ (ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ) |
doc |
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΡ (Ρ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΌ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ) |
sticker |
Π‘ΡΠΈΠΊΠ΅ΡΡ (PNG) |
animation |
GIF-Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ (MP4) |
video |
ΠΠΈΠ΄Π΅ΠΎ (ΡΡΠ΅Π±ΡΠ΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ*) |
audio |
ΠΡΠ΄ΠΈΠΎ (ΡΡΠ΅Π±ΡΠ΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ*) |
*ΠΠΈΠ΄Π΅ΠΎ ΠΈ Π°ΡΠ΄ΠΈΠΎ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠ΅Π±ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ API-Π²ΡΠ·ΠΎΠ²ΠΎΠ².
- Π’ΠΎΠΊΠ΅Π½ VK API Ρ
ΡΠ°Π½ΠΈΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅
.env, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π².gitignore - ΠΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΊΠΎΠΌΠΌΠΈΡΡΡΠ΅ ΡΠ°ΠΉΠ»
.envΠ² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ - ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
.env.exampleΠΊΠ°ΠΊ ΡΠ°Π±Π»ΠΎΠ½ Π΄Π»Ρ Π½ΠΎΠ²ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
ΠΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ Π»ΡΠ±ΡΠ΅ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ!
- Π€ΠΎΡΠΊΠ½ΠΈΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π²Π΅ΡΠΊΡ Π΄Π»Ρ ΡΠΈΡΠΈ (
git checkout -b feature/amazing-feature) - ΠΠ°ΡΠΈΠΊΡΠΈΡΡΠΉΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ (
git commit -m 'Add amazing feature') - ΠΡΠΏΡΠ°Π²ΡΡΠ΅ Π²Π΅ΡΠΊΡ (
git push origin feature/amazing-feature) - ΠΡΠΊΡΠΎΠΉΡΠ΅ Pull Request
MIT License