Привет %username%! Давно я тут ничего не писал и тут мне захотелось поделиться. Решил я ради развлечения написать небольшую приблуду для своего любимого zsh. Теперь он по команде excuse отправляет случайное предложение из базы данных Redis, которая крутится у меня в Docker’е. Для страждущих собственно код. Остальным под кат.

В остальном все примитивно и просто - как мне теперь кажется.

Вот собственно листинг единственного файла который делает всё:

#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
# Copyright 2017 Savin (JTProg) Mihael
# Simple Twitter posting excuse
# https://jtprog.ru/

import twitter  
import dotenv as d  
from pathlib import Path  
import logging  
import os  
import redis  
import random

r = redis.StrictRedis(host='localhost', port=63799, db=0)

# Get current working directory  
wd = os.path.dirname(os.path.abspath(__file__))  
# Log file name  
LOG_FILE_PATH = cwd + '/logs/info.log'

logging.getLogger(__name__)  
# Logging configuration  
logging.basicConfig(format=u'%(filename)s [LINE:%(lineno)d]# \
                    %(levelname)s [%(asctime)s] %(message)s',
                    level=logging.DEBUG,
                    filename=LOG_FILE_PATH)

# Load Twitter credential  
env = str(Path(__file__).parent / '.env')

try:  
    TOKEN = d.get_key(env, 'TOKEN')  
    TOKEN_KEY = d.get_key(env, 'TOKEN_KEY')  
    CON_SEC = d.get_key(env, 'CON_SEC')  
    CON_SEC_KEY = d.get_key(env, 'CON_SEC_KEY')  
except Exception as e:  
    # Log errors.  
    logging.fatal(u'Can\'t get configuration from enviromentnnFATAL: {}'.format(e))

def main():  
    my_auth = twitter.OAuth(TOKEN, TOKEN_KEY, CON_SEC, CON_SEC_KEY)  
    try:  
        twit = twitter.Twitter(auth=my_auth)  
    except Exception as e:  
        # Log errors  
        logging.fatal(u'FATAL: {}'.format(e))  
    # List of a reasons  
    reasons = r.get(random.randrange(0, 42388))

    try:  
        # Send tweet  
        # tweet = random.choice(reasons)  
        twit.statuses.update(status=reasons[0:139])  
        logging.info(u'INFO: {}'.format('Message send'))  
    except Exception as e:  
        # Log errors  
        logging.fatal(u'FATAL: {}'.format(e))

    return

if __name__ == '__main__':  
    main()

Redis у меня запущен в Docker-контейнере и проброшен соответствующий порт 63799. Наполнение базы данных в Redis делалось с помощью отдельного скрипта, который я решил не выкладывать в репозиторий. Вот его листинг:

# coding=utf-8  
from nltk.tokenize import sent_tokenize  
import redis

r = redis.StrictRedis(host='localhost', port=63799, db=0)

txt = open(r'tolstoy.txt', encoding='utf-8').read()  
sents = sent_tokenize(txt)  
key = 0

for pred in sents:  
    key += 1  
    r.set(key, pred)

print(r.dbsize())

Тут все примитивно и понятно подключаемся к БД, открываем файл с текстом в кодировке UTF-8, прогоняем через полезную и интересную библиотеку nltk и простым циклом загоняем все предложения в БД.

Важно: не проглядеть такой параметр как db=0, т.к. именно он отвечает за ту базу к которой вы подключаетесь и наполняете своими “отмазками”.

На этом собственно всё!


Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат, а так же подписывайся на канал.