Added dryrun mode. Also tg bot key has been moved to tg_settings file

This commit is contained in:
Alexandr Bogomyakov
2018-05-17 18:42:45 +03:00
parent 03748de34e
commit 358c6b348b
5 changed files with 147 additions and 5 deletions

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
# configs
creds.ini
tg_settings.py
# Byte-compiled / optimized / DLL files
__pycache__/

View File

@ -10,7 +10,7 @@ import logging
import telegram
from telegram.error import NetworkError, Unauthorized
from time import sleep
from main import Perdoliq
import tg_settings
update_id = None
@ -19,7 +19,12 @@ def main():
"""Run the bot."""
global update_id
# Telegram Bot Authorization Token
TOKEN = os.environ["TG_TOKEN"]
TOKEN = tg_settings.TG_TOKEN
try:
if os.environ["DRYRUN"]:
from dryrun import Perdoliq
except:
from main import Perdoliq
bot = telegram.Bot(TOKEN)
# get the first pending update_id,
@ -112,6 +117,7 @@ def echo(bot):
return False
msg = "Here is an available tests:\n``` "
i = 0
print(tests)
for subj in tests:
msg = msg + (" [%s] %s\n" % (i, subj))
i += 1

132
dryrun.py Normal file
View File

@ -0,0 +1,132 @@
import requests
import settings
import logging
import re
from bs4 import BeautifulSoup
from random import randint
import time
logging.basicConfig(level=logging.INFO)
class Perdoliq:
def __init__(self, username, password):
self.password = password
self.username = username
self.SessionId = ''
self.name = ''
self.subjects = {}
# make auth
def auth(self):
self.SessionId = '** DRY_RUN_ASP.NET_SessionId **'
return self.SessionId
# update and return list of subjs and tests
def get_tests(self):
self.subjects = {
'Аналитическая химия': [
'броматометрическое титрование',
'Качественный анализ. Теоретические основы. Итоговый',
'Химический количественный анализ. Итоговый', 'Йодометрия',
'редоксиметрия. нитритометрия',
'Количественный анализ. Протолитометрия.'
],
'Безопасность жизнедеятельности, медицина катастроф': [
'Мобилизационная подготовка здравоохранения',
'Медицина катастроф', 'Гражданская оборона'
],
'Биологическая химия': [
'Химия белков', 'Ферменты', 'Витамины',
'Нуклеиновые кислоты и матричные биосинтезы',
'Обмен углеводов', 'Энергетический обмен'
],
'Дисциплины по выбору Ф-04-1':
['физико-химические методы анализа'],
'Иностранный язык': [
'лексико-грамматический 9', 'Лексико-грамматический 8',
'лексико-грамматический 10', 'лексико-грамматический 3а'
],
'Органическая химия': [
'Аминокислоты', 'Углеводы',
'Карбоновые кислоты, гетерофункуциональные соединения',
'Омыляемые липиды', 'Неомыляемые липиды',
'Гетероциклические соединения'
],
'Патология': [
'Аллергия', 'Патология системы иммунобиологического надзора',
'Нозология', 'Патология белкового обмена',
'Патология обмена жиров', 'Патология углеводного обмена',
'Патология водного и ионного обменов. Нарушение КОС.',
'ЛИХОРАДКА', 'Кислородное голодание',
'Патофизиология периферического кровобращения. Воспаление.'
],
'Первая доврачебная помощь': ['Первая доврачебная помощь'],
'Физическая культура': [
'Методы контроля за функциональным и физическим состоянием организма человека'
],
'Философия': [
'Онтология. Гносеология', 'Западная философия 19-20вв-2',
'Западная философия 19-20вв - 3', 'Онтология',
'Научное познание - 2', 'Западная философия 19-20вв',
'Философия истории', 'Философия человека - 1',
'Философия человека - 2', 'Бытие и сознание',
'Социальная философия - 1', 'Научное познание',
'Философия человека', 'Онтология - 2',
'Философия общества и глобальные проблемы человечества',
'Русская философия'
]
}
return self.subjects
def start_test(self, pred, test):
return 30
# predict answers for any question
def predict(self, q_number):
return ['2']
# mark answers into requested question
def answer(self, q_number, answers):
return 0
# commit test
def finish_test(self):
return 0
def resolve(self, subj, test, accuracy, is_delayed=False):
# renew auth
self.auth()
# get count of questions
q_count = self.start_test(subj, test)
def sleep_rand():
delay = randint(20, 40)
logging.info("Going to wait %s sec for this question." % delay)
time.sleep(delay)
accuracy = int(accuracy)
# applying accuracy here. trying to make resulting
# accuracy NO LESSthan requested.
spoil_count = int(q_count - q_count * (accuracy / 100))
if int(spoil_count / q_count * (-100) + 100) < accuracy:
spoil_count -= 1
# skip random `spoil_count` questions.
# Choose questions which going to be skipped
skip_this = []
for i in range(0, spoil_count):
skip_this.append(randint(1, q_count + 1))
# start resolve test
for i in range(1, q_count + 1):
if is_delayed == True:
sleep_rand()
if i not in skip_this:
prediction = self.predict(i)
self.answer(i, prediction)
# make autocommit
if is_delayed == True:
self.finish_test()

View File

@ -1,5 +1,7 @@
python3
# python3 only
pip install requests
py -m pip install requests
pip install beautifulsoup4
pip install python-telegram-bot
py -m pip install beautifulsoup4

1
tg_settings.py.example Normal file
View File

@ -0,0 +1 @@
TG_TOKEN = '4712707:329GqTj222i8unS23367sXqeMsyE'