Top.Mail.Ru
Ответы
Аватар пользователя
6 месяцев назад
от

Телеграмм бот на Python, код выдает ошибку

import telebot
from telebot import types
import sqlite3
from datetime import datetime
import os
from dotenv import load_dotenv

# Загрузка токена из переменных окружения для безопасности
load_dotenv()
TOKEN = os.getenv('7619271249:AAGgwfIF8QP4a-HBLltmwTWMKoMGzwFys-I') # Измените на правильное имя переменной окружения
print("Загруженные переменные окружения:", os.environ)
print("Полученный токен:", TOKEN)

# Проверка, был ли токен загружен
if TOKEN is None:
raise ValueError("Токен бота не найден. Проверьте файл .env.")
bot = telebot.TeleBot(TOKEN)


# Инициализация базы данных
def init_db():
conn = sqlite3.connect('service_bot.db')
c = conn.cursor()

# Таблица пользователей
c.execute('''CREATE TABLE IF NOT EXISTS users
(user_id INTEGER PRIMARY KEY,
role TEXT,
username TEXT,
contact_info TEXT)''')

# Таблица заявок
c.execute('''CREATE TABLE IF NOT EXISTS requests
(request_id INTEGER PRIMARY KEY AUTOINCREMENT,
client_id INTEGER,
status TEXT,
description TEXT,
created_at TIMESTAMP)''')

# Таблица ставок
c.execute('''CREATE TABLE IF NOT EXISTS bids
(bid_id INTEGER PRIMARY KEY AUTOINCREMENT,
request_id INTEGER,
executor_id INTEGER,
price REAL,
comment TEXT,
created_at TIMESTAMP)''')

# Таблица чатов
c.execute('''CREATE TABLE IF NOT EXISTS chats
(chat_id INTEGER PRIMARY KEY AUTOINCREMENT,
request_id INTEGER,
client_id INTEGER,
executor_id INTEGER,
status TEXT)''')

conn.commit()
conn.close()

init_db() # Вызов функции инициализации базы данных

# Обработка команды /start
@bot.message_handler(commands=['start'])
def start_message(message):
bot.reply_to(message, "Привет! Я ваш сервисный бот. Используйте команды /register для регистрации и /newrequest для создания заявки.")

# Регистрация пользователей
@bot.message_handler(commands=['register'])
def register_user(message):
markup = types.ReplyKeyboardMarkup(row_width=2)
client_button = types.KeyboardButton('Клиент')
executor_button = types.KeyboardButton('Исполнитель')
markup.add(client_button, executor_button)

msg = bot.reply_to(message, "Кем вы хотите зарегистрироваться?", reply_markup=markup)
bot.register_next_step_handler(msg, process_role_step)

def process_role_step(message):
user_id = message.from_ user.id
role = message.text.lower()

conn = sqlite3.connect('service_bot.db')
c = conn.cursor()
c.execute("INSERT OR REPLACE INTO users (user_id, role, username) VALUES (?, ?, ?)",
(user_id, role, message.from_user.username))
conn.commit()
conn.close()

bot.reply_to(message, f"Вы зарегистрированы как {role}")

и т.д. ошибка где-то в начале

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Мастер
6мес

Ты же явно не для благотворительных целей делаешь его, а для коммерческих. Так почему ты хочешь чтобы за тебя работали за бесплатно?

Аватар пользователя
Профи
6мес

Печалька

Аватар пользователя
6мес

Откуда знать, что у тебя за ошибка?
С помощью GPT- чата написал видимо?

Аватар пользователя
Знаток
6мес

Давайте разберёмся с вашим кодом. Я вижу, что вы используете библиотеку `telebot` и пытаетесь загрузить токен бота из файла окружения с помощью `dotenv`. Давайте посмотрим на несколько возможных проблем и их решений:

1. **Ошибка в имени переменной окружения**:
- В строке `TOKEN = os.getenv('7619271249:AAGgwfIF8QP4a-HBLltmwTWMKoMGzwFys-I')` вы передаёте токен напрямую в `os.getenv()`, что неправильно. Вместо этого, вы должны указать имя переменной окружения, как, например, `'TELEGRAM_BOT_TOKEN'`.
- Убедитесь, что в вашем файле `.env` переменная окружения определена так: `TELEGRAM_BOT_TOKEN=7619271249:AAGgwfIF8QP4a-HBLltmwTWMKoMGzwFys-I`.

2. **Загрузка переменных окружения**:
- Убедитесь, что файл `.env` находится в той же директории, откуда вы запускаете свой скрипт.
- Проверьте, что `load_dotenv()` корректно загружает переменные. Можно добавить проверку, чтобы убедиться, что файл загружается правильно.

3. **Ошибка в обработчике сообщений**:
- Я заметил ошибку в функции `process_role_step`. В строке `user_id = message.from_ user.id` есть пробел между `from_` и `user`. Это должно быть `message.from_user.id`.

Аватар пользователя
Просветленный
6мес

Это попробуй

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
 import telebot  
from telebot import types  
import sqlite3  
from datetime import datetime  
import os  
from dotenv import load_dotenv  
 
# Загрузка токена из переменных окружения для безопасности  
load_dotenv()  
TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')  # Убедитесь, что у вас правильное имя переменной окружения  
 
# Проверка, был ли токен загружен  
if TOKEN is None:  
    raise ValueError("Токен бота не найден. Проверьте файл .env.")  
 
bot = telebot.TeleBot(TOKEN)  
 
# Инициализация базы данных  
def init_db():  
    conn = sqlite3.connect('service_bot.db')  
    c = conn.cursor()  
 
    # Таблица пользователей  
    c.execute('''CREATE TABLE IF NOT EXISTS users  
                 (user_id INTEGER PRIMARY KEY,  
                  role TEXT,  
                  username TEXT,  
                  contact_info TEXT)''')  
 
    # Таблица заявок  
    c.execute('''CREATE TABLE IF NOT EXISTS requests  
                 (request_id INTEGER PRIMARY KEY AUTOINCREMENT,  
                  client_id INTEGER,  
                  status TEXT,  
                  description TEXT,  
                  created_at TIMESTAMP)''')  
 
    # Таблица ставок  
    c.execute('''CREATE TABLE IF NOT EXISTS bids  
                 (bid_id INTEGER PRIMARY KEY AUTOINCREMENT,  
                  request_id INTEGER,  
                  executor_id INTEGER,  
                  price REAL,  
                  comment TEXT,  
                  created_at TIMESTAMP)''')  
 
    # Таблица чатов  
    c.execute('''CREATE TABLE IF NOT EXISTS chats  
                 (chat_id INTEGER PRIMARY KEY AUTOINCREMENT,  
                  request_id INTEGER,  
                  client_id INTEGER,  
                  executor_id INTEGER,  
                  status TEXT)''')  
 
    conn.commit()  
    conn.close()  
 
init_db()  # Вызов функции инициализации базы данных  
 
# Обработка команды /start  
@bot.message_handler(commands=['start'])  
def start_message(message):  
    bot.reply_to(message, "Привет! Я ваш сервисный бот. Используйте команды /register для регистрации и /newrequest для создания заявки.")  
 
# Регистрация пользователей  
@bot.message_handler(commands=['register'])  
def register_user(message):  
    markup = types.ReplyKeyboardMarkup(row_width=2)  
    client_button = types.KeyboardButton('Клиент')  
    executor_button = types.KeyboardButton('Исполнитель')  
    markup.add(client_button, executor_button)  
 
    msg = bot.reply_to(message, "Кем вы хотите зарегистрироваться?", reply_markup=markup)  
    bot.register_next_step_handler(msg, process_role_step)  
 
def process_role_step(message):  
    user_id = message.from_user.id   
    role = message.text.lower()  
 
    try: 
        conn = sqlite3.connect('service_bot.db')  
        c = conn.cursor()  
         
        c.execute("INSERT OR REPLACE INTO users (user_id, role, username) VALUES (?, ?, ?)", (user_id, role, message.from_user.username))  
         
        conn.commit()  
         
        bot.reply_to(message, f"Вы зарегистрированы как {role}")  
     
    except sqlite3.Error as e: 
        print(f"Ошибка при работе с БД: {e}") 
     
    finally: 
        conn.close() 
 
# Запуск бота 
bot.polling(none_stop=True)