доделал работу с api yandex lyceum теперь без костылей

This commit is contained in:
2023-04-22 13:34:23 +07:00
parent 3176029cd2
commit 9aca8ad10e
5 changed files with 257 additions and 26 deletions
+7 -25
View File
@@ -1,14 +1,8 @@
from aiogram.utils import executor from aiogram.utils import executor
from loguru import logger from loguru import logger
from aiogram import Bot, Dispatcher, types 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 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") # создаю объект бота bot = Bot(token="5941118321:AAG0g0keLrlnuH_9U9X6ehpFFAdOX38qeXI") # создаю объект бота
dp = Dispatcher(bot) # создаю объект слушателя dp = Dispatcher(bot) # создаю объект слушателя
@@ -29,24 +23,12 @@ async def start(message: types.Message):
@dp.message_handler(commands=['statistic']) @dp.message_handler(commands=['statistic'])
async def statistic(message: types.Message): async def statistic(message: types.Message):
login = "Dmitrium12" await yandex.statistic(message)
password = ""
options = webdriver.ChromeOptions()
options.add_argument("--headless") @dp.message_handler(commands=['create_yandex'])
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) async def create_yandex(message: types.Message):
driver.get('https://passport.yandex.ru/auth/') await yandex.create_yandex(message)
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"]} уведомлений. Прочитайте хоть')
@dp.message_handler(commands=['r']) @dp.message_handler(commands=['r'])
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -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:])}) message_send.append({"role": "user", "content": ' '.join(message.text.split()[1:])})
except sqlite3.OperationalError: except sqlite3.OperationalError:
message_send = [{"role": "user", "content": ' '.join(message.text.split()[1:])}] message_send = [{"role": "user", "content": ' '.join(message.text.split()[1:])}]
print(message_sendко) print(message_send)
response = openai.ChatCompletion.create( response = openai.ChatCompletion.create(
model="gpt-3.5-turbo", model="gpt-3.5-turbo",
messages=message_send, messages=message_send,
+51
View File
@@ -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"]} уведомлений. Прочитайте хоть')
+198
View File
@@ -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)