Форум сайта python.su
Привет! Использую Python для проект по автоматизации рассылок Телеграм по БД.
Вот сам код
main
import logging
from aiogram import Bot, Dispatcher, executor, types
from db import Database
logging.basicConfig(level=logging.INFO)
bot = Bot(token=“токен”)
dp = Dispatcher(bot)
db = Database('database.db')
@dp.message_handler(commands
async def start(message: types.Message):
if not db.user_exists(message.from_user.id):
db.add_user(message.from_user.id)
await bot.send_message(message.from_user.id, “Добро пожаловать!”)
@dp.message_handler(commands
async def sendall(message: types.Message):
if message.from_user.id == ID администратора:
text = message.text
users = db.get_users()
for row in users:
try:
await bot.send_message(row, text)
if int(row) != 1:
db.set_active(row,1)
except:
db.set_active(row,0)
await bot.send_message(message.from_user.id, “Успешная рассылка”)
@dp.message_handler(commands
async def sendallwp(message: types.Message):
if message.from_user.id == ID администратора:
users = db.get_users()
for row in users:
try:
await bot.send_photo(row, open('photo.jpg','rb'), message.text)
if int(row) != 1:
db.set_active(row,1)
except:
db.set_active(row,0)
await message.answer('Done')
if __name__ == “__main__”:
executor.start_polling(dp, skip_updates = True)
DB
import sqlite3
class Database:
def __init__(self, db_file):
self.connection = sqlite3.connect(db_file)
self.cursor = self.connection.cursor()
def user_exists(self, user_id):
with self.connection:
result = self.cursor.execute(“SELECT * FROM users WHERE user_id = ?”, (user_id,)).fetchmany(1)
return bool(len(result))
def add_user(self, user_id):
with self.connection:
return self.cursor.execute(“INSERT INTO users (user_id) VALUES (?)”, (user_id,))
def set_active(self, user_id, active):
with self.connection:
return self.cursor.execute(“UPDATE users SET active = ? WHERE user_id = ?”, (active, user_id,))
def get_users(self):
with self.connection:
return self.cursor.execute(“SELECT user_id, active FROM users”).fetchall()
Проблема в том, что скрипт позволяет отправлять сообщения только тем людям, которые самостоятельно зашли в бота, при этом, если ты настраиваешь бота на чтение исторических данных БД (заливаешь пропаршенные данные), то он снова отправляет сообщения только тем, кто самостоятельно зашел в бота, а остальным проставляет просто нулевое значение активности аккаунта. Хотя по логике библиотеки аиограм, он должен проставлять 0 только в случае, если пользак заблокировал отправку сообщение от конкретного бота.
В общем, я не сильно надеюсь, что кто-то поможет, но буду неистово благодарен, если кто-то разъяснит, как решить проблему.
Бота я писал самостоятельно по нескольким видео-урокам, где тьюторы заверяют, что все должно работать как часы. Оно и работает, но только по тем юзерам, что самостоятельно зашли в бота.
Офлайн
DB
import sqlite3 class Database: def __init__(self, db_file): self.connection = sqlite3.connect(db_file) self.cursor = self.connection.cursor() def user_exists(self, user_id): with self.connection: result = self.cursor.execute("SELECT * FROM users WHERE user_id = ?", (user_id,)).fetchmany(1) return bool(len(result)) def add_user(self, user_id): with self.connection: return self.cursor.execute("INSERT INTO users (user_id) VALUES (?)", (user_id,)) def set_active(self, user_id, active): with self.connection: return self.cursor.execute("UPDATE users SET active = ? WHERE user_id = ?", (active, user_id,)) def get_users(self): with self.connection: return self.cursor.execute("SELECT user_id, active FROM users").fetchall()
import logging from aiogram import Bot, Dispatcher, executor, types from db import Database logging.basicConfig(level=logging.INFO) bot = Bot(token="токен") dp = Dispatcher(bot) db = Database('database.db') @dp.message_handler(commands=['start']) async def start(message: types.Message): if not db.user_exists(message.from_user.id): db.add_user(message.from_user.id) await bot.send_message(message.from_user.id, "Добро пожаловать!") @dp.message_handler(commands=['sendall']) async def sendall(message: types.Message): if message.from_user.id == ид создателя: text = message.text[9:] users = db.get_users() for row in users: try: await bot.send_message(row[0], text) if int(row[1]) != 1: db.set_active(row[0],1) except: db.set_active(row[0],0) await bot.send_message(message.from_user.id, "Успешная рассылка") @dp.message_handler(commands=['sendallwp']) async def sendallwp(message: types.Message): if message.from_user.id == ид создателя: users = db.get_users() for row in users: try: await bot.send_photo(row[0], open('photo.jpg','rb'), message.text[10:]) if int(row[1]) != 1: db.set_active(row[0],1) except: db.set_active(row[0],0) await message.answer('Done') if __name__ == "__main__": executor.start_polling(dp, skip_updates = True)
Офлайн
chimeraexcept без точного названия исключения использовать нельзя. Так что расставь точные названия исключений для начала. Потом можно в случае исключения отправить сообщение от бота, включив в сообщение информацию из исключения.
В общем, я не сильно надеюсь, что кто-то поможет, но буду неистово благодарен, если кто-то разъяснит, как решить проблему.
chimeraЕсли исключение произойдёт в функции int(), то ты будешь думать, что оно произошло в операторе await. Если исключение произойдёт в функции db.set_active(), то ты будешь думать, что оно произошло в операторе await. Всё потому, что ты использовал except без точного названия исключения.@dp.message_handler(commands=['sendall']) async def sendall(message: types.Message): if message.from_user.id == ид создателя: text = message.text[9:] users = db.get_users() for row in users: try: await bot.send_message(row[0], text) if int(row[1]) != 1: db.set_active(row[0],1) except: db.set_active(row[0],0) await bot.send_message(message.from_user.id, "Успешная рассылка")
chimeraЧто, прямо там были неточные except'ы?
Бота я писал самостоятельно по нескольким видео-урокам, где тьюторы заверяют, что все должно работать как часы.
Офлайн
py.user.nextДа, код повторен за куратором, от себя я добавил лишь отправки с картинкой. Спасибо, сажусь проверять код.
Что, прямо там были неточные except'ы?
Офлайн