Add to configuration: minimum points and pinned games

This commit is contained in:
stilmaniac 2020-06-27 12:05:58 +03:00
parent 1ab5d688ff
commit a420a498dd
3 changed files with 56 additions and 17 deletions

View file

@ -1,4 +1,4 @@
![](https://i.imgur.com/dKA3udT.png) ![](https://i.imgur.com/oCob3wQ.gif)
### About ### About
The bot is specially designed for [SteamGifts.com](https://www.steamgifts.com/) The bot is specially designed for [SteamGifts.com](https://www.steamgifts.com/)
@ -22,7 +22,7 @@ The bot is specially designed for [SteamGifts.com](https://www.steamgifts.com/)
python -m venv env python -m venv env
source env/bin/activate source env/bin/activate
pip install -r requirements.txt pip install -r requirements.txt
python cli.py python src/cli.py
``` ```
### Help ### Help

View file

@ -1,10 +1,12 @@
import six import six
import configparser import configparser
import re
from pyfiglet import figlet_format from pyfiglet import figlet_format
from pyconfigstore import ConfigStore from pyconfigstore import ConfigStore
from PyInquirer import (Token, ValidationError, Validator, print_json, prompt, from PyInquirer import (Token, ValidationError, Validator, print_json, prompt,
style_from_dict) style_from_dict)
from prompt_toolkit import document
try: try:
import colorama import colorama
@ -37,13 +39,26 @@ def log(string, color, font="slant", figlet=False):
six.print_(string) six.print_(string)
def ask(type, name, message, validator=None, choices=[]): class PointValidator(Validator):
def validate(self, document: document.Document):
value = document.text
try:
value = int(value)
except Exception:
raise ValidationError(message = 'Value should be greater than 0', cursor_position = len(document.text))
if value <= 0:
raise ValidationError(message = 'Value should be greater than 0', cursor_position = len(document.text))
return True
def ask(type, name, message, validate=None, choices=[]):
questions = [ questions = [
{ {
'type': type, 'type': type,
'name': name, 'name': name,
'message': message, 'message': message,
'validator': validator, 'validate': validate,
}, },
] ]
if choices: if choices:
@ -83,6 +98,10 @@ def run():
else: else:
cookie = config['DEFAULT'].get('cookie') cookie = config['DEFAULT'].get('cookie')
pinned_games = ask(type='confirm',
name='pinned',
message='Should bot enter pinned games?')['pinned']
gift_type = ask(type='list', gift_type = ask(type='list',
name='gift_type', name='gift_type',
message='Select type:', message='Select type:',
@ -95,7 +114,12 @@ def run():
'New' 'New'
])['gift_type'] ])['gift_type']
s = SG(cookie, gift_type) min_points = ask(type='input',
name='min_points',
message='Enter minimum points to start working (bot will try to enter giveaways until minimum value is reached):',
validate=PointValidator)['min_points']
s = SG(cookie, gift_type, pinned_games, min_points)
s.start() s.start()

View file

@ -15,11 +15,13 @@ from cli import log
class SteamGifts: class SteamGifts:
def __init__(self, cookie, gifts_type): def __init__(self, cookie, gifts_type, pinned, min_points):
self.cookie = { self.cookie = {
'PHPSESSID': cookie 'PHPSESSID': cookie
} }
self.gifts_type = gifts_type self.gifts_type = gifts_type
self.pinned = pinned
self.min_points = int(min_points)
self.base = "https://www.steamgifts.com" self.base = "https://www.steamgifts.com"
self.session = requests.Session() self.session = requests.Session()
@ -60,8 +62,13 @@ class SteamGifts:
def update_info(self): def update_info(self):
soup = self.get_soup_from_page(self.base) soup = self.get_soup_from_page(self.base)
try:
self.xsrf_token = soup.find('input', {'name': 'xsrf_token'})['value'] self.xsrf_token = soup.find('input', {'name': 'xsrf_token'})['value']
self.points = int(soup.find('span', {'class': 'nav__points'}).text) # storage points self.points = int(soup.find('span', {'class': 'nav__points'}).text) # storage points
except TypeError:
log("⛔ Cookie is not valid.", "red")
sleep(10)
exit()
def get_game_content(self, page=1): def get_game_content(self, page=1):
n = page n = page
@ -74,13 +81,22 @@ class SteamGifts:
soup = self.get_soup_from_page(paginated_url) soup = self.get_soup_from_page(paginated_url)
game_list = soup.find_all(lambda tag: tag.name == 'div' and tag.get('class') == ['giveaway__row-inner-wrap']) game_list = soup.find_all('div', {'class': 'giveaway__row-inner-wrap'})
if not len(game_list):
log("⛔ Page is empty. Please, select another type.", "red")
sleep(10)
exit()
for item in game_list: for item in game_list:
if self.points == 0: if len(item.get('class', [])) == 2 and not self.pinned:
log("🛋️ Sleeping to get 6 points", "yellow") continue
if self.points == 0 or self.points < self.min_points:
txt = f"🛋️ Sleeping to get 6 points. We have {self.points} points, but we need {self.min_points} to start."
log(txt, "yellow")
sleep(900) sleep(900)
self.get_game_content(page=n) self.start()
break break
game_cost = item.find_all('span', {'class': 'giveaway__heading__thin'})[-1] game_cost = item.find_all('span', {'class': 'giveaway__heading__thin'})[-1]
@ -101,14 +117,15 @@ class SteamGifts:
game_id = item.find('a', {'class': 'giveaway__heading__name'})['href'].split('/')[2] game_id = item.find('a', {'class': 'giveaway__heading__name'})['href'].split('/')[2]
res = self.entry_gift(game_id) res = self.entry_gift(game_id)
if res: if res:
txt = f"🎉 One more game! Have just entered {game_name}" self.points -= int(game_cost)
txt = f"🎉 One more game! Has just entered {game_name}"
log(txt, "green") log(txt, "green")
# sleep(randint(10, 30)) sleep(randint(3, 7))
n = n+1 n = n+1
log("🛋️ List of games is ended. Waiting 2 min to update...", "yellow") log("🛋️ List of games is ended. Waiting 2 mins to update...", "yellow")
sleep(120) sleep(120)
self.start() self.start()
@ -117,8 +134,6 @@ class SteamGifts:
entry = requests.post('https://www.steamgifts.com/ajax.php', data=payload, cookies=self.cookie) entry = requests.post('https://www.steamgifts.com/ajax.php', data=payload, cookies=self.cookie)
json_data = json.loads(entry.text) json_data = json.loads(entry.text)
self.update_info()
if json_data['type'] == 'success': if json_data['type'] == 'success':
return True return True