diff --git a/V7/V7.py b/V7/V7.py deleted file mode 100644 index 8e8164d..0000000 --- a/V7/V7.py +++ /dev/null @@ -1,43 +0,0 @@ -from playwright.sync_api import sync_playwright, expect, Page, BrowserContext -from playwright_stealth import stealth_sync -from pyvirtualdisplay.smartdisplay import SmartDisplay - -from actions.cards import daily_cards, more_cards, all_cards -from actions.login import login -from actions.websearch import pc_search -from tools.browser_setup import create_display, start_browser -from tools.config import load_parameters, check_config -from tools.logger import * -import sys -import json - - -def routine(mail: str, pwd: str, vnc: bool = False) -> None: - name = mail.split("@")[0] - # display = create_display(vnc) - # display.start() - page, browser = start_browser(name) - login(page, mail, pwd) - all_cards(page) - pc_search(page) - # display.stop() - browser.close() - - -def main(): - data = load_parameters() - check_config(data) - - -# routine("EMAIL", "PWD", True) -# parse_file({"accounts": {"nb": 1, 0: {"mail": "piair338@gmail.com", "pwd": ""}}}) -""" -TODO : -Fidelity management. -Daily search mobile -start -> with json config - -> allow claiming - -> default mode ---vnc-- Should work, but not tested with WSL. -remove unused imports -""" diff --git a/V7/actions/cards.py b/V7/actions/cards.py deleted file mode 100644 index 9127e86..0000000 --- a/V7/actions/cards.py +++ /dev/null @@ -1,61 +0,0 @@ -from playwright.sync_api import sync_playwright, expect, Page, BrowserContext -from playwright_stealth import stealth_sync - -from actions.quiz import play -from tools.logger import * -from tools.logger import * - - -def all_cards(page: Page): - # input("1") - page.goto("https://rewards.bing.com") - page.wait_for_load_state('load') - daily_cards(page) - more_cards(page) - - -def daily_cards(page: Page): - for i in range(1, 4): - card = page.locator(f'#daily-sets > mee-card-group:nth-child(7) > div > mee-card:nth-child({i}) > div') - if "mee-icon-AddMedium" not in card.inner_html(): - info(f'Daily Card {i} : {"Validated" if "mee-icon-AddMedium" not in card.inner_html() else "Failure"}') - continue - with page.expect_popup() as page1_info: - card.click() - page1 = page1_info.value - stealth_sync(page1) - page1.wait_for_load_state('load') - try: - selector = page1.get_by_role("button", name="Accepter") - expect(selector).to_be_visible(timeout=10_000) - selector.click() - except AssertionError as e: - pass # The RGPD button should not be there in the first place - play(page1) - page1.close() - page.reload() - info(f'Daily Card {i} : {"Validated" if "mee-icon-AddMedium" not in card.inner_html() else "Failure"}') - - -def more_cards(page: Page): - c = 1 - while c < 15: # todo I don't really know why it stops without raising any errors, but I guess it's fine - card = page.locator(f"#more-activities > div > mee-card:nth-child({c})") - - try: - expect(card).to_be_visible(timeout=10_000) - except Exception as e: # The card probably does not exist - debug(e) - break - if "mee-icon-AddMedium" in card.inner_html(): - info(f"Playing more cards {c}.") - with page.expect_popup() as page1_info: - card.click() - page1 = page1_info.value - stealth_sync(page1) - page1.wait_for_load_state('load') - play(page1) - page1.close() - page.reload() - info(f'More Card {c} : {"Validated" if "mee-icon-AddMedium" not in card.inner_html() else "Failure"}') - c += 1 diff --git a/V7/actions/checks.py b/V7/actions/checks.py deleted file mode 100644 index 805fd7d..0000000 --- a/V7/actions/checks.py +++ /dev/null @@ -1,10 +0,0 @@ -from playwright.sync_api import Playwright, sync_playwright, expect, Page -from playwright_stealth import stealth_sync -from logging import * - - -def check_logged_in(page: Page): - if "pas connecté à Microsoft Rewards" in page.content(): - page.locator('css=[onclick="setsrchusr()"]').click() - page.wait_for_load_state('load') - info('Fixed logging in in card.') diff --git a/V7/actions/login.py b/V7/actions/login.py deleted file mode 100644 index 133934a..0000000 --- a/V7/actions/login.py +++ /dev/null @@ -1,30 +0,0 @@ -from playwright.sync_api import Playwright, sync_playwright, expect, Page -from logging import * - - -def login(page: Page, mail: str, pwd: str) -> None: - page.goto("https://rewards.bing.com") - page.wait_for_load_state('load') - if page.url == "https://rewards.bing.com/": - info("Logged in via cookies") - return - else: - info("logging in") - page.get_by_placeholder("Email, phone, or Skype").click() - page.get_by_placeholder("Email, phone, or Skype").fill(mail) - page.get_by_placeholder("Email, phone, or Skype").press("Enter") - page.get_by_placeholder("Password").click() - page.get_by_placeholder("Password").fill(pwd) - page.get_by_placeholder("Password").press("Enter") - page.get_by_label("Don't show this again").check() - page.get_by_role("button", name="Yes").click() - page.wait_for_url("https://rewards.bing.com/") - page.wait_for_load_state('load') - page.goto("https://bing.com") - page.get_by_role("link", name="Sign in").click() - page.get_by_role("link", name="Accept").click() - page.wait_for_load_state('load') - page.wait_for_timeout(3000) - page.goto("https://rewards.bing.com") - page.wait_for_load_state('load') - info("Logged in via password.") diff --git a/V7/actions/quiz.py b/V7/actions/quiz.py deleted file mode 100644 index 00c8009..0000000 --- a/V7/actions/quiz.py +++ /dev/null @@ -1,120 +0,0 @@ -from random import choice, shuffle - -from playwright.sync_api import Playwright, sync_playwright, expect, Page -from playwright_stealth import stealth_sync -from logging import * -from re import findall, search -from actions.checks import check_logged_in - - -def play(page: Page): - check_logged_in(page) - quiz_type = detect_quiz_type(page) - match quiz_type: - case 8 | 9: - info('Detected quiz_8.') - play_quiz_8(page) - case 5 | 4: - info('Detected quiz_4.') - play_quiz_4(page) - case 3 | 2: - info('Detected quiz_2.') - play_quiz_2(page) - case 1: - info('Detected poll.') - play_poll(page) - case 0: - info('Detected empty page.') - - -def detect_quiz_type(page: Page) -> int: - info("Detecting quiz type.") - if "bt_PollRadio" in page.content(): - return 1 - else: - try: - # RGPD - selector = page.locator("#rqStartQuiz") - expect(selector).to_be_visible(timeout=10_000) - selector.click() - return page.content().count("rqAnswerOption") - 1 - except AssertionError as e: - - if "rqQuestionState" in page.content(): - # The quiz is already started - warning("Detected via recovery mode.") - return page.content().count("rqAnswerOption") - 1 - return 0 - - -def play_quiz_8(page: Page): - info("Playing quiz 8.") - num_question = len(findall("", page.content())) + 1 - info(f"Looping on {num_question} questions.") - - counter = 0 - # rgpd_popup(driver) - for _ in range(num_question): - correct_answers = [] - for i in range(1, 9): - - element = page.locator(f'#rqAnswerOption{i - 1}') - # todo can probably be optimised using filter and has_text - if 'iscorrectoption="True"' in element.evaluate("el => el.outerHTML"): - correct_answers.append(f'#rqAnswerOption{i - 1}') - shuffle(correct_answers) - - for answer_id in correct_answers: - page.locator(answer_id).click() - page.wait_for_timeout(1000) - page.wait_for_timeout(3000) # todo check if there is a better method than hardcoded timout - page.wait_for_timeout(3000) # todo check if there is a better method than hardcoded timout - - -def play_quiz_4(page: Page): - info("Playing quiz 4.") - num_question = len(findall("", page.content())) + 1 - info(f"Looping on {num_question} questions.") - - for i in range(num_question): - txt = page.content() - answer_option = search('correctAnswer":"([^"]+)', txt)[1] - answer_option = answer_option.replace("\\u0027", "'") # replace Unicode weird symbols - page.locator(f'css=[data-option="{answer_option}"]').click() - info(f'Validated answer n°{i + 1}.') - page.wait_for_load_state('load') - debug(f'Next page loaded.') - info("Quiz 4 successful.") - - -def play_quiz_2(page: Page): - info("Playing quiz 2.") - for j in range(10): # todo de-hardcode the value - js_function = """ - function get_correct_answer(){ - function br(n) { for (var r, t = 0, i = 0; i < n.length; i++)t += n.charCodeAt(i); return r = parseInt(_G.IG.substr(_G.IG.length - 2), 16), t += r, t.toString() } // Ms check function - function namedRAValue() { //allow calls to getRAvalue - return _w.getRAValue() - }; - if (br(document.getElementById("rqAnswerOption0").attributes["data-option"].value) == namedRAValue()){ - return(0); - } - else { - return(1); - } - }; - return(get_correct_answer()) - """ - correct_answer_value = page.evaluate(js_function) - page.locator(f"#rqAnswerOption{correct_answer_value}").click() - page.wait_for_timeout(2000) - info("Quiz 2 successful.") - page.wait_for_timeout(3000) # todo check if there is a better method than hardcoded timout - - -def play_poll(page: Page): - info("Playing poll.") - answer_elem = page.locator(f"#btoption{choice([0, 1])}") - answer_elem.click() - info("Poll successful.") - page.wait_for_timeout(3000) # todo check if there is a better method than hardcoded timout diff --git a/V7/config.example.json b/V7/config.example.json deleted file mode 100644 index a0c02a7..0000000 --- a/V7/config.example.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "accounts": { - "nb": 1, - "0": { - "mail": "piair338@gmail.com", - "pwd": "uéuéué" - } - }, - "config": { - "vnc_enabled": "False", - "vnc_port": 2345, - "claim": "False" - } -} \ No newline at end of file diff --git a/V7/requirement.txt b/V7/requirement.txt deleted file mode 100644 index fa95a03..0000000 --- a/V7/requirement.txt +++ /dev/null @@ -1,4 +0,0 @@ -playwright -pyvirtualdisplay -playwright_stealth -pillow diff --git a/V7/tools/browser_setup.py b/V7/tools/browser_setup.py deleted file mode 100644 index 8230c0f..0000000 --- a/V7/tools/browser_setup.py +++ /dev/null @@ -1,18 +0,0 @@ -from playwright.sync_api import sync_playwright, expect, Page, BrowserContext -from playwright_stealth import stealth_sync -from pyvirtualdisplay.smartdisplay import SmartDisplay - - -def create_display(vnc=False) -> SmartDisplay: - if vnc: - return SmartDisplay(backend="xvnc", size=(1920, 1080), rfbport=2345, color_depth=24) - return SmartDisplay(size=(1920, 1080)) - - -def start_browser(name: str) -> (Page, BrowserContext): - p = sync_playwright().start() - browser = p.firefox.launch_persistent_context(f"./data/{name}/", headless=False, args=["--start-maximised"], - no_viewport=True) - page = browser.new_page() - stealth_sync(page) - return page, browser