Broken Scrap.TF public raffle bot

This commit is contained in:
Abhorrent_Anger 2023-12-14 12:47:40 +02:00
commit 90a49e3c5a
3 changed files with 129 additions and 0 deletions

11
LICENSE Normal file
View File

@ -0,0 +1,11 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.

11
README.md Normal file
View File

@ -0,0 +1,11 @@
# ScrapTFRaffleBot
Enters Public Raffles. Call as `python main.py <SCRAPTF> <CF_CLEARANCE> <USERNAME>`.
Deprecated due to the site implementing Cloudflare's turnstile key.
## Dependencies:
```
pip install urllib2
pip install termcolor
```

107
main.py Normal file
View File

@ -0,0 +1,107 @@
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()