Created
July 25, 2019 16:44
-
-
Save joaoescribano/61915992ef4f4d142723c8782d81714e to your computer and use it in GitHub Desktop.
Binance login + wallet check + captcha solver
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# Usage: | |
# ./binance.py <email> <senha> <otp> <wallet to test json> | |
from solver import PuzleSolver | |
import calendar | |
import json | |
import os | |
import pyotp | |
import base64 | |
import mysql.connector | |
from pyvirtualdisplay import Display | |
from selenium import webdriver | |
from selenium.common.exceptions import TimeoutException | |
from selenium.webdriver.common.by import By | |
from selenium.webdriver.support import expected_conditions as EC | |
from selenium.webdriver.support.ui import WebDriverWait | |
from selenium.webdriver.common.action_chains import ActionChains | |
import sys | |
import time | |
def get_chrome_drive(driver_path=None): | |
base_dir = os.path.dirname(os.path.abspath(__file__)) | |
log_path = os.path.join(base_dir, 'chromedriver.log') | |
if driver_path is None: | |
driver_path = '/usr/bin/chromedriver' | |
pass | |
options = webdriver.ChromeOptions() | |
# options.headless = True | |
# options.add_argument('--hide-scrollbars') | |
options.add_argument('--no-sandbox') | |
options.add_extension(base_dir + '/../plugin_editado.zip') | |
driver = webdriver.Chrome( | |
executable_path=driver_path, | |
chrome_options=options, | |
service_args=[ | |
# '--log-path={}'.format(log_path), | |
# '--verbose', | |
] | |
) | |
return driver | |
def get_firefox_drive(driver_path=None): | |
base_dir = os.path.dirname(os.path.abspath(__file__)) | |
log_path = os.path.join(base_dir, 'geckodriver.log') | |
if driver_path is None: | |
driver_path = '/usr/bin/geckodriver' | |
pass | |
options = webdriver.FirefoxOptions() | |
# options.add_argument('-headless') | |
driver = webdriver.Firefox( | |
executable_path=driver_path, | |
firefox_options=options | |
) | |
return driver | |
def solveCaptcha(driver): | |
base_dir = os.path.dirname(os.path.abspath(__file__)) | |
imgSlice = driver.execute_script('return document.querySelector(".geetest_canvas_slice.geetest_absolute").toDataURL("image/png").substring(22);') | |
f = open(base_dir + "/imgSlice.png", "wb") | |
f.write(base64.b64decode(imgSlice)) | |
f.close() | |
imgBg = driver.execute_script('return document.querySelector(".geetest_canvas_bg.geetest_absolute").toDataURL("image/png").substring(22);') | |
f = open(base_dir + "/imgBg.png", "wb") | |
f.write(base64.b64decode(imgBg)) | |
f.close() | |
solver = PuzleSolver(base_dir + "/imgSlice.png", base_dir + "/imgBg.png") | |
solution = solver.get_position() | |
time.sleep(3) | |
sliderBtn = driver.find_element_by_css_selector(".geetest_slider_button") | |
ActionChains(driver).drag_and_drop_by_offset(sliderBtn, solution, 0).perform() | |
try: | |
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div/main/div/div/div/div/div/span/div/div[3]/div/div[2]/div[2]/div[2]/div/input[1]'))) | |
return True | |
except TimeoutException: | |
print("Captcha error") | |
return solveCaptcha(driver) | |
def doLogin(driver, username, password, otc_pass, count=0): | |
count += 1 | |
if (count > 3): | |
return False | |
driver.get("https://www.binance.com/en/login") | |
time.sleep(5) | |
# login | |
elem = driver.find_element_by_css_selector("#login_input_email") | |
elem.clear() | |
elem.send_keys(username) | |
# password | |
elem = driver.find_element_by_css_selector("#login_input_password") | |
elem.clear() | |
elem.send_keys(password) | |
# send | |
driver.execute_script('document.querySelector("#login_input_login").click();') | |
time.sleep(5) | |
base_dir = os.path.dirname(os.path.abspath(__file__)) | |
solveCaptcha(driver) | |
totp = pyotp.TOTP(otc_pass) | |
otp = list(totp.now()) | |
elem = driver.find_element_by_xpath('//*[@id="__next"]/div/main/div/div/div/div/div/span/div/div[3]/div/div[2]/div[2]/div[2]/div/input[1]') | |
elem.send_keys(otp[0]) | |
elem = driver.find_element_by_xpath('//*[@id="__next"]/div/main/div/div/div/div/div/span/div/div[3]/div/div[2]/div[2]/div[2]/div/input[2]') | |
elem.send_keys(otp[1]) | |
elem = driver.find_element_by_xpath('//*[@id="__next"]/div/main/div/div/div/div/div/span/div/div[3]/div/div[2]/div[2]/div[2]/div/input[3]') | |
elem.send_keys(otp[2]) | |
elem = driver.find_element_by_xpath('//*[@id="__next"]/div/main/div/div/div/div/div/span/div/div[3]/div/div[2]/div[2]/div[2]/div/input[4]') | |
elem.send_keys(otp[3]) | |
elem = driver.find_element_by_xpath('//*[@id="__next"]/div/main/div/div/div/div/div/span/div/div[3]/div/div[2]/div[2]/div[2]/div/input[5]') | |
elem.send_keys(otp[4]) | |
elem = driver.find_element_by_xpath('//*[@id="__next"]/div/main/div/div/div/div/div/span/div/div[3]/div/div[2]/div[2]/div[2]/div/input[6]') | |
elem.send_keys(otp[5]) | |
try: | |
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[4]/div/div[2]/div/div[2]/div/div/div[1]/div[2]/h3'))) | |
print("Device need release aproval, calling php") | |
time.sleep(10) | |
link = "" | |
while (link == ""): | |
link = os.popen("php " + base_dir + "/imapValidateNewDevice.php").read(); | |
if (link == ""): | |
print("Retrying") | |
time.sleep(5) | |
print("Link received: " + link) | |
driver.get(link) | |
time.sleep(3) | |
return doLogin(driver, username, password, otc_pass, count) | |
except TimeoutException: | |
print("Device seems to be released!") | |
return True | |
def main(): | |
username = sys.argv[1] | |
password = sys.argv[2] | |
otc_pass = sys.argv[3] | |
tmpFile = sys.argv[4] | |
file = open("/tmp/test_" + tmpFile + ".json", 'r+') | |
dataJson = json.loads(file.read(-1)) | |
mydb = mysql.connector.connect( | |
host="server.com.br", | |
user="user", | |
passwd="pass", | |
database="db" | |
) | |
mycursor = mydb.cursor() | |
# display = Display(visible=0, size=(1024, 768)) | |
# display.start() | |
driver = get_chrome_drive() | |
driver.set_window_size(1024, 768) | |
if (doLogin(driver, username, password, otc_pass)): | |
try: | |
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.ID, 'dashboard-balanceDetail-withdraw'))) | |
for coin, markets in dataJson['binance'].items(): | |
print("Testing coin ", coin) | |
driver.get("https://www.binance.com/en/usercenter/wallet/withdrawals/" + coin) | |
time.sleep(3) | |
for market in markets: | |
elem = driver.find_element_by_css_selector("input[name=address]") | |
elem.clear() | |
elem.send_keys(market['wallet']) | |
time.sleep(1) | |
validation = driver.execute_script('return document.querySelector("input[name=address]").parentElement.parentElement.parentElement.parentElement.parentElement.children[2].innerText;') | |
check = True | |
if (validation == "Please enter a valid address"): | |
check = False | |
sql = "UPDATE markets SET trade_status = 0 WHERE id = " + market['market'] | |
else: | |
sql = "UPDATE markets SET trade_status = 1 WHERE id = " + market['market'] | |
mycursor.execute(sql) | |
mydb.commit() | |
print("Market #", market['market'], " [", market['coin'], "] (", market['wallet'], ') = ', check) | |
time.sleep(1) | |
except TimeoutException: | |
print("Something went wrong") | |
driver.close() | |
# display.popen.kill() | |
print("Display closed!") | |
return | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment