Skip to content

Instantly share code, notes, and snippets.

@ad-m
Created June 21, 2020 09:29
Show Gist options
  • Save ad-m/7580026132162cbb28d8b29fa9423957 to your computer and use it in GitHub Desktop.
Save ad-m/7580026132162cbb28d8b29fa9423957 to your computer and use it in GitHub Desktop.
(function () {
if (!window.grecaptcha) {
console.log('Avoid wrapping before load grecaptcha');
return;
};
if (window.grecaptcha.wrapped) {
console.log('Avoid multiple wrapping of grecaptcha');
return;
};
const x = grecaptcha.render;
grecaptcha.render = function () {
console.log('grecaptcha arguments', arguments);
const cb = arguments[1].callback;
if (arguments[1] && arguments[1].callback) {
window.recaptchaCallback = window.recaptchaCallback || [];
window.recaptchaCallback.push(arguments[1].callback);
console.log('recaptchaCallback', window.recaptchaCallback);
}
return x(...arguments);
};
grecaptcha.wrapped = true;
})();
import re
import time
import os
from os import environ
import gzip
from python_anticaptcha import AnticaptchaClient, NoCaptchaTaskProxylessTask
api_key = environ["KEY"]
site_key_pattern = "RECAPTCHA_PUBLIC_KEY = '(.+?)'"
url = "https://securitytrails.com/list/apex_domain/reddit.com"
DIR = os.path.dirname(os.path.abspath(__file__))
EXPECTED_RESULT = 'nnm.reddit.com'
client = AnticaptchaClient(api_key)
wrapper_code = open(os.path.join(DIR, 'callback_sniffer.js'), 'rb').read()
def get_token(url, site_key):
task = NoCaptchaTaskProxylessTask(
website_url=url, website_key=site_key
)
job = client.createTask(task)
job.join(maximum_time=60 * 15)
return job.get_solution_response()
def process(driver):
driver.get(url)
site_key = get_sitekey(driver)
print("Found site-key", site_key)
token = get_token(url, site_key)
print("Found token", token)
form_submit(driver, token)
time.sleep(15)
return driver.page_source
def form_submit(driver, token):
driver.execute_script(
"document.getElementById('g-recaptcha-response').innerHTML='{}';".format(token)
)
driver.execute_script("window.recaptchaCallback[0]('{}')".format(token))
time.sleep(1)
def get_sitekey(driver):
return re.search(site_key_pattern, driver.page_source).group(1)
if __name__ == "__main__":
from seleniumwire import webdriver # Import from seleniumwire
def custom(req, req_body, res, res_body):
if not req.path or not 'recaptcha' in req.path:
return
if not res.headers.get('Content-Type', None) == 'text/javascript':
return
if res.headers['Content-Encoding'] == 'gzip':
del res.headers['Content-Encoding']
res_body = gzip.decompress(res_body)
return res_body + wrapper_code
driver = webdriver.Firefox(seleniumwire_options={
'custom_response_handler': custom
})
try:
assert EXPECTED_RESULT in process(driver)
finally:
driver.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment