Python – технології. Що вимагає ринок 07.2020

Для свого розвитку треба розуміти, які навички потрібні програмісту на Python. тут збираю що почув-побачив. Пишуть що усе те що тут є по факту готовий Senior. Тримайтеся міцніше як будете те все читати 🙂

Читати далі →

Telegram-bot на python. 3 Реалізація роботи з GoogleAPI читаю-пишу

Пишу те, що накодив сам.

Важливо: про те, як налаштувати обліковий запис та отримати json-файл для підключення до документів з правами на редагування – то читачам домашнє завдання 🙂

Для роботи створив модуль gstools куди складаю функції, які використовую для читання-запису в таблицю Google.

наприклад читання усієї сторінки:

def read_from_worksheet(work_book_name, worksheet_name):  
    scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']  
    creds = ServiceAccountCredentials.from_json_keyfile_name('rrrrr-rrr-483eee24587fa.json', scope) 
    client = gspread.authorize(creds) 
    worksheet = client.open(work_book_name).worksheet(worksheet_name) 
    return worksheet

додати нові данні (стрічка-row)

def write_to_workbook(row_name, row_data, work_book_name, worksheet_name): 
    # document-specific operation! Be careful if copy it 
    scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'] 
    creds = ServiceAccountCredentials.from_json_keyfile_name('rrrrr-rrr-483eee24587fa.json', scope) 
    client = gspread.authorize(creds) 
    worksheet1 = client.open(work_book_name).worksheet(worksheet_name) 
    worksheet1.update('A' + str(row_name), [row_data])

Так, є що доробляти. Але воно маленьке та працює, за умови що се прототип – переробляти недоцільно.

Модифікація даних всередині сторінки таблиці. Шукаю в таблиці що треба модифікувати та записую в потрібну комірку необхідні данні (це результат творчості для завдання – тут тільки факт того, що зробив і воно працює):

def find_and_modify_cell_by_other_cell_value(work_book_name, worksheet_name, column_number, cell_value_to_search, 
                                             column_cell_number_to_edit, data_for_enter): 
    scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'] 
    creds = ServiceAccountCredentials.from_json_keyfile_name('rrrrr-rrr-483eee24587fa.json', scope) 
    client = gspread.authorize(creds) 
    worksheet1 = client.open(work_book_name).worksheet(worksheet_name) 
    sheet = worksheet1.get_all_values() 
    for row_number, row in enumerate(sheet): 
        if cell_value_to_search in row[column_number]: 
            worksheet1.update_cell(row_number+1, column_cell_number_to_edit, data_for_enter) 
            return worksheet_name, row[column_number], data_for_enter

Усі інші функції спираються на вищевказані та працюють IMHO коректно, поскладав у той-же файл, хоча треба було рознести по різних. При записі даних я не перевіряю дані бо перевірка проходить перед формуванням запиту на запис в таблицю. Для прототипу – норм.

В процесі роботи досить часто звертаюсь для оновлення даних з таблиць, тому застосунок інколи довго “висить” коли чекає підтвердження запису (перечитую з таблиці данні після кожного запису – це довго)

python. Telegram bot conversation

Телеграм вміє з Вами погутарити, якщо його навчити 🙂

Не одразу зрозумів як воно працює. Зараз, трохи почав розуміти. Як зрозумів – запишу а далі зміню-доповню якщо помилявся. Демонструю на прикладі що буде у самому низу сторінки.
Точка входу у розмову start_handler повертає статус розмови до якого треба перейти далі (return NAME) розмову припиняємо коли викликаємо функцію що повертає такий статус (return ConversationHandler.END)

from telegram.ext import ConversationHandler

NAME, PEOPLE_TYPE, WORKPLACE = range(3)

from ask.validators import WORKER_TYPES_MAP

@debug_requests
def start_handler(update: Update, context: CallbackContext):
.......багато..неважливого...тексту........
return NAME

@debug_requests
def name_handler(update: Update, context: CallbackContext):
   # отримати ім"я
   context.user_data[NAME] = update.message.text
   logger.info('user_data: %s', context.user_data)

   # спитати наступне питання
   inline_buttons = InlineKeyboardMarkup(
       inline_keyboard=[
        [InlineKeyboardButton(text=value, callback_data=key) for key, value in \
WORKER_TYPES_MAP.items()],

         ],
       )
   update.message.reply_text(
      text='введіть посаду співробітника',
      reply_markup=inline_buttons,
      )
return PEOPLE_TYPE

@debug_tg
def cancel_handler(update: Update, context: CallbackContext):
   """ Cancel dialog. Cancel data
   """
   update.message.reply_text('Cancel. For start over run command /start')
   return ConversationHandler.END

def main():
     logger.info('Started ask-bot')

    req = Request(
        connect_timeout=0.3,
        read_timeout=1.0,
        )
    bot = Bot(
        token=config.TG_TOKEN,
        request=req,
        base_url=config.TG_API_URL,
        )
    updater = Updater(
        bot=bot,
        use_context=True,
        )

    # перевірка підключення до Telegram API
    info = bot.get_me()
    logger.info(f'Bot info: {info}')
    # обробляємо команди розмови
    conv_handler = ConversationHandler(
        entry_points=[
            CallbackQueryHandler(start_handler, pass_user_data=True),
            ],
            states={
                NAME: [
                    MessageHandler(Filters.all, name_handler, pass_user_data=True),
                    ],
                PEOPLE_TYPE: [
                    CallbackQueryHandler(type_handler, pass_user_data=True),
                    ],
                WORKPLACE: [
                    MessageHandler(Filters.all, finish_handler, pass_user_data=True),
                    ],
                    },
                fallbacks=[
                    CommandHandler('cancel', cancel_handler),
                    ],
}
        )
updater.dispatcher.add_handler(conv_handler)
updater.dispatcher.add_handler(CommandHandler('start',start_buttons_handler))

updater.dispatcher.add_handler(MessageHandler(Filters.all, echo_handler))
# Запускаю бота в роботу
updater.start_polling()
updater.idle()
logger.info('Stopped ask-bot')

 

література

1 https://bitbucket.org/vkasatkin/tele_bot/src/master/anketa

Декоратори для роботи в python

В тексті програм для Telegram ботів зустрічаю щось таке (трохи змінив для наочності):

ADMINS = [123456, 234567]


def restrict(f):

    def inner(*args, **kwargs):
        update = args[0]
        if update and hasattr(update, 'message'):
            chat_id = update.message.chat_id
            if chat_id in ADMINS:
                print('Доступ адмінам дозволено!')
                return f(*args, **kwargs)
            else:
                print('Доступ заборонено!')
        else:
            print('Немає аргументу update')

    return inner

@restrict
def start(self, update, context):
    print('тут код функції, буде виконано якщо chat_id = update.message.chat_id')

… тут дещо пропустив ….
command_start  = CommandHandler('start', start)
updater.dispatcher.add_handler(command_start )

такий запис відповідає такому коду показаному нижче:

do_function = restrict(start)
…. тут багато пропущено ….

command_start  = CommandHandler('start', do_function)
updater.dispatcher.add_handler(command_start )

Зобов’язаний зауважити, відповідність коду визначається по результату виконання для клієнта, не гарантується, що код для виконання (бінарний код) такий самий

Telegram-bot на python. 2 Старт проекту

Для розробки використовую PyCharm на Windows x64 + python3.8
Як сервер для бота на старті проекту використовую старий ноут з FreeBSD 12.1 (minimal FreeBSD 12.1-RELEASE r354233 GENERIC i386)

Налаштування добре пояснюються на кожному першому сайті про python та  FreeBSD. Тому одразу до справи.
Створив бота в Telegram у @BotFather – добре документовано тому скажу що нам звідти треба тільки API.

Є декілька можливих модулів для створення ботів, я стартую з python-telegram-bot –  просто “знайшовся” першим. є інші, вони може кращі але  рішення прийнято. до релізу змінювати нічого не буду.

Як підключатися до гуглу взяв з допомоги гугла для python (звідти витягнув імена модулів для роботи з API googleDisk)

Налаштування оточення розробки та програм – 2-3 години робочого часу. Вивчення що треба робити брав з ютуб та текстів з пошуку.

Telegram-bot на python. 1 Технічне завдання на розробку

Потрібно зробити бота в Telegram. Боту потрібно  вміти:
у процессі розробки функції бота можуть змінюватися
джерело данних – документ гугл (на старті – без локальної бази данних)
розробка технологіями не обмежується

Термінологія, як я її розумію:
товар – талон на паливо
водій – клієнт, якому видаємо
Проект – водій в проекті приймає участь, та його обслуговує.

Етап 0 :
як розробник визначив те, що від розробника залежить
– Технології:  python + python-telegram-bot + google-api-python-client
– в майбутньому: буде частиною більш великої системи, передбачити можливість підключити бази данних,
– ООП. Можливість розділення на мікросервіси в майбутньому.
– підключаємо бота до google Disk GoogleSheet по API.
– обмежити доступ до бота фіксованим переліком Telegram user ID

Етап 1:
– читати данні з googleSheet таблиці (з декількох сторінок документу)
– виводити перелік з фільтрацією за статусом товару (талони на паливо, вільні/видано/використано)
– вивести перелік клієнтів (водії, яким видають ті талони)
Етап 2:
– додати клієнта (водія, в існуючий проект)
– зробити динамічне меню (з використанням InlineKeyboard) для водіїв, проектів
– видати водію талон на паливо (змінити властивості товару, з вільного на видано)
Етап 3:
– Закрити товар
– Повернути товар на склад

 

Django – основні кроки. Старт проекту

Для програмування в python користуюся середовищем розробки PyCharm (безкоштовна версія). Версія Про вміє працювати з Django, безкоштовна версія теж, але не автоматизовано. Різницю треба відчути, для тих хто ніколи про-версією не користувався безкоштовна версія PyCharm буде зручною (про себе сказав – мені зручно).

При запуску нового проекту створюємо віртуальне середовище проекту (звичайна назва venv, налаштовується в параметрах проекту при створенні).

налаштовую Django  в терміналі оболонки

python -m pip install Django
python -m django --version

Створення нового проекту:
django-admin startproject ProjectSite
python manage.py runserver
В терміналі вказано адресу серверу, переходжу за посиланням та перевіряю що все встановлено та запустилося. 
Зупиняю сервер, створюю застосунок для роботи (наприклад з контактами людей)
python manage.py startapp peoples
Створюю моделі для створення бази даних програми. Цей етап розписано на сайті проекту Django, тому тут не буду пояснювати.
python manage.py migrate
python manage.py makemigrations peoples

якщо треба щось перевірити - запускаємо оболонку python у venv проекту. В мене поки що такої потреби немає, але про наявність такої можливості я зобов"язаний сказати.
python manage.py shell

Інформацію про основні команди можемо дізнатися так

(venv) D:\test\ProjectSite>python manage.py help

Type 'manage.py help <subcommand>' for help on a specific subcommand.

Available subcommands:

[auth]
changepassword
createsuperuser

[contenttypes]
remove_stale_contenttypes

[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver

[sessions]
clearsessions

[staticfiles]
collectstatic
findstatic
runserver

FreeBSD та python

Треба розгорнути сервер для проекту на Python 3. Сервером обрав собі FreeBSD (версія як правило остання, production реліз, актуальна, на момент написання )

Встановлюю мінімальну конфігурацію, тільки системні застосунки, нічого зайвого.

Швиденько оновлюємо, далі перевіряємо
python -V
пише щось не те що я хочу 🙂 каже нема тут такого

Встановив tmux mc git – підтягнуло python 3.7&2/7

Встановлюю те, що мені треба:

make install -C  /usr/ports/lang/python38

налаштовую базові речі:
rm /usr/local/bin/python
ln -s /usr/local/bin/python3.8 /usr/local/bin/python

pip також відсутній,
python -m ensurepip
ln -s /usr/local/bin/pip3.8 /usr/local/bin/pip

Наразі можемо щось на python вже писати а за допомогою pip встановлювати додаткові застосунки до нього.

Далі буде… Джанго

FreeBSD тримаємо систему сучасною

Свою систему треба тримати готовою до викликів сучасності (тримаю актуальну RELEASE-гілку) . Оновлення безпеки та інші оновлення мають бути встановлені.

Тут основне що роблю для оновлення системи (на мінімалках)

freebsd-update fetch
freebsd-update install
portsnap fetch extract update
pkg update
pkg upgrade

 

Apple MacOS ComandLine tools

У Apple Mac OS витоки якої йдуть від FreeBSD є можливість через командний рядок дослідити систему, чи провести тонкі налаштування. У цій статті буду складати корисні термінальні команди, якими сам користуюся. Шукати по інтернету те, що одного разу вже знайшов – таке собі задоволення ©.

перевірити пам”ять, які модулі (RAM) , в яких слотах
system_profiler SPMemoryDataType