From b3e654691e6ba9fed7ad776e0fe4918d6dff0d3c Mon Sep 17 00:00:00 2001 From: bdrtr Date: Sat, 10 Aug 2024 15:27:15 +0200 Subject: [PATCH] opne-beta --- .gitignore | 103 +++++++++++ DAFAM/DAFAM.pyproject | 6 + DAFAM/sources/back-button.png | Bin 0 -> 467 bytes DAFAM/sources/compile.png | Bin 0 -> 16180 bytes DAFAM/sources/dafam.png | Bin 0 -> 27337 bytes DAFAM/sources/diskette.png | Bin 0 -> 6805 bytes DAFAM/sources/next_button.png | Bin 0 -> 9752 bytes DAFAM/ui_form.py | 315 ++++++++++++++++++++++++++++++++++ PreDefAlgs.py | 47 +++++ comments.py | 26 +++ decoder.py | 56 ++++++ komutlar.dfm | 4 + logger.py | 9 + login.py | 305 ++++++++++++++++++++++++++++++++ mainwindow.py | 245 ++++++++++++++++++++++++++ take_info.py | 5 + 16 files changed, 1121 insertions(+) create mode 100644 .gitignore create mode 100644 DAFAM/DAFAM.pyproject create mode 100644 DAFAM/sources/back-button.png create mode 100644 DAFAM/sources/compile.png create mode 100644 DAFAM/sources/dafam.png create mode 100644 DAFAM/sources/diskette.png create mode 100644 DAFAM/sources/next_button.png create mode 100644 DAFAM/ui_form.py create mode 100644 PreDefAlgs.py create mode 100644 comments.py create mode 100644 decoder.py create mode 100644 komutlar.dfm create mode 100644 logger.py create mode 100644 login.py create mode 100644 mainwindow.py create mode 100644 take_info.py 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 0000000000000000000000000000000000000000..e9eff218acc76bc5082356dc9436fabba6240004 GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAF&8^|hH!9j+Bur3Lte zxc>kDAIPLN@Oxnv475YBB*-tAfr*7*NK9EnQ%l#wJ0`BIwtm8<%?FR2x^V5;i&vk& z|M<1zuhSx+;!U0|jv*QoODDxjH!1M6@{25NYnnM>%AtS%=f64B|7GLby!RF7j@@jq zoRYa)V)r$TH_p3!Ouqf~m@@azN2Lktw=%S>vu#a!dUnd12;s!bS9IPlUwG&Bw8J3` z4LmOoG#asT9+(*W>2}n{Ck#{nuBrF$U)z74tL;^5{VLxzYR%KWbUFuj=ZUEE8J2a} zHfUY^z4gdvrUm^qjZ>3mZ+^T<{!iqhb?n|1!jZRsx_(^!w4bs5+;i^!a$(aV$w&7= O!RhJh=d#Wzp$PyA5S+LG literal 0 HcmV?d00001 diff --git a/DAFAM/sources/compile.png b/DAFAM/sources/compile.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b6ef4927d94a9b843877e2fd6f84aeb6fa27ea GIT binary patch literal 16180 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

sz~gdg!V3Lb&-`cq|bMj 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 XJNx;oJJsF)+mEB6qNQA|Xde7Om$z+& literal 0 HcmV?d00001 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 +