Compare commits
19 Commits
9bd96ad876
...
3c74aa025e
Author | SHA1 | Date |
---|---|---|
piair | 3c74aa025e | |
piair | 3123a1dbd0 | |
piair | 27d45e88dd | |
piair | 0685a42922 | |
piair | 6729703827 | |
piair | 304a222de1 | |
piair | 04d33f4ecd | |
piair | ac22814605 | |
piair | b7a89b56d0 | |
piair | 127d16afea | |
piair | 9bcbc81c2f | |
piair | 12eba5cde7 | |
piair | 22ea727c47 | |
piair | 05a1fd8557 | |
piair | 39e226b564 | |
piair | cd00c8ca88 | |
piair | 43793d2c2c | |
piair | ee6ec458fc | |
piair | e6e8bdaa06 |
|
@ -15,4 +15,5 @@ nohup.out
|
|||
file.png
|
||||
*.ts
|
||||
LICENSE
|
||||
README.md
|
||||
README.md
|
||||
venv
|
||||
|
|
163
V6.py
163
V6.py
|
@ -1,16 +1,17 @@
|
|||
#!/usr/bin/python3
|
||||
import random
|
||||
import subprocess
|
||||
|
||||
from modules.Classes.Config import Config
|
||||
from modules.Classes.DiscordLogger import DiscordLogger
|
||||
from modules.Classes.UserCredentials import UserCredentials
|
||||
from modules.Tools.logger import warning, critical
|
||||
from modules.Tools.logger import critical, warning
|
||||
from modules.cards import *
|
||||
from modules.config import *
|
||||
from modules.db import add_to_database
|
||||
from modules.driver_tools import *
|
||||
from modules.error import *
|
||||
|
||||
import random
|
||||
|
||||
|
||||
# create a webdriver
|
||||
def create_driver(mobile=False):
|
||||
|
@ -210,12 +211,12 @@ def all_cards():
|
|||
welcome_tour = driver.find_element(By.ID, "welcome-tour")
|
||||
interest_button_box = welcome_tour.find_element(By.CLASS_NAME, "interest-buttons")
|
||||
interests = interest_button_box.find_elements(By.CLASS_NAME, "ng-binding")
|
||||
debug("Got the following interests: "+str(interests))
|
||||
random.choice(interests).click() # Choose interest
|
||||
debug("Got the following interests: " + str(interests))
|
||||
random.choice(interests).click() # Choose interest
|
||||
custom_sleep(1.5)
|
||||
|
||||
claim_button = welcome_tour.find_element(By.ID, "claim-button")
|
||||
claim_button.click() # submit
|
||||
claim_button.click() # submit
|
||||
custom_sleep(1.5)
|
||||
return True
|
||||
|
||||
|
@ -265,6 +266,12 @@ def all_cards():
|
|||
if not checked:
|
||||
continue
|
||||
|
||||
try:
|
||||
activity = findall("data-bi-id=\"([^\"]+)\"", card_list[i].get_attribute("innerHTML"))[0]
|
||||
except Exception as e:
|
||||
warning("Can't find activity." + str(e))
|
||||
activity = ""
|
||||
|
||||
custom_sleep(1.5)
|
||||
check_welcome_tour()
|
||||
driver.execute_script("arguments[0].scrollIntoView();", card_list[i])
|
||||
|
@ -273,7 +280,7 @@ def all_cards():
|
|||
|
||||
if len(driver.window_handles) > 1:
|
||||
driver.switch_to.window(driver.window_handles[1])
|
||||
try_play(driver.title)
|
||||
try_play(driver.title, activity)
|
||||
close_tab(driver.window_handles[1])
|
||||
|
||||
try:
|
||||
|
@ -340,8 +347,35 @@ def promo():
|
|||
custom_sleep(3)
|
||||
|
||||
|
||||
def explore_on_bing(activity: str, config: Config):
|
||||
driver = config.WebDriver.driver
|
||||
|
||||
def search_bing(txt):
|
||||
search_elm = driver.find_element(By.ID, "sb_form_q")
|
||||
send_keys_wait(search_elm, txt)
|
||||
send_keys_wait(search_elm, Keys.ENTER)
|
||||
|
||||
if "lyrics" in activity:
|
||||
search_bing(
|
||||
f"paroles de {['Gata', 'Pyramide', 'Dolce Camara', 'Position', 'Mami Wata'][randint(0, 4)]}") # merci bing copilot pour les titres
|
||||
elif "flight" in activity:
|
||||
search_bing(
|
||||
f"vol {['Paris - New York', 'Londres Amsterdam', 'Bora-Bora Miami', 'Los Angeles Toulouse', 'Rome Dubai'][randint(0, 4)]}")
|
||||
elif "shopping" in activity:
|
||||
search_bing(f"idée cadeau {['Noel', 'Anniversaire'][randint(0, 1)]}")
|
||||
elif "movie" in activity:
|
||||
search_bing(
|
||||
f"Distribution {['Code 8 part 2', 'The Hunger Games: The ballad of Songbirds & Snakes', 'Rebel Moon: Part Two', 'Dune II', 'Wonka'][randint(0, 4)]}")
|
||||
elif "translator" in activity:
|
||||
search_bing(f"traduction {config.wordlist.get_word()} en anglais")
|
||||
elif "map" in activity:
|
||||
search_bing(f"{['Paris', 'Nice', 'Marseille', 'Bordeaux', 'Lyon'][randint(0, 4)]} carte")
|
||||
else:
|
||||
log_error(f"Explore on bing: {activity} not found.")
|
||||
|
||||
|
||||
# Find out which type of action to do
|
||||
def try_play(nom="unknown"):
|
||||
def try_play(nom="unknown", activity=""):
|
||||
driver = config.WebDriver.driver
|
||||
rgpd_popup(config)
|
||||
|
||||
|
@ -387,7 +421,7 @@ def try_play(nom="unknown"):
|
|||
info("On fidelity page.")
|
||||
fidelity()
|
||||
|
||||
elif wait_until_visible(By.ID, "rqStartQuiz", 5, driver):
|
||||
elif wait_until_visible(By.ID, "rqStartQuiz", 5, driver, raise_error=False):
|
||||
custom_sleep(3)
|
||||
driver.find_element(By.ID, "rqStartQuiz").click() # start the quiz
|
||||
answer_number = driver.page_source.count("rqAnswerOption")
|
||||
|
@ -397,9 +431,12 @@ def try_play(nom="unknown"):
|
|||
number = driver.page_source.count("rqAnswerOption")
|
||||
warning(f"recovery detected. quiz : {number}")
|
||||
play(number - 1)
|
||||
|
||||
elif "exploreonbing" in activity:
|
||||
info(f"Explore on bing: {activity}")
|
||||
explore_on_bing(activity, config)
|
||||
custom_sleep(uniform(3, 5))
|
||||
else:
|
||||
info(f"Nothing to do on page `{nom}`")
|
||||
info(f"Nothing obvious to do on page `{nom}`.")
|
||||
custom_sleep(uniform(3, 5))
|
||||
|
||||
|
||||
|
@ -476,10 +513,12 @@ def login():
|
|||
def logged_in():
|
||||
driver.get("https://login.live.com")
|
||||
custom_sleep(10)
|
||||
debug(get_domain(driver))
|
||||
if get_domain(driver) == "account.microsoft.com":
|
||||
return True
|
||||
return False
|
||||
|
||||
info("Logging in...")
|
||||
driver = config.WebDriver.driver
|
||||
try:
|
||||
if not logged_in():
|
||||
|
@ -608,19 +647,23 @@ def fidelity():
|
|||
pause = driver.find_element(By.CSS_SELECTOR, f'[class="c-action-toggle c-glyph f-toggle glyph-pause"]')
|
||||
pause.click()
|
||||
except Exception as e:
|
||||
error(f"Error while clicking pause. Probably no cards. {e}")
|
||||
return "no cards"
|
||||
debug("No pause button.")
|
||||
|
||||
cartes = driver.find_elements(By.CSS_SELECTOR, f'[ng-repeat="item in $ctrl.transcludedItems"]')
|
||||
nb_cartes = len(cartes)
|
||||
if nb_cartes == 0:
|
||||
warning("No fidelity cards detected")
|
||||
return "No cards."
|
||||
checked_list_all = driver.find_elements(By.CSS_SELECTOR, f'[ng-if="$ctrl.complete"]')
|
||||
for i in range(nb_cartes):
|
||||
cartes[i].click()
|
||||
checked_txt = checked_list_all[i].get_attribute("innerHTML")
|
||||
ok = checked_txt.count("StatusCircleOuter checkmark")
|
||||
total = checked_txt.count("StatusCircleOuter")
|
||||
if (ok != total):
|
||||
if ok != total:
|
||||
elm = driver.find_elements(By.CLASS_NAME, 'clickable-link')[i]
|
||||
if not "moviesandtv" in elm.get_attribute("innerHTML"): # not the film card
|
||||
# legacy code. Should be removed
|
||||
if "moviesandtv" not in elm.get_attribute("innerHTML"): # not the film card
|
||||
elm.click()
|
||||
driver.switch_to.window(driver.window_handles[len(driver.window_handles) - 1])
|
||||
sub_fidelity()
|
||||
|
@ -738,53 +781,53 @@ def json_start(json_entry, cred: UserCredentials):
|
|||
config.WebDriver.set_pc_driver(create_driver())
|
||||
config.WebDriver.switch_to_driver("PC")
|
||||
driver = config.WebDriver.driver
|
||||
try:
|
||||
if "unban" in json_entry and str(account_id) in json_entry["unban"]:
|
||||
login_part_1()
|
||||
info("\nGO TO example.com TO PROCEED or wait 1200 secs.")
|
||||
for _ in range(1200):
|
||||
sleep(1)
|
||||
if driver.current_url == "https://example.com/":
|
||||
info("proceeding")
|
||||
break
|
||||
else:
|
||||
login()
|
||||
except KeyError:
|
||||
if "unban" in json_entry and str(account_id) in json_entry["unban"]:
|
||||
login()
|
||||
info("\nGO TO example.com TO PROCEED or wait 1200 secs.")
|
||||
for _ in range(1200):
|
||||
sleep(1)
|
||||
if driver.current_url == "https://example.com/":
|
||||
info("proceeding")
|
||||
break
|
||||
else:
|
||||
login()
|
||||
try:
|
||||
if str(account_id) in json_entry["tout"]:
|
||||
daily_routine(cred, True)
|
||||
|
||||
else:
|
||||
try:
|
||||
if str(account_id) in json_entry["daily"]:
|
||||
try:
|
||||
all_cards()
|
||||
except Exception as e:
|
||||
log_error(e)
|
||||
except KeyError:
|
||||
pass
|
||||
try:
|
||||
if str(account_id) in json_entry["pc"]:
|
||||
try:
|
||||
bing_pc_search()
|
||||
except Exception as e:
|
||||
log_error(e)
|
||||
except KeyError:
|
||||
pass
|
||||
try:
|
||||
if str(account_id) in json_entry["mobile"]:
|
||||
try:
|
||||
bing_mobile_search(cred)
|
||||
except Exception as e:
|
||||
log_error(e)
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
try:
|
||||
if str(account_id) in json_entry["daily"]:
|
||||
try:
|
||||
all_cards()
|
||||
except Exception as e:
|
||||
log_error(e)
|
||||
except KeyError:
|
||||
pass
|
||||
try:
|
||||
if str(account_id) in json_entry["pc"]:
|
||||
try:
|
||||
bing_pc_search()
|
||||
except Exception as e:
|
||||
log_error(e)
|
||||
except KeyError:
|
||||
pass
|
||||
try:
|
||||
if str(account_id) in json_entry["mobile"]:
|
||||
try:
|
||||
bing_mobile_search(cred)
|
||||
except Exception as e:
|
||||
log_error(e)
|
||||
except KeyError:
|
||||
pass
|
||||
try:
|
||||
log_points()
|
||||
except Exception as e:
|
||||
error(f"CustomStart {e}")
|
||||
try:
|
||||
log_points()
|
||||
except Exception as e:
|
||||
error(f"CustomStart {e}")
|
||||
|
||||
driver.close()
|
||||
cred.next_account()
|
||||
account_id += 1
|
||||
|
@ -801,13 +844,16 @@ def default_start():
|
|||
while config.UserCredentials.is_valid():
|
||||
custom_sleep(1)
|
||||
info("Starting and configuring driver.")
|
||||
config.WebDriver.set_pc_driver(create_driver())
|
||||
try:
|
||||
config.WebDriver.set_pc_driver(create_driver())
|
||||
except:
|
||||
subprocess.Popen(["python3", "/app/MsRewards-Reborn/modules/Tools/update_chrome.py"])
|
||||
config.WebDriver.set_pc_driver(create_driver())
|
||||
config.WebDriver.switch_to_driver("PC")
|
||||
info("Driver started.")
|
||||
config.WebDriver.pc_driver.implicitly_wait(3)
|
||||
try:
|
||||
wait_time = uniform(1200, 3600)
|
||||
wait_time = 10 # the display closes when I ctrl + c
|
||||
info(f"Waiting for {round(wait_time / 60)}min before starting")
|
||||
custom_sleep(wait_time)
|
||||
daily_routine(config.UserCredentials)
|
||||
|
@ -835,7 +881,6 @@ def log_error(msg):
|
|||
|
||||
|
||||
def check_updated():
|
||||
debug(f"updated: {config.has_been_updated()}")
|
||||
if config.has_been_updated():
|
||||
config.discord.wh.send(f"Updated to {config.version}", username="update",
|
||||
avatar_url="https://cdn-icons-png.flaticon.com/512/1688/1688988.png")
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
file=version
|
||||
|
||||
if [ "$(git diff HEAD version | wc -w)" -eq 0 ]
|
||||
then
|
||||
echo 'updating minor version'
|
||||
new_path=$(cat $file | awk -F . '{print $1"."$2"."$3+1 }')
|
||||
echo $new_path > $file
|
||||
git add version
|
||||
else
|
||||
echo 'Version have been updated manually'
|
||||
fi
|
||||
echo Version: $(cat $file)
|
|
@ -0,0 +1 @@
|
|||
sh hooks/bump.sh
|
|
@ -22,7 +22,8 @@ class Config:
|
|||
proxy = json.load(inFile)
|
||||
with open("/app/MsRewards-Reborn/user_data/configs.json", "r") as inFile:
|
||||
config = json.load(inFile)
|
||||
|
||||
with open("/app/MsRewards-Reborn/user_data/version", "r") as inFile:
|
||||
version = inFile.readline()
|
||||
"""
|
||||
setup standalone stuff
|
||||
"""
|
||||
|
@ -31,10 +32,9 @@ class Config:
|
|||
self.json_entry = args.json.replace("'", "\"")
|
||||
self.wordlist = WordList("/usr/share/dict/french")
|
||||
self.vnc = args.vnc
|
||||
self.version = args.update_version
|
||||
self.WebDriver = Driver()
|
||||
self.display = None
|
||||
|
||||
self.version = version
|
||||
"""
|
||||
setup UserCredential
|
||||
"""
|
||||
|
@ -52,11 +52,11 @@ class Config:
|
|||
self.discord.avatar_url = settings["avatarlink"]
|
||||
|
||||
if (
|
||||
"discord" in config[args.config]
|
||||
and config[args.config]["discord"] in discord
|
||||
and "errorsL" in discord[config[args.config]["discord"]]
|
||||
and discord[config[args.config]["discord"]]["errorsL"] != ""
|
||||
):
|
||||
"discord" in config[args.config]
|
||||
and config[args.config]["discord"] in discord
|
||||
and "errorsL" in discord[config[args.config]["discord"]]
|
||||
and discord[config[args.config]["discord"]]["errorsL"] != ""
|
||||
):
|
||||
self.discord.wh_link = discord[config[args.config]["discord"]]["errorsL"]
|
||||
self.discord.wh = Webhook.from_url(self.discord.wh_link, adapter=RequestsWebhookAdapter())
|
||||
else:
|
||||
|
@ -81,4 +81,11 @@ class Config:
|
|||
self.display = display
|
||||
|
||||
def has_been_updated(self):
|
||||
return self.version != "None"
|
||||
with open('/app/MsRewards-Reborn/version', "r") as inFile:
|
||||
in_file_content = inFile.readlines()
|
||||
if self.version != in_file_content[0]:
|
||||
self.version = in_file_content[0]
|
||||
with open('/app/MsRewards-Reborn/user_data/version', "w") as outFile:
|
||||
outFile.write(self.version)
|
||||
return True
|
||||
return False
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import os
|
||||
import json
|
||||
import os
|
||||
from random import uniform
|
||||
|
||||
from selenium.common import TimeoutException
|
||||
from selenium.webdriver import ActionChains, Keys
|
||||
from selenium.webdriver import Keys
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.support import expected_conditions
|
||||
from selenium.webdriver.support.wait import WebDriverWait
|
||||
|
@ -14,9 +14,9 @@ from modules.Tools.tools import *
|
|||
|
||||
def init_profile(mail, mobile=False):
|
||||
if not mobile:
|
||||
chrome_profile_dir = "/app/MsRewards-Reborn/user_data/profile/"+mail
|
||||
chrome_profile_dir = "/app/MsRewards-Reborn/user_data/profile/" + mail
|
||||
else:
|
||||
chrome_profile_dir = "/app/MsRewards-Reborn/user_data/profile/mobile-"+mail
|
||||
chrome_profile_dir = "/app/MsRewards-Reborn/user_data/profile/mobile-" + mail
|
||||
|
||||
os.makedirs(chrome_profile_dir, exist_ok=True)
|
||||
|
||||
|
@ -30,12 +30,12 @@ def init_profile(mail, mobile=False):
|
|||
"accept_languages": "fr-FR,en-US,en",
|
||||
"selected_languages": "fr-FR,en-US,en"
|
||||
}
|
||||
}, f
|
||||
}, f
|
||||
)
|
||||
else:
|
||||
with open(preferences_file, "r") as f:
|
||||
settings = json.load(f)
|
||||
|
||||
|
||||
if "intl" not in settings:
|
||||
settings["intl"] = {}
|
||||
|
||||
|
@ -69,6 +69,7 @@ def send_keys_wait(element, keys: str) -> None:
|
|||
element.send_keys(i)
|
||||
sleep(uniform(0.1, 0.3))
|
||||
|
||||
|
||||
def send_wait_and_confirm(element, keys: str) -> None:
|
||||
send_keys_wait(element, keys)
|
||||
element.send_keys(Keys.ENTER)
|
||||
|
@ -81,6 +82,6 @@ def wait_until_visible(search_by: str, identifier: str, timeout: int = 20, brows
|
|||
expected_conditions.visibility_of_element_located((search_by, identifier)), "element not found")
|
||||
return True
|
||||
except TimeoutException as e:
|
||||
if raise_error:
|
||||
error(f"element {identifier} not found after {timeout}s")
|
||||
f = error if raise_error else debug
|
||||
f(f"element {identifier} not found after {timeout}s")
|
||||
return False
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
0.0.0
|
Loading…
Reference in New Issue