3 Commits
2.2 ... master

Author SHA1 Message Date
AB
decd96fe5c Implement cache TTL 2020-03-30 10:02:19 +00:00
AB
a5ac105177 Update bot for new age of fesmoo site. 2020-03-28 15:06:27 +00:00
AB
4b0a8a7675 Hotfix 2019-12-26 20:51:35 +00:00
3 changed files with 66 additions and 22 deletions

View File

@ -14,6 +14,12 @@ from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
from telegram.error import NetworkError, Unauthorized from telegram.error import NetworkError, Unauthorized
from time import sleep from time import sleep
from functools import wraps from functools import wraps
import datetime
import logging
logging.basicConfig(level=logging.INFO)
now = datetime.datetime.now()
from pprint import pprint from pprint import pprint
try: try:
@ -116,13 +122,19 @@ def perdoliq(username, password, subj, test, acc, submit=True, is_delayed=False)
return "Exception: " + str(e) return "Exception: " + str(e)
def list_test(username, password): def list_test(username, password):
if username in cached_tests: now = datetime.datetime.now()
return cached_tests[username] cache_name = f"{now.month}_{now.day}_{now.hour}"
if cache_name in cached_tests:
cache_username = cached_tests[cache_name].get(username, None)
if cache_username:
return cache_username
try: try:
app = Perdoliq(username, password) app = Perdoliq(username, password)
app.auth() app.auth()
tests = app.get_tests() tests = app.get_tests()
cached_tests[username] = tests if not cached_tests.get(cache_name, None):
cached_tests[cache_name] = dict()
cached_tests[cache_name][username] = tests
return tests return tests
except Exception as e: except Exception as e:
return "Exception: " + str(e) return "Exception: " + str(e)
@ -132,7 +144,6 @@ def list_(update, context):
query = update.callback_query query = update.callback_query
user_id = update.effective_user.id user_id = update.effective_user.id
tests = list_test(auth[user_id]["login"], auth[user_id]["passwd"]) tests = list_test(auth[user_id]["login"], auth[user_id]["passwd"])
print(tests)
keyboard = list() keyboard = list()
i = 1 i = 1
for subj in tests: for subj in tests:
@ -140,7 +151,7 @@ def list_(update, context):
#msg = msg + (" [%s] %s (%s tests)\n" % (i, subj, tests_count)) #msg = msg + (" [%s] %s (%s tests)\n" % (i, subj, tests_count))
keyboard.append([InlineKeyboardButton(f"{i}. {subj}", callback_data=f"s_{i}")]) keyboard.append([InlineKeyboardButton(f"{i}. {subj}", callback_data=f"s_{i}")])
i += 1 i += 1
keyboard.append([InlineKeyboardButton("Close", callback_data="subj")]) keyboard.append([InlineKeyboardButton("Закрыть", callback_data=f"close")])
reply_markup = InlineKeyboardMarkup(keyboard) reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text('Чо будем хакать?', reply_markup=reply_markup) update.message.reply_text('Чо будем хакать?', reply_markup=reply_markup)
@ -236,6 +247,7 @@ def button_handler(update, context):
precision, precision,
submit, submit,
delay) delay)
query.edit_message_text("Так! Я все решил.")
if __name__ == '__main__': if __name__ == '__main__':
try: try:

38
main.py
View File

@ -17,28 +17,44 @@ class Perdoliq:
self.name = '' self.name = ''
self.subjects = {} self.subjects = {}
@staticmethod
def get_secrets(response, input_id):
soup = BeautifulSoup(response.text, "html.parser")
try:
secret = soup.find(id=input_id).get('value', '')
except AttributeError:
secret = ''
logging.debug(f'*** Found {input_id}: {secret}')
return secret
# make auth # make auth
def auth(self): def auth(self):
r = requests.get(settings.fesmu_root_url) r = requests.get(settings.fesmu_root_url)
for c in r.cookies: self.SessionId = r.cookies.get('ASP.NET_SessionId', None)
if c.name == 'ASP.NET_SessionId': logging.info('ASP.NET_SessionId for curtain session is %s',
self.SessionId = c.value self.SessionId)
logging.info('ASP.NET_SessionId for curtain session is %s',
c.value)
data={
'ctl00$MainContent$UserText': self.username,
'ctl00$MainContent$PassText': self.password,
'ctl00_MainContent_ToolkitScriptManager1_HiddenField': '',
'ctl00$MainContent$ASPxButton1': '',
'__EVENTTARGET': '',
'__EVENTARGUMENT': '',
'__VIEWSTATE': self.get_secrets(r, '__VIEWSTATE'),
'__VIEWSTATEGENERATOR': self.get_secrets(r, '__VIEWSTATEGENERATOR'),
'__EVENTVALIDATION': self.get_secrets(r, '__EVENTVALIDATION'),
#'DXScript': get_secrets(r, 'DXScript'),
}
r = requests.post( r = requests.post(
settings.fesmu_root_url, settings.fesmu_root_url,
data=settings.merge( data = data,
settings.scam_data_1, { headers=settings.headers,
'ctl00$MainContent$UserText': self.username,
'ctl00$MainContent$PassText': self.password,
}),
cookies={'ASP.NET_SessionId': self.SessionId}) cookies={'ASP.NET_SessionId': self.SessionId})
r = requests.get( r = requests.get(
settings.fesmu_root_url + 'startstu.aspx', settings.fesmu_root_url + 'startstu.aspx',
cookies={'ASP.NET_SessionId': self.SessionId}) cookies={'ASP.NET_SessionId': self.SessionId})
soup = BeautifulSoup(r.text, "html.parser") soup = BeautifulSoup(r.text, "html.parser")
#print("****** ", soup)
_p = re.compile(',.*$') _p = re.compile(',.*$')
self.name = _p.sub( self.name = _p.sub(
'', soup.find(id="ctl00_MainContent_Label1").get_text())[14:] '', soup.find(id="ctl00_MainContent_Label1").get_text())[14:]

View File

@ -6,16 +6,32 @@ def merge(x, y):
z.update(y) # modifies z with y's keys and values & returns None z.update(y) # modifies z with y's keys and values & returns None
return z return z
headers = {
"Host": "www.fesmu.ru",
"Connection": "keep-alive",
"Content-Length": '896',
"Cache-Control": "max-age=0",
"Origin": "http://www.fesmu.ru",
"Upgrade-Insecure-Requests": '1',
"DNT": '1',
"Content-Type": "application/x-www-form-urlencoded",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Referer": "http://www.fesmu.ru/eport/eport/",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "en-US,en;q=0.9,ru;q=0.8,zh-CN;q=0.7,zh;q=0.6",
}
scam_data_1 = { scam_data_1 = {
'ctl00_MainContent_ToolkitScriptManager1_HiddenField': '', 'ctl00_MainContent_ToolkitScriptManager1_HiddenField': '',
'__EVENTTARGET': '', # '__EVENTTARGET': '',
'__EVENTARGUMENT': '', # '__EVENTARGUMENT': '',
'__VIEWSTATE': '/wEPDwUKLTM5Mjc2OTQzMQ9kFgJmD2QWAgIDD2QWAgIBD2QWAgIFDw8WAh4EVGV4dAVA0KHQtdC50YfQsNGBINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQtdC5INC90LAg0L/QvtGA0YLQsNC70LU6IDE0OWRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBR1jdGwwMCRNYWluQ29udGVudCRBU1B4QnV0dG9uMaxc3rVccSyMpTHRwTntZdTJoxFSZnqwhbBnF1ATfZNL', '__VIEWSTATE': '/wEPDwUKLTM5Mjc2OTQzMQ9kFgJmD2QWAgIDD2QWAgIBD2QWAgIFDw8WAh4EVGV4dAW7AdCX0LAg0YHRg9GC0LrQuCDRg9C90LjQutCw0LvRjNC90YvRhSDQsNCy0YLQvtGA0LjQt9C40YDQvtCy0LDQvdC90YvRhSDQv9C+0LvRjNC30L7QstCw0YLQtdC70LXQuSDQvdCwINC/0L7RgNGC0LDQu9C1OiAyNjY3PGJyLyA+0KHQtdC50YfQsNGBINC/0L7QtNC60LvRjtGH0LXQvdC40Lkg0Log0L/QvtGA0YLQsNC70YM6IDUzOTVkZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUdY3RsMDAkTWFpbkNvbnRlbnQkQVNQeEJ1dHRvbjFA+y5c2mr9OLuyebEMey8lwZdb51brZaJ6iXIvwaVWpg==',
'__VIEWSTATEGENERATOR': '73D4C735', # '__VIEWSTATEGENERATOR': '73D4C735',
'__EVENTVALIDATION': '/wEdAAPdQMZpQT+E4nHOdGeZqyTVUN0eEH6RAZcaSKVdt8S4X7osef1mutGT26WuFCdWwFbKoA75NEe+fYiUfCl9R3M++NkzZ8G6NwAHQz7bnnn1nw==', '__EVENTVALIDATION': '/wEdAAMqLyJo1lw62U+c0YXYJTJCUN0eEH6RAZcaSKVdt8S4X7osef1mutGT26WuFCdWwFaDQnYjJQ2/uhzVMKV3HbBN40+h9rsbvZwG3sNsqevEUg==',
'ctl00$MainContent$ASPxButton1': '', 'ctl00$MainContent$ASPxButton1': '',
'DXScript': '1_42,1_75,2_27', # 'DXScript': '1_42,1_75,2_27',
} }
scam_data_2 = { scam_data_2 = {