Advertisement
stuppid_bot

govno

Jan 12th, 2015
442
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.65 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from PyQt5.QtWidgets import QApplication, QDialog, QLineEdit, QMessageBox
  3. from PyQt5.QtCore import Qt
  4. from PyQt5.QtGui import QPixmap
  5. from ui.login import Ui_LoginDialog
  6. from ui.captcha import Ui_CaptchaDialog
  7. from vkapi import VkClient, VkError
  8. import os
  9.  
  10. IPHONE_CLIENT_ID=3140623
  11. IPHONE_CLIENT_SECRET="VeWdmVclDCtn6ihuP1nt"
  12. DEFAULT_PERMISSIONS="notify,friends,photos,audio,video,docs,notes,pages,status,offers,questions,wall,groups,messages,email,notifications,stats,ads,offline"
  13. API_VERSION = 5.27
  14. API_DELAY = 0.34
  15. TOKEN_FILE = 'data/access_token.txt'
  16.  
  17. class BaseApp(VkClient):
  18.     def __init__(self,
  19.                  client_id=IPHONE_CLIENT_ID,
  20.                  client_secret=IPHONE_CLIENT_SECRET,
  21.                  permissions=DEFAULT_PERMISSIONS,
  22.                  api_version=API_VERSION,  
  23.                  api_delay=API_DELAY,
  24.                  token_file=TOKEN_FILE):    
  25.         VkClient.__init__(self)
  26.         self.tokenFile = token_file
  27.         self.clientId = client_id
  28.         self.clientSecret = client_secret
  29.         self.permissions = permissions
  30.         self.apiVersion = api_version
  31.         self.apiDelay = api_delay
  32.        
  33.         self.userId = None
  34.         self.isAuthed = True
  35.         self.qApp = QApplication([])
  36.         self.mainWindow = None
  37.        
  38.         try:
  39.             self.accessToken = open(self.tokenFile).read()
  40.         except:
  41.             pass
  42.        
  43.         try:
  44.             users = self.users.get()
  45.             self.userId = users[0]['id']
  46.         except VkError:
  47.             self.isAuthed = False
  48.             self.showLoginDialog()
  49.            
  50.         if not self.isAuthed:
  51.             raise SystemExit
  52.            
  53.     def run(self):
  54.         raise RuntimeError("Not implemented yet.")
  55.  
  56.     def showLoginDialog(self):
  57.         self.mainWindow = LoginDialog(self)
  58.         self.mainWindow.show()
  59.         self.qApp.exec_()
  60.        
  61.     def login(self, username, password):
  62.         username = username.strip()
  63.         password = password.strip()
  64.         error = ""
  65.        
  66.         if not username:
  67.             error = "Введите имя пользователя."
  68.         elif not password:
  69.             error = "Введите пароль."
  70.         else:
  71.             r = self._auth(username, password)
  72.            
  73.             if 'access_token' in r:
  74.                 self.accessToken = r['access_token']
  75.                 self.userId = r['user_id']
  76.                 self.isAuthed = True
  77.                
  78.                 with open(self.tokenFile, 'w') as f:
  79.                     f.write(self.accessToken)
  80.                
  81.                 self.mainWindow.close()
  82.                 self.mainWindow = None
  83.                 return
  84.            
  85.             error = r['error']
  86.            
  87.             if 'error_description' in r:
  88.                 error += ': ' + r['error_description']
  89.        
  90.         self.mainWindow.showError(error)
  91.        
  92.     def _auth(self, username, password, captcha_key=None, captcha_sid=None):
  93.         params = dict(username=username,
  94.                       password=password,
  95.                       client_id=self.clientId,
  96.                       client_secret=self.clientSecret,
  97.                       scope=self.permissions,
  98.                       grant_type='password')
  99.        
  100.         if captcha_key:
  101.             params['captcha_key'] = captcha_key
  102.             params['captcha_sid'] = captcha_sid
  103.            
  104.         r = self.session.post('https://oauth.vk.com/token', params).json()
  105.        
  106.         if 'error' in r:
  107.             if r['error'] == 'need_captcha':
  108.                 captcha_key = self.solveCaptcha(r['captcha_img'])
  109.                
  110.                 # Если введена капча отправляем запрос еще раз.
  111.                 if captcha_key is not False:
  112.                     return self._auth(username, password, captcha_key,
  113.                                       r['captcha_sid'])
  114.                  
  115.         return r
  116.  
  117.     def solveCaptcha(self, url):
  118.         data = self.session.get(url).content
  119.         dialog = CaptchaDialog(self.mainWindow)
  120.         dialog.setCaptchaImage(data)
  121.        
  122.         if dialog.exec_():
  123.             return str(dialog.lineEdit_captcha.text())
  124.        
  125.         return False
  126.    
  127.     def logout(self):
  128.         self.accessToken = None
  129.         self.userId = None
  130.         self.isAuthed = False
  131.        
  132.         try:
  133.             os.unlink(self.tokenFile)
  134.         except:
  135.             pass
  136.        
  137.         try:
  138.             self.mainWindow.close()
  139.         except:
  140.             pass
  141.    
  142.     def captchaHandler(self, error):
  143.         params = dict(error.params)
  144.         captcha_key = self.solveCaptcha(error.captchaImg)
  145.        
  146.         if captcha_key is not False:
  147.             params['captcha_key'] = captcha_key
  148.             params['captcha_sid'] = error.captchaSid
  149.             return self.api(error.method, params)
  150.        
  151.         raise error
  152.    
  153.     def log(self, s):
  154.         print(s)
  155.  
  156. class LoginDialog(QDialog, Ui_LoginDialog):
  157.     def __init__(self, controller):
  158.         QDialog.__init__(self)
  159.         self.setupUi(self)
  160.         self.controller = controller
  161.         sz = self.size()
  162.         self.setFixedSize(sz.width(), sz.height())
  163.         # Убираем кнопку "?"
  164.         # self.setWindowFlags(self.windowFlags() &
  165.         #                     ~Qt.WindowContextHelpButtonHint)      
  166.         self.lineEdit_password.setEchoMode(QLineEdit.Password)  
  167.         self.checkBox_showPassword.stateChanged.connect(self.showHidePassword)  
  168.         self.pushButton_login.clicked.connect(self.onLogin)
  169.        
  170.     def showHidePassword(self, state):
  171.         mode = QLineEdit.Normal if state == 2 else QLineEdit.Password
  172.         self.lineEdit_password.setEchoMode(mode)
  173.        
  174.     def onLogin(self):
  175.         username = str(self.lineEdit_username.text())
  176.         password = str(self.lineEdit_password.text())
  177.         self.pushButton_login.setDisabled(True)
  178.         self.controller.login(username, password)
  179.         self.pushButton_login.setEnabled(True)
  180.        
  181.     def showError(self, message):
  182.         QMessageBox.critical(self, "Ошибка", message)
  183.        
  184. class CaptchaDialog(QDialog, Ui_CaptchaDialog):
  185.     def __init__(self, parent=None):
  186.         QDialog.__init__(self, parent)
  187.         self.setupUi(self)
  188.         self.parent = parent
  189.         sz = self.size()
  190.         self.setFixedSize(sz.width(), sz.height())    
  191.        
  192.     def setCaptchaImage(self, imdata):
  193.         pixmap = QPixmap()
  194.         pixmap.loadFromData(imdata)
  195.         self.label_captcha.setPixmap(pixmap)
  196.        
  197. if __name__ == '__main__':
  198.     app = BaseApp()
  199.     app.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement