Skip to content

Instantly share code, notes, and snippets.

@Saren-Arterius
Created November 11, 2017 17:17
Show Gist options
  • Save Saren-Arterius/80970abb5c392d607146c0c5a62ff971 to your computer and use it in GitHub Desktop.
Save Saren-Arterius/80970abb5c392d607146c0c5a62ff971 to your computer and use it in GitHub Desktop.
#!/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