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

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

 

Відновлення після форматування в Ubuntu

Відформатував диск. Але, виявилося, завчасно. Маємо видаленний NTFS розділ диску та Ubuntu як робочу систему.

Зовсім несподівано виявилося що система має свій “класичний” застосунок (сюрприз) TestDisk. Відео про роботу застосунку.

Все добре видно. Додаткових питань в мене не виникло.

Якщо треба призначити права ACL

    setfacl -m u::rwx,g:minil:rw file

     Для заданого файлу file встановлюємо дозволи RWX (читання, запис, виконання) власника файлу ACL  та  RW  для групи minil.

    setfacl -M file1 file2

    Встановити/змінити  ACL властивості file1 та file2.

    setfacl -x g:mail:rw file

     Видалити групу mail ACL властивостей file.

    setfacl -bn file

     Видалити усі ``access'' ACL з файлу file крім успадкованих.

    getfacl file1 | setfacl -b -n -M - file2

     Копіювати ACL з file1 до file2.

Додатково, якщо треба призначити ACL до папки та її піпапок, та файлів:
find  -type f -exec setfacl -m u:twisted:rwx::allow {} \;
find  -type d -exec setfacl -m u::rwx:fd:allow {} \;

owncloud командний рядок

З командлайну ми можемо багато чого зробити з нашим owncloud за допомогою застосунку occ (запускаються з кореневої папки owncloud у моєму випадку, для FreeBSD /usr/local/www/owncloud) .

Перечитати усі файли/папки користувача (така потреба виникає коли в сховище користувача файли потрапляють не через застосунок або web-інтерфейс)

$ sudo -u www php occ files:scan username

Очистити trashbin усіх користувачів – видалити файли “видалені” через ВЕБ-інтерфейс користувачами (якщо вказати користувача то тільки в нього, не видаляйте файли “вручну” – в базі залишиться сміття від незнайдених файлів)

$ sudo -u www php occ trashbin:cleanup

Оновлення скриптів owncloud до новішої версії (якщо з інтерфейсу не спрацювало)

Увімкнути режим обслуговування

$ sudo -u www php occ maintenance:mode --on

Запустити оновлення

$ sudo -u www php occ upgrade

якщо раптом забули увімкнути режим обслуговування – скрипт зробить це за Вас (увімкне та вимкне)

Після успішного оновлення вимкнути режим обслуговування

$ sudo -u www php occ maintenance:mode --off

Тепер користувачі можуть підключатися до оновленої версії

УВАГА! після оновлення може змінитись властивість “максимальний розмір файлу” для завантаження на сервер. Обов”язково перевіряйте у ВЕБ-інтерфейсі адміністратора.

Якщо все те робить один користувач, і виникла потреба подивитись які саме команди з консолі виконувались(цей мануал так і зроблено):

$ history | grep occ

довідка

Про crontab

Ідеї оптимізації для завдань по роскладу. Для того, щоб не відправляв листи дописуємо після виконуваної команди
>/dev/null 2>&1

Для розуміння коли запускати
# .————– хвилина (0 – 59)
# | .———– година (0 – 23)
# | | .——– день місяця (1 – 31)
# | | | .—– місяць (1 – 12) АБО jan,feb,mar,apr …
# | | | | .– день тижня (0 – 6) (неділя=0 чи 7) АБО sun,mon,tue,wed,thu,fri,sat
# | | | | |
* * * * * виконувана команда

Наприклад:
0 * * * * chmod -R 755 /mnt/ftp >/dev/null 2>&1
 >/dev/null означає відправляти вивід програми  (STDOUT) до /dev/null
2>@1 каже відправляти туди само усі помилки (STDERR) 
примітка про номери: stdin (0); stdout (1); stderr (2)

Для того, щоб не відправлялася пошта можемо скористатися опцією MAILTO

MAILTO=””
0 * * * * /root/script.sh

Або відправляти результати на спеціальну адресу кожні 15 хвилин

MAILTO=”user@sample.com”
*/15 * * * * /home/script.sh

Вирішуємо проблеми у FreeNAS швидкість мережі (картка LAN Mellanox 10GB)

Виникають складнощі зі швидкістю передачі данних інтерфейсом SFP+ . При тому, що на Windows працює як було задумано – знайшов як підвищити продуктивність мережевого з”єднання. Додаткові налаштування:

kern.ipc.maxsockbuf=16777216
net.inet.IP.intr_queue_maxlen=2048
net.inet.tcp.recvbuf_max=16777216
net.inet.tcp.recvspace=4194304
net.inet.tcp.recvbuf_inc=524288
net.inet.tcp.sendbuf_max=16777216
net.inet.tcp.sendspace=2097152
net.inet.tcp.sendbuf_inc=32768
net.route.netisr_maxqlen=2048

Отримав швидкість +/- 9 GB на інтерфейсі

вирішення проблеми знайшов тут