Skip to content

Instantly share code, notes, and snippets.

@joaoescribano
Created July 25, 2019 16:44
Show Gist options
  • Save joaoescribano/61915992ef4f4d142723c8782d81714e to your computer and use it in GitHub Desktop.
Save joaoescribano/61915992ef4f4d142723c8782d81714e to your computer and use it in GitHub Desktop.
Binance login + wallet check + captcha solver
#!/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