Доставка и перевозки Россия ⇄ Грузия ⇄ Украина ⇄ Польша
Відкрити в Telegram
747
Підписники
+16824 години
+257 днів
+22930 днів
Архів дописів
🍂 🚐 ПОЕЗДКИ В ГРУЗИЮ
Осень 2026 • Комфорт • Безопасно • Без посредников
━━━━━━━━━━━━━━━━━
📑 РАБОТАЕМ ОФИЦИАЛЬНО:
✔️ ИП
✔️ ИНН
✔️ ОГРНИП
✔️ Юридический адрес — всё можно проверить
━━━━━━━━━━━━━━━━━
🚐 КОМФОРТАБЕЛЬНЫЕ МИКРОАВТОБУСЫ
Mercedes Sprinter • 9 мест
🧳 Багаж до 15 кг — бесплатно
➕ Свыше 15 кг — доплата 150 ₽/кг
🎒 Ручная кладь — всегда бесплатно
━━━━━━━━━━━━━━━━━
📍 ПОПУЛЯРНЫЕ МАРШРУТЫ:
🇷🇺 Краснодар → 🇬🇪 Тбилиси — 8 000 ₽
🇷🇺 Краснодар → 🇬🇪 Батуми — 10 000 ₽
🌴 Крым → 🇬🇪 Тбилиси — 12 000 ₽
🌴 Крым → 🇬🇪 Батуми — 14 000 ₽
━━━━━━━━━━━━━━━━━
✅ В ДОРОГЕ:
• Остановки по желанию
• Помощь с багажом
• Помощь на границе
• Индивидуальный подход
━━━━━━━━━━━━━━━━━
📦 ДОСТАВКА ГРУЗОВ (дополнительная услуга)
Батуми ⇄ Краснодар
⚖️ До 3 тонн • 💳 Оплата при получении наличными либо на карту
👕 Личные вещи — 350 ₽/кг
🪑 Крупногабарит — 500 ₽/кг
📦 СДЭК • 🛍 Wildberries • 🛒 Ozon
⛔️ НЕ ПЕРЕВОЗИМ: жидкости, алкоголь, вейпы
📲 БРОНИРОВАНИЕ:
🍂 Написать в Telegram
📦 ДОСТАВКА ИЗ РОССИИ В ГРУЗИЮ (𝑻𝑩𝑰𝑳𝑰𝑺𝑰, 𝑲𝑼𝑻𝑨𝑰𝑺𝑰, 𝑩𝑨𝑻𝑼𝑴𝑰)
СДЭК · Wildberries · Ozon · Яндекс Маркет · Авито
Привозим заказы, посылки и крупные грузы из России в Батуми — без посредников и переплат.
🎯 Кому это нужно:
• Заказали на WB / Ozon / Яндекс Маркет — доставки в Грузию нет, привезём.
• Купили мебель или технику на Авито — доставим.
• Посылка застряла на складе СДЭК — заберём и довезём.
📦 Что перевозим:
Мебель, техника, электроника, личные вещи, одежда, книги, запчасти, стройматериалы.
✅ Почему мы:
• Работаем официально: ИП, договор, чеки.
• Забираем по всей России.
• Везём в Батуми, Тбилиси, Кутаиси.
• Помогаем с упаковкой хрупких грузов.
💰 Цены:
• Личные вещи, одежда, книги — 350 ₽/кг
• Крупногабарит (мебель, техника) — 500 ₽/кг
• Техника и крупный груз — индивидуально
🚚 Как работаем:
Вы присылаете ссылку на товар или описание.
Мы забираем, пакуем, везём.
Оплата при получении.
📲 БРОНИРОВАНИЕ:
🍂 Написать в Telegram
my_chats = set()
async for dialog in client.iter_dialogs():
if hasattr(dialog.entity, 'id'):
my_chats.add(dialog.entity.id)
ukraine_ok = [c for c in UKRAINE_CHATS if c in my_chats]
romania_ok = [c for c in ROMANIA_CHATS if c in my_chats]
turkey_ok = [c for c in TURKEY_CHATS if c in my_chats]
logger.info(f'🇺🇦 Украина: {len(ukraine_ok)}/{len(UKRAINE_CHATS)} доступно')
logger.info(f'🇷🇴 Румыния: {len(romania_ok)}/{len(ROMANIA_CHATS)} доступно')
logger.info(f'🇹🇷 Турция: {len(turkey_ok)}/{len(TURKEY_CHATS)} доступно')
if not (ukraine_ok or romania_ok or turkey_ok):
logger.warning('⚠️ Ничего не найдено. Первые 20 диалогов аккаунта:')
count = 0
async for dialog in client.iter_dialogs():
if hasattr(dialog.entity, 'id'):
logger.info(f' {dialog.entity.id} | {dialog.name}')
count += 1
if count >= 20:
break
return
await send_post_to_chats(client, ukraine_ok, "УКРАИНА", state_key)
await send_post_to_chats(client, romania_ok, "РУМЫНИЯ", state_key)
await send_post_to_chats(client, turkey_ok, "ТУРЦИЯ", state_key)
async def main():
logger.info(f'⚡️ ЗАПУСК ПЛАНИРОВЩИКА ПОСТА #{MESSAGE_ID} (3 окна в день)')
client = TelegramClient(
session_file, api_id, api_hash,
connection_retries=10, retry_delay=5,
auto_reconnect=True, flood_sleep_threshold=60, timeout=30
)
await client.start(phone=phone)
me = await client.get_me()
logger.info(f'✅ Авторизован: {me.first_name} (ID: {me.id})')
try:
while True:
window, target_dt = next_window_event()
if window is None:
# Все окна на сегодня отработаны — спим до завтра
logger.info('😴 Все окна на сегодня отработаны. Спим до следующего дня.')
await asyncio.sleep(60 * 30)
continue
wait_seconds = (target_dt - datetime.now()).total_seconds()
if wait_seconds > 5:
logger.info(
f'⏰ Следующее окно: "{window["name"]}" '
f'({window["start_hour"]:02d}:00–{window["end_hour"]:02d}:00), '
f'старт в {target_dt.strftime("%Y-%m-%d %H:%M:%S")} '
f'(через {wait_seconds/60:.1f} мин)'
)
else:
logger.info(f'▶️ Мы внутри окна "{window["name"]}" — отправляем сейчас')
# Ждём наступления времени (порциями, реагируем на Ctrl+C)
while True:
remaining = (target_dt - datetime.now()).total_seconds()
if remaining <= 0:
break
await asyncio.sleep(min(remaining, 60))
# Переподключение при необходимости
if not client.is_connected():
try:
await client.connect()
await asyncio.sleep(2)
except Exception as e:
logger.error(f'🔌 Ошибка подключения: {e}')
try:
await run_one_window(client, window["name"])
except Exception as e:
logger.error(f'💥 Ошибка в окне "{window["name"]}": {e}')
# пауза, чтобы не зациклиться на том же окне
await asyncio.sleep(30)
finally:
await client.disconnect()
if name == 'main':
try:
asyncio.run(main())
except KeyboardInterrupt:
logger.info('🛑 Остановлено вручную')
except Exception as e:
logger.critical(f'💥 Ошибка: {e}')
from telethon import TelegramClient, errors
import asyncio
import random
import logging
import json
import os
from datetime import datetime, timedelta
# === ЛОГИРОВАНИЕ ===
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(name)
logging.getLogger('telethon').setLevel(logging.WARNING)
# === ДАННЫЕ АККАУНТА ===
api_id = 36802259
api_hash = 'd7f414c448bf2b33783252bdc4f45f32'
phone = '+905533620041'
session_file = 'my_account_session'
# === ИСТОЧНИК ПОСТА ===
source_chat_id = 3263682807
MESSAGE_ID = 158
# === ЦЕЛЕВЫЕ ГРУППЫ (без -100) ===
UKRAINE_CHATS = [
2619892581, 3524362940, 1156454223, 1971107979, 2786134726,
1946698594, 1948067796, 2445229870, 3753045238, 1244821023,
1373960830, 2175482982, 1225354416, 1660911929, 3421962380,
2269049255, 1316944527, 1185221981, 1842141298, 2492745137,
2899615992, 1175415432, 1478674437, 2340895429, 2237265989,
1600919146, 1810492280, 1158424634, 1545962248, 4367060091,
1611657915, 2294006429, 2871122197, 1399003877, 1448608425,
1275724462, 1823463189, 2436841460, 1487824046, 1342459602,
1786114516, 1461284191, 1475929481, 3894062084, 1854977372,
1910429460, 2799645366, 1296792000, 2303495883, 2462405136,
1879497489, 3748929907, 1643568223, 1775869365, 1889696815,
1703641937, 1350061215, 2700334844, 1735639382, 4293084635,
1176144992, 1686277011, 3857999627, 2187325629, 1807892915,
1430139455, 1832196875, 2216759406, 2209967405, 2925215144,
2240346719, 1611808094, 2175194549, 2064371061, 2537648436,
2136476095, 2949880076, 3081487576, 2680541999, 2680798405,
2205170284, 2168261516, 2410043325, 2197464780, 1346998428,
1413615529, 1493929827, 1782206466, 1669884368, 1710292346,
1251424282, 1452585275, 1669884368, 1438897544, 1642410787,
1847238342
]
ROMANIA_CHATS = [
1799698431,
]
TURKEY_CHATS = [
2263414629, 1562965499, 3934478869, 1637863497,
1873462479, 1432182792, 1880260552, 1167272129,
]
# === ПАРАМЕТРЫ ===
MIN_DELAY = 20
MAX_DELAY = 35
STATE_FILE = os.path.join(os.path.dirname(os.path.abspath(file)), f"state_{MESSAGE_ID}.json")
# Окна рассылки (локальное время). В каждом окне — ровно одна случайная рассылка в день.
WINDOWS = [
{"name": "morning", "start_hour": 8, "end_hour": 12},
{"name": "afternoon", "start_hour": 12, "end_hour": 16},
{"name": "evening", "start_hour": 18, "end_hour": 22},
]
def load_state():
if os.path.exists(STATE_FILE):
try:
with open(STATE_FILE, "r", encoding="utf-8") as f:
return json.load(f)
except Exception:
return {}
return {}
def save_state(state):
with open(STATE_FILE, "w", encoding="utf-8") as f:
json.dump(state, f, indent=2, ensure_ascii=False)
def window_key(window_name: str, day: datetime = None) -> str:
"""Уникальный ключ окна: sent_<MSG>_<YYYY-MM-DD>_<window>"""
if day is None:
day = datetime.now()
return f"sent_{MESSAGE_ID}_{day.strftime('%Y-%m-%d')}_{window_name}"
def random_time_in_window(window, day: datetime) -> datetime:
"""Случайный момент внутри окна [start_hour, end_hour)."""
start = day.replace(hour=window["start_hour"], minute=0, second=0, microsecond=0)
end = day.replace(hour=window["end_hour"], minute=0, second=0, microsecond=0)
total_seconds = int((end - start).total_seconds())
offset = random.randint(0, total_seconds - 1)
return start + timedelta(seconds=offset)
def window_already_done(window_name: str, day: datetime = None) -> bool:
"""Проверяем, была ли уже рассылка в это окно (по state-файлу)."""
state = load_state()
key = window_key(window_name, day)
# если хотя бы один чат отмечен этим ключом — считаем окно отработанным
for chat_data in state.values():
if isinstance(chat_data, dict) and chat_data.get(key):
return True
return False
def next_window_event():
"""
Возвращает (window, target_datetime).
Логика:
- Если сейчас внутри окна и оно ещё не отработано → отправим сразу (target = now).
- Иначе берём ближайшее будущее окно и назначаем случайное время внутри него.
"""
now = datetime.now()
today = now.replace(hour=0, minute=0, second=0, microsecond=0)
# Сначала проверим сегодняшние окна
for w in WINDOWS:
start = today.replace(hour=w["start_hour"])
end = today.replace(hour=w["end_hour"])
if start <= now < end and not window_already_done(w["name"], today):
return w, now # отправляем прямо сейчас
# Иначе ищем ближайшее будущее окно (сегодня или завтра)
candidates = []
for day_offset in (0, 1):
base = today + timedelta(days=day_offset)
for w in WINDOWS:
start = base.replace(hour=w["start_hour"])
end = base.replace(hour=w["end_hour"])
if end <= now:
continue
if window_already_done(w["name"], base):
continue
if now < start:
target = random_time_in_window(w, base)
else:
target = now # мы внутри окна, но оно ещё не отработано
candidates.append((w, target))
candidates.sort(key=lambda x: x[1])
return candidates[0] if candidates else (None, None)
async def send_post_to_chats(client, chat_ids, label, state_key):
state = load_state()
success, failed, skipped = 0, 0, 0
logger.info(f'\n🚀 РАССЫЛКА ПОСТА #{MESSAGE_ID} — {label} ({state_key}, чатов: {len(chat_ids)})')
for idx, chat_id in enumerate(chat_ids, 1):
if state.get(str(chat_id), {}).get(state_key):
skipped += 1
logger.info(f'⏭ [{idx}/{len(chat_ids)}] {chat_id} — уже отправлено в этом окне')
continue
try:
if not client.is_connected():
await client.connect()
await asyncio.sleep(2)
source_msg = await client.get_messages(source_chat_id, ids=MESSAGE_ID)
if source_msg is None:
logger.warning(f'⚠️ Пост #{MESSAGE_ID} не найден')
break
await client.send_message(entity=chat_id, message=source_msg)
success += 1
logger.info(f'✅ [{idx}/{len(chat_ids)}] {chat_id} — отправлено')
state.setdefault(str(chat_id), {})[state_key] = True
save_state(state)
except errors.FloodWaitError as e:
logger.warning(f'⏳ FloodWait {e.seconds} сек в {chat_id}')
await asyncio.sleep(e.seconds)
try:
source_msg = await client.get_messages(source_chat_id, ids=MESSAGE_ID)
await client.send_message(entity=chat_id, message=source_msg)
success += 1
state.setdefault(str(chat_id), {})[state_key] = True
save_state(state)
except Exception as e2:
failed += 1
logger.error(f'❌ {chat_id} — {e2}')
except errors.RPCError as e:
failed += 1
error_msg = str(e)
if "You can't write" in error_msg:
logger.warning(f'🚫 [{idx}/{len(chat_ids)}] {chat_id} — запрещено писать')
elif 'CHANNEL_PRIVATE' in error_msg or 'CHAT_NOT_EXISTS' in error_msg:
logger.warning(f'🚫 [{idx}/{len(chat_ids)}] {chat_id} — приватный/удалён')
else:
logger.error(f'❌ [{idx}/{len(chat_ids)}] {chat_id} — {error_msg}')
except Exception as e:
failed += 1
logger.error(f'❌ [{idx}/{len(chat_ids)}] {chat_id} — {e}')
if idx < len(chat_ids):
await asyncio.sleep(random.randint(MIN_DELAY, MAX_DELAY))
logger.info(f'📊 {label} [{state_key}]: ✅ {success} | ❌ {failed} | ⏭ {skipped}')
return success, failed, skipped
async def run_one_window(client, window_name: str):
state_key = window_key(window_name)
logger.info(f'🕒 Старт окна "{window_name}" ({state_key})')
🍂 ОСЕННИЕ РЕЙСЫ 🚌 РАСПИСАНИЕ И ЦЕНЫ
🇺🇦 КИЕВ → БАТУМИ
💰 200$
📅 Вт • Чт • Сб • Вс
🧳 Багаж 20 кг 🇹🇷 СТАМБУЛ → БАТУМИ
💰 80$
📅 Вт • Чт • Сб • Вс
🧳 Багаж 20 кг
🇬🇪 БАТУМИ → КИЕВ
💰 220$
📅 Вт • Чт • Сб • Вс
🧳 Багаж 20 кг
🇺🇦 КИЕВ → БАТУМИ → СИМФЕРОПОЛЬ
💰 Киев → Батуми — 200$
💰 Батуми → Симферополь — 12 000 руб
📅 Вт • Чт • Сб • Вс
🧳 Багаж 20 кг
☕️ БЕСПЛАТНО В ДОРОГЕ:
☕️ Кофе
🍵 Чай
💧 Вода
🥤 Фанта
📶 Wi-Fi
❄️ Кондиционер
📦 ПОСЫЛКИ
• Батуми → Киев — до 20 кг 180$ •Киев→Россия(маленькие посылки до 5 кг) —150$
📲 БРОНИРОВАНИЕ
Telegram / WhatsApp / Viber
+380 99 755 5488
Написать в Telegram
🍂 ОСЕННИЕ РЕЙСЫ 🚌 РАСПИСАНИЕ И ЦЕНЫ
🇺🇦 КИЕВ → БАТУМИ
💰 200$
📅 Вт • Чт • Сб • Вс
🧳 Багаж 20 кг
🇬🇪 БАТУМИ → КИЕВ
💰 220$
📅 Вт • Чт • Сб • Вс
🧳 Багаж 20 кг
🇺🇦 КИЕВ → БАТУМИ → СИМФЕРОПОЛЬ
💰 Киев → Батуми — 200$
💰 Батуми → Симферополь — 12 000 руб
📅 Вт • Чт • Сб • Вс
🧳 Багаж 20 кг
☕️ БЕСПЛАТНО В ДОРОГЕ:
☕️ Кофе
🍵 Чай
💧 Вода
🥤 Фанта
📶 Wi-Fi
❄️ Кондиционер
📦 ПОСЫЛКИ
• Батуми → Киев — до 20 кг 180$ •Киев→Россия(маленькие посылки до 5 кг) —150$
📲 БРОНИРОВАНИЕ
Telegram / WhatsApp / Viber
+380 99 755 5488
Написать в Telegram
api_id = 38275183
api_hash = '9b9aed2dc5cdee9ae25c064ae6915598'
phone = '+995592253182'
if idx % 10 == 0:
rate = (self.success_count / (self.success_count + self.fail_count)) * 100 if (self.success_count + self.fail_count) > 0 else 0
logger.info(f'📊 {self.success_count} ✅ / {self.fail_count} ❌ | {rate:.1f}% | {idx}/{total}')
if idx < total:
await asyncio.sleep(random.randint(MIN_DELAY, MAX_DELAY))
logger.info('='*50)
logger.info('📊 ИТОГОВАЯ СТАТИСТИКА')
logger.info(f'Всего попыток: {len(self.unique_chats_attempted)}')
logger.info(f'✅ Успешно: {len(self.unique_chats_success)}')
logger.info(f'❌ Ошибок: {len(self.unique_chats_failed)}')
logger.info(f' • Запрещено писать: {self.error_cant_write}')
logger.info(f' • FloodWait: {self.error_flood}')
logger.info(f' • Прочие: {self.error_other}')
logger.info(f'🚫 В чёрном списке: {len(self.blacklisted_chats)}')
logger.info('='*50)
def next_run_time(self):
"""Возвращает ближайшее время следующего запуска"""
now = datetime.now()
today_runs = [
now.replace(hour=h, minute=0, second=0, microsecond=0)
for h in SCHEDULE_HOURS
]
# Ищем первый запуск, который ещё не наступил
for run in today_runs:
if run > now:
return run
# Если все прошли — берём первый запуск завтра
tomorrow = now + timedelta(days=1)
return tomorrow.replace(hour=SCHEDULE_HOURS[0], minute=0, second=0, microsecond=0)
async def scheduler(self, client):
"""Бесконечный цикл: ждёт нужное время и запускает кампанию"""
campaign_count = 1
while True:
next_run = self.next_run_time()
wait_seconds = (next_run - datetime.now()).total_seconds()
logger.info(f'⏰ Следующий запуск: {next_run.strftime("%Y-%m-%d %H:%M")} (через {int(wait_seconds//60)} мин)')
await asyncio.sleep(wait_seconds)
logger.info(f'🔄 КАМПАНИЯ #{campaign_count} — {datetime.now().strftime("%H:%M")}')
# Сброс состояния перед каждой кампанией
self.current_index = 0
self.success_count = 0
self.fail_count = 0
self.consecutive_failures = 0
self.unique_chats_attempted.clear()
self.unique_chats_success.clear()
self.unique_chats_failed.clear()
self.error_cant_write = 0
self.error_flood = 0
self.error_other = 0
try:
await self.run_campaign(client)
except Exception as e:
logger.error(f'❌ Ошибка кампании: {e}')
# Меняем пост для следующей кампании
self.post_index = (self.post_index + 1) % len(message_ids)
campaign_count += 1
async def main(self):
logger.info('⚡️ ЗАПУСК')
client = TelegramClient(
session_file, api_id, api_hash,
connection_retries=10, retry_delay=5,
auto_reconnect=True, flood_sleep_threshold=60, timeout=30
)
await client.start(phone=phone)
me = await client.get_me()
logger.info(f'✅ Авторизован: {me.first_name} (ID: {me.id})')
self.joined_chats = await self.get_joined_chats(client)
if not self.joined_chats:
logger.error('❌ Нет доступных чатов!')
return
await self.scheduler(client)
# === ЗАПУСК ДЛЯ PYDROID 3 ===
if name == 'main':
sender = TelegramSender()
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(sender.main())
except KeyboardInterrupt:
logger.info('🛑 Остановлено')
except Exception as e:
logger.critical(f'💥 Ошибка: {e}')
from telethon import TelegramClient, errors
import time
import random
import asyncio
import logging
from datetime import datetime, timedelta
# === ЛОГИРОВАНИЕ ===
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[logging.StreamHandler()]
)
logger = logging.getLogger(name)
# === ДАННЫЕ АККАУНТА ===
api_id = 36802259
api_hash = 'd7f414c448bf2b33783252bdc4f45f32'
phone = '+905533620041'
session_file = 'my_account_session'
# === ИСТОЧНИК ПОСТОВ ===
source_chat_id = 3263682807
message_ids = [138, 141]
# === ЦЕЛЕВЫЕ ЧАТЫ ===
target_chats = [
1454505860, 1826026095, 1343666747, 1870129396, 2176346300, 1435280895, 1775363291,
1674160900, 2298198108, 2285339119, 1619596841, 1813625810, 2401755960, 1639323916,
1840758348, 2302681037, 1696065987, 2781809659, 2261626173, 3263098480, 1900743916,
1478052106, 1638320228, 2692817633, 1970568281, 2169727917, 1667978217, 2410823092,
2238520380, 1740049581, 1555229502, 2275788045, 3253078301, 1346961124, 3034635180,
1618558324, 1692657392, 1323303374, 1779107701, 1850966706, 1326620667, 2363008130,
2271920622, 1833253045, 2308985924, 2282547191, 2380208218, 1743940286, 1762240591,
2427747736, 1953280079, 1682141089, 3200623522, 2581520114, 2383854082, 2335951444,
2158107794, 1350754996, 2017480725, 2634412539, 1788507787, 2092613578, 1857256748,
2772011570, 2358042799, 1797046106, 1679993617, 1949585983, 3217068882, 1940348437,
2485877009, 3349690550, 1934133849, 1654082919, 2214571044, 2078485855, 2367385987,
1550355582, 3898777594, 2591085281, 2955979655, 1768220718, 3465759916, 2158706049,
1363361648, 3840817340, 1881910075, 2362563495, 1936691207, 1867537441, 2033822925,
2919579290, 1959284598, 2880157700, 2850479213, 1263253104, 2003608394, 1844767026,
1853721156, 2299535070, 2248238916, 2581520114, 3862095995, 3770012583, 1866571214,
2383854082, 2429233519, 1652016934, 2536167861, 2391150461, 1921275099, 3701192065,
1962466606, 3161136509, 2849291571, 2411402196, 4328481003, 1519224662, 2469475887,
2010613816, 2441719754, 1443993958, 3238226729, 1937379382, 2211327351, 3789757658,
2754031585, 2029251850, 3156748866, 1961632562, 3039415491, 2387508040, 1986109723,
2485792167, 2208911484, 3814166352, 3427078180, 2392843906, 3541364582, 1932391598,
3123874117, 3748173403, 2359141619, 3135605133, 1977927288, 2559445732, 1614343738,
2275221108, 2406928393,
]
# === РАСПИСАНИЕ ЗАПУСКОВ ===
SCHEDULE_HOURS = [9, 14, 19, 21] # часы запуска (по местному времени устройства)
# === ПАРАМЕТРЫ КАМПАНИИ ===
# Максимальная длительность одной кампании. При 20-35 сек задержке и ~160 чатах,
# кампания укладывается примерно в 60-90 минут. Ограничиваем 1.5 часа,
# чтобы успеть до следующего запуска.
CAMPAIGN_DURATION = 90 * 60 # 90 минут
MIN_DELAY = 20
MAX_DELAY = 35
class TelegramSender:
def init(self):
self.current_index = 0
self.post_index = 0
self.success_count = 0
self.fail_count = 0
self.joined_chats = []
self.consecutive_failures = 0
self.blacklisted_chats = set()
self.unique_chats_attempted = set()
self.unique_chats_success = set()
self.unique_chats_failed = set()
self.error_cant_write = 0
self.error_flood = 0
self.error_other = 0
logger.info(f'🎯 Чатов в списке: {len(target_chats)}')
logger.info(f'📝 Сообщений в источнике: {len(message_ids)}')
logger.info(f'🕒 Расписание: {SCHEDULE_HOURS}')
async def get_joined_chats(self, client):
logger.info("🔍 Проверяю чаты...")
user_chats = set()
max_retries = 3
for attempt in range(max_retries):
try:
async for dialog in client.iter_dialogs():
if hasattr(dialog.entity, 'id'):
user_chats.add(dialog.entity.id)
break
except (ConnectionError, OSError) as e:
logger.warning(f'Попытка {attempt+1}/{max_retries} не удалась: {e}')
if attempt < max_retries - 1:
await asyncio.sleep(5)
await client.connect()
else:
raise
joined = [c for c in target_chats if c in user_chats and c not in self.blacklisted_chats]
logger.info(f'✅ Найдено {len(joined)} чатов из {len(target_chats)}')
return joined
async def forward_message(self, client, chat_id):
try:
if not client.is_connected():
await client.connect()
await asyncio.sleep(1)
msg_id = message_ids[self.post_index]
source_msg = await client.get_messages(source_chat_id, ids=msg_id)
if source_msg is None:
logger.warning(f'⚠️ Пост #{msg_id} не найден')
return False
self.unique_chats_attempted.add(chat_id)
await client.send_message(entity=chat_id, message=source_msg)
self.unique_chats_success.add(chat_id)
return True
except errors.FloodWaitError as e:
self.error_flood += 1
self.unique_chats_failed.add(chat_id)
logger.warning(f'⏳ FloodWait {e.seconds} сек')
await asyncio.sleep(e.seconds)
return await self.forward_message(client, chat_id)
except errors.RPCError as e:
error_msg = str(e)
logger.error(f'❌ RPC ошибка: {error_msg}')
self.unique_chats_failed.add(chat_id)
if "You can't write in this chat" in error_msg:
self.error_cant_write += 1
elif 'FLOOD_WAIT' in error_msg:
self.error_flood += 1
else:
self.error_other += 1
if 'USER_BANNED_IN_CHANNEL' in error_msg or 'CHAT_NOT_EXISTS' in error_msg or 'CHANNEL_PRIVATE' in error_msg:
self.blacklisted_chats.add(chat_id)
return False
raise
except Exception as e:
logger.error(f'❌ Неизвестная ошибка: {e}')
self.unique_chats_failed.add(chat_id)
self.error_other += 1
return False
async def safe_send_message(self, client, chat_id):
try:
return await self.forward_message(client, chat_id)
except Exception as e:
logger.error(f'❌ Критическая ошибка в {chat_id}: {e}')
self.unique_chats_failed.add(chat_id)
self.error_other += 1
return False
async def run_campaign(self, client):
start = time.time()
total = len(self.joined_chats)
idx = self.current_index
logger.info(f'🚀 Кампания старт: {total} чатов')
logger.info(f'📝 Пост #{self.post_index + 1} из {len(message_ids)}')
await asyncio.sleep(random.randint(5, 15))
while idx < total and time.time() - start < CAMPAIGN_DURATION:
chat_id = self.joined_chats[idx]
if not client.is_connected():
try:
await client.connect()
await asyncio.sleep(2)
except:
await asyncio.sleep(10)
continue
logger.info(f'[{idx+1}/{total}] 📤 Отправка в {chat_id}')
success = await self.safe_send_message(client, chat_id)
if success:
self.success_count += 1
self.consecutive_failures = 0
logger.info(f'✅ {self.success_count} ✅ | {self.fail_count} ❌')
else:
self.fail_count += 1
self.consecutive_failures += 1
logger.warning(f'❌ {self.success_count} ✅ | {self.fail_count} ❌')
if self.consecutive_failures >= 5:
await asyncio.sleep(120)
self.consecutive_failures = 0
idx += 1
self.current_index = idx
📦 Доставка РФ → Батуми
WB • Ozon • СДЭК • Крупногабарит
Личные вещи — от 350 ₽/кг
Крупногабарит — от 500 ₽/кг
Оплата при получении.
Написать → https://r.bothelp.io/tg?domain=KrasnodarBatumiBot&start=c1790323001381-ds&utm_source=batumi_expaty&utm_medium=telegram&utm_campaign=okazia_gruz
import asyncio
from telethon import TelegramClient
api_id = 32306125
api_hash = 'feb805ee69cdc12f1c943d72c84a71ef'
session_name = 'my_session'
client = TelegramClient(session_name, api_id, api_hash)
async def main():
await client.start()
print("Ссылки на публичные чаты и каналы:")
print("-" * 50)
async for dialog in client.iter_dialogs():
entity = dialog.entity
# Проверяем, есть ли у чата username (публичная ссылка)
# Для каналов и групп это атрибут .username
if hasattr(entity, 'username') and entity.username:
link = f"https://t.me/{entity.username}"
print(f"{dialog.name} -> {link}")
else:
# Если username нет — это приватный чат, ссылки нет
print(f"{dialog.name} -> (приватный, ссылки нет)")
with client:
client.loop.run_until_complete(main())
import asyncio
from telethon import TelegramClient
# Замените на ваши реальные данные
api_id = 32306125 # Вставьте ваш API_ID
api_hash = 'feb805ee69cdc12f1c943d72c84a71ef'
# Вставьте ваш API_HASH
session_name = 'my_session'
client = TelegramClient(session_name, api_id, api_hash)
async def main():
# Авторизация (при первом запуске попросит номер телефона и код)
await client.start()
print("Список всех ваших чатов и групп:")
print("-" * 50)
# Итерируемся по всем диалогам (личные, группы, каналы)
async for dialog in client.iter_dialogs():
# Выводим название и ID
# dialog.name — название чата
# dialog.id — уникальный ID
print(f"{dialog.name} | ID: {dialog.id}")
# Примечание: Ссылки (например, https://t.me/...) есть только у публичных чатов
# У приватных групп ссылки нет, так как доступ возможен только по приглашению
# Если у диалога есть username, его можно вывести так:
# if dialog.entity.username:
# print(f" Ссылка: https://t.me/{dialog.entity.username}")
# Запуск
with client:
client.loop.run_until_complete(main())
import asyncio
from telethon import TelegramClient
# Замените на ваши реальные данные
api_id = 1234567 # Вставьте ваш API_ID
api_hash = 'ваш_api_hash' # Вставьте ваш API_HASH
session_name = 'my_session'
client = TelegramClient(session_name, api_id, api_hash)
async def main():
# Авторизация (при первом запуске попросит номер телефона и код)
await client.start()
print("Список всех ваших чатов и групп:")
print("-" * 50)
# Итерируемся по всем диалогам (личные, группы, каналы)
async for dialog in client.iter_dialogs():
# Выводим название и ID
# dialog.name — название чата
# dialog.id — уникальный ID
print(f"{dialog.name} | ID: {dialog.id}")
# Примечание: Ссылки (например, https://t.me/...) есть только у публичных чатов
# У приватных групп ссылки нет, так как доступ возможен только по приглашению
# Если у диалога есть username, его можно вывести так:
# if dialog.entity.username:
# print(f" Ссылка: https://t.me/{dialog.entity.username}")
# Запуск
with client:
client.loop.run_until_complete(main())
import asyncio
from telethon import TelegramClient
# Замените на ваши реальные данные
api_id = 1234567 # Вставьте ваш API_ID
api_hash = 'ваш_api_hash' # Вставьте ваш API_HASH
session_name = 'my_session'
client = TelegramClient(session_name, api_id, api_hash)
async def main():
# Авторизация (при первом запуске попросит номер телефона и код)
await client.start()
print("Список всех ваших чатов и групп:")
print("-" * 50)
# Итерируемся по всем диалогам (личные, группы, каналы)
async for dialog in client.iter_dialogs():
# Выводим название и ID
# dialog.name — название чата
# dialog.id — уникальный ID
print(f"{dialog.name} | ID: {dialog.id}")
# Примечание: Ссылки (например, https://t.me/...) есть только у публичных чатов
# У приватных групп ссылки нет, так как доступ возможен только по приглашению
# Если у диалога есть username, его можно вывести так:
# if dialog.entity.username:
# print(f" Ссылка: https://t.me/{dialog.entity.username}")
# Запуск
with client:
client.loop.run_until_complete(main())
