Skip to content
Alexandr edited this page Mar 15, 2018 · 13 revisions

Вітаємо Вас на retailhackathon !!

Для початку створюємо проект, встановлюємо python 3.6.2 і наступні бібліотеки:

Команда для встановлення pip3.6 install <package_name>. Також, для зручного написання коду на Python, можете використовувати jupyter (встановлюється так само як попередні пакети).

Посилання на бібліотеку для роботи з Telegram API - pyTelegramBotAPI.

Створюємо нового бота за допомогою BotFather.

Пробуємо запустити:

import telebot

bot = telebot.TeleBot("TOKEN")

@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
	bot.reply_to(message, "Howdy, how are you doing?")

@bot.message_handler(func=lambda message: True)
def echo_all(message):
	bot.reply_to(message, message.text)

bot.polling()

Після доробки код буде виглядати наступним чином:

import telebot
from telebot import types
from collections import namedtuple
from settings import TOKEN
from dwapi.datawiz import DW
import datetime

bot = telebot.TeleBot(TOKEN)
dw = DW()
info = dw.get_client_info()
client = namedtuple("Client", info.keys())
client = client(**info)


def convert_human_format(df, columns):
    format_string = '{}:  {} \n'
    results = format_string.format(*columns)
    for obj in df.to_dict('split')['data']:
        results += format_string.format(*obj)
    return results


@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
    markup = types.ReplyKeyboardMarkup()
    markup.add(types.KeyboardButton('ТОП 10 товарів'))
    markup.add(types.KeyboardButton('Оборот по магазинам'))
    bot.send_message(message.chat.id, "Виберіть звіт!", reply_markup=markup)


@bot.message_handler(func=lambda message: 'ТОП 10 товарів' == message.text)
def top_products(message):
    date_to = client.date_to.date()
    date_from = client.date_to.date() - datetime.timedelta(days=30)
    df = dw.get_products_sale(date_from=date_from, date_to=date_to, view_type='raw')
    df = df.groupby('name').agg({'turnover': 'sum'}).sort_values('turnover', ascending=False).head(10).reset_index()
    df['turnover'] = df['turnover'].round(2)
    bot.send_message(message.chat.id, convert_human_format(df, columns=['Назва товара', 'Оборот']))


@bot.message_handler(func=lambda message: 'Оборот по магазинам' == message.text)
def turnover_by_shops(message):
    df = dw.get_categories_sale(view_type='row', per_shop=True)
    df = df.groupby('shop_name').agg({'turnover': 'sum'}).sort_values('turnover', ascending=False).head(10).reset_index()
    df['turnover'] = df['turnover'].round(2)
    result = convert_human_format(df, ['Назва магазина', 'Оборот'])
    bot.send_message(message.chat.id, result)


bot.polling()

Публікуємо бота на Heroku.

Встановлюємо Heroku СLI.

Додаємо файл runtime.txt, який буде вказувати, яку версію python ми використовуємо:

python-3.6.2

Додаємо файл requirements.txt, в якому зберігається список потрібних бібліотек:

pyTelegramBotAPI
git+https://github.com/datawizio/pythonAPI.git

Додаємо файл Procfile, в якому вказуємо команду для запуску:

worker: python bot.py

Додаємо файл .gitignore для чистоти:

*.ipynb
.idea/
.ipynb_checkpoints/
__pycache__/

Виконуємо пару команд для опублікування проекту на Heroku.

# логінемся в heroku
heroku login

# створюємо проект
heroku create <name project> 

# ініціалізуєм папку
git init

# підключаєм до репозиторію
heroku git:remote -a <name project>

# добавляємо файли до проекту
git add .

# комітимо
git commit -am "make it better"

# пушимо на heroku
git push heroku master

#стартуємо воркер
heroku ps:scale worker=1

Дякую за увагу!!!

Clone this wiki locally