• XSS.stack #1 – первый литературный журнал от юзеров форума

Python - задай вопрос получи ответ

Подскажите, как в питоне сделать цикл чтобы импортировать прокси в селениум из списка по очереди и как возможно сделать проверку с перезапуском скрипта, если прокси не валидный, тогда скрипт перезапускает себя с новым прокси.

Python:
from selenium import webdriver
import time
import random
from random import choice
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from random import choice

prox=[]
proxies=[]

try:
    with open('GoodProxy.txt', 'r') as f:
        proxies=f.readlines()

except:
    print('[ERROR]\t"GoodProxy.txt" file NOT FOUND !!')
    exit()
print('[***]\tTotal Proxies :',len(proxies))

for line in proxies:
    prox.append(line)

link = "http://yandex.ru/"
PROXY = choice(prox) # IP:PORT or HOST:PORT
print(PROXY)


options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=%s' % PROXY)
options.add_argument('--disable-features=UserAgentClientHint')
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
prefs = {"profile.default_content_setting_values.geolocation" :2}
options.add_experimental_option("prefs",prefs)

browser = webdriver.Chrome(options=options)

browser.get(link)
 
Python:
import time
from random import choice

from requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains


URL = "http://yandex.ru/"

try:
    with open('GoodProxy.txt', 'r') as f:
        proxy_list = [line.rstrip() for line in f if line.rstrip()]
except:
    print('[ERROR]\t"GoodProxy.txt" file NOT FOUND !!')
    exit()
print('[***]\tTotal Proxies :',len(proxy_list))


def check_proxy(proxy):
    proxies = {
        'http':'socks5://' % proxy,
        'https':'socks5://' % proxy
    }
    try:
        return requests.get(URL, proxies=proxies)
    except:
        return False


def do_something(proxy=None):
    options = webdriver.ChromeOptions()
    if proxy:
        options.add_argument('--proxy-server=%s' % proxy)
    options.add_argument('--disable-features=UserAgentClientHint')
    options.add_argument("--disable-blink-features")
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
   
    prefs = {"profile.default_content_setting_values.geolocation" :2}
    options.add_experimental_option("prefs", prefs)
   
    browser = webdriver.Chrome(options=options)
    browser.get(URL)



def main():
    for proxy in proxy_list:
        if not check_proxy(proxy):
            print('[PROXY] Bad:', proxy)
            continue
        
        print('[PROXY] Good:', proxy)
        do_something(proxy)

Но лучше разберись с очередями, потому что с ними проще избавляться от мертвых проксей и юзать только живые
 
Python:
import time
from random import choice

from requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains


URL = "http://yandex.ru/"

try:
    with open('GoodProxy.txt', 'r') as f:
        proxy_list = [line.rstrip() for line in f if line.rstrip()]
except:
    print('[ERROR]\t"GoodProxy.txt" file NOT FOUND !!')
    exit()
print('[***]\tTotal Proxies :',len(proxy_list))


def check_proxy(proxy):
    proxies = {
        'http':'socks5://' % proxy,
        'https':'socks5://' % proxy
    }
    try:
        return requests.get(URL, proxies=proxies)
    except:
        return False


def do_something(proxy=None):
    options = webdriver.ChromeOptions()
    if proxy:
        options.add_argument('--proxy-server=%s' % proxy)
    options.add_argument('--disable-features=UserAgentClientHint')
    options.add_argument("--disable-blink-features")
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
  
    prefs = {"profile.default_content_setting_values.geolocation" :2}
    options.add_experimental_option("prefs", prefs)
  
    browser = webdriver.Chrome(options=options)
    browser.get(URL)



def main():
    for proxy in proxy_list:
        if not check_proxy(proxy):
            print('[PROXY] Bad:', proxy)
            continue
       
        print('[PROXY] Good:', proxy)
        do_something(proxy)

Но лучше разберись с очередями, потому что с ними проще избавляться от мертвых проксей и юзать только живые
Не подскажите книгу или материал по очередям, я пробовал через функции, но все время было только падение кода, без ошибок в консоли
 
from sys import exit добавь еще
И запускай не двойным кликом, а из терминала (ком.строки), тогда увидишь ошибку.
Книги не нужны, просто документация по Queue.Queue
 
from sys import exit добавь еще
И запускай не двойным кликом, а из терминала (ком.строки), тогда увидишь ошибку.
Книги не нужны, просто документация по Queue.Queue
1624619305747.png


Подскажите, еще, пожалуйста, пишет такую ошибку если вставляю код
Python:
for proxy in proxy_list:
    print(proxy)
ниже функции проверки прокси иначе код вообще не отрабатывает и ошибок нет, в консоль выводит прокси и перебирает их, тип строка, поэтому не могу понять в чем может быть проблема
 
Поправь там немножко
proxies = {
'http':'socks5://%s' % proxy,
'https':'socks5://%s' % proxy
}
Ошибки нет, но и проверки тоже
если вставлять код ниже, тогда

1624619970255.png


Если нет
1624620017751.png

Не понимаю в чем может быть проблема, т.к все данные выводятся , и если делать перебор проксей, так же все падают в консоль, но они не заходят в функцию проверки
 
Блин, так скрипт не полный. Вызова функции main нету. Я думал ты сам сделаешь)
if __name__ == '__main__':
main()

И добавь таймаут в check_proxy, requests.get(proxies=proxies, timeout=10)
 
Блин, так скрипт не полный. Вызова функции main нету. Я думал ты сам сделаешь)
if __name__ == '__main__':
main()

И добавь таймаут в check_proxy, requests.get(proxies=proxies, timeout=10)

Я ещё тупой в питоне, с js только перешёл, спасибо
 
Блин, так скрипт не полный. Вызова функции main нету. Я думал ты сам сделаешь)
if __name__ == '__main__':
main()

И добавь таймаут в check_proxy, requests.get(proxies=proxies, timeout=10)
Можешь еще подсказать, когда запускаю код в терминале или ide в откладке он работает, но когда запускаю через 2 клик терминал падает, нужен какой-то импорт системы?
Остальные скрипты работают нормально, думал я дальше с кодом где-то ошибся, но даже если удаляю ничего не меняется, в терминале работает, по клику падает консоль.
 
Можешь еще подсказать, когда запускаю код в терминале или ide в откладке он работает, но когда запускаю через 2 клик терминал падает, нужен какой-то импорт системы?
Остальные скрипты работают нормально, думал я дальше с кодом где-то ошибся, но даже если удаляю ничего не меняется, в терминале работает, по клику падает консоль.
Пробовал добавить #!/usr/bin/python в начало скрипта?
 
На сколько понимаю строка же для linux, а я с windows запускаю
Ок. Тогда с чем *.py файлы ассоциированы?
 
Ок. Тогда с чем *.py файлы ассоциированы?
Просто путь по умолчанию на питона стоит, если открываю другие скрипты, все работает, только с этим такая проблема.
 
Код:

Python:
<?php
die(json_encode([
    'state' => 'needupdate',
]));

define ('ALLOW', true);
require 'config.php';
require '../session/uuid.lib.php';
require 'aes.class.php';

if (!isset($_POST['d']) || !isset($_POST['h']) || !isset($_POST['v']))
    die('too many hackers');

if ($_POST['v'] != $ver['launcher'])
    die(json_encode([
        'state' => 'needupdate',
    ]));

$key = 'Cheat' . $ver['launcher'] . 'Pidor';
while (strlen($key) < 16)
    $key .= '!';
$key = substr($key, 0, 16);
$data = AES::decrypt($_POST['d'], $key);
if (md5($data) != $_POST['h'])
    die(json_encode([
        'state' => 'fail',
        'message' => 'Ошибка авторизации. Код 65 '.$data
    ]));
    
@list($word, $username, $password, $version, $osuuid) = explode('^', $data, 5);
if (!isset($osuuid) || $word != 'data')
    die(json_encode([
        'state' => 'fail',
        'message' => 'Ошибка авторизации. Повторите попытку позже. Код 30'
    ]));

if ($version != $ver['launcher'])
    die(json_encode([
        'state' => 'needupdate',
    ]));

connect_db();

$username = mysql_real_escape_string($username);

if (!endsWith($password, '-'))
    die(json_encode([
        'state' => 'fail',
        'message' => 'Неверный формат пароля'
    ]));

$info = mysql_query("SELECT password, username, uuid_protection FROM authme WHERE username = '".$username."'")
        or die(json_encode([
            'state' => 'fail',
            'message' => 'Ошибка базы данных [0]. Сообщите об этом администратору.'
        ]));
$info = mysql_fetch_assoc($info);

if (md5($info['password'].'$Sasha').'-' != $password)
    die(json_encode([
        'state' => 'fail',
        'message' => 'Неверный логин или пароль<br>'
    ]));

if ($info['uuid_protection'] == 1){
    if (!preg_match('/^[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}$/i', $osuuid))
        die(json_encode([
            'state' => 'fail',
            'message' => 'Неверный формат UUID (идентификатора компьютера)'
        ]));
    
    $u = strtolower($username);
    $uuid_query = mysql_query("SELECT COUNT(*) FROM user_uuid WHERE uuid = '".$osuuid."' AND username = '".$info['username']."'")
            or die(json_encode([
                'state' => 'fail',
                'message' => 'Ошибка базы данных [1]. Сообщите об этом администратору.'
            ]));
    $uuid_query = mysql_fetch_array($uuid_query);
    if ($uuid_query[0] == 0)
        die(json_encode([
            'state' => 'fail',
            'message' => 'В аккаунте включена привязка к компьютеру.<br>Вход возможен только с разрешенных устройств.<br><br>Чтобы добавить устройство войдите в Личный Кабинет<br>Меню>Разное>Безопасность'
        ]));
}

$session = randNum();
mysql_query("UPDATE authme SET session='".$session."', lastlogin='".time()."' WHERE username = '".$info['username']."'");
/*mysql_query("UPDATE sessions SET session='".$session."', lastlogin='".time()."' WHERE username = '".$info['username']."'");
if (mysql_affected_rows() == 0){
    mysql_query("INSERT INTO sessions (uuid, username, session, lastlogin) VALUES (UNHEX('".str_replace('-', '', getUUID($info['username']))."'), '".$info['username']."', '".$session."', ".time().")");
}*/

$salt = randNum();
$response = [
    'state' => 'success',
    'username' => $info['username'],
    'uuid' => str_replace('-', '', getUUID($info['username'])),
    //'realsess' => $session,
    //'salt' => $salt,
    'session' => base_convert($session^$salt, 10, 34).'z'.base_convert($salt, 10, 36)
];

print json_encode($response);


//**** Functions
function endsWith($haystack, $needle) {
    return substr($haystack, -strlen($needle)) === $needle;
}
function randNum(){
    return rand(1000000000000000000,9223372036854775807);
}

Авторизация:
Python:
if (!isset($_POST['d']) || !isset($_POST['h']) || !isset($_POST['v']))

Вопрос:
Какой запрос идёт на сервер при авторизации и что они означают?

Как я понял (но не работает):
d
- логин, h - пароль, v - uuid
d=NICK&h=PASSWORD&v=UUID


Буду благодарен.:)
 
Код:

Python:
<?php
die(json_encode([
    'state' => 'needupdate',
]));

define ('ALLOW', true);
require 'config.php';
require '../session/uuid.lib.php';
require 'aes.class.php';

if (!isset($_POST['d']) || !isset($_POST['h']) || !isset($_POST['v']))
    die('too many hackers');

if ($_POST['v'] != $ver['launcher'])
    die(json_encode([
        'state' => 'needupdate',
    ]));

$key = 'Cheat' . $ver['launcher'] . 'Pidor';
while (strlen($key) < 16)
    $key .= '!';
$key = substr($key, 0, 16);
$data = AES::decrypt($_POST['d'], $key);
if (md5($data) != $_POST['h'])
    die(json_encode([
        'state' => 'fail',
        'message' => 'Ошибка авторизации. Код 65 '.$data
    ]));
   
@list($word, $username, $password, $version, $osuuid) = explode('^', $data, 5);
if (!isset($osuuid) || $word != 'data')
    die(json_encode([
        'state' => 'fail',
        'message' => 'Ошибка авторизации. Повторите попытку позже. Код 30'
    ]));

if ($version != $ver['launcher'])
    die(json_encode([
        'state' => 'needupdate',
    ]));

connect_db();

$username = mysql_real_escape_string($username);

if (!endsWith($password, '-'))
    die(json_encode([
        'state' => 'fail',
        'message' => 'Неверный формат пароля'
    ]));

$info = mysql_query("SELECT password, username, uuid_protection FROM authme WHERE username = '".$username."'")
        or die(json_encode([
            'state' => 'fail',
            'message' => 'Ошибка базы данных [0]. Сообщите об этом администратору.'
        ]));
$info = mysql_fetch_assoc($info);

if (md5($info['password'].'$Sasha').'-' != $password)
    die(json_encode([
        'state' => 'fail',
        'message' => 'Неверный логин или пароль<br>'
    ]));

if ($info['uuid_protection'] == 1){
    if (!preg_match('/^[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}$/i', $osuuid))
        die(json_encode([
            'state' => 'fail',
            'message' => 'Неверный формат UUID (идентификатора компьютера)'
        ]));
   
    $u = strtolower($username);
    $uuid_query = mysql_query("SELECT COUNT(*) FROM user_uuid WHERE uuid = '".$osuuid."' AND username = '".$info['username']."'")
            or die(json_encode([
                'state' => 'fail',
                'message' => 'Ошибка базы данных [1]. Сообщите об этом администратору.'
            ]));
    $uuid_query = mysql_fetch_array($uuid_query);
    if ($uuid_query[0] == 0)
        die(json_encode([
            'state' => 'fail',
            'message' => 'В аккаунте включена привязка к компьютеру.<br>Вход возможен только с разрешенных устройств.<br><br>Чтобы добавить устройство войдите в Личный Кабинет<br>Меню>Разное>Безопасность'
        ]));
}

$session = randNum();
mysql_query("UPDATE authme SET session='".$session."', lastlogin='".time()."' WHERE username = '".$info['username']."'");
/*mysql_query("UPDATE sessions SET session='".$session."', lastlogin='".time()."' WHERE username = '".$info['username']."'");
if (mysql_affected_rows() == 0){
    mysql_query("INSERT INTO sessions (uuid, username, session, lastlogin) VALUES (UNHEX('".str_replace('-', '', getUUID($info['username']))."'), '".$info['username']."', '".$session."', ".time().")");
}*/

$salt = randNum();
$response = [
    'state' => 'success',
    'username' => $info['username'],
    'uuid' => str_replace('-', '', getUUID($info['username'])),
    //'realsess' => $session,
    //'salt' => $salt,
    'session' => base_convert($session^$salt, 10, 34).'z'.base_convert($salt, 10, 36)
];

print json_encode($response);


//**** Functions
function endsWith($haystack, $needle) {
    return substr($haystack, -strlen($needle)) === $needle;
}
function randNum(){
    return rand(1000000000000000000,9223372036854775807);
}

Авторизация:
Python:
if (!isset($_POST['d']) || !isset($_POST['h']) || !isset($_POST['v']))

Вопрос:
Какой запрос идёт на сервер при авторизации и что они означают?

Как я понял (но не работает):
d
- логин, h - пароль, v - uuid
d=NICK&h=PASSWORD&v=UUID


Буду благодарен.:)
Прилетает POST запрос с следующими параметрами

v - указание версии
d - Зашифрованные данные
h - md5 хэш сумма расшифрованных данных

Далее идет проверка что все параметры заданы (d, h, v). Иначе завершаем работу с ошибкой


Если тебя интересуют логпасс, то они спрятаны в параметре d

Код:
$key = 'Cheat' . $ver['launcher'] . 'Pidor';

// Пока длинна строки меньше 16, добавляем в конец воскл знак.
while (strlen($key) < 16)
    $key .= '!';
    
// В значении key берем первые 16 символов
$key = substr($key, 0, 16);

// Расшифровываем данные, которые прилетели с параметром d
$data = AES::decrypt($_POST['d'], $key);


$data имеет примерно такой формат:
Код:
word^username^password^version^osuuid

А далее уже просто используя функцию explode разбиваем эту строку на куски (делитель == символ ^)
Код:
$word, $username, $password, $version, $osuuid = explode('^', $data, 5);


Соответсвенно чтоб создать свой запрос, тебе надо пройти описаные действия в обратном порядке.
Вместо explode используй конкатернацию
Вместо decrypt используй encrypt
 
Можешь еще подсказать, когда запускаю код в терминале или ide в откладке он работает, но когда запускаю через 2 клик терминал падает, нужен какой-то импорт системы?
Остальные скрипты работают нормально, думал я дальше с кодом где-то ошибся, но даже если удаляю ничего не меняется, в терминале работает, по клику падает консоль.
Потому что он напрямую запускает интерпретатор python. Завершается скрипт, завершается и процесс питона. Ты можешь поставить заглушку в под вызов main(), например input() (тогда он будет ждать нажатия enter после завершения), НО, если вылетит экзепшен в ходе работы, то он все равно закроется
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Возможно ли скомпилировать файл py. в exe через termux?
Не знаю, не пробовал, но теоретически да, попробуй)
 
Возможно ли скомпилировать файл py. в exe через termux?
Я очень сомневаюсь, что ты сможешь поставить компилятор (mingw, или что-то из этой серии) в Termux.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх