diff --git a/davtelepot/api_helper.py b/davtelepot/api_helper.py new file mode 100644 index 0000000..3f07d95 --- /dev/null +++ b/davtelepot/api_helper.py @@ -0,0 +1,106 @@ +"""Get and parse Telegram API webpage.""" + +# Standard library modules +import asyncio +import logging + +# Third party modules +import aiohttp +from bs4 import BeautifulSoup + +api_url = "https://core.telegram.org/bots/api" + + +class TelegramApiMethod(object): + """Telegram bot API method.""" + + def __init__(self, name, description, table): + """Initialize object with name, description and table data.""" + self._name = name + self._description = description + self._table = table + + @property + def name(self): + """Return method name.""" + return self._name + + @property + def description(self): + """Return method description.""" + return self._description + + @property + def table(self): + """Return method parameters table.""" + return self._table + + def get_parameters_from_table(self): + """Extract parameters from API table.""" + result = '' + if self.table is None: + return "No parameters" + rows = self.table.find_all('tr') + if rows is None: + rows = [] + for row in rows: + result += '------\n' + columns = row.find_all('td') + if columns is None: + columns = [] + for column in columns: + result += f'| {column.text.strip()} |' + result += '\n' + result += '\n' + return result + + +async def main(loop=None, filename=None): + """Get information from Telegram bot API webpage.""" + if loop is None: + loop = asyncio.get_event_loop() + async with aiohttp.ClientSession( + loop=loop, + timeout=aiohttp.ClientTimeout( + total=100 + ) + ) as session: + async with session.get( + api_url + ) as response: + webpage = BeautifulSoup( + await response.text(), + "html.parser" + ) + if filename is not None: + with open(filename, 'w') as _file: + _file.write(webpage.decode()) + for method in webpage.find_all("h4"): + method_name = method.text + description = '' + parameters_table = None + for tag in method.next_siblings: + if tag.name is None: + continue + if tag.name == 'h4': + break # Stop searching in siblings if

is found + if tag.name == 'table': + parameters_table = tag + break # Stop searching in siblings if is found + description += tag.get_text() + if method_name and method_name[0] == method_name[0].lower(): + method = TelegramApiMethod( + method_name, description, parameters_table + ) + print( + "NAME\n\t{m.name}\n" + "DESCRIPTION\n\t{m.description}\n" + f"TABLE\n\t{method.get_parameters_from_table()}\n\n".format( + m=method + ) + ) + +if __name__ == '__main__': + loop = asyncio.get_event_loop() + loop.run_until_complete(main(loop=loop, filename='prova.txt')) + logging.info("Done!")