Уведомления

Группа в Telegram: @pythonsu

#1 Март 10, 2023 00:28:08

chimera
Зарегистрирован: 2023-03-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с ботом для сообщений по БД

Привет! Использую 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 только в случае, если пользак заблокировал отправку сообщение от конкретного бота.

В общем, я не сильно надеюсь, что кто-то поможет, но буду неистово благодарен, если кто-то разъяснит, как решить проблему.
Бота я писал самостоятельно по нескольким видео-урокам, где тьюторы заверяют, что все должно работать как часы. Оно и работает, но только по тем юзерам, что самостоятельно зашли в бота.

Офлайн

#2 Март 10, 2023 00:31:42

chimera
Зарегистрирован: 2023-03-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с ботом для сообщений по БД

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)

Офлайн

#3 Март 10, 2023 17:22:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Помогите с ботом для сообщений по БД

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'ы?



Офлайн

#4 Март 10, 2023 19:15:44

chimera
Зарегистрирован: 2023-03-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с ботом для сообщений по БД

py.user.next
Что, прямо там были неточные except'ы?
Да, код повторен за куратором, от себя я добавил лишь отправки с картинкой. Спасибо, сажусь проверять код.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version