a-stepkin

Бот в телеграм: лог сообщений в БД

 photo 2016-09-20  16.21.21.png
Сегодня сделал лог сообщений в БД.
Код выглядит так:
def log(message, answer):
    print('\n -----') # пустая строка и разделитель сообщений
    from datetime import datetime
    print(datetime.now())
    print('Сообщение от', message.from_user.first_name, message.from_user.last_name, 'id', str(message.from_user.id))
    print(message.text)
    print(answer)

    import sqlite3

    db = sqlite3.connect("telegram.db")
    c = db.cursor()

    def create_table():        
        c.execute(
            "CREATE TABLE IF NOT EXISTS usersdata(date REAL, id REAL, first_name TEXT, last_name TEXT, user_message TEXT, bot_answer TEXT)")

    create_table()

    date = datetime.now()
    id = str(message.from_user.id)
    first_name = message.from_user.first_name
    last_name = message.from_user.last_name
    user_message = message.text
    bot_answer = answer
    c.execute("INSERT INTO usersdata VALUES (?, ?, ?, ?, ?, ?)",
              [date, id, first_name, last_name, user_message, bot_answer])
    db.commit()
    c.close()
    db.close()
a-stepkin

Бот в телеграм: записал значение из переписки с ботом в БД

 photo 2016-09-19  16.43.00.png
Сегодня мне удалось записать в БД значение из переписки с ботом в чате, а именно — внести в БД имя пользователя.
Код выглядит так:
@bot.message_handler(commands=['help'])
def handle_text(message):
    answer = 'Жаль, еще не работает, вы можете посмотреть котировки тут — https://news.yandex.ru/quotes/213/index.html'
    log(message, answer)
    bot.send_message(message.chat.id, answer)

    import sqlite3

    db = sqlite3.connect("telegram.db")
    c = db.cursor()

    def create_table():
        c.execute("CREATE TABLE IF NOT EXISTS usersdata(first_name TEXT)")
    create_table()
    first_name = message.from_user.first_name
    c.execute("INSERT INTO usersdata VALUES (?)", [first_name])
    db.commit()
    c.close()
    db.close()
a-stepkin

Бот в телеграм: как записать значение переменной в БД SQLite

 photo 2016-09-17  14.39.28.png
Ок, а как записать значение переменной в таблицу БД?
Так.
import sqlite3


db = sqlite3.connect("telegram.db")
c = db.cursor()

def create_table():
    c.execute("CREATE TABLE IF NOT EXISTS usersdata(key TEXT, value1 REAL, value2 REAL)")

key = float(XML.dollar_quoete())
value1 = 64
value2 = 65
def data_entry():
    
    c.execute("INSERT INTO usersdata VALUES (?, ?, ?)", (key, value1, value2 ))
    db.commit()
    c.close()
    db.close()
Т.е. мы записываем в БД текущий курс USD ЦБ.
a-stepkin

Бот в телеграм: создание БД из Питона и запись первых значений

 photo 2016-09-16  21.55.02.png
Есть другой способ создания БД прямо из Питона.
import sqlite3

db = sqlite3.connect("telegram.db")
c = db.cursor()

def create_table():
    c.execute("CREATE TABLE IF NOT EXISTS usersdata(value1 REAL, value2 REAL)")


def data_entry():
    c.execute("INSERT INTO usersdata VALUES(64, 65)")
    db.commit()
    c.close()
    db.close()
create_table()
data_entry()
Тут мы создаем БД и таблицу. И записываем первые значения в таблицу. Для того, чтобы просмотреть БД можно скачать прогу браузера БД, я качал отсюда. Так мы записали первые значения в БД из Питона.
a-stepkin

Бот в телеграм: создание тестовой базы данных

 photo sqlite-database.png
Для того, чтобы иметь возможность уведомлять каждого пользователя о достижении установленных им значений курса доллара, необходимо где-то эти значения хранить.
Вероятно, потребуется база данных. Я выбрал SQLite.
Создадим тестовую базу данных в Мак.
Для этого в терминале, в папке будущей БД, пишем команды:
1. sqlite3 test.db
2. create table first (a int, b strinb);
3. .schema
4. insert into first (a, b) values (1, 'hello');
5. .quit

Видео-туториал, как это делать.
a-stepkin

Бот в телеграм: автоматическая проверка достижения курсом заданных значений

Возвращаемся к коду логики, сигнализирующей достижение курсом определенных значений.
Вместо записанного вручную значения курса теперь используем данные курса, полученные с сайта.
Код выглядит так:
import XML
import threading

quoeteup = 65
quoetedown = 64
# обращение к функции парсинга курса из другого файла
quoete = float(XML.dollar_quoete())

def update():
  global timer
  timer = threading.Timer(5.0, update)
  timer.start()

  if quoete > quoeteup:
    print("Курс USD достиг верхний лимит заданного значения, сейчас составляет")
    timer.cancel()

  if quoete < quoetedown:
    print("Курс USD достиг нижний лимит заданного значения, сейчас составляет")
    timer.cancel()

  print(quoete)

update()

Важно обратить внимание на оператор "float", который переводит значение курса для питона в число. (Без него выполнение кода выдает ошибку.)

Результат выполнения кода
Курс USD достиг верхний лимит заданного значения, сейчас составляет
65.0539
a-stepkin

Бот в телеграм: меняем в значении курса запятую на точку

Меняем запятую из полученных значений курса с сайта на точку.
Раньше часть функции парсинга значений у нас выглядела следующим образом:
for x in quoetes_list:
    id_v = x.get("ID")
    if id_v == id_dollar:
        dollar = (x.find("Value").text)

Теперь, изменим запятую на точку:
for x in quoetes_list:
    id_v = x.get("ID")
    if id_v == id_dollar:
        dollarp = (x.find("Value").text)
        # изменение запятой на точку в полученном с сайта значении dollarp
        dollar = str(dollarp).replace(',', '.')

Если не ошибаюсь, есть другой, более корректный метод сделать это, но на данный момент я выбрал более грубый и более простой.
(Что-то связанное с локалью (locale), а я еще не знаю, что это.)
a-stepkin

"Мы — молодцы" или сравнение с другими людьми

 photo 2016-09-11  18.01.00.png

Когда мой ум начинает сравнивать меня с кем-то, я стал использовать мысль: "мы — молодцы".
Например, во время пробежки, встречается кто-то менее подготовленный и следом мысль, типо, я круче. Важно ли это? Человек молодец и я тоже.
Или обгоняет кто-то тебя, и вместо я — "лох" и минорных настроений, "мы — молодцы".
Ну и мы, это как-бы я, "все — молодцы".
Используйте :).
a-stepkin

Бот в телеграм: сигнализировать достижение определенных значений курса

Сейчас бот только обновляет периодически курс доллара.
Попросим его по достижению курсом определенных значений, сигнализировать это событие сообщением.
import threading

quoeteup = 64
quoetedown = 60


def update():
  global timer
  timer = threading.Timer(5.0, update)
  timer.start()
  quoete = 64.1617
  if quoete > quoeteup:
    print("Курс USD достиг верхний лимит заданного значения, сейчас составляет")
    timer.cancel()

  if quoete < quoetedown:
    print("Курс USD достиг нижний лимит заданного значения, сейчас составляет")
    timer.cancel()

  print(quoete)

update()

Результат выполнения кода
Курс USD достиг верхний лимит заданного значения, сейчас составляет 64.1617

В данном коде курс доллара мы вводим самостоятельно вместо получения его значений с сайта т.к. котировки с сайта в качестве разделителя используют запятую — выполнение программы в этом случае выдает ошибку.
Для применения значений с сайта, необходимо используемую в качестве разделителя запятую заменить на точку.