123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- from dataclasses import dataclass, field
- from typing import List, Dict
- from selenium import webdriver
- from selenium.webdriver.chrome.options import Options
- from selenium.webdriver.common.keys import Keys
- from selenium.webdriver.common.by import By
- from datetime import datetime
- import pandas as pd
- from tinydb import Query
- import re
- from config import Config
- from logger import logger
- import logging
- from db import PlayerDB
- @dataclass
- class Player():
- url:str = 'https://play.boobylegends.com/player/'
- driver:webdriver = None
- Cards:List[dict] = field(default_factory=list)
- asOf:datetime = datetime.utcnow()
- df:pd.DataFrame = field(default_factory=pd.DataFrame)
- rank:int = 0
- score:int = 0
- def fetchData(self):
- logger.debug("Fetch Player Data.")
- self.loadPage()
- self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
- userInfo=self.driver.find_element(By.CLASS_NAME, 'user-infos')
- self.score=int(userInfo.find_element(By.CLASS_NAME,'my-score').text)
- regex=re.compile('[^0-9]')
- self.rank=int(regex.sub('',userInfo.find_element(By.TAG_NAME,'span').text))
- collection=self.driver.find_element(By.CLASS_NAME, 'container-collection')
- self.Cards=[]
- cards=collection.find_elements(By.CLASS_NAME, 'wrapper-card')
- for card in cards:
- try:
- Card={}
- Card['card-num']=int(card.find_element(By.CLASS_NAME,'pornstar-number').text)
- Card['name']=card.find_element(By.TAG_NAME,'h2').text
- Card['card-id'] = int(card.get_attribute('card-id'))
- Card['phid'] = card.get_attribute('phid')
- Card['level'] = card.get_attribute('level')
- tierCard = card.find_element(By.CLASS_NAME,'tier-card')
- tierLink = tierCard.get_attribute('src')
- Card['tier'] = tierLink[:-4][-1].upper()
- Card['link'] = card.get_attribute('href')
- try:
- Card['stock']=card.find_element(By.CLASS_NAME,'card-nb').text
- except:
- Card['stock']="0"
- self.Cards.append(Card)
- except Exception as e:
- logger.error(f"{e}\n{card.text}")
- self.loadDF()
- def initPage(self):
- logger.debug("Init Player Page.")
- options = webdriver.ChromeOptions()
- options.add_argument("--log-level=3")
- options.add_argument("--headless")
- options.add_argument("--disable-blink-features=AutomationControlled")
- self.driver = webdriver.Chrome(options=options)
- self.driver.get(self.url)
- self.driver.add_cookie(Config["cookie"])
- def loadPage(self):
- logger.debug("Load Player Page.")
- if self.driver is None: self.initPage()
- self.driver.get(self.url)
- self.asOf=datetime.utcnow()
- def closePage(self):
- logger.debug("Close Player Page.")
- self.driver.close()
- def loadDF(self):
- logger.debug("Load Player pandas DF.")
- self.df=pd.DataFrame(self.Cards)
- self.df.sort_values(by='card-num', ascending=True, inplace=True)
- def show(self,fields=['card-num','name','level','stock'],filter=''):
- logger.debug("Show Player Data.")
- print("Rank: {Rank}\tScore: {Score}\n".format(Rank=self.rank,Score=self.score))
- if filter != '':
- pdf=self.df.query(filter)
- else:
- pdf=self.df
- print(pdf[fields].to_string(index=False))
- def commit(self):
- logger.debug("Player Commit.")
- today=self.asOf.strftime('%Y-%m-%d')
- for Card in self.Cards:
- thisCard={}
- thisCard['date'] = today
- thisCard['card-num'] = Card['card-num']
- thisCard['name'] = Card['name']
- thisCard['level'] = Card['level']
- thisCard['tier'] = Card['tier']
- thisCard['stock'] = Card['stock']
- thisCard['card-id'] = Card['card-id']
- thisCard['phid'] = Card['phid']
- thisCard['link'] = Card['link']
- PlayerDB.upsert(thisCard,Query().fragment({'date':today,'card-num':Card['card-num']}))
|