Update main.py
Browse files
main.py
CHANGED
@@ -1,24 +1,45 @@
|
|
|
|
|
|
|
|
|
|
1 |
import telegram
|
2 |
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters
|
3 |
import schedule
|
4 |
import time
|
5 |
-
import
|
6 |
-
from collections import deque
|
7 |
from asyncio import run
|
8 |
|
9 |
BOT_TOKEN = os.environ['YOUR_BOT_TOKEN']
|
10 |
YOUR_USER_ID = 855890735 # Замените на ваш ID
|
11 |
CHANNEL_ID = os.environ['YOUR_CHANNEL_ID'] # Замените на ID канала
|
12 |
|
13 |
-
# Создаем бота Telegram
|
14 |
bot = telegram.Bot(token=BOT_TOKEN)
|
15 |
-
|
16 |
application = ApplicationBuilder().token(BOT_TOKEN).build()
|
17 |
-
|
18 |
message_queue = deque()
|
19 |
test_mode = False
|
20 |
|
21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
async def handle_message(update, context):
|
23 |
message = update.message
|
24 |
if message and message.from_user:
|
@@ -26,24 +47,16 @@ async def handle_message(update, context):
|
|
26 |
if user_id == YOUR_USER_ID and message.chat.type == 'private':
|
27 |
if not message.text.startswith("/"):
|
28 |
if test_mode:
|
29 |
-
await forward_message(message.
|
30 |
-
print(
|
31 |
-
f"Сообщение с ID {message.message_id} отправлено напрямую (тестовый режим)."
|
32 |
-
)
|
33 |
else:
|
34 |
-
message_queue.append(message.
|
35 |
-
print(
|
36 |
-
f"Добавлено сообщение с ID {message.message_id} в очередь."
|
37 |
-
)
|
38 |
else:
|
39 |
print(f"Получена команда от владельца: {message.text}")
|
40 |
else:
|
41 |
-
print(
|
42 |
-
|
43 |
-
)
|
44 |
-
await update.message.reply_text(
|
45 |
-
"Извини, но я могу общаться только с моим владельцем."
|
46 |
-
)
|
47 |
|
48 |
|
49 |
async def start(update, context):
|
@@ -52,12 +65,8 @@ async def start(update, context):
|
|
52 |
print("Владелец начал диалог.")
|
53 |
await update.message.reply_text("Привет!")
|
54 |
else:
|
55 |
-
print(
|
56 |
-
|
57 |
-
)
|
58 |
-
await update.message.reply_text(
|
59 |
-
"Извини, но я могу общаться только с моим владельцем."
|
60 |
-
)
|
61 |
|
62 |
|
63 |
async def clear_queue(update, context):
|
@@ -81,50 +90,64 @@ async def send_now(update, context):
|
|
81 |
global message_queue
|
82 |
if update.effective_user.id == YOUR_USER_ID:
|
83 |
if message_queue:
|
84 |
-
|
85 |
-
await forward_message(
|
86 |
-
message_queue.append(
|
87 |
print("Отправлено первое сообщение из очереди.")
|
88 |
await update.message.reply_text("Отправлено первое сообщение из очереди.")
|
89 |
else:
|
90 |
print("Очередь пуста.")
|
91 |
await update.message.reply_text("Очередь пуста.")
|
92 |
|
|
|
93 |
async def delete_last_message(update, context):
|
94 |
global message_queue
|
95 |
if update.effective_user.id == YOUR_USER_ID:
|
96 |
if message_queue:
|
97 |
-
|
98 |
-
print(f"Удалено сообщение
|
99 |
await update.message.reply_text("Последнее сообщение удалено из очереди.")
|
100 |
else:
|
101 |
print("Очередь пуста, нечего удалять.")
|
102 |
await update.message.reply_text("Очередь пуста, нечего удалять.")
|
103 |
|
104 |
|
105 |
-
async def forward_message(
|
106 |
try:
|
107 |
-
await bot.
|
108 |
-
|
109 |
-
)
|
110 |
-
print(f"Сообщение с ID {message_id} успешно отправлено в канал.")
|
111 |
except telegram.error.BadRequest as e:
|
112 |
-
print(f"Ошибка при
|
113 |
|
114 |
|
115 |
-
|
|
|
116 |
global message_queue
|
117 |
if message_queue:
|
118 |
-
|
119 |
-
|
120 |
-
run(forward_message(message_id))
|
121 |
|
122 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
123 |
start_handler = CommandHandler("start", start)
|
124 |
clear_handler = CommandHandler("clear", clear_queue)
|
125 |
test_handler = CommandHandler("test", toggle_test_mode)
|
126 |
-
send_now_handler = CommandHandler("send", send_now)
|
127 |
-
delete_last_handler = CommandHandler("del", delete_last_message)
|
128 |
message_handler = MessageHandler(
|
129 |
filters=filters.TEXT & ~filters.COMMAND, callback=handle_message
|
130 |
)
|
@@ -132,33 +155,27 @@ message_handler = MessageHandler(
|
|
132 |
application.add_handler(start_handler)
|
133 |
application.add_handler(clear_handler)
|
134 |
application.add_handler(test_handler)
|
135 |
-
application.add_handler(send_now_handler)
|
136 |
-
application.add_handler(delete_last_handler)
|
137 |
application.add_handler(message_handler)
|
138 |
|
139 |
-
|
|
|
140 |
async def error_handler(update, context):
|
141 |
"""Обработчик ошибок."""
|
142 |
print(f'Произошла ошибка: {context.error}')
|
|
|
|
|
143 |
application.add_error_handler(error_handler)
|
144 |
|
145 |
-
# Запускаем планировщик в отдельном потоке
|
146 |
-
schedule.every().day.at("00:00").do(send_messages)
|
147 |
-
schedule.every().day.at("04:00").do(send_messages)
|
148 |
-
schedule.every().day.at("08:00").do(send_messages)
|
149 |
-
schedule.every().day.at("12:00").do(send_messages)
|
150 |
-
schedule.every().day.at("16:00").do(send_messages)
|
151 |
-
schedule.every().day.at("20:00").do(send_messages)
|
152 |
|
153 |
-
|
|
|
|
|
|
|
154 |
|
155 |
-
|
156 |
-
|
157 |
-
schedule.run_pending()
|
158 |
-
time.sleep(1)
|
159 |
|
160 |
-
|
161 |
-
scheduler_thread.start()
|
162 |
|
163 |
-
# Запускаем бота в главном потоке
|
164 |
-
application.run_polling()
|
|
|
1 |
+
import os
|
2 |
+
from collections import deque
|
3 |
+
|
4 |
+
from flask import Flask, request
|
5 |
import telegram
|
6 |
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters
|
7 |
import schedule
|
8 |
import time
|
9 |
+
from threading import Thread
|
|
|
10 |
from asyncio import run
|
11 |
|
12 |
BOT_TOKEN = os.environ['YOUR_BOT_TOKEN']
|
13 |
YOUR_USER_ID = 855890735 # Замените на ваш ID
|
14 |
CHANNEL_ID = os.environ['YOUR_CHANNEL_ID'] # Замените на ID канала
|
15 |
|
|
|
16 |
bot = telegram.Bot(token=BOT_TOKEN)
|
|
|
17 |
application = ApplicationBuilder().token(BOT_TOKEN).build()
|
|
|
18 |
message_queue = deque()
|
19 |
test_mode = False
|
20 |
|
21 |
|
22 |
+
# --- Flask app ---
|
23 |
+
app = Flask(__name__)
|
24 |
+
|
25 |
+
|
26 |
+
@app.route('/', methods=['GET'])
|
27 |
+
def home():
|
28 |
+
return "Это API сервер для Telegram бота."
|
29 |
+
|
30 |
+
|
31 |
+
@app.route('/send_message', methods=['POST'])
|
32 |
+
def send_message():
|
33 |
+
data = request.get_json()
|
34 |
+
message = data.get('message')
|
35 |
+
if message:
|
36 |
+
message_queue.append(message)
|
37 |
+
return {'status': 'ok'}
|
38 |
+
else:
|
39 |
+
return {'status': 'error', 'message': 'Missing message data'}
|
40 |
+
|
41 |
+
|
42 |
+
# --- Telegram bot handlers ---
|
43 |
async def handle_message(update, context):
|
44 |
message = update.message
|
45 |
if message and message.from_user:
|
|
|
47 |
if user_id == YOUR_USER_ID and message.chat.type == 'private':
|
48 |
if not message.text.startswith("/"):
|
49 |
if test_mode:
|
50 |
+
await forward_message(message.text)
|
51 |
+
print(f"Сообщение '{message.text}' отправлено напрямую (тестовый режим).")
|
|
|
|
|
52 |
else:
|
53 |
+
message_queue.append(message.text)
|
54 |
+
print(f"Добавлено сообщение '{message.text}' в очередь.")
|
|
|
|
|
55 |
else:
|
56 |
print(f"Получена команда от владельца: {message.text}")
|
57 |
else:
|
58 |
+
print(f"Получено сообщение от постороннего пользователя (ID: {user_id}): {message.text}")
|
59 |
+
await update.message.reply_text("Извини, но я могу общаться только с моим владельцем.")
|
|
|
|
|
|
|
|
|
60 |
|
61 |
|
62 |
async def start(update, context):
|
|
|
65 |
print("Владелец начал диалог.")
|
66 |
await update.message.reply_text("Привет!")
|
67 |
else:
|
68 |
+
print(f"Посторонний пользователь (ID: {user_id}) попытался начать диалог.")
|
69 |
+
await update.message.reply_text("Извини, но я могу общаться только с моим владельцем.")
|
|
|
|
|
|
|
|
|
70 |
|
71 |
|
72 |
async def clear_queue(update, context):
|
|
|
90 |
global message_queue
|
91 |
if update.effective_user.id == YOUR_USER_ID:
|
92 |
if message_queue:
|
93 |
+
message = message_queue.popleft()
|
94 |
+
await forward_message(message)
|
95 |
+
message_queue.append(message) # Переносим в конец очереди
|
96 |
print("Отправлено первое сообщение из очереди.")
|
97 |
await update.message.reply_text("Отправлено первое сообщение из очереди.")
|
98 |
else:
|
99 |
print("Очередь пуста.")
|
100 |
await update.message.reply_text("Очередь пуста.")
|
101 |
|
102 |
+
|
103 |
async def delete_last_message(update, context):
|
104 |
global message_queue
|
105 |
if update.effective_user.id == YOUR_USER_ID:
|
106 |
if message_queue:
|
107 |
+
deleted_message = message_queue.pop()
|
108 |
+
print(f"Удалено сообщение '{deleted_message}' из очереди.")
|
109 |
await update.message.reply_text("Последнее сообщение удалено из очереди.")
|
110 |
else:
|
111 |
print("Очередь пуста, нечего удалять.")
|
112 |
await update.message.reply_text("Очередь пуста, нечего удалять.")
|
113 |
|
114 |
|
115 |
+
async def forward_message(message):
|
116 |
try:
|
117 |
+
await bot.send_message(chat_id=CHANNEL_ID, text=message)
|
118 |
+
print(f"Сообщение '{message}' успешно отправлено в канал.")
|
|
|
|
|
119 |
except telegram.error.BadRequest as e:
|
120 |
+
print(f"Ошибка при отправке сообщения: {e}")
|
121 |
|
122 |
|
123 |
+
# --- Планировщик ---
|
124 |
+
def send_messages_from_queue():
|
125 |
global message_queue
|
126 |
if message_queue:
|
127 |
+
message = message_queue.popleft()
|
128 |
+
run(forward_message(message))
|
|
|
129 |
|
130 |
|
131 |
+
schedule.every().day.at("00:00").do(send_messages_from_queue)
|
132 |
+
schedule.every().day.at("04:00").do(send_messages_from_queue)
|
133 |
+
schedule.every().day.at("08:00").do(send_messages_from_queue)
|
134 |
+
schedule.every().day.at("12:00").do(send_messages_from_queue)
|
135 |
+
schedule.every().day.at("16:00").do(send_messages_from_queue)
|
136 |
+
schedule.every().day.at("20:00").do(send_messages_from_queue)
|
137 |
+
|
138 |
+
|
139 |
+
def run_scheduler():
|
140 |
+
while True:
|
141 |
+
schedule.run_pending()
|
142 |
+
time.sleep(1)
|
143 |
+
|
144 |
+
|
145 |
+
# --- Регистрация обработчиков Telegram ---
|
146 |
start_handler = CommandHandler("start", start)
|
147 |
clear_handler = CommandHandler("clear", clear_queue)
|
148 |
test_handler = CommandHandler("test", toggle_test_mode)
|
149 |
+
send_now_handler = CommandHandler("send", send_now)
|
150 |
+
delete_last_handler = CommandHandler("del", delete_last_message)
|
151 |
message_handler = MessageHandler(
|
152 |
filters=filters.TEXT & ~filters.COMMAND, callback=handle_message
|
153 |
)
|
|
|
155 |
application.add_handler(start_handler)
|
156 |
application.add_handler(clear_handler)
|
157 |
application.add_handler(test_handler)
|
158 |
+
application.add_handler(send_now_handler)
|
159 |
+
application.add_handler(delete_last_handler)
|
160 |
application.add_handler(message_handler)
|
161 |
|
162 |
+
|
163 |
+
# --- Обработчик ошибок Telegram ---
|
164 |
async def error_handler(update, context):
|
165 |
"""Обработчик ошибок."""
|
166 |
print(f'Произошла ошибка: {context.error}')
|
167 |
+
|
168 |
+
|
169 |
application.add_error_handler(error_handler)
|
170 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
171 |
|
172 |
+
# --- Запуск приложения ---
|
173 |
+
if __name__ == "__main__":
|
174 |
+
scheduler_thread = Thread(target=run_scheduler)
|
175 |
+
scheduler_thread.start()
|
176 |
|
177 |
+
flask_thread = Thread(target=app.run, kwargs={'host': '0.0.0.0', 'port': 5000})
|
178 |
+
flask_thread.start()
|
|
|
|
|
179 |
|
180 |
+
application.run_polling()
|
|
|
181 |
|
|
|
|