#!/usr/bin/python3 # -*- coding: utf-8 -*- from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QDialog from search import Ui_SearchDialog from jsonIO import jsonIO from requests import post, get from urllib.parse import urlencode header = { "User-Agent": "", "Authorization": "" } tokens_filename = "tokens.json" class SearchDialog(QDialog, Ui_SearchDialog): def __init__(self, parent=None): QDialog.__init__(self, parent, flags=Qt.Window) Ui_SearchDialog.__init__(self) self.ui = Ui_SearchDialog() self.ui.setupUi(self) self.parent = parent # import tokens from tokens_filename if not jsonIO.is_valid_json(tokens_filename): jsonIO.save_json(tokens_filename, { "oauth_app_name": "", "client_id": "", "client_secret": "", "authorization_code": "", "access_token": "", "refresh_token": "" }) QMessageBox.critical(self, "Ошибка", "Заполните 'tokens.json' своими данными чтобы поиск работал корректно!") self.close() else: self.tokens = jsonIO.load_json(tokens_filename) for key, value in self.tokens.items(): if (key != "access_token" or key != "refresh_token") and value == "": QMessageBox.critical(self, "Ошибка", "Заполните 'tokens.json' своими данными чтобы поиск работал корректно!") self.close() if self.tokens["access_token"] == "": self.get_new_access_token() self.update_headers() self.ui.search.clicked.connect(self.search_titles) def update_headers(self): header["User-Agent"] = self.tokens["oauth_app_name"] header["Authorization"] = "Bearer {}".format(self.tokens["access_token"]) def get_new_access_token(self): response = post("https://shikimori.one/oauth/token", headers=header, data={ "grant_type": "authorization_code", "client_id": self.tokens["client_id"], "client_secret": self.tokens["client_secret"], "code": self.tokens["authorization_code"], }) if response.status_code == 200: new_tokens = response.json() self.tokens["access_token"] = new_tokens["access_token"] self.tokens["refresh_token"] = new_tokens["refresh_token"] jsonIO.save_json(tokens_filename, self.tokens) self.update_headers() print("got new tokens") def refresh_access_token(self): response = post("https://shikimori.one/oauth/token", headers=header, data={ "grant_type": "refresh_token", "client_id": self.tokens["client_id"], "client_secret": self.tokens["client_secret"], "refresh_token": self.tokens["refresh_token"], }) if response.status_code == 200: new_tokens = response.json() self.tokens["access_token"] = new_tokens["access_token"] self.tokens["refresh_token"] = new_tokens["refresh_token"] jsonIO.save_json(tokens_filename, self.tokens) self.update_headers() print("tokens updated", new_tokens) def search_titles(self): title_name = self.ui.to_search.text() if len(title_name) == 0: QMessageBox.critical(self, "Ошибка", "Введите название тайтла.") return response = get("https://shikimori.one/api/animes", headers=header, params={"search": title_name, "limit": 25}) # print(response.json()) if response.status_code == 401: if response.json()["error"] == "invalid_token": self.refresh_access_token() # self.search_titles() return if response.status_code == 200: found_titles = response.json() if len(found_titles) == 0: QMessageBox.information(self, "Информация", "Ничего не найдено. Попробуйте еще раз.") return self.ui.search_list.clear() for data in found_titles: item = QListWidgetItem() if data["russian"] != "": item.setText("{} | {}".format(data["russian"], data["name"])) else: item.setText(data["name"]) item.setData(1, data["id"]) self.ui.search_list.addItem(item)