konsole dan ziyade yapmak istediğim konsolun bir benzeri, arayüzsüz bir konsol proje düşünün mesela port scanner diyelim bu port scannerı benim projeme eklediğim zaman arayüz eklemezsem exe de konsolu kapattığım için kullanıcılar taranan portları yada artık program neyse onun çıktısını göremeyecekleri için programı kullanamayacaklar. Bende kendi konsol widgetımı yapmak istiyorum. X bir yerden aldığım projeye arayüz yazmadan direkt olarak programıma koyucam ilgilisi gelip buton yada direkt olarak python dosya.py gibi bir etkileşim ile projeyi çalıştıracak, benim yaptığım konsoldan görüntüleyebilecek ve kullanabilecek.
Eninde sonunda kendi konsol programınızı yapmak istiyorsunuz sonucuna ulaşıyoruz.
Yukarıda kodları size fikir vermesi açısından paylaştım. Ama paylaştığım kodların istediğiniz özelliklerde bir konsol programı oluşturmaya yeterli olmadığının farkındayım.
Şimdilik müsaadenizi istiyorum. Belki başka arkadaşlar konuya dahil olup, size bazı spesifik konularda yardımcı olabilirler. İyi günler.
Tekrar merhaba,
Paylaştığım kodları biraz değiştirerek, linux ortamında geçerli olan, istediğiniz özelliklere yakın bir uygulama tasarlayabiliriz. Windows için nasıl bir yol izlenmesi gerektiği konusunda biraz daha araştırma yapmam lazım.
Python’ın linux için sunduğu standart kütüphanede, pty
isimli, pseudo terminal
anlamına gelen bir kitaplık var. Bu kitaplığı kullanarak bir terminal oturumu oluşturabiliriz.
pty
kitaplığı, sizin projeniz için, linux ortamında işinizi oldukça kolaylaştıracak bir kitaplıktır; pty
kitaplığında yer alan pty.openpty()
fonksiyonu, bir ana (master) ve bir alt (slave) terminal yaratır ve bu iki terminal arasında veri iletimini sağlar. Bu fonksiyonu ana ve alt süreçleri yönetmek için kullanabiliriz.
Terminal işlemleri, standart giriş ve çıkışlarla alakalı, yani I/O işlemleriyle ilgili olduğu için, select
kitaplığını kullanarak I/O işlemlerini asenkron
bir şekilde yürütebiliriz.
select.select()
fonksiyonu, terminalden veri beklerken, veri geldiğinde işlem yapmak için kullanılan, asenkron bir şekilde çalışan bir fonksiyondur.
Bu fonksiyon aşağıdakileri argüman olarak alıyor:
rlist
: Okuma işlemi için izlenecek dosya tanımlayıcılarının listesi. Bu listede yer alan dosya tanımlayıcılarında okuma işlemi yapılabilir.wlist
: Yazma (write) işlemi için izlenecek dosya tanımlayıcılarının listesi. Bu listede yer alan dosya tanımlayıcılarına yazma işlemi yapılabilir.xlist
: Hata (exception) için izlenecek dosya tanımlayıcılarının listesi. Bu listede yer alan dosya tanımlayıcıları, hata koşullarına karşı kontrol edilir.timeout
: Operasyonun ne kadar süre bekleyeceğini belirler. Süre dolduğunda veya bir olay gerçekleştiğinde, işlev geri döner (yanireturn
edilir). Eğertimeout
belirtilmezse,select
fonksiyonu sürekli bekler.
Sizinle ilk paylaştığım kodda std
çıktıların widget
’e yönlendirilmesini sağlayan pseudo
bir std
giriş-çıkış nesnesi tanımlamıştım.
Daha sonra paylaştığım kodlarda ise, std
çıktıları yönlendiren bu sınıf kullanılmadı. Çünkü daha farklı algoritmalar denerken ihtiyaç duymamıştım.
Şimdi ise bu sınıfı tekrar devreye sokuyorum. Ama artık her yazdığımız ifade, yeni bir subprocess
olarak oluşturulmuyor. Terminal ortamını simüle eden uygulamımızı bir kez aktif ediyoruz, sonra da sanal terminali oluşturmuş oluyoruz.
Bunun için önce terminal işlemlerini QTextEdit
’e yönlendirmemiz gerekiyor. Sonra da yazılan her yazıyı sanki terminal ekranına yazıyormuşuz gibi davranan bir terminal ortamı canlandırmalıyız.
pty
bize simülasyonu sağlıyor; select
fonksiyonu ise, I/O işlemlerinin asenkron
bir şekilde yapılmasını sağlayan araçları sunuyor.
Bu durumda, her enter
veya Return
tuşuna bastığımızda yeni bir process
oluşturulmayacak.
Simüle edilmiş terminal ortamı, ana program çalıştırılır çalışmaz başlayacak; yani GUI’den bağımsız bir process
olarak terminali program ile birlikte başlatacağız.
O halde terminal
ortamını bir signal-slot
mekanizması ile GUI’den bağımsız bir şekilde simüle ettikten sonra, onu etkinleştirmek gerekiyor.
Linux için:
import os
import sys
import pty
import select
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit
from PyQt5.QtGui import QTextCursor
from PyQt5.QtCore import Qt, QThread, pyqtSignal
class StdIO:
def __init__(self, widget):
self.widget = widget
def write(self, text: str):
self.widget.moveCursor(QTextCursor.End)
self.widget.insertPlainText(text)
self.widget.ensureCursorVisible()
def flush(self):
pass
def readline(self):
return self.widget.toPlainText()
@staticmethod
def fileno():
return 0
class Worker(QThread):
update_console = pyqtSignal(str)
def __init__(self, master_fd, parent=None):
super().__init__(parent)
self.master_fd = master_fd
def run(self):
while True:
try:
# select.select() fonksiyonunu çağırarak, belirli dosya tanımlayıcılarında
# veri olup olmadığını kontrol edelim.
# Bu durumda, yalnızca self.master_fd dosya tanımlayıcısını izliyoruz.
# Eğer self.master_fd'ye veri gelirse, bu fonksiyonun döneceği zaman belirlenir.
rlist, _, _ = select.select([self.master_fd], [], [])
# Yukarıdaki kodda, yazma ve hata izleyicisi için boş listeler tanımladığımız
# için isimlerinin ne olduğunun bir önemi yok.
# rlist içinde veri olan dosya tanımlayıcılarını arayalım.
for fd in rlist:
if fd == self.master_fd:
# Eğer self.master_fd'den veri varsa, bu veriyi oku.
# 1024 byte veri okur.
data = os.read(self.master_fd, 1024)
# Eğer okunan veri yoksa (yani bağlantı kapalıysa), döngüyü sonlandırır.
if not data:
return
# Okunan veriyi GUI'ye (QTextEdit widgetine) iletmek için bir sinyal gönderelim.
# Ve data.decode() kullanarak veriyi UTF-8 formatında string'e çevirelim.
self.update_console.emit(data.decode())
except OSError:
# Eğer bir OSError oluşursa, döngüden çıkar.
break
class CommandLineWindow(QMainWindow):
def __init__(self):
super().__init__()
self.console = QTextEdit(self)
self.io = StdIO(self.console)
self.master_fd, self.slave_fd = pty.openpty()
self.worker = Worker(self.master_fd)
self.worker.update_console.connect(self.update_console)
self.worker.start()
self.config()
self.command = ""
def activate_pty(self):
# Ana süreç ile alt süreçleri ayıralım.
# Bu fonksiyon çağrıldığında, bir ana süreç (parent process) ve
# bir alt süreç (child process) oluşturulur.
pid = os.fork()
if pid == 0:
# Alt süreçte (child process) çalışacak kod bloğu.
# Yeni bir oturum başlatır ve bu süreci kontrol eder.
# Bu, alt sürecin yeni bir terminal oturumu oluşturmasını sağlar.
os.setsid()
# Slave terminal dosya tanımlayıcısını, stdin (standart giriş) olarak ayarlar
# ve alt sürecin standart giriş verilerini slave terminalden alınmasını sağlar.
os.dup2(self.slave_fd, 0)
# Slave terminal dosya tanımlayıcısını stdout (standart çıkış) olarak ayarlar
# ve alt sürecin standart çıkış verilerini slave terminale yazılmasını sağlar.
os.dup2(self.slave_fd, 1)
# Slave terminal dosya tanımlayıcısını stderr (standart hata) olarak ayarlar
# ve alt sürecin hata mesajlarını slave terminale yazılmasını sağlar.
os.dup2(self.slave_fd, 2)
# Artık slave_fd, alt süreç tarafından kullanılacağı için, bu dosya tanımlayıcısını kapatabiliriz.
os.close(self.slave_fd)
# Slave terminal üzerinden çalışacak kabuğu başlatır,
# mevcut oturum sürecini 'bash' shell'i ile değiştirir ve komutları bu shell üzerinde çalıştırır.
os.execlp("bash", "bash")
else:
# Ana süreçte (parent process) çalışacak kod bloğu.
# Slave terminal dosya tanımlayıcısına bu süreçte ihtiyaç yok.
# Ana süreç slave terminal ile doğrudan etkileşimde bulunmaz, bu yüzden kapatılır.
os.close(self.slave_fd)
def config(self):
self.console.setReadOnly(False)
self.console.setStyleSheet("background-color: black; color: white;")
self.setCentralWidget(self.console)
self.console.setTextInteractionFlags(Qt.TextEditorInteraction)
self.console.setPlaceholderText("Enter commands and press Enter...")
self.console.installEventFilter(self)
self.setWindowTitle("Terminal Interface")
self.setGeometry(100, 100, 800, 600)
# Std çıktıları `self.io` nesnesine yönlendirelim.
sys.stdin = self.io
sys.stdout = self.io
sys.stderr = self.io
self.activate_pty()
def eventFilter(self, obj, event):
if obj is self.console and event.type() == event.KeyPress:
key = event.key()
if key in (Qt.Key_Enter, Qt.Key_Return):
self.process_command()
# Komut işletildikten sonra self.command'ı sıfırlayalım.
self.command = ""
return True
else:
# Enter tuşuna basana kadar yazdıklarımızı kaydedelim.
self.command += event.text()
return super().eventFilter(obj, event)
def process_command(self):
# Yazdığımız ifade aşağıdaki `os.write` ile ekrana ikinci defa yazılacağı
# için `self.console.append` fonksiyonu ile boş bir `str` satırını
# konsola ekliyorum. Ve `echo` oluşturan kısımları kabaca siliyorum.
cursor = self.console.textCursor()
cursor.movePosition(QTextCursor.StartOfBlock)
cursor.select(QTextCursor.BlockUnderCursor)
cursor.selectedText()
cursor.removeSelectedText()
self.console.append("")
# Sonra da simüle ettiğimiz terminal uygulamasına komutu gönderelim.
os.write(self.master_fd, (self.command + "\n").encode())
def update_console(self, text):
# Komutun işletilmesinden sonra oluşan çıktıyı std ekrana yazdıralım.
# std ekran, QTextEdit widgetine yazdırılır.
self.io.write(text)
if __name__ == "__main__":
app = QApplication(sys.argv)
terminal = CommandLineWindow()
terminal.show()
sys.exit(app.exec_())
Elinize sağlık windowsta çalışması için bir kaç değişiklik yaptım. Genel olarak istediğime yakın olmuş ve önümüz düz gibi gözüküyor. Bir kaç düzenleme yapıp buraya güncel ve neyin nasıl olması gerektiğini anlatır şekilde paylaşmayı planlıyorum.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit
from PyQt5.QtCore import Qt, QProcess
from PyQt5.QtGui import QTextCursor
class CommandLineWindow(QMainWindow):
def __init__(self):
super().__init__()
self.console = QTextEdit(self)
self.process = QProcess(self)
self.config()
self.command = ""
self.process.readyReadStandardOutput.connect(self.update_console)
self.process.readyReadStandardError.connect(self.update_console)
def config(self):
self.console.setReadOnly(False)
self.console.setStyleSheet("background-color: black; color: white;")
self.setCentralWidget(self.console)
self.console.setTextInteractionFlags(Qt.TextEditorInteraction)
self.console.setPlaceholderText("Enter commands and press Enter...")
self.console.installEventFilter(self)
self.setWindowTitle("Terminal Interface")
self.setGeometry(100, 100, 800, 600)
self.process.start("cmd.exe")
def eventFilter(self, obj, event):
if obj is self.console and event.type() == event.KeyPress:
key = event.key()
if key in (Qt.Key_Enter, Qt.Key_Return):
self.process_command()
self.command = ""
return True
elif key == Qt.Key_Backspace:
self.command = self.command[:-1]
else:
self.command += event.text()
return super().eventFilter(obj, event)
def process_command(self):
if self.command.strip():
self.console.append(f"> {self.command}")
self.process.write((self.command + "\n").encode())
self.console.moveCursor(QTextCursor.End)
def update_console(self):
try:
output = self.process.readAllStandardOutput().data().decode('utf-8', errors='replace')
self.console.append(output)
except Exception as e:
self.console.append(f"Error decoding output: {e}")
try:
error_output = self.process.readAllStandardError().data().decode('utf-8', errors='replace')
if error_output:
self.console.append(error_output)
except Exception as e:
self.console.append(f"Error decoding error output: {e}")
if __name__ == "__main__":
try:
app = QApplication(sys.argv)
terminal = CommandLineWindow()
terminal.show()
sys.exit(app.exec_())
except Exception as e:
print(f"Unhandled exception: {e}")
Basit kodları çalıştırıyor örneği;
import math
import sys
sys.stdout.reconfigure(encoding='utf-8')
sys.stdin.reconfigure(encoding='utf-8')
def hesapla_karekok():
try:
sayi = float(input("Bir sayı girin: "))
if sayi < 0:
print("Negatif sayının karekökü hesaplanamaz.")
else:
sayi = math.sqrt(sayi)
print(f"{sayi} sayısının karekökü: {sayi:.2f}")
except ValueError:
print("Geçerli bir sayı girin.")
hesapla_karekok()
Ama aşağıdaki kodu çalıştıramadım mesela. Bunun için nasıl bir şey yapabiliriz.
banner = '''
.,***,..
.@@@@@@@@@@@@@@@@@@@@@@.
(@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
,@@@@@@@. /@@@@@@@@@@@@@@@@@@@@@%
@@@@@@@& @@@@@@@@@@@@@@@@@@@@@@%
.@@@@@@@@& @@@@@@@@@@@@@@@@@@@@@@
#@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@/
*@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@.
%@@@@@@@@@@@@@@@@% %@@@@@@@@# @@@@
&@@@@@@@@@@@@@@@@@@@@@@ ,@@@ .@@@
&@@@@@@@@@@@@@@@@@@@@@@@@@@&##%@@@@@@@@@% @@@@
%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&
/@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/
(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(
%@@@@@@@@@@@@@@@@@@@@@@@@@@,
#@@@@@@@@@@@@@%
#@@@@@@@@#
@@@@&
▓█████▄ ▒█████ ███▄ █ ▄▄▄█████▓ █ █░ ▒█████ ██▀███ ██▀███ ▓██ ██▓
▒██▀ ██▌ ▒██▒ ██▒ ██ ▀█ █ ▓ ██▒ ▓▒ ▓█░ █ ░█░▒██▒ ██ ▓██ ▒ ██ ▒▓██ ▒ ██ ▒▒██ ██▒
░██ █▌ ▒██░ ██▒ ▓██ ▀█ ██▒ ▒ ▓██░ ▒░ ▒█░ █ ░█ ▒██░ ██ ▓██ ░▄█ ▒▓██ ░▄█ ▒ ▒██ ██░
░▓█▄ ▌ ▒██ ██░ ▓██▒ ▐▌██▒ ░ ▓██▓ ░ ░█░ █ ░█ ▒██ ██ ▒██▀▀█▄ ▒██▀▀█▄ ░ ▐██▓░
░▒████▓ ░ ████▓▒░ ▒██░ ▓██░ ▒██▒ ░ ░░██▒██▓ ░ ████▓▒ ░██▓ ▒██ ▒░██▓ ▒██ ▒ ░ ██▒▓░
▒▒▓ ▒ ░ ▒░▒░▒░ ░ ▒░ ▒ ▒ ▒ ░░ ░ ▓░▒ ▒ ░ ▒░▒░▒░ ░ ▒▓ ░▒▓ ░░ ▒▓ ░▒▓ ░ ██▒▒▒
░ ▒ ▒ ░ ▒ ▒░ ░ ░░ ░ ▒░ ░ ▒ ░ ░ ░ ▒ ▒░ ░▒ ░ ▒ ░ ░▒ ░ ▒ ░▓██ ░▒░
░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ▒ ░░ ░ ░░ ░ ▒ ▒ ░░
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
░ ░ ░
'''
print(banner)
import websocket
import json
import threading
import time
import requests
def send_json_request(ws, request):
ws.send(json.dumps(request))
def recieve_json_response(ws):
response = ws.recv()
if response:
return json.loads(response)
def heartbeat(interval, ws):
print(" LISTENING ")
while True:
time.sleep(interval)
heartbeatJSON = {"op": 1, "d": "null"}
send_json_request(ws, heartbeatJSON)
def send_to_discord_webhook(content):
webhook_url = "YOUR_HOOK_HERE" # YOUR DISCORD WEB HOOK URL
data = {
"content": content
}
requests.post(webhook_url, json=data)
def websocket_loop():
ws = websocket.WebSocket()
ws.connect("wss://gateway.discord.gg/?v=6&encoding=json")
event = recieve_json_response(ws)
heartbeat_intervals = event['d']['heartbeat_interval'] / 1000
print("heartbeat_intervals = ", heartbeat_intervals)
threading._start_new_thread(heartbeat, (heartbeat_intervals, ws))
token = "YOUR_TOKEN_HERE" # YOUR ACCOUNT TOKEN
payload = {'op': 2, "intents": 513, 'd':{"token": token, "properties": {"$os": "windows", "$browser": "chrome", "$device": "pc"}}}
send_json_request(ws, payload)
while True:
event = recieve_json_response(ws)
try:
if event and 'd' in event and 'author' in event['d']:
message_content = event['d']['content']
author_username = event['d']['author']['username']
server_id = event['d'].get('guild_id')
server_name = "DM"
if server_id:
server_name = event['d'].get('guild', {}).get('name', 'Unknown Server')
print(f"{author_username} ({server_name} - {server_id}): {message_content}")
op_code = event['op']
if op_code == 11:
print('heartbeat received')
if server_name == "DM":
with open('DM_messages.txt', 'a') as dm_file:
dm_file.write(f"{author_username} ({server_name} - {server_id}): {message_content}\n")
else:
with open('Server_messages.txt', 'a') as server_file:
server_file.write(f"{author_username} ({server_name} - {server_id}): {message_content}\n")
send_to_discord_webhook(f"{author_username} ({server_name} - {server_id}): {message_content}")
except Exception as e:
#print(f"Error: {str(e)}")
pass
if __name__ == "__main__":
websocket_loop()
QProcess
’in ortam değişkenlerinde karakter kodlaması sorunu oluşuyor. QProcessEnvironment
sınıfını programınıza aktarıp, program başlamadan önce process
nesnesinin karakter kodlamasını utf-8
yapın, öyle deneyin.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit
from PyQt5.QtCore import Qt, QProcess, QProcessEnvironment
from PyQt5.QtGui import QTextCursor
class CommandLineWindow(QMainWindow):
def __init__(self):
super().__init__()
self.console = QTextEdit(self)
self.process = QProcess(self)
self.env = QProcessEnvironment.systemEnvironment()
self.config()
self.command = ""
self.process.readyReadStandardOutput.connect(self.update_console)
self.process.readyReadStandardError.connect(self.update_console)
def config(self):
self.console.setReadOnly(False)
self.console.setStyleSheet("background-color: black; color: white;")
self.setCentralWidget(self.console)
self.console.setTextInteractionFlags(Qt.TextEditorInteraction)
self.console.setPlaceholderText("Enter commands and press Enter...")
self.console.installEventFilter(self)
self.setWindowTitle("Terminal Interface")
self.setGeometry(100, 100, 800, 600)
self.env.insert("PYTHONIOENCODING", "utf-8")
self.process.setProcessEnvironment(self.env)
self.process.start("cmd.exe")
def eventFilter(self, obj, event):
if obj is self.console and event.type() == event.KeyPress:
key = event.key()
if key in (Qt.Key_Enter, Qt.Key_Return):
self.process_command()
self.command = ""
return True
elif key == Qt.Key_Backspace:
self.command = self.command[:-1]
else:
self.command += event.text()
return super().eventFilter(obj, event)
def process_command(self):
if self.command.strip():
self.console.append(f"> {self.command}")
self.process.write((self.command + "\n").encode())
self.console.moveCursor(QTextCursor.End)
def update_console(self):
try:
output = self.process.readAllStandardOutput().data().decode('utf-8', errors='replace')
self.console.append(output)
except Exception as e:
self.console.append(f"Error decoding output: {e}")
try:
error_output = self.process.readAllStandardError().data().decode('utf-8', errors='replace')
if error_output:
self.console.append(error_output)
except Exception as e:
self.console.append(f"Error decoding error output: {e}")
if __name__ == "__main__":
try:
app = QApplication(sys.argv)
terminal = CommandLineWindow()
terminal.show()
sys.exit(app.exec_())
except Exception as e:
print(f"Unhandled exception: {e}")
Emeğinize sağlık, fakat attığım scriptin çıktılarını bir türlü widget a yazdıramadım. Başka bir kod denediğimde sorunsuz çalışıyor.
import math
import sys
from os import system
from colorama import Fore, init, Style
import requests
import re
import time
import threading
from proxy_checker import ProxyChecker
from sys import stdout
sys.stdout.reconfigure(encoding='utf-8')
sys.stdin.reconfigure(encoding='utf-8')
lock = threading.Lock()
class UI:
@staticmethod
def banner():
banner = f'''
{Fore.LIGHTBLACK_EX}{Style.RESET_ALL}
\t\t\t
\t\t\t
\t\t\t
██████╗ ██╗ █████╗ ██████╗ ██╗ █████╗ ██████╗
██╔══██╗██║ ██╔══██╗██╔════╝ ██║██╔══██╗██╔════╝
██████╔╝██║ ███████║██║ ██║███████║██║
██╔══██╗██║ ██╔══██║██║ ██ ██║██╔══██║██║
██████╔╝███████╗██║ ██║╚██████╗╚█████╔╝██║ ██║╚██████╗
\t\t\t
\t\t\t
\t\t\t
\t\t\t {Fore.LIGHTBLACK_EX}https://discord.gg/script{Style.RESET_ALL}
'''
return banner
@staticmethod
def menu():
menu = f'''
[{Fore.RED}1{Style.RESET_ALL}] Proxy Kazıma [{Fore.RED}2{Style.RESET_ALL}] Proxy Kontrolü
'''
return menu
def write(arg):
lock.acquire()
stdout.flush()
print(arg)
lock.release()
class XProxy:
proxy_w_regex = [
["http://spys.me/proxy.txt","%ip%:%port% "],
["http://www.httptunnel.ge/ProxyListForFree.aspx"," target=\"_new\">%ip%:%port%</a>"],
["https://raw.githubusercontent.com/sunny9577/proxy-scraper/master/proxies.json", "\"ip\":\"%ip%\",\"port\":\"%port%\","],
["https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list", '"host": "%ip%".*?"country": "(.*?){2}",.*?"port": %port%'],
["https://raw.githubusercontent.com/clarketm/proxy-list/master/proxy-list.txt", '%ip%:%port% (.*?){2}-.-S \\+'],
["https://www.us-proxy.org/", "<tr><td>%ip%<\\/td><td>%port%<\\/td><td>(.*?){2}<\\/td><td class='hm'>.*?<\\/td><td>.*?<\\/td><td class='hm'>.*?<\\/td><td class='hx'>(.*?)<\\/td><td class='hm'>.*?<\\/td><\\/tr>"],
["https://free-proxy-list.net/", "<tr><td>%ip%<\\/td><td>%port%<\\/td><td>(.*?){2}<\\/td><td class='hm'>.*?<\\/td><td>.*?<\\/td><td class='hm'>.*?<\\/td><td class='hx'>(.*?)<\\/td><td class='hm'>.*?<\\/td><\\/tr>"],
["https://www.sslproxies.org/", "<tr><td>%ip%<\\/td><td>%port%<\\/td><td>(.*?){2}<\\/td><td class='hm'>.*?<\\/td><td>.*?<\\/td><td class='hm'>.*?<\\/td><td class='hx'>(.*?)<\\/td><td class='hm'>.*?<\\/td><\\/tr>"],
['https://www.socks-proxy.net/', "%ip%:%port%"],
['https://free-proxy-list.net/uk-proxy.html', "<tr><td>%ip%<\\/td><td>%port%<\\/td><td>(.*?){2}<\\/td><td class='hm'>.*?<\\/td><td>.*?<\\/td><td class='hm'>.*?<\\/td><td class='hx'>(.*?)<\\/td><td class='hm'>.*?<\\/td><\\/tr>"],
['https://free-proxy-list.net/anonymous-proxy.html', "<tr><td>%ip%<\\/td><td>%port%<\\/td><td>(.*?){2}<\\/td><td class='hm'>.*?<\\/td><td>.*?<\\/td><td class='hm'>.*?<\\/td><td class='hx'>(.*?)<\\/td><td class='hm'>.*?<\\/td><\\/tr>"],
["https://www.proxy-list.download/api/v0/get?l=en&t=https", '"IP": "%ip%", "PORT": "%port%",'],
["https://api.proxyscrape.com/?request=getproxies&proxytype=http&timeout=6000&country=all&ssl=yes&anonymity=all", "%ip%:%port%"],
["https://raw.githubusercontent.com/TheSpeedX/SOCKS-List/master/http.txt", "%ip%:%port%"],
["https://raw.githubusercontent.com/shiftytr/proxy-list/master/proxy.txt", "%ip%:%port%"],
["https://raw.githubusercontent.com/TheSpeedX/SOCKS-List/master/socks5.txt", "%ip%:%port%"],
["https://www.hide-my-ip.com/proxylist.shtml", '"i":"%ip%","p":"%port%",'],
["https://raw.githubusercontent.com/scidam/proxy-list/master/proxy.json", '"ip": "%ip%",\n.*?"port": "%port%",'],
['https://www.freeproxychecker.com/result/socks4_proxies.txt', "%ip%:%port%"],
['https://proxy50-50.blogspot.com/', '%ip%</a></td><td>%port%</td>'],
['http://free-fresh-proxy-daily.blogspot.com/feeds/posts/default', "%ip%:%port%"],
['http://free-fresh-proxy-daily.blogspot.com/feeds/posts/default', "%ip%:%port%"],
['http://www.live-socks.net/feeds/posts/default', "%ip%:%port%"],
['http://www.socks24.org/feeds/posts/default', "%ip%:%port%"],
['http://www.proxyserverlist24.top/feeds/posts/default',"%ip%:%port%" ] ,
['http://proxysearcher.sourceforge.net/Proxy%20List.php?type=http',"%ip%:%port%"],
['http://proxysearcher.sourceforge.net/Proxy%20List.php?type=socks', "%ip%:%port%"],
['http://proxysearcher.sourceforge.net/Proxy%20List.php?type=socks', "%ip%:%port%"],
['https://www.my-proxy.com/free-anonymous-proxy.html', '%ip%:%port%'],
['https://www.my-proxy.com/free-transparent-proxy.html', '%ip%:%port%'],
['https://www.my-proxy.com/free-socks-4-proxy.html', '%ip%:%port%'],
['https://www.my-proxy.com/free-socks-5-proxy.html','%ip%:%port%'],
['https://www.my-proxy.com/free-proxy-list.html','%ip%:%port%'],
['https://www.my-proxy.com/free-proxy-list-2.html','%ip%:%port%'],
['https://www.my-proxy.com/free-proxy-list-3.html','%ip%:%port%'],
['https://www.my-proxy.com/free-proxy-list-4.html', '%ip%:%port%'],
['https://www.my-proxy.com/free-proxy-list-5.html','%ip%:%port%'],
['https://www.my-proxy.com/free-proxy-list-6.html','%ip%:%port%'],
['https://www.my-proxy.com/free-proxy-list-7.html','%ip%:%port%'],
['https://www.my-proxy.com/free-proxy-list-8.html','%ip%:%port%'],
['https://www.my-proxy.com/free-proxy-list-9.html','%ip%:%port%'],
['https://www.my-proxy.com/free-proxy-list-10.html','%ip%:%port%'],
]
proxy_direct = [
'https://api.proxyscrape.com/v2/?request=getproxies&protocol=http&timeout=5000&country=all&ssl=all&anonymity=all',
'https://api.proxyscrape.com/v2/?request=getproxies&protocol=socks4&timeout=5000&country=all&ssl=all&anonymity=all',
'https://api.proxyscrape.com/v2/?request=getproxies&protocol=socks5&timeout=5000&country=all&ssl=all&anonymity=all',
'https://www.proxyscan.io/download?type=http',
'https://www.proxyscan.io/download?type=https',
'https://www.proxyscan.io/download?type=socks4',
'https://www.proxyscan.io/download?type=socks5',
'https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/http.txt',
'https://github.com/TheSpeedX/PROXY-List/blob/master/socks4.txt',
'https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/socks5.txt',
'https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/http.txt',
'https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/socks4.txt',
'https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/socks5.txt',
'https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/https.txt',
'https://raw.githubusercontent.com/hookzof/socks5_list/master/proxy.txt',
'https://multiproxy.org/txt_all/proxy.txt',
'http://rootjazz.com/proxies/proxies.txt',
'http://ab57.ru/downloads/proxyold.txt',
'https://raw.githubusercontent.com/clarketm/proxy-list/master/proxy-list-raw.txt',
'https://proxy-spider.com/api/proxies.example.txt',
'https://raw.githubusercontent.com/opsxcq/proxy-list/master/list.txt',
'https://www.proxy-list.download/api/v1/get?type=socks4'
'https://raw.githubusercontent.com/TheSpeedX/SOCKS-List/master/socks4.txt'
]
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"}
def __init__(self):
self.proxy_output = []
self.scrape_counter = 0
self.checked_counter= 0
def _update_title(self):
while True:
elapsed = time.strftime('%H:%M:%S', time.gmtime(time.time() - self.start))
system('Başlık Proxy - geçen: %s ^| kazınmış: %s ^| Kontrol :%s'% (elapsed, self.scrape_counter, self.checked_counter))
time.sleep(0.4)
def file_read(self, name):
with open(name, 'r', encoding='UTF-8') as f:
text = [line.strip('\n') for line in f]
return text
def file_write(self, name, contents):
with open(name, 'w', encoding='UTF-8' ) as f:
for x in contents:
f.write(x + '\n')
def background_task(self):
self.start = time.time()
threading.Thread(target = self._update_title, daemon=True).start()
def get_proxies(self):
return self.proxy_output
class ProxyScrape(XProxy):
def _scrape(self, url, custom_regex):
try:
proxylist = requests.get(url, timeout=5, headers=self.headers).text
custom_regex = custom_regex.replace('%ip%', '([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})')
custom_regex = custom_regex.replace('%port%', '([0-9]{1,5})')
for proxy in re.findall(re.compile(custom_regex), proxylist):
self.proxy_output.append(proxy[0] + ":" + proxy[1])
write(' > '+proxy[0] + ":" + proxy[1])
self.scrape_counter += 1
except requests.exceptions.RequestException:
write('İsteklerle ilgili hata oluştu.')
def scrape_regex(self):
for source in self.proxy_w_regex:
self._scrape(source[0], source[1])
def scrape_direct(self):
for source in self.proxy_direct:
try:
page = requests.get(source, timeout=5, headers=self.headers).text
for proxy in re.findall(re.compile('([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}):([0-9]{1,5})'), page):
self.proxy_output.append(proxy[0] + ':' + proxy[1])
write(' > ' + proxy[0] + ':' + proxy[1])
except requests.exceptions.RequestException:
write('İsteklerle ilgili hata oluştu.')
class ProxyCheck(XProxy):
def __init__(self):
XProxy.__init__(self)
print('Loading..')
self.checker = ProxyChecker()
system('cls')
def check(self, list_, timeout=5):
for x in list_:
c = self.checker.check_proxy(x)
if c:
write(Fore.GREEN + '[ALIVE] '+ x + ' | ' + c['anonymity'] + ' | ' + 'Timeout:'+ str(c['timeout']) + ' ' +c['country_code'] + Style.RESET_ALL + ' ' + c['protocols'][0])
with open('all_alive.txt', 'a', encoding='UTF-8') as f:
f.write(x + '\n')
if c['protocols'][0] == 'http':
with open('http_.txt', 'a', encoding='UTF-8') as f:
f.write(x + '\n')
elif c['protocols'][0] == 'socks4':
with open('socks4_.txt', 'a', encoding='UTF-8') as f:
f.write(x + '\n')
elif c['protocols'][0] == 'socks5':
with open('socks5_.txt', 'a', encoding='UTF-8') as f:
f.write(x + '\n')
else:
pass
self.checked_counter += 1
else:
write(Fore.RED + '[DEAD] ' + x + Style.RESET_ALL)
with open('proxies.txt', 'a', encoding='UTF-8') as f:
f.write(x + '\n')
self.checked_counter += 1
def main():
x = UI()
p = ProxyScrape()
system(' by BlacJac ^| Proxy ')
system('cls')
print(x.banner())
print(x.menu())
print('\n')
try:
user_input = int(input(f'[{Fore.RED}>{Style.RESET_ALL}] > '))
if user_input == 1:
system('cls')
print(x.banner())
p.background_task()
print('Proxy ler siliniyor')
p.scrape_regex()
p.scrape_direct()
output = p.get_proxies()
print('\nYinelenenler kontrol ediliyor..')
print('Current length:', len(output))
clean_output = list(set(output))
print('Kopyaları kaldırdıktan sonraki uzunluk:', len(clean_output))
print('Proxy.txt dosyasına yazma..')
p.file_write('Proxy.txt', clean_output)
print('bitmiş.')
system('Duraklat>nul')
elif user_input == 2:
pc = ProxyCheck()
system('cls')
print(x.banner())
path = input('Path: ')
if '"' in path:
new_path = path.replace('"','')
else:
new_path = path
proxy_list = pc.file_read(new_path)
thread_count = int(input('Konu sayısını girin[e.g 200] : '))
print('Yükleniyor..')
threads = []
system('cls')
print(x.banner())
pc.background_task()
for i in range(thread_count):
t = threading.Thread(target=pc.check, args= (proxy_list[int(len(proxy_list) / thread_count * i): int(len(proxy_list)/ thread_count* (i+1))],))
threads.append(t)
t.start()
for t in threads:
t.join()
print('bitmiş.')
system('pause>nul')
else:
print('Geçersiz!')
main()
except ValueError:
main()
if __name__ == '__main__':
main()
Müsaadenizi isteyeyim artık ben. Size de kolaylıklar dilerim.