import json import logging import re from pathlib import Path from time import sleep import requests from bs4 import BeautifulSoup PATTERN_CHAMPIONGG = re.compile(r'^\s+matchupData\.championData = (.*)$') LOL_CHAMPS_DIR = r'C:\\League of Legends\\Config\\Champions\\' HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'} def getChampData(champ, position): page = requests.get('http://champion.gg/champion/%s/%s' % (champ, position), headers=HEADERS).text for line in page.split("\n"): if "matchupData.championData" in line: return json.loads(PATTERN_CHAMPIONGG.match(line).group(1)) def getChampsWithPositionsAndPatch(): soup = BeautifulSoup(requests.get('http://champion.gg', headers=HEADERS).text, 'html.parser') patch = soup.find('div', class_='analysis-holder').find('strong').text champs = [] for div in soup.find_all('div', class_='champ-height'): champ_name = div.find('span', class_='champion-name').text pos = [link['href'].split('/')[-1] for link in div.find_all('a', href=True)[1:]] champs.append({champ_name: pos }) return (champs, patch) def makeItemSet(data, label): return { "items": [{ "id": item['id'], "count": 1} for item in data['items']], "type": "%s (%.2f %% - %d games)" % (label, data['winPercent'] * 100, data['games']) } def makeItemSetFromList(list, label): return { "items": [{ "id": str(id), "count": 1} for id in list], "type": "%s" % (label) } def writeItemSet(id, pos, ver, data, path): logging.info('Writing item set for %s at %s' % (id, pos)) item_set = { "map": "any", "blocks": [], "title": "CGG %s %s" % (pos, ver), "priority": False, "mode": "any", "type": "custom", "sortrank": 1, "champion": "%s" % id } if 'mostGames' in data['firstItems']: item_set['blocks'].append(makeItemSet(data['firstItems']['mostGames'], 'Most Frequent Starters')) if 'highestWinPercent' in data['firstItems']: item_set['blocks'].append(makeItemSet(data['firstItems']['highestWinPercent'], 'Highest Win % Starters')) if 'mostGames' in data['items']: item_set['blocks'].append(makeItemSet(data['items']['mostGames'], 'Most Frequent Core Build')) if 'highestWinPercent' in data['items']: item_set['blocks'].append(makeItemSet(data['items']['highestWinPercent'], 'Highest Win % Core Build')) item_set['blocks'].append(makeItemSetFromList([2003, 2004, 2055, 2031, 2032, 2033, 2138, 2140, 2139], "Consumables")) item_set['blocks'].append(makeItemSetFromList([3340, 3364, 3363], "Trinkets")) with open('%sCGG_%s_%s.json' % (path, id, pos), 'w', newline='\n') as out: json.dump(item_set, out, indent=4) def main(): logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', level=logging.INFO) logging.info('CGG Item Sets') ver = requests.get('https://ddragon.leagueoflegends.com/realms/euw.json', headers=HEADERS).json()['v'] data = requests.get('http://ddragon.leagueoflegends.com/cdn/%s/data/en_US/champion.json' % ver, headers=HEADERS).json()['data'] lol_champs = [data[i] for i in data] logging.info('LoL version: %s' % ver) logging.info('LoL numbers of champs: %d' % len(lol_champs)) (champs, patch) = getChampsWithPositionsAndPatch() logging.info('CGG version: %s' % patch) logging.info('CGG numbers of champs: %d' % len(champs)) for champ in champs: for name, positions in champ.items(): c = next((x for x in lol_champs if x['name'] == name), None) if c is not None: path = '%s%s\\Recommended\\' % (LOL_CHAMPS_DIR, name) Path(path).mkdir(parents=True, exist_ok=True) for pos in positions: writeItemSet(c['id'], pos, patch, getChampData(c['id'], pos), path) sleep(.3) else: logging.error('%s not found in LoL champs' % name) if __name__ == "__main__": main()