یک سرویس مستقل پایتون برای مدیریت اتصالات و پیامهای تلگرام با استفاده از Telethon
- 🔐 اتصال به تلگرام با QR Code
- 📱 پشتیبانی از Phone Code و 2FA
- 💬 دریافت و ارسال پیامهای تلگرام
- 🔄 مدیریت Session های متعدد به صورت همزمان
- 🗄️ ذخیره تمام دادهها در MongoDB (sessions, messages, events)
- ⚡ عملیات Async با Motor (MongoDB async driver)
- 🔌 Reconnect خودکار
- 🐳 Docker Support
- 📊 RESTful API با FastAPI
- 📈 آمار و گزارشگیری از پیامها
- Python 3.11+
- MongoDB 5.0+ (برای ذخیره تمام دادهها)
- Telegram API Credentials (API ID & API Hash)
- Redis (برای caching)
- Docker & Docker Compose (برای deployment)
- به https://my.telegram.org بروید
- وارد شوید و به قسمت "API development tools" بروید
- یک Application جدید بسازید
- API ID و API Hash را کپی کنید
# کلون پروژه
git clone <repository-url>
cd telegram-crawler-python
# ایجاد virtual environment
python -m venv venv
source venv/bin/activate # در Windows: venv\Scripts\activate
# نصب dependencies
pip install -r requirements.txt
# کپی و تنظیم environment variables
cp .env.example .env
# ویرایش .env و تنظیم مقادیرTELEGRAM_API_ID=your_api_id
TELEGRAM_API_HASH=your_api_hash
HOST=0.0.0.0
PORT=8000
DEBUG=False
DATABASE_URL=sqlite:///./sessions.db
MONGODB_URL=mongodb://localhost:27017
MONGODB_DATABASE=telegram_serviceackend.com
WEBHOOK_SECRET_TOKEN=your-secret-token
API_SECRET_KEY=your-api-secret-keypython -m app.main
# یا
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload# Build و اجرا
docker-compose up -d
# مشاهده logs
docker-compose logs -f
# متوقف کردن
docker-compose downhttp://localhost:8000
تمام درخواستها نیاز به API Key دارند که باید در header ارسال شود:
X-API-Key: your-api-secret-key
POST /api/telegram/request-qrRequest:
{
"agent_id": 123
}Response:
{
"success": true,
"session_id": "uuid-v4-session-id",
"qr_code": "data:image/png;base64,iVBORw0KG...",
"expires_in": 300
}POST /api/telegram/verify-codeRequest:
{
"session_id": "uuid-v4-session-id",
"code": "12345"
}POST /api/telegram/verify-passwordRequest:
{
"session_id": "uuid-v4-session-id",
"password": "my-password"
}POST /api/telegram/disconnectRequest:
{
"session_id": "uuid-v4-session-id"
}GET /api/telegram/status/{session_id}POST /api/telegram/send-messageRequest:
{
"session_id": "uuid-v4-session-id",
"chat_id": 123456789,
"message": "سلام، چطور میتونم کمکتون کنم؟",
"reply_to": null
}# درخواست QR Code
curl -X POST "http://localhost:8000/api/telegram/request-qr" \
-H "X-API-Key: your-api-secret-key" \
-H "Content-Type: application/json" \
-d '{"agent_id": 123}'
# بررسی وضعیت
curl -X GET "http://localhost:8000/api/telegram/status/{session_id}" \
-H "X-API-Key: your-api-secret-key"
# ارسال پیام
curl -X POST "http://localhost:8000/api/telegram/send-message" \
-H "X-API-Key: your-api-secret-key" \
-H "Content-Type: application/json" \
-d '{
"session_id": "uuid",
"chat_id": 123456789,
"message": "سلام"
}'
# دریافت پیامها
curl -X GET "http://localhost:8000/api/telegram/messages/{session_id}?limit=50" \
-H "X-API-Key: your-api-secret-key"
# دریافت آمار
curl -X GET "http://localhost:8000/api/telegram/agent-stats/123" \
-H "X-API-Key: your-api-secret-key"import httpx
API_BASE_URL = "http://localhost:8000"
API_KEY = "your-api-secret-key"
headers = {
"X-API-Key": API_KEY,
"Content-Type": "application/json"
}
# درخواست QR Code
# دریافت پیامها
res🗄️ ساختار MongoDB
### Collections
#### 1. messages
```javascript
{
"_id": ObjectId,
"session_id": "uuid",
"agent_id": 123,
"message_id": 456,
"chat_id": 789,
"from_user": {
"id": 987654321,
"first_name": "علی",
"last_name": "محمدی",
"username": "ali_m",
"phone": "+989123456789"
},
"chat": {
"id": 789,
"type": "private"
},
"text": "سلام",
"date": "2025-12-20T10:30:00Z",
"reply_to_message_id": null,
"is_outgoing": false,
"created_at": ISODate("2025-12-20T10:30:00Z")
}{
"_id": ObjectId,
"session_id": "uuid",
"agent_id": 123,
"event_type": "new_message",
"metadata": {
"message_id": 456,
"chat_id": 789
},
"created_at": ISODate("2025-12-20T10:30:00Z")
}messages: session_id, agent_id, chat_id, message_id, dateevents: session_id, event_type, created_at
db.messages.find({ "agent_id": 123 }).sort({ "date": -1 }).limit(100)db.messages.find({
"session_id": "uuid",
"chat_id": 789
}).sort({ "date": -1 })mongodb.py # MongoDB service
db.messages.aggregate([
{ $match: { "agent_id": 123 } },
{ $group: {
_id: "$chat_id",
count: { $sum: 1 }
}}
])این سرویس به جای ارسال webhook به Laravel، تمام پیامها و رویدادها را در MongoDB ذخیره میکند. مزایا:
✅ Performance بهتر: ذخیره مستقیم در دیتابیس سریعتر از HTTP request است ✅ Reliability: در صورت مشکل شبکه، داده از دست نمیرود ✅ Query آسان: میتوانید به راحتی پیامها را جستجو و فیلتر کنید ✅ Scalability: MongoDB برای حجم بالای داده مناسب است ✅ Offline Access: میتوانید بدون نیاز به Laravel به دادهها دسترسی داشته باشید
اگر نیاز به ارسال داده به Laravel دارید، میتوانید از طریق API endpoints دریافت کنید یا یک worker service اضافه کنید که دادهها را از MongoDB بخواند و به Laravel بفرستد. "from": { "id": 987654321, "first_name": "علی", "last_name": "محمدی", "username": "ali_m", "phone": "+989123456789" }, "chat": { "id": 987654321, "type": "private" }, "text": "سلام", "date": "2025-12-20T10:30:00Z", "reply_to_message_id": null } }
## 📁 ساختار پروژه
telegram-crawler-python/ ├── app/ │ ├── init.py │ ├── main.py # FastAPI application │ ├── config.py # تنظیمات │ ├── api/ │ │ ├── init.py │ │ ├── routes.py # API endpoints │ │ └── schemas.py # Pydantic schemas │ ├── models/ │ │ ├── init.py │ │ └── session.py # Database models │ ├── services/ │ │ ├── init.py │ │ ├── telegram.py # Telegram client management │ │ └── webhook.py # Webhook sender │ └── utils/ │ ├── init.py │ ├── qr_generator.py # QR code generator │ └── session_manager.py # Session management ├── sessions/ # Session files ├── .env.example ├── .gitignore ├── docker-compose.yml ├── Dockerfile ├── requirements.txt ├── docs.md # مستندات کامل └── README.md # این فایل
## 🔧 توسعه و تست
### اجرای در حالت Development
```bash
# با reload خودکار
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
پس از اجرای سرویس، به آدرس زیر بروید:
http://localhost:8000/docs
http://localhost:8000/redoc
-
خطای "Session not found"
- مطمئن شوید session_id صحیح است
- بررسی کنید که Session در دیتابیس موجود باشد
-
خطای "Invalid API key"
- API_SECRET_KEY در .env را بررسی کنید
- Header X-API-Key را در درخواست قرار دهید
-
خطای "FloodWaitError"
- تلگرام محدودیت تعداد درخواست دارد
- چند دقیقه صبر کنید و دوباره تلاش کنید
-
Session منقضی میشود
- Session files را backup کنید
- از Volume در Docker استفاده کنید
# Docker
docker-compose logs -f telegram-service
# Local
# Logs در console نمایش داده میشوندcurl http://localhost:8000/healthResponse:
{
"status": "healthy",
"active_sessions": 5
}- ✅ API_SECRET_KEY قوی استفاده کنید
- ✅ HTTPS برای Production
- ✅ محدود کردن CORS
- ✅ Firewall برای محدود کردن دسترسی
- ✅ Backup منظم از Session files
- ✅ استفاده از Environment Variables
در فایل app/main.py:
app.add_middleware(
CORSMiddleware,
allow_origins=["https://your-frontend.com"],
allow_credentials=True,
allow_methods=["GET", "POST"],
allow_headers=["*"],
)# Build image
docker build -t telegram-service:latest .
# Run container
docker run -d \
--name telegram-service \
-p 8000:8000 \
--env-file .env \
-v $(pwd)/sessions:/app/sessions \
telegram-service:latestdocker-compose -f docker-compose.yml up -d- ✅ پیادهسازی اولیه
- ✅ اتصال به تلگرام با QR Code
- ✅ مدیریت Session ها
- ✅ دریافت و ارسال پیام
- ✅ Webhook به Laravel
- ✅ Docker Support
برای مشارکت در پروژه:
- Fork کنید
- یک Branch جدید بسازید (
git checkout -b feature/AmazingFeature) - تغییرات را Commit کنید (
git commit -m 'Add some AmazingFeature') - Push کنید (
git push origin feature/AmazingFeature) - یک Pull Request باز کنید
این پروژه تحت لایسنس MIT است.
برای سوالات و مشکلات، Issue باز کنید یا به تیم توسعه مراجعه کنید.
ساخته شده با ❤️ برای Laravel Backend Integration