diff --git a/Bot.py b/Bot.py index b63a772..cba61cc 100755 --- a/Bot.py +++ b/Bot.py @@ -1,14 +1,8 @@ from aiogram.utils import executor from loguru import logger from aiogram import Bot, Dispatcher, types -from functions import get_audio_messages_func, create_statistic, openai_answer +from functions import get_audio_messages_func, openai_answer, yandex import json -from selenium import webdriver -from selenium.webdriver.chrome.service import Service -from selenium.webdriver.common.by import By -from webdriver_manager.chrome import ChromeDriverManager -import requests -import time bot = Bot(token="5941118321:AAG0g0keLrlnuH_9U9X6ehpFFAdOX38qeXI") # создаю объект бота dp = Dispatcher(bot) # создаю объект слушателя @@ -29,24 +23,12 @@ async def start(message: types.Message): @dp.message_handler(commands=['statistic']) async def statistic(message: types.Message): - login = "Dmitrium12" - password = "" - options = webdriver.ChromeOptions() - options.add_argument("--headless") - driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) - driver.get('https://passport.yandex.ru/auth/') - time.sleep(1) - driver.find_element(By.CLASS_NAME, "Button2").click() - time.sleep(1) - driver.find_element(By.XPATH, '//*[@id="passp-field-login"]').send_keys(login) - driver.find_element(By.XPATH, '//*[@id="passp:sign-in"]').click() - time.sleep(1) - driver.find_element(By.XPATH, '//*[@id="passp-field-passwd"]').send_keys(password) - driver.find_element(By.XPATH, '//*[@id="passp:sign-in"]').click() - time.sleep(5) - cookies = {"Session_id": [i["value"] for i in driver.get_cookies() if i["name"] == "Session_id"][0]} - response = requests.get("https://lyceum.yandex.ru/api/notifications?isRead=false&limit=20", cookies=cookies) - await message.reply(f'У вас {response.json()["unreadCount"]} уведомлений. Прочитайте хоть') + await yandex.statistic(message) + + +@dp.message_handler(commands=['create_yandex']) +async def create_yandex(message: types.Message): + await yandex.create_yandex(message) @dp.message_handler(commands=['r']) diff --git a/db.sql b/db.sql index 121e10e..796d229 100644 Binary files a/db.sql and b/db.sql differ diff --git a/functions/openai_answer.py b/functions/openai_answer.py index 1902987..bead391 100644 --- a/functions/openai_answer.py +++ b/functions/openai_answer.py @@ -19,7 +19,7 @@ async def get_response_to_openai(message: types.Message, bot): message_send.append({"role": "user", "content": ' '.join(message.text.split()[1:])}) except sqlite3.OperationalError: message_send = [{"role": "user", "content": ' '.join(message.text.split()[1:])}] - print(message_sendко) + print(message_send) response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=message_send, diff --git a/functions/yandex.py b/functions/yandex.py new file mode 100644 index 0000000..46929ee --- /dev/null +++ b/functions/yandex.py @@ -0,0 +1,51 @@ +import sqlite3 +import time +import requests +from aiogram import types +from selenium import webdriver +from selenium.webdriver.chrome.service import Service +from selenium.webdriver.common.by import By +from webdriver_manager.chrome import ChromeDriverManager + + +async def create_yandex(message: types.Message): + conn = sqlite3.connect('db.sql') + cur = conn.cursor() + response = cur.execute("SELECT * FROM yandex WHERE user_id=?", (message.from_user.id, )).fetchall() + conn.close() + if response: + await message.reply("Ваш аккаунт уже добавлен") + options = webdriver.ChromeOptions() + options.add_argument("--headless") + driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) + driver.get('https://passport.yandex.ru/auth/') + time.sleep(1) + driver.find_element(By.CLASS_NAME, "Button2").click() + time.sleep(1) + driver.find_element(By.XPATH, '//*[@id="passp-field-login"]').send_keys(message.text.split()[1]) + driver.find_element(By.XPATH, '//*[@id="passp:sign-in"]').click() + time.sleep(1) + driver.find_element(By.XPATH, '//*[@id="passp-field-passwd"]').send_keys(message.text.split()[2]) + driver.find_element(By.XPATH, '//*[@id="passp:sign-in"]').click() + time.sleep(5) + try: + cookies = [i["value"] for i in driver.get_cookies() if i["name"] == "Session_id"][0] + conn = sqlite3.connect('db.sql') + cur = conn.cursor() + cur.execute("INSERT INTO yandex (user_id, Session_id) VALUES (?, ?)", (message.from_user.id, str(cookies))) + conn.commit() + conn.close() + await message.reply("Ваш аккаунт добавлен") + except IndexError: + await message.reply("Ошибка пароля или логина") + +async def statistic(message: types.Message): + conn = sqlite3.connect('db.sql') + cur = conn.cursor() + response = cur.execute("SELECT * FROM yandex WHERE user_id=?", (message.from_user.id,)).fetchall() + conn.close() + if not response: + await message.reply("Сначала используйте /create_yandex с логином и паролем для добавление аккаунта") + cookies = {"Session_id": response[0][2]} + response = requests.get("https://lyceum.yandex.ru/api/notifications?isRead=false&limit=20", cookies=cookies) + await message.reply(f'У вас {response.json()["unreadCount"]} уведомлений. Прочитайте хоть') diff --git a/test.py b/test.py index e69de29..f430d51 100644 --- a/test.py +++ b/test.py @@ -0,0 +1,198 @@ +from flask import Flask, request, jsonify +import logging +import random + +app = Flask(__name__) + +logging.basicConfig(level=logging.INFO) + +cities = { + 'москва': [['1540737/daa6e420d33102bf6947', '213044/7df73ae4cc715175059e'], "Россия"], + 'нью-йорк': [['1652229/728d5c86707054d4745f', '1030494/aca7ed7acefde2606bdc']], + 'париж': [["1652229/f77136c2364eb90a3ea8", '123494/aca7ed7acefd12e606bdc']] +} + +sessionStorage = {} + + +@app.route('/post', methods=['POST']) +def main(): + logging.info('Request: %r', request.json) + response = { + 'session': request.json['session'], + 'version': request.json['version'], + 'response': { + 'end_session': False + } + } + handle_dialog(response, request.json) + logging.info('Response: %r', response) + return jsonify(response) + + +def handle_dialog(res, req): + user_id = req['session']['user_id'] + if req['session']['new']: + res['response']['text'] = 'Привет! Назови своё имя!' + sessionStorage[user_id] = { + 'first_name': None, + 'game_started': False + } + return + + if sessionStorage[user_id]['first_name'] is None: + first_name = get_first_name(req) + if first_name is None: + res['response']['text'] = 'Не расслышала имя. Повтори, пожалуйста!' + else: + sessionStorage[user_id]['first_name'] = first_name + sessionStorage[user_id]['guessed_cities'] = [] + res['response']['text'] = f'Приятно познакомиться, {first_name.title()}. Я Алиса. Отгадаешь город по фото?' + res['response']['buttons'] = [ + { + 'title': 'Да', + 'hide': True + }, + { + 'title': 'Нет', + 'hide': True + } + ] + else: + if not sessionStorage[user_id]['game_started']: + if 'да' in req['request']['nlu']['tokens']: + if len(sessionStorage[user_id]['guessed_cities']) == 3: + res['response']['text'] = 'Ты отгадал все города!' + res['end_session'] = True + else: + sessionStorage[user_id]['game_started'] = True + sessionStorage[user_id]['attempt'] = 1 + play_game(res, req) + elif 'нет' in req['request']['nlu']['tokens']: + res['response']['text'] = 'Ну и ладно!' + res['end_session'] = True + else: + res['response']['text'] = 'Не поняла ответа! Так да или нет?' + res['response']['buttons'] = [ + { + 'title': 'Да', + 'hide': True + }, + { + 'title': 'Нет', + 'hide': True + } + ] + else: + play_game(res, req) + + +def play_game(res, req): + user_id = req['session']['user_id'] + city = random.choice(list(cities.keys())) + while city in sessionStorage[user_id]['guessed_cities']: + city = random.choice(list(cities.keys())) + sessionStorage[user_id]['city'] = city + sessionStorage[user_id]['country'] = cities[city][1] + sessionStorage[user_id]['guessed_cities'].append(city) + images = cities[city][0] + res['response']['card'] = {} + res['response']['card']['type'] = 'BigImage' + res['response']['card']['title'] = 'Что это за город?' + res['response']['card']['image_id'] = random.choice(images) + res['response']['text'] = 'Тогда сыграем! Как называется этот город?' + + +def check_city(res, req): + user_id = req['session']['user_id'] + if req['request']['original_utterance'].lower() == sessionStorage[user_id]['city']: + if len(sessionStorage[user_id]['guessed_cities']) == 3: + res['response']['text'] = f'Правильно! Ты отгадал все города!' + res['end_session'] = True + else: + res['response']['text'] = f'Правильно! Следующий город - {play_game(res, req)}' + sessionStorage[user_id]['game_started'] = False + del sessionStorage[user_id]['attempt'] + + # Добавляем вопрос о стране + res['response']['buttons'] = [ + { + 'title': 'Да', + 'hide': True, + }, + { + 'title': 'Нет', + 'hide': True, + } + ] + else: + if sessionStorage[user_id]['attempt'] == 3: + res['response'][ + 'text'] = f'Вы проиграли! Правильный ответ - {sessionStorage[user_id]["city"]}. Сыграем еще?' + del sessionStorage[user_id]['attempt'] + sessionStorage[user_id]['game_started'] = False + res['response']['buttons'] = [ + { + 'title': 'Да', + 'hide': True, + }, + { + 'title': 'Нет', + 'hide': True, + } + ] + else: + sessionStorage[user_id]['attempt'] += 1 + res['response']['text'] = f'Неправильно. Попробуй еще раз!' + + +def check_country(res, req): + user_id = req['session']['user_id'] + if req['request']['original_utterance'].lower() == sessionStorage[user_id]['country']: + res['response']['text'] = f'Правильно! Следующий город - {play_game(res, req)}' + del sessionStorage[user_id]['attempt'] + res['response']['buttons'] = [ + { + 'title': 'Да', + 'hide': True, + }, + { + 'title': 'Нет', + 'hide': True, + } + ] + else: + if sessionStorage[user_id]['attempt'] == 3: + res['response'][ + 'text'] = f'Вы проиграли! Правильный ответ - {sessionStorage[user_id]["country"]}. Сыграем еще?' + del sessionStorage[user_id]['attempt'] + sessionStorage[user_id]['game_started'] = False + res['response']['buttons'] = [ + { + 'title': 'Да', + 'hide': True, + }, + { + 'title': 'Нет', + 'hide': True, + } + ] + else: + sessionStorage[user_id]['attempt'] += 1 + res['response']['text'] = f'Неправильно. Попробуй еще раз!' + + +def get_city(req): + for entity in req['request']['nlu']['entities']: + if entity['type'] == 'YANDEX.GEO': + return entity['value'].get('city', None) + + +def get_first_name(req): + for entity in req['request']['nlu']['entities']: + if entity['type'] == 'YANDEX.FIO': + return entity['value'].get('first_name', None) + + +if __name__ == '__main__': + app.run(port=52520)