Найти - Пользователи
Полная версия: Помогите с ботом для сообщений по БД
Начало » Python для экспертов » Помогите с ботом для сообщений по БД
1
chimera
Привет! Использую 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 только в случае, если пользак заблокировал отправку сообщение от конкретного бота.

В общем, я не сильно надеюсь, что кто-то поможет, но буду неистово благодарен, если кто-то разъяснит, как решить проблему.
Бота я писал самостоятельно по нескольким видео-урокам, где тьюторы заверяют, что все должно работать как часы. Оно и работает, но только по тем юзерам, что самостоятельно зашли в бота.
chimera
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()

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=['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)

py.user.next
chimera
В общем, я не сильно надеюсь, что кто-то поможет, но буду неистово благодарен, если кто-то разъяснит, как решить проблему.
except без точного названия исключения использовать нельзя. Так что расставь точные названия исключений для начала. Потом можно в случае исключения отправить сообщение от бота, включив в сообщение информацию из исключения.

Например, вот здесь
chimera
  
@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, "Успешная рассылка")
Если исключение произойдёт в функции int(), то ты будешь думать, что оно произошло в операторе await. Если исключение произойдёт в функции db.set_active(), то ты будешь думать, что оно произошло в операторе await. Всё потому, что ты использовал except без точного названия исключения.

chimera
Бота я писал самостоятельно по нескольким видео-урокам, где тьюторы заверяют, что все должно работать как часы.
Что, прямо там были неточные except'ы?
chimera
py.user.next
Что, прямо там были неточные except'ы?
Да, код повторен за куратором, от себя я добавил лишь отправки с картинкой. Спасибо, сажусь проверять код.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB