Skip to content

Commit cfd9ffd

Browse files
committed
Update Telegram Panel: Add new features, improvements, and documentation
1 parent 651e93e commit cfd9ffd

27 files changed

Lines changed: 5478 additions & 297 deletions

ACCOUNT_SAFETY_REPORT.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# 🔒 گزارش ایمنی اکانت‌ها
2+
3+
## ✅ بررسی کامل انجام شد
4+
5+
ربات را بررسی کردم. **اکانت‌ها فقط در شرایط زیر حذف می‌شوند:**
6+
7+
### 1. ✅ SessionRevokedError واقعی از تلگرام (امن)
8+
**زمانی که:**
9+
- شما خودتان از تلگرام اصلی Logout کنید
10+
- رمز عبور اکانت را تغییر دهید
11+
- تلگرام به دلایل امنیتی session را لغو کند
12+
13+
**کد مربوطه:**
14+
```python
15+
# در Client.py - خط 115-124
16+
if ('session' in check_error_msg and
17+
('revoked' in check_error_msg or 'invalid' in check_error_msg)) or
18+
'auth' in check_error_msg:
19+
logger.warning("Client has true SessionRevokedError. Removing permanently...")
20+
# فقط در این صورت حذف می‌شود
21+
```
22+
23+
### 2. ✅ حذف دستی توسط شما (امن)
24+
**زمانی که:**
25+
- شما از منوی Account Management گزینه Delete را بزنید
26+
- شما به صورت دستی اکانت را حذف کنید
27+
28+
### 3. ✅ خطاهای موقت حذف نمی‌کنند (امن)
29+
**این خطاها اکانت را حذف نمی‌کنند:**
30+
- ❌ خطاهای شبکه (Network errors)
31+
- ❌ خطاهای موقت Telegram API
32+
- ❌ Rate limit errors
33+
- ❌ "key is not registered" (اکانت در لیست می‌ماند برای retry)
34+
35+
**کد محافظت:**
36+
```python
37+
# در Client.py - خط 125-130
38+
else:
39+
# Not a true session revoked error
40+
logger.warning("Client has connectivity issues but not revoked.
41+
Keeping in active list for retry.")
42+
# IMPORTANT: Keep the client in active_clients even if it has issues
43+
```
44+
45+
## 🛡️ محافظت‌های فعال
46+
47+
### 1. بررسی دقیق قبل از حذف
48+
- ربات دو بار بررسی می‌کند: یکبار `is_user_authorized()` و یکبار `get_dialogs()`
49+
- فقط اگر هر دو fail شوند و خطا "session revoked" باشد، حذف می‌شود
50+
51+
### 2. اکانت‌ها در لیست می‌مانند
52+
- حتی اگر موقتاً کار نکنند، در `active_clients` می‌مانند
53+
- در هر task دوباره تلاش می‌شوند
54+
- فقط SessionRevokedError واقعی آنها را حذف می‌کند
55+
56+
### 3. لاگ کامل
57+
- هر حذفی لاگ می‌شود با دلیل دقیق
58+
- می‌توانید در `bot_running.log` ببینید چرا اکانتی حذف شده
59+
60+
## 📊 موارد خاص بررسی شده
61+
62+
### ❌ در actions.py (ارسال پیام)
63+
```python
64+
# خط 1611-1615
65+
if "sessionrevokederror" in error_msg or "not logged in" in error_msg:
66+
# فقط SessionRevokedError واقعی
67+
del self.tbot.active_clients[session_name]
68+
```
69+
**امن است** - فقط SessionRevokedError
70+
71+
### ❌ در handle_group_action (عملیات گروهی)
72+
```python
73+
# خط 264-268
74+
if "SessionRevokedError" in error_msg or "not logged in" in error_msg.lower():
75+
del self.tbot.active_clients[session_name]
76+
```
77+
**امن است** - فقط SessionRevokedError
78+
79+
### ❌ در shutdown
80+
```python
81+
# فقط هنگام خاموش کردن ربات
82+
await self.client_manager.disconnect_all_clients()
83+
```
84+
**امن است** - فقط disconnect می‌کند، حذف نمی‌کند
85+
86+
## 🎯 نتیجه نهایی
87+
88+
### ✅ ربات امن است
89+
- اکانت‌ها را خودکار حذف نمی‌کند
90+
- فقط SessionRevokedError واقعی از تلگرام باعث حذف می‌شود
91+
- خطاهای موقت اکانت را حذف نمی‌کنند
92+
- اکانت‌ها در لیست می‌مانند برای retry
93+
94+
### 💡 توصیه‌ها
95+
1. اگر اکانتی حذف شد، `bot_running.log` را بررسی کنید
96+
2. اگر "SessionRevokedError" دیدید، باید دوباره login کنید
97+
3. اگر خطای دیگری دیدید، اکانت همچنان در لیست است
98+
99+
### 🔍 بررسی لاگ‌ها
100+
برای اطمینان از عدم حذف خودکار:
101+
```bash
102+
cd /root/tel-panl/TELEGRAM-PANNEL
103+
grep -i "Removing.*session" bot_running.log | tail -20
104+
```
105+
106+
اگر چیزی نبود، یعنی هیچ اکانتی حذف نشده است ✅
107+

ANTI_DUPLICATE_SYSTEM.md

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
# ✅ سیستم جلوگیری از ارسال تکراری (Anti-Duplicate System)
2+
3+
## 🎯 مشکلی که حل شد:
4+
5+
در لیستی از 100 username، اگر task قطع شود یا خطا رخ دهد، نباید دوباره به username هایی که قبلاً پیام گرفتند، پیام ارسال شود.
6+
7+
---
8+
9+
## ✅ راه‌حل: سیستم Checkpoint
10+
11+
### 📋 نحوه کار:
12+
13+
#### 1. **وقتی پیام موفقیت‌آمیز ارسال می‌شود:**
14+
```
15+
✅ پیام به @username1 ارسال شد
16+
→ @username1 در فایل checkpoint ذخیره می‌شود
17+
→ از لیست task خط می‌خورد
18+
```
19+
20+
#### 2. **فایل Checkpoint:**
21+
```json
22+
{
23+
"task_id": "task_20251116_045030",
24+
"sent_usernames": [
25+
"username1",
26+
"username2",
27+
"username3"
28+
],
29+
"total_sent": 3,
30+
"total_failed": 1,
31+
"timestamp": "2025-11-16T04:52:15"
32+
}
33+
```
34+
35+
#### 3. **وقتی task دوباره اجرا می‌شود:**
36+
```
37+
📂 بارگذاری checkpoint...
38+
✅ 3 username قبلاً ارسال شده
39+
⏭️ username1, username2, username3 skip می‌شوند
40+
→ فقط username های جدید process می‌شوند
41+
```
42+
43+
---
44+
45+
## 🔒 تضمین‌های سیستم:
46+
47+
### ✅ هیچ username دوبار پیام نمی‌گیرد
48+
- هر username فقط یک بار mark می‌شود
49+
- قبل از ارسال، double-check می‌شود
50+
- بعد از ارسال موفق، فوراً ذخیره می‌شود
51+
52+
### ✅ محافظت در برابر قطع شدن
53+
- هر ارسال موفق → فوراً checkpoint ذخیره می‌شود
54+
- اگر task قطع شد → وقتی restart می‌شود، از جای قبلی ادامه می‌دهد
55+
56+
### ✅ نرمال‌سازی username
57+
```python
58+
@Username1 → username1
59+
Username1 → username1
60+
USERNAME1 → username1
61+
```
62+
همه به یک شکل ذخیره می‌شوند
63+
64+
---
65+
66+
## 📊 مثال عملی:
67+
68+
### Task اول:
69+
```
70+
100 username داریم
71+
→ 50 تا ارسال می‌شود
72+
→ خطا رخ می‌دهد و task قطع می‌شود
73+
→ checkpoint: 50 username ذخیره شده
74+
```
75+
76+
### Task دوم (restart):
77+
```
78+
100 username می‌دهیم به ربات
79+
→ ربات checkpoint را می‌خواند
80+
→ 50 username قبلی را skip می‌کند
81+
→ فقط 50 username باقی‌مانده را process می‌کند
82+
✅ نتیجه: همه 100 username فقط یک بار پیام گرفتند
83+
```
84+
85+
---
86+
87+
## 🛠️ استفاده:
88+
89+
### در کد:
90+
91+
```python
92+
from src.smart_sender import SmartBulkSender
93+
94+
# ایجاد sender با task_id
95+
sender = SmartBulkSender(
96+
accounts=accounts,
97+
usernames=usernames,
98+
message="سلام",
99+
max_per_account=4,
100+
task_id="my_campaign_001" # ✅ شناسه یکتا
101+
)
102+
103+
# ارسال
104+
await sender.send_all()
105+
106+
# (اختیاری) پاکسازی checkpoint بعد از اتمام
107+
sender.cleanup()
108+
```
109+
110+
### Task ID:
111+
- اگر `task_id` ندهید → خودکار generate می‌شود
112+
- اگر `task_id` یکسان بدهید → از همان checkpoint استفاده می‌شود
113+
- برای campaign های مختلف → task_id های مختلف استفاده کنید
114+
115+
---
116+
117+
## 📁 فایل‌های Checkpoint:
118+
119+
```
120+
task_checkpoint_my_campaign_001.json
121+
task_checkpoint_task_20251116_045030.json
122+
```
123+
124+
- در همان پوشه ربات ذخیره می‌شوند
125+
- بعد از اتمام task می‌توانید حذف کنید (با `sender.cleanup()`)
126+
- یا نگه دارید برای ادامه در آینده
127+
128+
---
129+
130+
## 🎯 مزایا:
131+
132+
1.**امنیت کامل:** هیچ username دوبار پیام نمی‌گیرد
133+
2.**ادامه از جای قطع شده:** اگر task fail شد، از همان جا ادامه می‌دهد
134+
3.**سرعت بالا:** username های قبلی skip می‌شوند
135+
4.**گزارش دقیق:** می‌توانید ببینید چند تا ارسال شده
136+
5.**انعطاف‌پذیر:** می‌توانید task_id را خودتان تعیین کنید
137+
138+
---
139+
140+
## 🔍 لاگ‌ها:
141+
142+
```
143+
ℹ️ No checkpoint found, starting fresh
144+
✅ Checkpoint loaded: 50 usernames already sent
145+
⚠️ 50 usernames already sent, skipping them
146+
⏭️ Skipping @username1 (already sent in previous task)
147+
✅ Marked as sent: @username2
148+
💾 Checkpoint saved: 51 usernames
149+
🗑️ Checkpoint file removed: task_checkpoint_my_campaign_001.json
150+
```
151+
152+
---
153+
154+
## ⚙️ پیاده‌سازی:
155+
156+
فایل: `src/smart_sender.py`
157+
158+
- `_load_checkpoint()` - بارگذاری از فایل
159+
- `_save_checkpoint()` - ذخیره در فایل
160+
- `_mark_as_sent()` - mark کردن username
161+
- `_normalize_username()` - نرمال‌سازی
162+
- `cleanup()` - پاکسازی checkpoint
163+
164+
---
165+
166+
## 📝 نکات مهم:
167+
168+
1. **فقط SUCCESS mark می‌شود:**
169+
- اگر پیام موفق ارسال شد → mark می‌شود
170+
- اگر NOT_FOUND بود → mark نمی‌شود (نیازی نیست)
171+
- اگر FAILED بود → mark نمی‌شود (باید دوباره تلاش شود)
172+
173+
2. **Double-check:**
174+
- قبل از ارسال، چک می‌شود که mark نباشد
175+
- بعد از بارگذاری checkpoint، filter می‌شود
176+
177+
3. **Thread-safe:**
178+
- هر ارسال فوراً ذخیره می‌شود
179+
- checkpoint بعد از هر SUCCESS به‌روز می‌شود
180+

0 commit comments

Comments
 (0)