Собрался, я, значится, свой говномесседжер для вконтактика запилить на pyqt. Само собой, все запросы к вк должны из отдельного потока идти, однако, вконтакт иногда запрашивает капчу, скотина эдакая. Кто-нибудь что-то подобное делал? С какой стороны к этой проблеме подойти вообще? Пока думаю для потока запросов использовать наследника QtCore.QThread с переопределённым run(), для работы с контактом - vk_api. Получается что-то такое:
#!/usr/bin/python3
'''
Created on 20 янв. 2017 г.
@author: metallikus
'''
from PyQt5 import QtCore, QtWidgets, Qt
import vk_api
import datetime
import time
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
QtWidgets.QMainWindow.__init__(self, parent)
self.loginInput = QtWidgets.QLineEdit()
self.passInput = QtWidgets.QLineEdit()
self.urlInput = QtWidgets.QLineEdit()
self.startButton = QtWidgets.QPushButton("spam!")
self.setCentralWidget(QtWidgets.QWidget())
self.centralWidget().setLayout(QtWidgets.QVBoxLayout())
self.centralWidget().layout().addWidget(QtWidgets.QLabel("Логин:"))
self.centralWidget().layout().addWidget(self.loginInput)
self.centralWidget().layout().addWidget(QtWidgets.QLabel("Пароль:"))
self.centralWidget().layout().addWidget(self.passInput)
self.centralWidget().layout().addWidget(QtWidgets.QLabel("Url жертвы:"))
self.centralWidget().layout().addWidget(self.urlInput)
self.centralWidget().layout().addSpacerItem(QtWidgets.QSpacerItem(0,
5,
QtWidgets.QSizePolicy.Fixed,
QtWidgets.QSizePolicy.Expanding))
self.centralWidget().layout().addWidget(self.startButton)
self.startButton.clicked.connect(self.startSpam)
def startSpam(self):
if (len(self.loginInput.text()) > 0 and
len(self.passInput.text()) > 0 and
len(self.urlInput.text()) > 0):
self.msgSender = MsgSender(self.loginInput.text(),
self.passInput.text(),
self.urlInput.text())
self.msgSender.start()
else:
QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning,
"egg",
"Заполните все поля, пожалуйста!",
QtWidgets.QMessageBox.Ok, self).show()
class CaptchaWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setLayout(QtWidgets.QVBoxLayout())
self.layout().addWidget(QtWidgets.QLabel("Капча вылезла!"))
class MsgSender(QtCore.QThread):
printTxt = QtCore.pyqtSignal(str) #сигнал для передачи текста родителю
def __init__(self, login=None, password=None, url=None, parent=None):
QtCore.QThread.__init__(self, parent)
self.login = login
self.password = password
self.url = url
def captchaHandler(self, captcha):
key = """
Как-то запросить ввод капчи из гуи-потока, но, блин, как, мать его?
"""
print("Капча, блин")
return captcha.try_again(key)
def run(self):
vk1 = vk_api.VkApi(self.login, self.password, captcha_handler=self.captchaHandler)
vk1.authorization()
screenName = self.url.strip().split("/")[-1]
userId = vk1.method("users.get", {"user_ids": screenName})[0]["id"]
while True:
vk1.method("messages.send",{"user_id": userId,
"message":datetime.datetime.now(),
"random_id":int(datetime.datetime.now().timestamp())})
def run():
import sys
app = Qt.QApplication(sys.argv)
window = MainWindow()
window.setWindowTitle("Заголовок")
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
run()
На месте “Как-то запросить ввод капчи из гуи-потока…” нужно какой-то mutex или ещё чего использовать… Вот хотелось бы узнать что именно? Или вообще QtCore.QThread тут не прокатит? А что тогда?