Update main.py
Browse files
main.py
CHANGED
@@ -1,45 +1,24 @@
|
|
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 |
-
|
|
|
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,16 +26,24 @@ async def handle_message(update, context):
|
|
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.
|
51 |
-
print(
|
|
|
|
|
52 |
else:
|
53 |
-
message_queue.append(message.
|
54 |
-
print(
|
|
|
|
|
55 |
else:
|
56 |
print(f"Получена команда от владельца: {message.text}")
|
57 |
else:
|
58 |
-
print(
|
59 |
-
|
|
|
|
|
|
|
|
|
60 |
|
61 |
|
62 |
async def start(update, context):
|
@@ -65,8 +52,12 @@ async def start(update, context):
|
|
65 |
print("Владелец начал диалог.")
|
66 |
await update.message.reply_text("Привет!")
|
67 |
else:
|
68 |
-
print(
|
69 |
-
|
|
|
|
|
|
|
|
|
70 |
|
71 |
|
72 |
async def clear_queue(update, context):
|
@@ -90,64 +81,50 @@ async def send_now(update, context):
|
|
90 |
global message_queue
|
91 |
if update.effective_user.id == YOUR_USER_ID:
|
92 |
if message_queue:
|
93 |
-
|
94 |
-
await forward_message(
|
95 |
-
message_queue.append(
|
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 |
-
|
108 |
-
print(f"Удалено сообщение
|
109 |
await update.message.reply_text("Последнее сообщение удалено из очереди.")
|
110 |
else:
|
111 |
print("Очередь пуста, нечего удалять.")
|
112 |
await update.message.reply_text("Очередь пуста, нечего удалять.")
|
113 |
|
114 |
|
115 |
-
async def forward_message(
|
116 |
try:
|
117 |
-
await bot.
|
118 |
-
|
|
|
|
|
119 |
except telegram.error.BadRequest as e:
|
120 |
-
print(f"Ошибка при
|
121 |
|
122 |
|
123 |
-
|
124 |
-
def send_messages_from_queue():
|
125 |
global message_queue
|
126 |
if message_queue:
|
127 |
-
|
128 |
-
|
|
|
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,27 +132,33 @@ message_handler = MessageHandler(
|
|
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 |
-
|
178 |
-
|
|
|
|
|
179 |
|
180 |
-
|
|
|
181 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import telegram
|
2 |
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters
|
3 |
import schedule
|
4 |
import time
|
5 |
+
import os
|
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 |
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.message_id)
|
30 |
+
print(
|
31 |
+
f"Сообщение с ID {message.message_id} отправлено напрямую (тестовый режим)."
|
32 |
+
)
|
33 |
else:
|
34 |
+
message_queue.append(message.message_id)
|
35 |
+
print(
|
36 |
+
f"Добавлено сообщение с ID {message.message_id} в очередь."
|
37 |
+
)
|
38 |
else:
|
39 |
print(f"Получена команда от владельца: {message.text}")
|
40 |
else:
|
41 |
+
print(
|
42 |
+
f"Получено сообщение от постороннего пользователя (ID: {user_id}): {message.text}"
|
43 |
+
)
|
44 |
+
await update.message.reply_text(
|
45 |
+
"Извини, но я могу общаться только с моим владельцем."
|
46 |
+
)
|
47 |
|
48 |
|
49 |
async def start(update, context):
|
|
|
52 |
print("Владелец начал диалог.")
|
53 |
await update.message.reply_text("Привет!")
|
54 |
else:
|
55 |
+
print(
|
56 |
+
f"Посторонний пользователь (ID: {user_id}) попытался начать диалог."
|
57 |
+
)
|
58 |
+
await update.message.reply_text(
|
59 |
+
"Извини, но я могу общаться только с моим владельцем."
|
60 |
+
)
|
61 |
|
62 |
|
63 |
async def clear_queue(update, context):
|
|
|
81 |
global message_queue
|
82 |
if update.effective_user.id == YOUR_USER_ID:
|
83 |
if message_queue:
|
84 |
+
message_id = message_queue.popleft()
|
85 |
+
await forward_message(message_id)
|
86 |
+
message_queue.append(message_id) # Переносим в конец очереди
|
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 |
+
deleted_message_id = message_queue.pop()
|
98 |
+
print(f"Удалено сообщение с ID {deleted_message_id} из очереди.")
|
99 |
await update.message.reply_text("Последнее сообщение удалено из очереди.")
|
100 |
else:
|
101 |
print("Очередь пуста, нечего удалять.")
|
102 |
await update.message.reply_text("Очередь пуста, нечего удалять.")
|
103 |
|
104 |
|
105 |
+
async def forward_message(message_id):
|
106 |
try:
|
107 |
+
await bot.copy_message(
|
108 |
+
chat_id=CHANNEL_ID, from_chat_id=YOUR_USER_ID, message_id=message_id
|
109 |
+
)
|
110 |
+
print(f"Сообщение с ID {message_id} успешно отправлено в канал.")
|
111 |
except telegram.error.BadRequest as e:
|
112 |
+
print(f"Ошибка при копировании сообщения: {e}")
|
113 |
|
114 |
|
115 |
+
def send_messages():
|
|
|
116 |
global message_queue
|
117 |
if message_queue:
|
118 |
+
message_id = message_queue.popleft()
|
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 |
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 |
+
from threading import Thread
|
|
|
|
|
|
|
154 |
|
155 |
+
def run_scheduler():
|
156 |
+
while True:
|
157 |
+
schedule.run_pending()
|
158 |
+
time.sleep(1)
|
159 |
|
160 |
+
scheduler_thread = Thread(target=run_scheduler)
|
161 |
+
scheduler_thread.start()
|
162 |
|
163 |
+
# Запускаем бота в главном потоке
|
164 |
+
application.run_polling()
|