import urllib import time import sys try: from BeautifulSoup import BeautifulSoup except ImportError: from bs4 import BeautifulSoup import re from termcolor import colored SCR_SESSION = '' USER_ID = '' SCRAPTF = '' CF_CLEARANCE = '' USERNAME = '' BASE_URL = 'https://scrap.tf' RAFFLE_URL = '/raffles/' ENTER_RAFFLE_URL = '/ajax/viewraffle/EnterRaffle' def load_arguments(): global SCRAPTF, CF_CLEARANCE, USERNAME SCRAPTF = sys.argv[1] CF_CLEARANCE = sys.argv[2] USERNAME = sys.argv[3] def fetch_raw(url): request = urllib.request.Request(url) request = add_headers(request) page = urllib.request.urlopen(request).read() return page def post_raw(url, data): request = urllib.request.Request(url, urllib.parse.urlencode(data).encode()) request = add_headers(request) page = urllib.request.urlopen(request) return page def add_headers(request): request.add_header("Cookie", 'scraptf=' + SCRAPTF + '; cf_clearance=' + CF_CLEARANCE) request.add_header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") return request def fetch(url): html = fetch_raw(url) return BeautifulSoup(html, 'lxml') def check_notifications(parsed_html): notices = parsed_html.select('.user-notices-count')[0].text if notices != '0': print(colored('You have ' + notices + ' new notices!', 'red')) def unentered_raffles(): parsed_html = fetch(BASE_URL + RAFFLE_URL) raffles = parsed_html.select('#raffles-list .panel-raffle:not(.raffle-entered)') raffle_list = [] for element in raffles: link_element = element.find('a') relative_url = link_element.attrs['href'].replace(RAFFLE_URL, '') if relative_url: raffle_list.append(relative_url) print(colored('There are ' + str(len(raffle_list)) + ' raffles to enter for ' + USERNAME + '...', 'blue')) check_notifications(parsed_html) return raffle_list def get_hash(parsed_html): button = parsed_html.select('.btn.btn-embossed.btn-info.btn-lg:not(#raffle-enter):not([style*="display: none"])') if not button: print(colored('Didn\'t enter ' + parsed_html.find('title').text[:-19] + ' due to a missing enter button!', 'red')) return False onclick = button[0].attrs['onclick'] quote_text = re.findall(r"'([^']*)'", onclick) return quote_text[1] def get_csrf(parsed_html): form = parsed_html.select('#logoutForm')[0] input_element = form.find('input') return input_element.attrs['value'] def enter_raffle(raffle): parsed_html = fetch(BASE_URL + RAFFLE_URL + raffle) password = get_hash(parsed_html) if not password: return 418 # TODO: Somehow fetch the turnstile key, rendered client-side turnstile = parsed_html.select('#turnstile-container input')[0].value csrf = get_csrf(parsed_html) data = {'raffle' : raffle, 'captcha' : '', 'hash' : password, 'flag' : 'false', 'turnstile_token' : turnstile, 'csrf' : csrf} result = post_raw(BASE_URL + ENTER_RAFFLE_URL, data) if result.status == 200: print(colored('Succesfully entered ' + parsed_html.find('title').text[:-19] + ' (' + raffle + ')!', 'green')) time.sleep(5) return result def enter_raffles(): raffles = unentered_raffles() for raffle in raffles: enter_raffle(raffle) load_arguments() enter_raffles()