Advertisement
stuppid_bot

Untitled

Jan 26th, 2016
505
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.31 KB | None | 0 0
  1. from .ui_auth import Ui_Auth
  2. from PyQt5.QtCore import Qt, QUrl
  3. from PyQt5.QtGui import QImage, QPixmap
  4. from PyQt5.QtWebKitWidgets import QWebView
  5. from PyQt5.QtWidgets import QDialog
  6. import logging
  7. import time
  8. import urllib.parse
  9.  
  10.  
  11. AUTH_URL = "https://oauth.vk.com"
  12.  
  13.  
  14. class DirectAuth(QDialog):
  15.     def __init__(self, client):
  16.         super(QDialog, self).__init__()
  17.         self.client = client
  18.         self.logger = logging.getLogger('.'.join([
  19.             __name__, self.__class__.__name__]))
  20.         self.captcha_img = None
  21.         self.captcha_sid = None
  22.         self.ui = Ui_Auth()
  23.         self.ui.setupUi(self)
  24.         # self.setWindowModality(Qt.NonModal)
  25.         self.hide_error()
  26.         self.hide_captcha()
  27.         self.connect_slots()
  28.  
  29.     def connect_slots(self):
  30.         # Убираем пробелы у значений полей
  31.         """self.ui.username_line.editingFinished.connect(
  32.            lambda: self.ui.username_line.setText(
  33.                self.ui.username_line.text().strip()))
  34.        self.ui.password_line.editingFinished.connect(
  35.            lambda: self.ui.password_line.setText(
  36.                self.ui.password_line.text().strip()))
  37.        self.ui.captcha_line.editingFinished.connect(
  38.            lambda: self.ui.captcha_line.setText(
  39.                self.ui.captcha_line.text().strip()))"""
  40.         self.ui.refresh_captcha_button.clicked.connect(self.load_captcha)
  41.         self.ui.login_button.clicked.connect(self.login)
  42.  
  43.     def login(self):
  44.         username = self.ui.username_line.text()
  45.         if not username:
  46.             self.ui.username_line.setFocus()
  47.             self.show_error('Username required')
  48.             return
  49.         password = self.ui.password_line.text()
  50.         if not password:
  51.             self.ui.password_line.setFocus()
  52.             self.show_error('Password required')
  53.             return
  54.         params = {
  55.             'username': username,
  56.             'password': password,
  57.             'grant_type': 'password',
  58.             'v': self.client.api_version,
  59.             'client_id': self.client.client_id,
  60.             'client_secret': self.client.client_secret,
  61.             'test_redirect_uri': 1,
  62.         }
  63.         if self.client.scope:
  64.             params['scope'] = self.client.scope
  65.         if self.ui.captcha_frame.isVisible():
  66.             params['captcha_sid'] = self.captcha_sid
  67.             params['captcha_key'] = self.ui.captcha_line.text()
  68.         response = self.client.get(
  69.             urllib.parse.urljoin(AUTH_URL, 'token'), params)
  70.         if 'captcha_sid' in response:
  71.             self.captcha_img = response.captcha_img
  72.             self.captcha_sid = response.captcha_sid
  73.             self.show_error('Captcha required')
  74.             self.show_captcha()
  75.             return
  76.         if 'redirect_uri' in response:
  77.             print(self.client.qapp)
  78.             w = BrowserAuth(self.client, response.redirect_uri)
  79.             # w.exec_()
  80.             w.show()
  81.             # self.client.qapp.exec_()
  82.             """
  83.            try:
  84.                self.client.qapp.exec_()
  85.            except AuthError:
  86.                self.reject()
  87.            if self.client.access_token:
  88.                self.accept()
  89.            self.reject()"""
  90.             return
  91.         if 'error' in response:
  92.             self.logger.warning("Error response: %s", response)
  93.             self.ui.password_line.clear()
  94.             self.ui.username_line.setFocus()
  95.             self.ui.username_line.selectAll()
  96.             self.show_error(
  97.                 response.get('error_description') or response.error)
  98.             self.hide_captcha()
  99.             return
  100.         self.client.access_token = response.access_token
  101.         self.client.user_id = response.user_id
  102.         self.client.secret_token = response.get('secret')
  103.         self.client.token_expiry = response.expires_in
  104.         if self.client.token_expiry:
  105.             self.client.token_expiry += time.time()
  106.         self.logger.info('Authentication successful')
  107.         self.accept()
  108.  
  109.     def hide_error(self):
  110.         self.ui.error_label.hide()
  111.  
  112.     def show_error(self, message):
  113.         self.ui.error_label.setText(self.tr(message))
  114.         self.ui.error_label.show()
  115.  
  116.     def hide_captcha(self):
  117.         self.ui.captcha_frame.hide()
  118.  
  119.     def show_captcha(self):
  120.         self.load_captcha()
  121.         self.ui.captcha_frame.show()
  122.  
  123.     def load_captcha(self):
  124.         data = self.client.http.get(self.captcha_img).content
  125.         pix = QPixmap.fromImage(QImage.fromData(data))
  126.         self.ui.captcha_image.setPixmap(pix)
  127.         self.ui.captcha_line.clear()
  128.         self.ui.captcha_line.setFocus()
  129.  
  130.  
  131. class BrowserAuth(QWebView):
  132.     def __init__(self, client, url, parent=None):
  133.         self.client = client
  134.         self.url = url
  135.         super(QWebView, self).__init__(parent)
  136.         self.setUrl(QUrl(url))
  137.         self.setWindowModality(Qt.ApplicationModal)
  138.  
  139.     def titleChaged(self, title):
  140.         self.setWindowTitle(title)
  141.  
  142.     def urlChanged(self, url):
  143.         if not url.hasFragment():
  144.             return
  145.         result = dict(urllib.parse.parse_qsl(url.fragment))
  146.         if 'error' in result:
  147.             self.close()
  148.             raise AuthError(result.get('error_description') or result.error)
  149.         self.client.access_token = result['access_token']
  150.         self.client.user_id = int(result['user_id'])
  151.         self.client.secret_token = result.get('secret')
  152.         self.client.token_expiry = int(result['expires_in'])
  153.         if self.client.token_expiry:
  154.             self.client.token_expiry += time.time()
  155.         self.close()
  156.  
  157.  
  158. class StandaloneAuth(BrowserAuth):
  159.     def __init__(self, client, display=None, redirect_uri=None, parent=None):
  160.         self.display = display
  161.         self.redirect_uri = redirect_uri
  162.         params = {
  163.             'client_id': client.client_id,
  164.             'redirect_uri': redirect_uri,
  165.             'response_type': 'token',
  166.             'v': client.api_version,
  167.         }
  168.         if client.scope:
  169.             params['scope'] = client.scope
  170.         if display:
  171.             params['display'] = display
  172.         url = urllib.parse.urljoin(AUTH_URL, 'authorize')
  173.         url = "{}?{}".format(url, urllib.parse.urlencode(params))
  174.         super(BrowserAuth, self).__init__(client, url, parent)
  175.  
  176.  
  177. class AuthError(Exception):
  178.     pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement