commit b3e654691e6ba9fed7ad776e0fe4918d6dff0d3c Author: bdrtr Date: Sat Aug 10 15:27:15 2024 +0200 opne-beta diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bf2d2f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,103 @@ +# Sanal ortam +venv/ +.venv/ +env/ +.env/ +*.env + +myenv/ +.myenv/ +myenv/ +*.myenv +myenv + +# PyCharm ve diğer IDE'lere özgü dosyalar +.idea/ +*.iml + +# Python bytecode dosyaları +__pycache__/ +*.pyc +*.pyo +*.pyd + +# Diğer geçici dosyalar +*.log +*.tmp + +#accounts +*.txt + +# Python bytecode dosyaları +__pycache__/ +*.pyc +*.pyo +*.pyd + +# Sanal ortam klasörleri +venv/ +.env/ +.venv/ +ENV/ +env/ +venv.bak/ + +# Pipenv dosyaları +Pipfile.lock + +# Python distribütörleri tarafından oluşturulan dosyalar +*.egg-info/ +dist/ +build/ +.eggs/ + +# Test çıktıları +nosetests.xml +coverage.xml +*.cover +*.py,cover +*.hypothesis/ +*.tox/ +*.nox/ +.coverage +.cache +*.log + +# IDE/Editor dosyaları +.vscode/ +.idea/ +*.sublime-project +*.sublime-workspace + +# Çeşitli geçici dosyalar +*.tmp +*.bak +*.swp +*.swo + +# Jupyter Notebook dosyaları +.ipynb_checkpoints/ + +# Sistem dosyaları +.DS_Store +Thumbs.db + +# PyCharm kullanıcı dosyaları +*.iml +.idea/ + + +#--- +DAFAM/__pycache__/ +DAFAM/.qrcreator/ +DAFAM/sources/DAFAM.pyproject +DAFAM/sources/DAFAM.pyproject.user +DAFAM/sources/form.ui +DAFAM/sources/form.ui.autosave +DAFAM/.qtcreator + +*.ui +*.user +*.project +*.autosave +*.qtcreator \ No newline at end of file diff --git a/DAFAM/DAFAM.pyproject b/DAFAM/DAFAM.pyproject new file mode 100644 index 0000000..b9db497 --- /dev/null +++ b/DAFAM/DAFAM.pyproject @@ -0,0 +1,6 @@ +{ + "files": [ + "mainwindow.py", + "form.ui" + ] +} diff --git a/DAFAM/sources/back-button.png b/DAFAM/sources/back-button.png new file mode 100644 index 0000000..e9eff21 Binary files /dev/null and b/DAFAM/sources/back-button.png differ diff --git a/DAFAM/sources/compile.png b/DAFAM/sources/compile.png new file mode 100644 index 0000000..b9b6ef4 Binary files /dev/null and b/DAFAM/sources/compile.png differ diff --git a/DAFAM/sources/dafam.png b/DAFAM/sources/dafam.png new file mode 100644 index 0000000..72fe57b Binary files /dev/null and b/DAFAM/sources/dafam.png differ diff --git a/DAFAM/sources/diskette.png b/DAFAM/sources/diskette.png new file mode 100644 index 0000000..49f89eb Binary files /dev/null and b/DAFAM/sources/diskette.png differ diff --git a/DAFAM/sources/next_button.png b/DAFAM/sources/next_button.png new file mode 100644 index 0000000..c87a447 Binary files /dev/null and b/DAFAM/sources/next_button.png differ diff --git a/DAFAM/ui_form.py b/DAFAM/ui_form.py new file mode 100644 index 0000000..7322dba --- /dev/null +++ b/DAFAM/ui_form.py @@ -0,0 +1,315 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'form.ui' +## +## Created by: Qt User Interface Compiler version 6.7.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QGraphicsView, QLabel, QListWidget, + QListWidgetItem, QMainWindow, QPlainTextEdit, QPushButton, + QSizePolicy, QStackedWidget, QStatusBar, QWidget) + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + if not MainWindow.objectName(): + MainWindow.setObjectName(u"MainWindow") + MainWindow.resize(1258, 631) + MainWindow.setStyleSheet(u"QMainWindow {\n" +" background:#003049;\n" +"}") + self.centralwidget = QWidget(MainWindow) + self.centralwidget.setObjectName(u"centralwidget") + self.stackedWidget = QStackedWidget(self.centralwidget) + self.stackedWidget.setObjectName(u"stackedWidget") + self.stackedWidget.setGeometry(QRect(10, 10, 1231, 581)) + self.stackedWidget.setStyleSheet(u"QFrame {\n" +" background-color:#001d3d;\n" +" border-radius:10px;\n" +"}") + self.home_page = QWidget() + self.home_page.setObjectName(u"home_page") + self.home_list = QListWidget(self.home_page) + self.home_list.setObjectName(u"home_list") + self.home_list.setGeometry(QRect(160, 20, 451, 551)) + self.home_list.setStyleSheet(u"QListWidget {\n" +" font: 800 11pt \"Ubuntu Sans\";\n" +" font: 500 11pt \"Ubuntu Sans\";\n" +" color: rgb(0, 0, 0);\n" +" background:rgb(255,255,255);\n" +" border-radius:20px;\n" +" text-align: center;\n" +"}\n" +"\n" +"QListWidget::item {\n" +" text-align:center;\n" +" color:black;\n" +" margin:5px;\n" +"\n" +"\n" +"}") + self.home_plain_text = QPlainTextEdit(self.home_page) + self.home_plain_text.setObjectName(u"home_plain_text") + self.home_plain_text.setGeometry(QRect(633, 29, 371, 161)) + self.home_plain_text.setStyleSheet(u"QPlainTextEdit {\n" +"background-color:#001d3d;\n" +"color:white;\n" +"}") + self.home_save_button = QPushButton(self.home_page) + self.home_save_button.setObjectName(u"home_save_button") + self.home_save_button.setGeometry(QRect(1070, 50, 88, 26)) + self.home_save_button.setStyleSheet(u"QPushButton {\n" +" background-color:white;\n" +" color:black;\n" +"}") + icon = QIcon() + icon.addFile(u"sources/diskette.png", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.home_save_button.setIcon(icon) + self.home_next_button = QPushButton(self.home_page) + self.home_next_button.setObjectName(u"home_next_button") + self.home_next_button.setGeometry(QRect(1070, 10, 88, 26)) + self.home_next_button.setStyleSheet(u"QPushButton {\n" +" background-color:white;\n" +"}") + icon1 = QIcon() + icon1.addFile(u"sources/next_button.png", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.home_next_button.setIcon(icon1) + self.widget = QWidget(self.home_page) + self.widget.setObjectName(u"widget") + self.widget.setGeometry(QRect(10, 30, 141, 501)) + self.widget.setStyleSheet(u"QWidget {\n" +" background-color:#003566;\n" +" border-radius:50px;\n" +"}") + self.home_widget_left = QWidget(self.widget) + self.home_widget_left.setObjectName(u"home_widget_left") + self.home_widget_left.setGeometry(QRect(10, 70, 121, 321)) + self.home_widget_left.setLayoutDirection(Qt.LeftToRight) + self.home_widget_left.setAutoFillBackground(False) + self.home_widget_left.setStyleSheet(u"QWidget {\n" +" background:#fca311;\n" +" border-radius:10px;\n" +"}\n" +"\n" +"") + self.home_show_account = QPushButton(self.home_widget_left) + self.home_show_account.setObjectName(u"home_show_account") + self.home_show_account.setGeometry(QRect(10, 70, 88, 26)) + self.home_show_account.setStyleSheet(u"QPushButton {\n" +" background-color: #003566;\n" +" color: rgb(255, 255, 255);\n" +" font: 600 11pt \"URW Bookman\";\n" +"}\n" +"\n" +"QPushButton:hover {\n" +" \n" +" background-color: rgb(246, 211, 45);\n" +" color:#003566;\n" +"}") + self.home_show_account.setAutoDefault(True) + self.label = QLabel(self.home_widget_left) + self.label.setObjectName(u"label") + self.label.setGeometry(QRect(20, 30, 81, 18)) + self.label.setStyleSheet(u"QLabel {\n" +" color:rgb(255,255,255);\n" +"}\n" +"QLabel:hover {\n" +" \n" +" color: rgb(26, 95, 180);\n" +" font: 600 15pt \"Ubuntu Sans\";\n" +" font-size:20pt;\n" +"}") + self.home_run = QPushButton(self.home_widget_left) + self.home_run.setObjectName(u"home_run") + self.home_run.setGeometry(QRect(10, 130, 88, 26)) + self.home_run.setStyleSheet(u"QPushButton {\n" +" background-color: #003566;\n" +" color: rgb(255, 255, 255);\n" +" font: 600 11pt \"URW Bookman\";\n" +"}\n" +"\n" +"QPushButton:hover {\n" +" \n" +" background-color: rgb(246, 211, 45);\n" +" color:#003566;\n" +"}") + self.graphicsView = QGraphicsView(self.home_page) + self.graphicsView.setObjectName(u"graphicsView") + self.graphicsView.setGeometry(QRect(640, 230, 341, 201)) + self.graphicsView.setAutoFillBackground(False) + self.stackedWidget.addWidget(self.home_page) + self.widget.raise_() + self.home_list.raise_() + self.home_plain_text.raise_() + self.home_save_button.raise_() + self.home_next_button.raise_() + self.graphicsView.raise_() + self.code_page = QWidget() + self.code_page.setObjectName(u"code_page") + self.code_code_label = QPlainTextEdit(self.code_page) + self.code_code_label.setObjectName(u"code_code_label") + self.code_code_label.setGeometry(QRect(10, 10, 561, 551)) + self.code_code_label.setStyleSheet(u"QPlainTextEdit \n" +"{\n" +" background-color:white;\n" +" color:black;\n" +" border-radius:10px;\n" +" font: 600 12pt \"Ubuntu Sans\";\n" +"}\n" +"") + self.code_save_button = QPushButton(self.code_page) + self.code_save_button.setObjectName(u"code_save_button") + self.code_save_button.setGeometry(QRect(990, 20, 88, 26)) + self.code_save_button.setStyleSheet(u"QPushButton {\n" +" background-color: white;\n" +" color: black;\n" +" font: 600 11pt \"URW Bookman\";\n" +"}\n" +"\n" +"QPushButton:hover {\n" +" \n" +" background-color: black;\n" +" color:white;\n" +"}") + self.code_file_open = QPushButton(self.code_page) + self.code_file_open.setObjectName(u"code_file_open") + self.code_file_open.setGeometry(QRect(990, 60, 88, 26)) + self.code_file_open.setStyleSheet(u"QPushButton {\n" +" background-color: white;\n" +" color: black;\n" +" font: 600 11pt \"URW Bookman\";\n" +"}\n" +"\n" +"QPushButton:hover {\n" +" \n" +" background-color: black;\n" +" color:white;\n" +"}") + self.code_info_label = QLabel(self.code_page) + self.code_info_label.setObjectName(u"code_info_label") + self.code_info_label.setGeometry(QRect(600, 270, 601, 291)) + self.code_info_label.setStyleSheet(u"QLabel \n" +"{\n" +" background-color:white;\n" +" color:black;\n" +" border-radius:10px;\n" +" font: 600 12pt \"Ubuntu Sans\";\n" +"}\n" +"") + self.code_back_button = QPushButton(self.code_page) + self.code_back_button.setObjectName(u"code_back_button") + self.code_back_button.setGeometry(QRect(1100, 20, 88, 26)) + self.code_back_button.setStyleSheet(u"QPushButton {\n" +" background-color:white;\n" +"}") + icon2 = QIcon() + icon2.addFile(u"sources/back-button.png", QSize(), QIcon.Mode.Normal, QIcon.State.Off) + self.code_back_button.setIcon(icon2) + self.code_run_button = QPushButton(self.code_page) + self.code_run_button.setObjectName(u"code_run_button") + self.code_run_button.setGeometry(QRect(990, 120, 88, 71)) + self.code_run_button.setStyleSheet(u"QPushButton {\n" +" background-color: white;\n" +" color: black;\n" +" font: 600 11pt \"URW Bookman\";\n" +"}\n" +"\n" +"QPushButton:hover {\n" +" \n" +" background-color: black;\n" +" color:white;\n" +"}") + self.code_generate_button = QPushButton(self.code_page) + self.code_generate_button.setObjectName(u"code_generate_button") + self.code_generate_button.setGeometry(QRect(730, 230, 88, 26)) + self.code_generate_button.setStyleSheet(u"QPushButton {\n" +" background-color: white;\n" +" color: black;\n" +" font: 600 11pt \"URW Bookman\";\n" +"}\n" +"\n" +"QPushButton:hover {\n" +" \n" +" background-color: black;\n" +" color:white;\n" +"}") + self.code_prompt = QPlainTextEdit(self.code_page) + self.code_prompt.setObjectName(u"code_prompt") + self.code_prompt.setGeometry(QRect(603, 150, 351, 70)) + self.code_prompt.setStyleSheet(u"QPlainTextEdit \n" +"{\n" +" background-color:white;\n" +" color:black;\n" +" border-radius:10px;\n" +" font: 600 12pt \"Ubuntu Sans\";\n" +"}\n" +"") + self.plainTextEdit = QPlainTextEdit(self.code_page) + self.plainTextEdit.setObjectName(u"plainTextEdit") + self.plainTextEdit.setGeometry(QRect(603, 10, 341, 121)) + self.plainTextEdit.setStyleSheet(u"QPlainTextEdit {\n" +" background-color:white;\n" +" border-radius:2px;\n" +" color:black;\n" +"}") + self.stackedWidget.addWidget(self.code_page) + self.page_2 = QWidget() + self.page_2.setObjectName(u"page_2") + self.stackedWidget.addWidget(self.page_2) + self.code_notif = QLabel(self.centralwidget) + self.code_notif.setObjectName(u"code_notif") + self.code_notif.setGeometry(QRect(500, 590, 281, 18)) + self.code_notif.setStyleSheet(u"QLabel \n" +"{\n" +" color:white;\n" +" border-radius:10px;\n" +" font: 600 12pt \"Ubuntu Sans\";\n" +"}\n" +"") + self.widget_2 = QWidget(self.centralwidget) + self.widget_2.setObjectName(u"widget_2") + self.widget_2.setGeometry(QRect(70, 600, 1101, 71)) + self.widget_2.setStyleSheet(u"QWidget {\n" +"background-color:#fca311;\n" +"border-radius:20px;\n" +"}") + MainWindow.setCentralWidget(self.centralwidget) + self.statusbar = QStatusBar(MainWindow) + self.statusbar.setObjectName(u"statusbar") + MainWindow.setStatusBar(self.statusbar) + + self.retranslateUi(MainWindow) + + self.stackedWidget.setCurrentIndex(1) + + + QMetaObject.connectSlotsByName(MainWindow) + # setupUi + + def retranslateUi(self, MainWindow): + MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) + self.home_save_button.setText(QCoreApplication.translate("MainWindow", u" save", None)) + self.home_next_button.setText("") + self.home_show_account.setText(QCoreApplication.translate("MainWindow", u"show", None)) + self.label.setText(QCoreApplication.translate("MainWindow", u"ACCOUNTS", None)) + self.home_run.setText(QCoreApplication.translate("MainWindow", u"run", None)) + self.code_code_label.setPlainText(QCoreApplication.translate("MainWindow", u"code is here", None)) + self.code_save_button.setText(QCoreApplication.translate("MainWindow", u"kaydet", None)) + self.code_file_open.setText(QCoreApplication.translate("MainWindow", u"dosya a\u00e7", None)) + self.code_info_label.setText("") + self.code_back_button.setText("") + self.code_run_button.setText(QCoreApplication.translate("MainWindow", u"\u00e7al\u0131\u015ft\u0131r", None)) + self.code_generate_button.setText(QCoreApplication.translate("MainWindow", u"\u00fcret", None)) + self.code_prompt.setPlainText(QCoreApplication.translate("MainWindow", u"(prompt) >> ", None)) + self.code_notif.setText("") + # retranslateUi + diff --git a/PreDefAlgs.py b/PreDefAlgs.py new file mode 100644 index 0000000..cb0fab1 --- /dev/null +++ b/PreDefAlgs.py @@ -0,0 +1,47 @@ +from login import TrustPilot +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +import time + +class Algoritma(): + + def __init__ (self, link, type, proxy = None): + + self.platform = TrustPilot(link, type, proxy) + self.email = '' + self.passwd = '' + + def __setitem__(self, key, value): + + if key == 'email': self.email = value + + elif key == 'passwd': self.passwd = value + + + def click(self, timeout, type, value): + self.platform.find_and_click(timeout, type, value) + + def fill(self, timeout, type, value, text, num): + self.platform.find_and_fill(timeout, type, value, text, num) + + + def start(self): + #that scenario is already created for programmer and not will be change + + mail = "https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=157&ct=1722797878&rver=7.0.6738.0&wp=MBI_SSL&wreply=https%3a%2f%2foutlook.live.com%2fowa%2f%3fnlp%3d1%26cobrandid%3dab0455a0-8d03-46b9-b18b-df2f57b9e44c%26culture%3den-us%26country%3dus%26RpsCsrfState%3dc34ac037-be32-3b76-76f2-2cc383370e56&id=292841&aadredir=1&whr=outlook.de&CBCXT=out&lw=1&fl=dob%2cflname%2cwld&cobrandid=ab0455a0-8d03-46b9-b18b-df2f57b9e44c" + + self.platform.find_and_click(10,'css', "span.typography_body-l__KUYFJ.typography_appearance-action__9NNRY.link_link__IZzHN.link_underlined__OXYVM") + time.sleep(.7) + self.platform.find_and_fill(10, 'id', "email-lookup",f"{self.email}",Keys.RETURN) + self.platform.add_page(mail) + self.platform.pages_to(1) + self.platform.find_and_fill(10, 'name', "loginfmt", f"{self.email}", Keys.RETURN) + self.platform.find_and_fill(10, 'name', "passwd", f"{self.passwd}", Keys.RETURN) + self.platform.find_and_click(10,'id', "acceptButton") + self.platform.active_element_click() + time.sleep(0.5) + self.platform.get_knowledge('class', "JdFsz") + self.platform.home() + self.platform.find_and_fill(10, 'id', "verification-code-input", self.platform.result) + time.sleep(2) + self.platform.end() \ No newline at end of file diff --git a/comments.py b/comments.py new file mode 100644 index 0000000..454a443 --- /dev/null +++ b/comments.py @@ -0,0 +1,26 @@ +import google.generativeai as genai +import os +from dotenv import load_dotenv +load_dotenv() + +api_key = os.getenv('GEMINI_API_KEY') + + +class GEMINI: + + def __init__(self, _api_key, _model_name): + + self.api_key = _api_key + self.response = None + genai.configure(api_key=self.api_key) + self.model = genai.GenerativeModel(_model_name) + + + + + def set_text(self,_req_text): + self.response = self.model.generate_content(_req_text) + + def get_text(self): + return self.response.text + diff --git a/decoder.py b/decoder.py new file mode 100644 index 0000000..81162db --- /dev/null +++ b/decoder.py @@ -0,0 +1,56 @@ +from login import TrustPilot +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +import time, threading +from concurrent.futures import ThreadPoolExecutor +from logger import setup_logger +import logging + + +class AST: + + def __init__ (self, all_lines): + + self.all_lines = all_lines + self.lines = [] + + self._keys = { + "ok": "Keys.RETURN", + 'none':"Keys.ENTER" + } + + self.process_order = {} + self.base_code = """\n""" + + + self.special_keys = ['driver', 'bas', 'doldur'] + + def decode(self): + + _split_lines = self.all_lines.split('\n') + + for line in _split_lines: + + line = str.strip(line) + words = line.split(' ') + + """ driver + bas + doldur + yeni_sayfa + sayfa_degistir + aktif_elemana_tikla + eve_don + bilgi_al + + """ + + if words[0] not in self.special_keys: + return 0 + + elif words[0] in "driver": + self.base_code+=f"alg = Algoritma(link={words[1]}, type='{words[2]}')\ntime.sleep(0.5)\n" + elif words[0] in "bas": + self.base_code+=f"alg.click(10, '{words[1]}', {words[2]})\ntime.sleep(0.5)\n" + elif words[0] in "doldur": + self.base_code+=f"alg.fill(10, '{words[1]}', {words[2]}, {words[3]}, {self._keys[words[4]]})\n" diff --git a/komutlar.dfm b/komutlar.dfm new file mode 100644 index 0000000..88409ef --- /dev/null +++ b/komutlar.dfm @@ -0,0 +1,4 @@ +driver 'https://lichess.org/login?referrer=/' chrome None +doldur id 'form3-username' 'merhaba' ok +doldur id 'form3-password' 'sifre' none +bas class 'box__top' \ No newline at end of file diff --git a/logger.py b/logger.py new file mode 100644 index 0000000..67f5000 --- /dev/null +++ b/logger.py @@ -0,0 +1,9 @@ +import logging + + +def setup_logger(): + logging.basicConfig(level=logging.DEBUG, # Log seviyesini belirleyin + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # Mesaj formatı + datefmt='%Y-%m-%d %H:%M:%S', # Tarih formatı + handlers=[logging.FileHandler('app.log' ,"w"), # Dosyaya loglama + logging.StreamHandler()]) diff --git a/login.py b/login.py new file mode 100644 index 0000000..fcb77c2 --- /dev/null +++ b/login.py @@ -0,0 +1,305 @@ +""" This page created by Bedir Karaabali 04.08.2024 + it's contain trustpilot and outlook.de login process. """ + + +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.common.exceptions import TimeoutException, NoSuchElementException, WebDriverException +from logger import setup_logger +import time, re, logging + +setup_logger() +logging.getLogger(__file__) + + + +def find_clickable_content(func): + def wrapper(self, *args, **kwargs): + + _driver = args[0] + _timeout = args[1] + _finder = args[3] + + se_list = { + '0':By.ID, + '1':By.NAME, + '2':By.CSS_SELECTOR, + '3':By.CLASS_NAME + } + + _selector = se_list[f'{args[2]}'] + _req = (_selector, _finder) + + logging.info("find_clickable_content basladi") + + try: + _find_item = WebDriverWait(_driver, timeout=_timeout).until( + EC.element_to_be_clickable((_req)) + ) + _find_item.click() + + except TimeoutException as t: + logging.error(f"time out {t} \n\n") + + + except NoSuchElementException as e: + logging.error(f"no element find {e}") + + + return func(self, *args, **kwargs) + + return wrapper + + +def find_fillable_content(func): + def wrapper(self, *args, **kwargs): + + _driver = args[0] + _timeout = args[1] + _finder = args[3] + + se_list = { + '0':By.ID, + '1':By.NAME, + '2':By.CSS_SELECTOR, + '3':By.CLASS_NAME + } + + _selector = se_list[f'{args[2]}'] + _req = (_selector, _finder) + + logging.info("find_fillable_content basladi") + + try: + _find_item = WebDriverWait(_driver, timeout=_timeout).until( + EC.presence_of_element_located((_req)) + ) + + for key, value in kwargs.items(): + if value != None or value != '': + if hasattr(_find_item, 'send_keys'): + _find_item.send_keys(value) + else: + logging.error(f"{key} wrong process.") + + + + except TimeoutException as t: + print(f"time out {t} \n\n") + logging.error(f"time out {_finder}") + + except NoSuchElementException as e: + logging.error(f"no element find {e}") + + return func(self, *args, **kwargs) + + return wrapper + + + +def get_knowledge(func): + def wrapper(self, *args, **kwargs): + + _driver = args[0] + _timeout = args[1] + _finder = args[3] + + se_list = { + '0':By.ID, + '1':By.NAME, + '2':By.CSS_SELECTOR, + '3':By.CLASS_NAME + } + + _selector = se_list[f'{args[2]}'] + _req = (_selector, _finder) + + logging.info("get_knowledge basladi") + + try: + _find_item = WebDriverWait(_driver, timeout=_timeout).until( + EC.presence_of_element_located((_req)) + ) + + return _find_item.text + + except TimeoutException as t: + logging.error(f"time out {t} \n\n") + + except NoSuchElementException as e: + logging.error(f"element bulunamadi {_finder}") + + return func(self, *args, **kwargs) + + return wrapper + + + + + +class TrustPilot: + + def __init__(self, _main_link, _browser_type, _proxy:str) -> None: + + self.current_page = 0 + self.result = '' + + self.proxy = _proxy + + self.selectors = { + 'id':0, + 'name':1, + 'css':2, + 'class':3 + } + + self.pages = {} + + self._link = _main_link + self._browser_type = _browser_type + + self._web_driver = None + self._cookie_menagement = None + self.chrome_options = None + + self.preprocess() + self.request_web_main_page(_main_link) + self.cookies_control() + self.pages_update() + + + + def set_settings(self): + self.chrome_options = webdriver.ChromeOptions() + self.chrome_options.add_argument(f'--proxy-server={self.proxy}') + logging.info("proxy ayarlandi") + + + def extract_numbers(self, text): + numbers = re.findall(r'\d', text) + logging.info(f"onay sifresi elde edildi {numbers}") + return ''.join(numbers) + + def pages_update(self): + pages = self._web_driver.window_handles + self.pages = {index: value for index, value in enumerate(pages)} + logging.info("sayfa degisti") + + def preprocess(self): + self._web_driver = webdriver.Chrome(options=self.chrome_options) if self._browser_type == "chrome" else webdriver.Firefox() #now just 2 browser Google Chrome and FireFox + + def request_web_main_page(self, link): + try: + self._web_driver.get(link) + time.sleep(.5) + except WebDriverException as w: + logging.error(f"Failed to get the page: {link}. Exception: {w}") + + + @find_clickable_content + def pass_cookie(self, driver, timeout, by, value): + pass + + + def cookies_control(self): + self._cookie_menagement = self._web_driver.get_cookies() + if self._cookie_menagement: + self.pass_cookie(self._web_driver, 10, self.selectors['id'], "onetrust-accept-btn-handler") + + + @find_clickable_content + def _find_and_click(self, driver, timeout, by, value): + pass + + def find_and_click(self, timeout=10, by=None, value=None): + self._find_and_click(self._web_driver, timeout, self.selectors[f'{by}'], value) + + + + @find_fillable_content + def _find_and_fill(self, driver, timeout, by, value, **kwargs): + pass + + + def find_and_fill(self, timeout=10, by=None, value=None, text='None', command=None): + if command != None: self._find_and_fill(self._web_driver,timeout, self.selectors[f'{by}'], value, text=text, command=command) + else :self._find_and_fill(self._web_driver,timeout, self.selectors[f'{by}'], value, text=text) + + + + def add_page(self, link): + self._web_driver.execute_script(f"window.open('{link}');") + self.pages_update() + + def pages_to(self, page_num): + self.current_page = page_num + self._web_driver.switch_to.window(f'{self._web_driver.window_handles[page_num]}') + + def home(self): + self.pages_to(0) + self.current_page = 0 + + + def active_element_click(self): + active_element = self._web_driver.execute_script("return document.activeElement;") + time.sleep(.9) + active_element.send_keys(Keys.ENTER) + + @get_knowledge + def _get_knowledge(self, driver, timeout, by, value, **kwargs): + pass + + def get_knowledge(self, by, value): + text = self._get_knowledge(self._web_driver, 10, self.selectors[f'{by}'], value) + self.result = self.extract_numbers(text) + + def end(self): + logging.info("quiting") + self._web_driver.quit() + + +""" +class find_and_fill(object): + + def __init__ (self, selector, value): + + self.selector = selector + self.value = value + + + def __call__(self, driver): + element = driver.find_element(*self.selector) + if self.value in element.get_attribute('id'): + return element + + else: return False + +link = "https://trustpilot.com/users/connect?redirect=%2F&source_cta=header" + +if __name__ == "__main__": + + driver = webdriver.Chrome() + driver.get(link) + + element = WebDriverWait(driver, 10).until( + find_and_fill((By.ID, 'input'), 'input') + ) + + print(element) + + + +""" + + + + + + + + + + diff --git a/mainwindow.py b/mainwindow.py new file mode 100644 index 0000000..4499f82 --- /dev/null +++ b/mainwindow.py @@ -0,0 +1,245 @@ +# This Python file uses the following encoding: utf-8 +from PySide6.QtWidgets import QApplication, QMainWindow, QFileDialog, QGraphicsPixmapItem ,QGraphicsScene,QGraphicsView +from PySide6.QtGui import QPixmap, QIcon +from PySide6.QtCore import QTimer +from DAFAM.ui_form import Ui_MainWindow +import logging, sys, time + +from concurrent.futures import ThreadPoolExecutor +from logger import setup_logger +from PreDefAlgs import Algoritma +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +from decoder import AST +from comments import api_key, GEMINI + + +setup_logger() #logging configure +logger = logging.getLogger(__file__) #loggin - process + +class MainWindow(QMainWindow): + def __init__(self, parent=None): + super().__init__(parent) + self.ui = Ui_MainWindow() + self.ui.setupUi(self) + + self.icon_path = "DAFAM//sources//" + self.setWindowTitle("DAFAM CONTROLLER") + self.setWindowIcon(QIcon(self.icon_path+"dafam.png")) + self._gemini_model = GEMINI(api_key, "gemini-1.5-flash") #api and name + self._definetions()#defs + self._icons_png() #fill the graphics + self.listen_states()#listen the buttons and events + + + + + + + def _icons_png(self): + _scene = self._return_scene(self.icon_path+"dafam.png", 300,200) + self.ui.graphicsView.setScene(_scene) + + _icon = self._return_icon(self.icon_path+"next_button.png", 32,32) + self.ui.home_next_button.setIcon(_icon) + + _icon = self._return_icon(self.icon_path+"back-button.png", 32,32) + self.ui.code_back_button.setIcon(_icon) + + _icon = self._return_icon(self.icon_path+"diskette.png", 32,32) + self.ui.home_save_button.setIcon(_icon) + + _icon = self._return_icon(self.icon_path+"compile.png", 54,54) + self.ui.code_run_button.setIcon(_icon) + + + def _definetions(self): #definations and self metods are there + + self.model_path = "" #path veriables + self.schema = """email: {} passwd: {}""" #list view schema + self._accounts = [] #accounts infos + self.current_row_list = 0 #current list index + self.accounts_dic = {} # accounts infos but in dict + + def _return_scene(self, _path, sizex, sizey): + + image = QPixmap(_path) + resized = image.scaled(sizex,sizey) + item = QGraphicsPixmapItem(resized) + scene = QGraphicsScene() + scene.addItem(item) + + return scene + + + def _return_icon(self, _path, sizex, sizey): + image = QPixmap(_path) + resized = image.scaled(sizex,sizey) + + return resized + + + + def _notif(self, _text): #use for notifications for page code + + self.ui.code_notif.setText(_text) + self.ui.code_notif.setVisible(True) + QTimer.singleShot(2000,self._notif_clear) # 2000ms + + + def _notif_clear(self): #notification clear + self.ui.code_notif.setVisible(False) + + + def show_accounts(self): #for add accounts from accounts.txt + + with open(f'{self.model_path}') as file: + + lines = file.readlines() + + for line in lines: + if len(lines) == 0: + continue + + words = line.split(' : ') + words = [str.strip(word) for word in words] + + if len(words) == 2 and len(words[0].split('@')) == 2: + + if words[0].split('@')[1] == 'outlook.de': self.accounts_dic[f'{words[0]}'] = words[1] + # {'xxxxx@outlook.de' : 'passwd'} + + _formatted = self.schema.format(words[0], words[1]) + #'email: xxxx, passwd: xxxxx' + + self._accounts.append(_formatted) + + + self.ui.home_list.addItems(self._accounts) #fill the list view + file.close() + + def listen_states(self): + + + #---page home ---------- + self.ui.home_next_button.clicked.connect(lambda: self.ui.stackedWidget.setCurrentIndex(1)) + self.ui.home_show_account.clicked.connect(self.get_file) #fill the user list + self.ui.home_list.itemClicked.connect(self.item_clicked) ##### + self.ui.home_save_button.clicked.connect(self.save_plain_text) + self.ui.home_run.clicked.connect(self.run)#run planned scenario + #--- icon + + #----page code ----------- + + self.ui.code_back_button.clicked.connect(lambda :self.ui.stackedWidget.setCurrentIndex(0)) + self.ui.code_file_open.clicked.connect(self.code_file_open) + self.ui.code_save_button.clicked.connect(self.code_file_save) + self.ui.code_run_button.clicked.connect(self.code_file_run) + self.ui.code_generate_button.clicked.connect(self.generate_comment) + + + #--------------------code run - save - open + + + #------generate GEMINI + + def generate_comment(self): + _text = self.ui.code_prompt.toPlainText() + self._gemini_model.set_text(_text) + QTimer.singleShot(2000, self.fill_prompt_label) + + def fill_prompt_label(self): + _text = self._gemini_model.get_text() + self.ui.plainTextEdit.setPlainText(_text) + + #that is planned scenario pls don't change + def run(self): + + link = "https://trustpilot.com/users/connect?redirect=%2F&source_cta=header" + + #registed base scanerio + + with ThreadPoolExecutor(max_workers=3) as executor: + # Her hesap için iş parçacığı oluştur ve çalıştır + for account in self.accounts_dic: + logging.info(f"names: {account}") + executor.submit(self.run_algorithm, account, link) + + + def run_algorithm(self, account, link): + logging.info(f"process established for {account} ") + proxy = "109.94.182.128:4145" + prog = Algoritma(link=link, type="chrome" , proxy=proxy) + prog['email'] = account + prog['passwd'] = self.accounts_dic[account] + prog.start() + + # + def code_file_run(self): + + self.code_file_save() + _text = self.ui.code_code_label.toPlainText() + #AST for decode .dfm + _ast = AST(_text) + #------------ get control about wrote code + _ast.decode() + print(_ast.base_code) + exec(_ast.base_code) + #---------------- + + def code_file_save(self): + try: + + with open(self.model_path, "w") as _file: + + _text = self.ui.code_code_label.toPlainText() + _file.write(_text) + self._notif("kaydedildi..") + + except Exception as e: + logger.warning(f"{e}") + self._notif("bir dosya seçin") + + def code_file_open(self): + + self.model_path , _ = QFileDialog.getOpenFileName(self, 'code dosyası giriniz', '', '*.dfm') + + with open(self.model_path) as file: + + _read = file.read() + self.ui.code_code_label.setPlainText(_read) + file.close() + #--------------------------------------------------------------------------------------------------------- + + + def save_plain_text(self): + _text = self.ui.home_plain_text.toPlainText() + + try: + + self._accounts.pop(self.current_row_list) + self._accounts.insert(self.current_row_list, _text) + self.ui.home_list.clear() + self.ui.home_list.addItems(self._accounts) + + except Exception as e: + logger.warning(f"{e}") + self._notif(f'save işlemi gerçekleşmedi.') + + + def item_clicked(self, item): + _text = item.text() + self.current_row_list = self.ui.home_list.currentRow() + self.ui.home_plain_text.setPlainText(_text) + + def get_file(self): + self.model_path, _ = QFileDialog.getOpenFileName(self, "bir kullanıcı dosyası seçin", ".txt") + + self.show_accounts() + + +if __name__ == "__main__": + app = QApplication(sys.argv) + widget = MainWindow() + widget.show() + sys.exit(app.exec()) \ No newline at end of file diff --git a/take_info.py b/take_info.py new file mode 100644 index 0000000..dd8d433 --- /dev/null +++ b/take_info.py @@ -0,0 +1,5 @@ +""" this page created by Bedir Karaabali 05.08.2024 + just support outlook.de accounts""" + +import os +