Platitude

Untitled

May 13th, 2020
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 20.38 KB | None | 0 0
  1. import ssl, requests, logging, re, dpath, time, json
  2. #import dpath.util as dp
  3. from aiogram.contrib.fsm_storage.memory import MemoryStorage
  4. from aiogram.contrib.middlewares.logging import LoggingMiddleware
  5. from configuration import *
  6. from aiohttp import web
  7. from aiogram.dispatcher.webhook import get_new_configured_app
  8. from aiogram.dispatcher import FSMContext
  9. from aiogram.dispatcher.filters import Text
  10. from aiogram.dispatcher.filters.state import State, StatesGroup
  11. from aiogram import Bot, types
  12. from aiogram.dispatcher import Dispatcher
  13. from aiogram.types import ReplyKeyboardRemove, \
  14.     ReplyKeyboardMarkup, KeyboardButton, \
  15.     InlineKeyboardMarkup, InlineKeyboardButton
  16.  
  17. API_TOKEN = '1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  18. WEBHOOK_HOST = 'xxxxxx.ru'
  19. WEBHOOK_PORT = 443
  20. WEBHOOK_URL_PATH = '/xxxxxxxxxxx'
  21. WEBHOOK_URL = f"https://{WEBHOOK_HOST}:{WEBHOOK_PORT}{WEBHOOK_URL_PATH}"
  22. WEBAPP_HOST = '0.0.0.0'
  23. WEBAPP_PORT = xxxxxxx
  24. WEBHOOK_SSL_CERT = '/root/howtostydu-end3.8/webhook_cert.pem'  # Path to the ssl certificate
  25. WEBHOOK_SSL_PRIV = '/root/howtostydu-end3.8/webhook_pkey.pem'  # Path to the ssl private key
  26.  
  27. #logging.basicConfig(level=logging.INFO)
  28.  
  29. API_TOKEN = API_TOKEN
  30.  
  31. bot = Bot(token=API_TOKEN)
  32.  
  33. storage = MemoryStorage()
  34. dp = Dispatcher(bot, storage=storage)
  35.  
  36. ###################################### меню ################################################
  37. def main_menu(message):
  38.     user_id = message.chat.id
  39.     r = requests.post(http_getusertoken, json={"password": "1488", "telegram_id": int(user_id)})
  40.     print(r.json())
  41.     print(r.status_code)
  42.     if r.json()['msg'] == "ok":
  43.         inline_kb = InlineKeyboardMarkup(row_width=2)
  44.         btn_registration = InlineKeyboardButton('Пройти тест', callback_data='test')
  45.         btn_auth = InlineKeyboardButton('Личная информация', callback_data='personal_information')
  46.         btn_url_site = InlineKeyboardButton('Перейти на сайт', url="https://xxxxxx.ru/home")
  47.         btn_exit = InlineKeyboardButton('Выйти', callback_data='exit')
  48.         inline_kb.add(btn_registration)
  49.         inline_kb.add(btn_auth)
  50.         inline_kb.add(btn_url_site)
  51.         inline_kb.add(btn_exit)
  52.         return inline_kb
  53.  
  54.     else:
  55.         inline_kb1 = InlineKeyboardMarkup(row_width=2)
  56.         btn_registration = InlineKeyboardButton('Регистрация', callback_data='registration')
  57.         btn_auth = InlineKeyboardButton('Авторизация', callback_data='auth')
  58.         btn_url_site = InlineKeyboardButton('Перейти на сайт', url="https://xxxxx.ru/home")
  59.         inline_kb1.add(btn_registration)
  60.         inline_kb1.add(btn_auth)
  61.         inline_kb1.add(btn_url_site)
  62.         return inline_kb1
  63.  
  64.  
  65. def personal_information_menu():
  66.     inline_kb = InlineKeyboardMarkup(row_width=2)
  67.     btn_edit_name = InlineKeyboardButton(text="Изменить имя", callback_data="edit_name")
  68.     btn_edit_secondName = InlineKeyboardButton(text="Изменить фамилию", callback_data="edit_secondName")
  69.     btn_edit_phone = InlineKeyboardButton(text="Изменить номер телефона", callback_data="edit_phone")
  70.     btn_edit_email = InlineKeyboardButton(text="Изменить email", callback_data="edit_email")
  71.     btn_edit_group = InlineKeyboardButton(text="Изменить группу", callback_data="edit_group")
  72.     btn_main_menu = InlineKeyboardButton(text="Назад", callback_data="send_welcome")
  73.     inline_kb.add(btn_edit_name, btn_edit_secondName)
  74.     inline_kb.add(btn_edit_phone, btn_edit_email)
  75.     inline_kb.add(btn_edit_group)
  76.     inline_kb.add(btn_main_menu)
  77.     return inline_kb
  78.  
  79.  
  80. #################################################### начало ##########################################
  81. async def send_welcome(message: types.Message):
  82.     user_id = message.from_user.id
  83.     r = requests.post(http_getusertoken, json={"password": "1488", "telegram_id": int(user_id)})
  84.     if r.json()['msg'] == "ok":
  85.         await bot.send_message(message.chat.id, "Добро пожаловать на платформу онлайн тестирования",
  86.                    reply_markup=main_menu(message))
  87.     else:
  88.         img = open("/root/howtostydu-end3.8/logo.jpg", "rb")
  89.         await bot.send_photo(message.chat.id, img,
  90.                        caption="Добро пожаловать на платформу онлайн тестирования",
  91.                        reply_markup=main_menu(message))
  92.  
  93.  
  94. @dp.message_handler(state='*', commands=["start", "cancel"])
  95. @dp.message_handler(Text(equals=['начать', 'отмена'], ignore_case=True), state='*')
  96. async def cancel_handler(message: types.Message, state: FSMContext):
  97.     await state.finish()
  98.     await send_welcome(message)
  99.  
  100. ##################################################### выход ###########################################
  101. @dp.callback_query_handler(lambda c: c.data == 'exit')
  102. async def exit_user(callback_query: types.CallbackQuery):
  103.     await bot.answer_callback_query(callback_query.id)
  104.     user_id = callback_query.from_user.id
  105.     r = requests.post(http_getusertoken, json={"password": "1488", "telegram_id": int(user_id)})
  106.     TOKEN_USER = r.json()["access_token"]
  107.     headers = {"Authorization": "Bearer " + TOKEN_USER}
  108.     requests.post('https://howtostudy.ru/api/telegram4ik/removeusertelegram',
  109.                   json={"password": "1488", "telegram_id": user_id}, headers=headers)
  110.     await send_welcome(callback_query.message)
  111.  
  112. ##################################### персональная информация #########################################
  113. class Form_edit(StatesGroup):
  114.     edit_name = State()
  115.     edit_secondName = State()
  116.     edit_phone = State()
  117.     edit_email = State()
  118.     edit_email_passward = State()
  119.     edit_group = State()
  120.  
  121.  
  122. @dp.callback_query_handler(lambda c: c.data == 'personal_information')
  123. async def personal_information(callback_query: types.CallbackQuery):
  124.     await callback_query.answer()
  125.     r = requests.post(http_getusertoken, json={"password": "1488", "telegram_id": callback_query.from_user.id})
  126.     TOKEN_USER = r.json()["access_token"]
  127.     headers = {"Authorization": "Bearer " + TOKEN_USER}
  128.     r = requests.get(http_getown, headers=headers)
  129.     # {'personals': {'email': '148@.com', 'firstName': 'fsdf', 'group': 'ИС-18', 'phone': 84354543543, 'secondName': 'f'}}
  130.     #img = open("/root/howtostydu-end3.8/logo.jpg", "rb")  # D:\Inf\python\\telegramBot\HowToDo\main\\logo.jpg
  131.     output = "Настройка персональной информация\n"
  132.  
  133.     if 'email' in r.json()['personals']:
  134.         output = output + f"\nВаш email: {r.json()['personals']['email']}"
  135.  
  136.     if 'firstName' in r.json()['personals']:
  137.         output = output + f"\nИмя: {r.json()['personals']['firstName']}"
  138.  
  139.     if 'secondName' in r.json()['personals']:
  140.         output = output + f"\nФамилия: {r.json()['personals']['secondName']}"
  141.  
  142.     if 'phone' in r.json()['personals']:
  143.         output = output + f"\nТелефон: {r.json()['personals']['phone']}"
  144.  
  145.     if 'group' in r.json()['personals']:
  146.         output = output + f"\nГруппа: {r.json()['personals']['group']}"
  147.  
  148.     await callback_query.message.edit_text(output, reply_markup=personal_information_menu())
  149.  
  150. async def send_personal_information(message,http, json):
  151.     r = requests.post(http_getusertoken, json={"password": "1488", "telegram_id": message.chat.id})
  152.     TOKEN_USER = r.json()["access_token"]
  153.     headers = {"Authorization": "Bearer " + TOKEN_USER}
  154.     requests.post(http, json=json,headers=headers)
  155.     return await bot.send_message(message.chat.id, "Данные сохранены")
  156.  
  157.  
  158. @dp.callback_query_handler(lambda c: c.data == 'edit_name') #Изменить имя
  159. async def edit_name(callback_query: types.CallbackQuery):
  160.     await callback_query.answer()
  161.     await Form_edit.edit_name.set()
  162.     await callback_query.message.answer("Укажите имя: ")
  163.  
  164. @dp.message_handler(state=Form_edit.edit_name)
  165. async def edit_name_save(message: types.Message, state: FSMContext):
  166.     async with state.proxy() as data:
  167.         data['name'] = message.text
  168.     r = {"firstName": message.text}
  169.     await send_personal_information(message, http_setown, r)
  170.     await state.finish()
  171.     await send_welcome(message)
  172.  
  173. @dp.callback_query_handler(lambda c: c.data == 'edit_secondName') #Изменить фамилию
  174. async def edit_secondName(callback_query: types.CallbackQuery):
  175.     await callback_query.answer()
  176.     await Form_edit.edit_secondName.set()
  177.     await callback_query.message.answer("Укажите фамилию: ")
  178.  
  179. @dp.message_handler(state=Form_edit.edit_secondName)
  180. async def edit_secondName_save(message: types.Message, state: FSMContext):
  181.     async with state.proxy() as data:
  182.         data['secondName'] = message.text
  183.     r = {"secondName": message.text}
  184.     await send_personal_information(message, http_setown, r)
  185.     print(send_personal_information(message, http_setown, r))
  186.     await state.finish()
  187.     await send_welcome(message)
  188.  
  189. @dp.callback_query_handler(lambda c: c.data == 'edit_phone') #Изменить телефон
  190. async def edit_phone(callback_query: types.CallbackQuery):
  191.     await callback_query.answer()
  192.     await Form_edit.edit_phone.set()
  193.     await callback_query.message.answer("Укажите номер телефона: ")
  194.  
  195. @dp.message_handler(state=Form_edit.edit_phone)
  196. async def edit_phone_save(message: types.Message, state: FSMContext):
  197.     message.text = message.text.replace("+7", "8")
  198.     if len(str(message.text)) == 11 and str(message.text).isdigit():
  199.         async with state.proxy() as data:
  200.             data['phone'] = message.text
  201.         r = {"phone": message.text}
  202.         await send_personal_information(message, http_setown, r)
  203.         await state.finish()
  204.         await send_welcome(message)
  205.     else:
  206.         await message.answer("Некоректный номер телефона\nУкажите номер телефона: ")
  207.  
  208. @dp.callback_query_handler(lambda c: c.data == 'edit_email') #Изменить email
  209. async def edit_email(callback_query: types.CallbackQuery):
  210.     await callback_query.answer()
  211.     await Form_edit.edit_email.set()
  212.     await callback_query.message.answer("Укажите новый email: ")
  213.  
  214. @dp.message_handler(
  215.     lambda message: ('@' not in message.text) or (('.com' not in message.text) and ('.ru' not in message.text)),
  216.     state=Form_edit.edit_email)
  217. async def check_email(message: types.Message):
  218.     return await message.reply("Некоректно введен email.\nУкажите email: ")
  219.  
  220. @dp.message_handler(state=Form_edit.edit_email)
  221. async def edit_email_save(message: types.Message, state: FSMContext):
  222.     async with state.proxy() as data:
  223.         data['email'] = message.text
  224.         await Form_edit.next()
  225.         await message.answer("Введите пароль: ")
  226.  
  227. @dp.message_handler(state=Form_edit.edit_email_passward)
  228. async def edit_email_passward(message: types.Message, state: FSMContext):
  229.     async with state.proxy() as data:
  230.         data['password'] = message.text
  231.         print(data["email"],data['password'])
  232.         r = requests.post(http_getusertoken, json={"password": "1488", "telegram_id": message.chat.id})
  233.         TOKEN_USER = r.json()["access_token"]
  234.         headers = {"Authorization": "Bearer " + TOKEN_USER}
  235.         r = requests.post(http_email, json={"newEmail": data["email"], "password": data['password']}, headers=headers)
  236.         #r = {"newEmail": data["email"], "password": data['password']}
  237.         await send_personal_information(message, http_email, r)
  238.         if r.json()['msg'] == "ok":
  239.             await message.answer("Вы успешно изменили email")
  240.             await state.finish()
  241.             await send_welcome(message)
  242.         else:
  243.             await message.answer("Неверно указан пароль\nВведите пароль: ")
  244.  
  245. @dp.callback_query_handler(lambda c: c.data == 'edit_group') #Изменить группу
  246. async def edit_group(callback_query: types.CallbackQuery):
  247.     await callback_query.answer()
  248.     await Form_edit.edit_group.set()
  249.     markup = types.ReplyKeyboardMarkup(resize_keyboard=True, selective=True, one_time_keyboard=True)
  250.     markup.add("ИС-16", "ИС-17", "ИС-18")
  251.     markup.add("ИС-19", "ИЭ-17", "ИЭ-19")
  252.     await callback_query.message.answer("Укажите вашу группу: ", reply_markup=markup)
  253.  
  254. @dp.message_handler(lambda message: message.text not in ["ИС-16", "ИС-17", "ИС-18", "ИС-19", "ИЭ-17", "ИЭ-19"],
  255.                     state=Form_edit.edit_group)
  256. async def process_gender_invalid(message: types.Message):
  257.     return await message.reply("Неверно указана группа\nПожалуйства выберите группу из списка")
  258.  
  259. @dp.message_handler(state=Form_edit.edit_group)
  260. async def edit_secondName_save(message: types.Message, state: FSMContext):
  261.     async with state.proxy() as data:
  262.         data['group'] = message.text
  263.     r = {"group": message.text}
  264.     await send_personal_information(message, http_setown, r)
  265.     await state.finish()
  266.     await send_welcome(message)
  267.  
  268.  
  269. @dp.callback_query_handler(lambda c: c.data == 'send_welcome') #назад
  270. async def back(callback_query):
  271.     await callback_query.message.edit_text("Добро пожаловать на платформу онлайн тестирования", reply_markup=main_menu(callback_query.message))
  272.  
  273. ##################################### авторизация #####################################################
  274. class Form_auth(StatesGroup):
  275.     name_aut = State()
  276.     password_aut = State()
  277.  
  278. @dp.callback_query_handler(lambda c: c.data == 'auth')
  279. async def send_name(callback_query: types.CallbackQuery):
  280.     await bot.answer_callback_query(callback_query.id)
  281.     await Form_auth.name_aut.set()
  282.     await bot.send_message(callback_query.from_user.id, 'Укажите логин: ')
  283.  
  284.  
  285. @dp.message_handler(state=Form_auth.name_aut)
  286. async def send_password(message: types.Message, state: FSMContext):
  287.     async with state.proxy() as data:
  288.         data['name'] = message.text
  289.     await Form_auth.next()
  290.     await message.answer("Укажите пароль: ")
  291.  
  292.  
  293. @dp.message_handler(state=Form_auth.password_aut)
  294. async def process_gender(message: types.Message, state: FSMContext):
  295.     try:
  296.         async with state.proxy() as data:
  297.             data['password'] = message.text
  298.             print("Авторизация: ",data['name'], data['password'])
  299.             user_id = message.chat.id
  300.             r = requests.post(http_auth, json={
  301.                 "login": data["name"],
  302.                 "password": data['password']})
  303.             headers = {"Authorization": "Bearer " + r.json()['access_token']}
  304.             requests.post(http_addidtelegram,
  305.                           json={"password": "1488", "telegram_id": user_id}, headers=headers)
  306.             await bot.send_message(message.chat.id, "Вы успешно авторизовались.")
  307.             await send_welcome(message)
  308.         await state.finish()
  309.     except Exception as e:
  310.         await message.answer("Такого пользователя нет\nУкажите логин: ")
  311.         await Form_auth.first()
  312.  
  313. ##################################### регистрация ############################################
  314. class Form_registration(StatesGroup):
  315.     name = State()
  316.     password = State()
  317.     email = State()
  318.     category = State()
  319.  
  320.  
  321. @dp.callback_query_handler(lambda c: c.data == 'registration')
  322. async def send_name(callback_query: types.CallbackQuery):
  323.     await bot.answer_callback_query(callback_query.id)
  324.     await Form_registration.name.set()
  325.     await bot.send_message(callback_query.from_user.id, 'Укажите логин: ')
  326.  
  327. @dp.message_handler(state=Form_registration.name)
  328. async def lan(message, state: FSMContext):
  329.     async with state.proxy() as data:
  330.         data['name'] = message.text
  331.         user_id = message.from_user.id
  332.         r = requests.post(http_reg, json={"login": data['name'], "password": "", "email": "", "category": ""})
  333.         print(r.json()['msg'])
  334.         if r.json()['msg'] != "NOT_ORIGINAL_LOGIN":
  335.             await message.answer("Введите пароль: ")
  336.             await Form_registration.next()
  337.         else:
  338.             await message.answer("Логин занят\nУкажите логин: ")
  339.             await Form_registration.first()
  340.  
  341. @dp.message_handler(state=Form_registration.name)
  342. async def send_password(message: types.Message, state: FSMContext):
  343.     async with state.proxy() as data:
  344.         data['name'] = message.text
  345.     await Form_registration.next()
  346.     await message.answer("Укажите пароль: ")
  347.  
  348. @dp.message_handler(lambda message: message.text, state=Form_registration.password)
  349. async def send_emai(message: types.Message, state: FSMContext):
  350.     await Form_registration.next()
  351.     await state.update_data(password=message.text)
  352.     await message.answer("Укажите email: ")
  353.  
  354.  
  355. @dp.message_handler(
  356.     lambda message: ('@' not in message.text) or (('.com' not in message.text) and ('.ru' not in message.text)),
  357.     state=Form_registration.email)
  358. async def check_email(message: types.Message):
  359.     return await message.reply("Некоректно введен email.\nУкажите email: ")
  360.  
  361.  
  362. @dp.message_handler(lambda message: message.text, state=Form_registration.email)
  363. async def send_group(message: types.Message, state: FSMContext):
  364.     await Form_registration.next()
  365.     await state.update_data(email=message.text)
  366.  
  367.     markup = types.ReplyKeyboardMarkup(resize_keyboard=True, selective=True, one_time_keyboard=True)
  368.     markup.add("ИС-16", "ИС-17", "ИС-18")
  369.     markup.add("ИС-19", "ИЭ-17", "ИЭ-17")
  370.     await message.answer("Укажите вашу группу: ", reply_markup=markup)
  371.  
  372.  
  373. @dp.message_handler(lambda message: message.text not in ["ИС-16", "ИС-17", "ИС-18", "ИС-19", "ИЭ-17", "ИЭ-17"],
  374.                     state=Form_registration.category)
  375. async def process_gender_invalid(message: types.Message):
  376.     return await message.reply("Неверно указана группа, пожалуйства выберите группу")
  377.  
  378.  
  379. @dp.message_handler(state=Form_registration.category)
  380. async def process_gender(message: types.Message, state: FSMContext):
  381.     async with state.proxy() as data:
  382.         data['category'] = message.text
  383.         print("Данные регистрации: ",data['name'], data['password'], data['email'], data['category'])
  384.         try:
  385.             user_id = message.chat.id
  386.             r = requests.post(http_reg, json={"login": data['name'], "password":data['password'],"email":data['email'],"category": data['category']})
  387.             await bot.send_message(message.chat.id, "Вы успешно зарегистрированы.")
  388.             headers = {"Authorization": "Bearer " + r.json()['access_token']}
  389.             requests.post(http_addidtelegram,
  390.                           json={"password": "1488", "telegram_id": user_id}, headers=headers)
  391.             await send_welcome(message)
  392.         except Exception as e:
  393.             await message.answer("Ooops")
  394.     await state.finish()
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403. ###################################### тесты ################################################
  404. class Form_test(StatesGroup):
  405.     res_id = State()
  406.     index = State()
  407.     questions_list = State()
  408.     user_answers = State()
  409.  
  410.  
  411. @dp.callback_query_handler(lambda c: c.data == 'test')
  412. async def edit_secondName(callback_query: types.CallbackQuery):
  413.     await callback_query.answer()
  414.  
  415.  
  416.  
  417. ###################################### вебхуки ################################################
  418. async def on_startup(app):
  419.     webhook = await bot.get_webhook_info()
  420.     if webhook.url != WEBHOOK_URL:
  421.         if not webhook.url:
  422.             await bot.delete_webhook()
  423.         await bot.set_webhook(WEBHOOK_URL, certificate=open(WEBHOOK_SSL_CERT, 'rb'))
  424.  
  425. async def on_shutdown(app):
  426.     await bot.delete_webhook()
  427.     await dp.storage.close()
  428.     await dp.storage.wait_closed()
  429.  
  430. if __name__ == '__main__':
  431.     app = get_new_configured_app(dispatcher=dp, path=WEBHOOK_URL_PATH)
  432.     app.on_startup.append(on_startup)
  433.     app.on_shutdown.append(on_shutdown)
  434.     context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
  435.     context.load_cert_chain(WEBHOOK_SSL_CERT, WEBHOOK_SSL_PRIV)
  436.     web.run_app(app, host=WEBAPP_HOST, port=WEBAPP_PORT, ssl_context=context)
Add Comment
Please, Sign In to add comment