Created
November 11, 2017 17:17
-
-
Save Saren-Arterius/80970abb5c392d607146c0c5a62ff971 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/python3 | |
| from pyquery import PyQuery as pq | |
| from selenium import webdriver | |
| from operator import itemgetter | |
| from re import sub | |
| from datetime import datetime | |
| from os.path import dirname, realpath | |
| class BuyStockSession(object): | |
| def __init__(self, username, password): | |
| self.cheapest_stock = None | |
| self.current_np = None | |
| self.username = username | |
| self.password = password | |
| self.log = open("{0}/log.log".format(dirname(realpath(__file__))), "a") | |
| self.__print_and_write("Current time: {0}".format(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) | |
| try: | |
| self.browser = webdriver.PhantomJS() | |
| except: | |
| self.browser = webdriver.Firefox() | |
| self.__login() | |
| self.__change_to_en() | |
| def __login(self): | |
| self.__print_and_write("Going to login page...") | |
| self.browser.get("http://www.neopets.com/login/index.phtml") | |
| self.__print_and_write("Logging in...") | |
| login_field = self.browser.find_element_by_xpath("//div[@class='welcomeLoginUsernameInput']/input") | |
| password_field = self.browser.find_element_by_xpath("//div[@class='welcomeLoginPasswordInput']/input") | |
| login_field.send_keys(self.username) | |
| password_field.send_keys(self.password) | |
| login_field.submit() | |
| def __print_and_write(self, string): | |
| print(string) | |
| self.log.write(string + "\n") | |
| def get_stocks_info(self): | |
| all_stocks = {} | |
| self.__print_and_write("Getting stock info...") | |
| self.browser.get("http://www.neopets.com/stockmarket.phtml?type=list&full=true") | |
| html = self.browser.page_source | |
| for row in pq(pq(html)("table[align='center']")("tr")[1:]): | |
| try: | |
| all_stocks[pq(pq(row)("td")[1])("a")("b").html()] = int(pq(pq(row)("td")[5])("b").html()) | |
| except ValueError: | |
| pass | |
| return all_stocks | |
| def get_cheapest_stock(self): | |
| all_stocks = self.get_stocks_info() | |
| all_buyable_stocks = all_stocks.copy() | |
| for stock, value in all_stocks.items(): | |
| if value < 15: | |
| all_buyable_stocks.pop(stock) | |
| return min(all_buyable_stocks.items(), key=itemgetter(1)) | |
| def get_current_np(self): | |
| html = self.browser.page_source | |
| return int(sub(",", "", pq(html)("#npanchor").html())) | |
| def withdraw_from_bank(self, amount): | |
| self.browser.get("http://www.neopets.com/bank.phtml") | |
| """ | |
| for input_field in pq(self.browser.page_source).find("input"): | |
| if pq(input_field).attr("value") is not None and "Collect" in pq(input_field).attr("value"): | |
| self.__print_and_write("Collecting interest...") | |
| self.browser.find_elements_by_xpath( | |
| "//form[@action='process_bank.phtml']/input[@type='submit']").click() | |
| break | |
| """ | |
| withdraw_amount_field = self.browser.find_elements_by_xpath("//input[@name='amount']")[1] | |
| withdraw_amount_field.send_keys(str(amount)) | |
| self.browser.execute_script("window.confirm = function () { return true; }") | |
| withdraw_amount_field.send_keys(u'\ue007') | |
| self.browser.execute_script("return window.confirm;") | |
| return True | |
| def buy_cheapest_stock(self, amount_shares): | |
| try: | |
| if amount_shares > 1000: | |
| amount_shares = 1000 | |
| elif amount_shares < 1: | |
| amount_shares = 1 | |
| except TypeError: | |
| amount_shares = 1000 | |
| self.cheapest_stock = self.get_cheapest_stock() | |
| self.__print_and_write("Cheapest stock: " + repr(self.cheapest_stock)) | |
| self.current_np = self.get_current_np() | |
| self.__print_and_write("Current NP: " + repr(self.current_np)) | |
| if self.current_np < self.cheapest_stock[1] * amount_shares: | |
| amount = self.cheapest_stock[1] * amount_shares - self.current_np | |
| self.__print_and_write("Withdrawing {0} NP from bank....".format(amount)) | |
| self.withdraw_from_bank(amount) | |
| self.__print_and_write("Buying Shares...") | |
| self.browser.get("http://www.neopets.com/stockmarket.phtml?type=buy") | |
| stock_field = self.browser.find_element_by_xpath("//input[@name='ticker_symbol']") | |
| amount_shares_field = self.browser.find_element_by_xpath("//input[@name='amount_shares']") | |
| stock_field.send_keys(str(self.cheapest_stock[0])) | |
| amount_shares_field.send_keys(str(amount_shares)) | |
| amount_shares_field.submit() | |
| elem = self.browser.find_element_by_xpath("//*") | |
| html = elem.get_attribute("outerHTML") | |
| try: | |
| self.__print_and_write(pq(html)(".errorMessage").html()) | |
| self.__print_and_write("There was an error.") | |
| if pq(html)(".errorMessage").html().contains("transaction"): | |
| self.__print_and_write("Retrying...") | |
| self.__change_to_en() | |
| self.buy_cheapest_stock(amount_shares) | |
| except: | |
| pass | |
| finally: | |
| self.__print_and_write("Done!") | |
| self.__print_and_write("Finished time: {0}\n".format(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) | |
| self.browser.close() | |
| self.log.close() | |
| return True | |
| def __change_to_en(self): | |
| self.__print_and_write("Changing language to EN...") | |
| self.browser.find_element_by_css_selector("select.sf > option:nth-child(1)").click() | |
| self.browser.find_element_by_css_selector("td.sf:nth-child(3) > table:nth-child(1) > tbody:nth-child(1) > " + | |
| "tr:nth-child(1) > td:nth-child(3) > input:nth-child(1)").click() | |
| if __name__ == "__main__": | |
| print("Initializing...") | |
| sess = BuyStockSession("YOUR_USERNAME", "YOUR_PASSWORD") | |
| sess.buy_cheapest_stock(1000) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment