steamgifts-bot/main.py
2020-03-09 20:32:32 +02:00

132 lines
3.9 KiB
Python

import sys
import configparser
import requests
import json
import threading
from time import sleep
from random import randint
from requests import RequestException
from bs4 import BeautifulSoup
CONFIG_DEFAULT = {
'cookie': 'Paste you cookie here',
'sleeptime': 900
}
def exitMessage(msg):
print(msg)
input()
sys.exit()
def readConfig():
config = configparser.ConfigParser()
def initConfig():
config['STEAMGIFTS'] = CONFIG_DEFAULT
with open('config.ini', 'w') as configfile:
config.write(configfile)
if not len(config.read('config.ini')):
initConfig()
exitMessage('Init file was created. Please, look into it and set up your cookie.')
elif list(CONFIG_DEFAULT.keys()) != list(config['STEAMGIFTS'].keys()):
initConfig()
exitMessage('Init file was reinitialised due to incorrect format. Please, look into it and set up your cookie.')
global timeout, cookies
timeout = config['STEAMGIFTS']['sleeptime']
cookies = {'PHPSESSID': config['STEAMGIFTS']['cookie']}
pages = 1
def get_soup_from_page(url):
r = requests.get(url, cookies=cookies)
soup = BeautifulSoup(r.text, 'html.parser')
return soup
def get_page():
global xsrf_token, points
try:
soup = get_soup_from_page('https://www.steamgifts.com')
xsrf_token = soup.find('input', {'name': 'xsrf_token'})['value']
points = soup.find('span', {'class': 'nav__points'}).text # storage points
except RequestException:
print('Cant connect to the site')
print('Waiting 2 minutes and reconnect...')
sleep(120)
get_page()
except TypeError:
print('Cant recognize your cookie value.')
sleep(30)
sys.exit(0)
# get codes of the games
def get_games():
global game_name
global pages
n = 1
while n <= pages:
print('Proccessing games from %d page.' % n)
soup = get_soup_from_page('https://www.steamgifts.com/giveaways/search?page=' + str(n))
try:
gifts_list = soup.find_all(lambda tag: tag.name == 'div' and tag.get('class') == ['giveaway__row-inner-wrap'])
for item in gifts_list:
if int(points) == 0:
print('> Sleeping to get 6 points')
sleep(timeout)
get_games()
break
game_cost = item.find_all('span', {'class': 'giveaway__heading__thin'})
last_div = None
for last_div in game_cost:
pass
if last_div:
game_cost = last_div.getText().replace('(', '').replace(')', '').replace('P', '')
game_name = item.find('a', {'class': 'giveaway__heading__name'}).text.encode('utf-8')
if int(points) - int(game_cost) < 0:
print('Not enough points to enter: ' + game_name)
continue
elif int(points) - int(game_cost) > 0:
entry_gift(item.find('a', {'class': 'giveaway__heading__name'})['href'].split('/')[2])
n = n+1
except AttributeError:
break
print('List of games is ended. Waiting 2 min to update...')
sleep(120)
get_page()
get_games()
def entry_gift(code):
payload = {'xsrf_token': xsrf_token, 'do': 'entry_insert', 'code': code}
entry = requests.post('https://www.steamgifts.com/ajax.php', data=payload, cookies=cookies)
json_data = json.loads(entry.text)
get_page()
# print(json_data)
# updating points after entered a giveaway
if json_data['type'] == 'success':
print('> Bot has entered giveaway: ' + game_name.decode("utf-8"))
sleep(randint(10, 30))
if __name__ == '__main__':
readConfig()
get_page()
get_games()