def search_and_replace( site: mwclient.Site, search: str, regex: re.Pattern, replace: str, namespace: int = 0, ) -> None: for result in site.search(search, namespace=namespace, what='text'): page = site.pages[result['title']] text = page.text() newtext = regex.sub(replace, text) if newtext != text: page.edit(newtext, summary=f'replace {regex.pattern} with {replace} (auto)') logger.info('page %s updated.', page.page_title) else: logger.warning('page %s not updated.', page.page_title)
async def search(self, ctx, site_name: Option(str, 'What wiki to search', autocomplete=wikis_autocomplete), query: str): mw_options = conf.get_object(ctx.guild, 'mwSites') if site_name not in mw_options: return await ctx.respond( f'"{site_name}" is not a valid search source on this server.') site = Site(mw_options[site_name]['url'], path=mw_options[site_name]['path'], clients_useragent=USER_AGENT) results = site.search(query) title = results.next().get('title').replace(' ', '_') await ctx.respond(f'First result for "{query}":\n' + str( f'https://{mw_options[site_name]["url"]}{mw_options[site_name]["pagePath"]}{title}' ))
class Wiki: def __init__(self, device: str, buildid: str, *, boardconfig: str = None) -> None: self.site = WikiSite('www.theiphonewiki.com') self.device = device self.buildid = buildid self.board = boardconfig def get_firm_page(self) -> str: results = list(self.site.search(f'{self.buildid} ({self.device})')) if len(results) == 0: raise ValueError( f'No Firmware Keys page for device: {self.device}, buildid: {self.buildid}.' ) return self.site.pages[results[0]['title']].text() def parse_page(self, page: str) -> dict: page = ' '.join([ x for x in page.split(' ') if x != '' ]).replace('{{', '{| class="wikitable"').replace( '}}', '|}' ) # Have to coerce wikitextparser into recognizing it as a table for easy parsing page_data = dict() for entry in wikiparse(page).tables[0].data()[0]: key, item = entry.split(' = ') page_data[key] = item if self.board is not None: if ('Model' not in page_data.keys()) and ('Model2' not in page_data.keys()): return page_data if self.board.lower() not in [ x.lower() for x in page_data.values() ]: raise ValueError( f'Boardconfig: {self.board} for device: {self.device} is not valid!' ) if page_data['Model2'].lower() == self.board.lower(): for key in page_data.keys(): if '2' in key: page_data[key.replace('2', '')] = page_data[key] for key in list(page_data.keys()): if '2' in key: del page_data[key] return page_data def get_keys(self, page: str) -> str: page_data = self.parse_page(page) response = { 'identifier': page_data['Device'], 'buildid': page_data['Build'], 'codename': page_data['Codename'], 'restoreramdiskexists': 'RestoreRamdisk' in page_data.keys(), 'updateramdiskexists': 'UpdateRamdisk' in page_data.keys(), 'keys': list() } for component in page_data.keys(): if any(x == component for x in ('Version', 'Build', 'Device', 'Model', 'Codename', 'Baseband', 'DownloadURL')): continue if any(component.endswith(x) for x in ('Key', 'IV', 'KBAG')): continue image = { 'image': component, 'filename': page_data[component], 'date': datetime.now().isoformat() } if any(component == x for x in ('RootFS', 'RestoreRamdisk', 'UpdateRamdisk')): image['filename'] += '.dmg' for key in ('IV', 'Key') if component != 'RootFS' else ('Key', ): if component + key not in page_data.keys(): continue if any(x in page_data[component + key] for x in ('Unknown', 'Not Encrypted')): continue image[key.lower()] = page_data[component + key] if ('iv' not in image.keys()) and ('key' not in image.keys()): if not image['filename'].endswith('.dmg'): continue if ('iv' in image.keys()) and ('key' in image.keys()): image['kbag'] = image['iv'] + image['key'] response['keys'].append(image) return json.dumps(response)