def test_parser_afiliado_con_empleador(): html = './sss_beneficiarios_hospitales/html-samples/full-afiliado-con-empleador.html' parser = SSSParser(html) data = parser.get_all_data() # print(json.dumps(data, indent=2)) assert data['title'] == "Superintendencia de Servicios de Salud" assert data["hay_afiliacion"] assert not data["no_hay_afiliacion"] for d in data['tablas']: assert "name" in d is_afiliacion = "AFILIACION" in [ v for k, v in d.items() if k == 'name' ] is_persona = "AFILIADO" in [v for k, v in d.items() if k == 'name'] is_declarado = "DECLARADO_POR_EMPLEADOR" in [ v for k, v in d.items() if k == 'name' ] assert is_afiliacion or is_persona or is_declarado if is_afiliacion: assert d['data']["Parentesco"] == "TITULAR" assert d['data']["CUIL"] == "27-1XXXXX3-6" assert d['data']["Tipo de documento"] == "DOCUMENTO UNICO" assert d['data']["N\u00famero de documento"] == "1XXXXX3" assert d['data']["Apellido y nombre"] == "GOMEZ EDUARDO" assert d['data']["Provincia"] == "CAPITAL FEDERAL" assert d['data']["Fecha de nacimiento"] == "25-05-1977" assert d['data']["Sexo"] == "Masculino" if is_persona: assert d['data']["CUIL titular"] == "27-1XXXXX3-6" assert d['data']["CUIT de empleador"] == "30-70818659-3" assert d['data']["CUIL titular"] == "27-1XXXXX3-6" assert d['data'][ "Tipo de beneficiario"] == "RELACION DE DEPENDENCIA" assert d['data']["C\u00f3digo de Obra Social"] == "4-0080-0" assert d['data'][ "Denominaci\u00f3n Obra Social"] == "OBRA SOCIAL DE EJECUTIVOS Y DEL PERSONAL DE DIRECCION DE EMPRESAS" assert d['data']["Fecha Alta Obra Social"] == "01-06-1931" if is_declarado: assert d['data'][ "Tipo Beneficiario Declarado"] == "RELACION DE DEPENDENCIA (DDJJ SIJP)" assert d['data']["Ultimo Per\u00edodo Declarado"] == "02-2020"
def test_parser_no_afiliado(): html = get_html_sample('full-sin-datos') parser = SSSParser(html) data = parser.get_all_data() # print(json.dumps(data, indent=2)) assert data['title'] == "Superintendencia de Servicios de Salud" assert data["afiliado"] == False for d in data['tablas']: assert "name" in d is_persona = "NO_AFILIADO" in [v for k, v in d.items() if k == 'name'] assert is_persona assert d['data']["Apellido y Nombre"] == "BXXXXXXXXS FXXXL JUAN CARLOS" assert d['data']["Tipo Documento"] == "DU" assert d['data']["Nro Documento"] == "2XXXXX1" assert d['data']["CUIL"] == "202XXXXX18"
def test_parser_no_afiliado(): html = './sss_beneficiarios_hospitales/html-samples/full-sin-datos.html' parser = SSSParser(html) data = parser.get_all_data() # print(json.dumps(data, indent=2)) assert data['title'] == "Superintendencia de Servicios de Salud" assert not data["hay_afiliacion"] assert data["no_hay_afiliacion"] for d in data['tablas']: assert "name" in d is_persona = "NO_AFILIADO" in [v for k, v in d.items() if k == 'name'] assert is_persona assert d['data']["Apellido y Nombre"] == "BXXXXXXXXS FXXXL JUAN CARLOS" assert d['data']["Tipo Documento"] == "DU" assert d['data']["Nro Documento"] == "2XXXXX1" assert d['data']["CUIL"] == "202XXXXX18"
def query(self, dni): logger.info('DBH query') if not self.logged_in: self.login() if not self.logged_in: return {'ok': False, 'error': 'Unable to login'} params = { 'pagina_consulta': '', 'cuil_b': '', 'nro_doc': dni, 'B1': 'Consultar' } sleep(self.pause_before_requests) ret = self._request(self.query_url, params=params) if ret['ok']: self.query_response = ret['response'] else: raise Exception('Unable to Query from SSS page. {}'.format( ret['error'])) logger.info('Query {}'.format(self.query_response.status_code)) self._save_response('query', self.query_response) if self.fake_env: # DNI should be a file in html-samples folder e.g. "full-afiliado" html = f'/html-samples/{dni}.html' # dejar un valor predeterminado if not os.path.isfile(html): html = f'/html-samples/full-afiliado.html' module_dir = os.path.dirname(__file__) html = module_dir + html else: html = self.query_response.text self.parser = SSSParser(html) self.parser.debug = self.debug data = self.parser.get_all_data() return {'ok': True, 'resultados': data}
def test_parser_afiliado(): html = './sss_beneficiarios_hospitales/html-samples/full-afiliado.html' parser = SSSParser(html) data = parser.get_all_data() # print(json.dumps(data, indent=2)) assert data['title'] == "Superintendencia de Servicios de Salud" assert data["hay_afiliacion"] assert not data["no_hay_afiliacion"] for d in data['tablas']: assert "name" in d is_afiliacion = "AFILIACION" in [ v for k, v in d.items() if k == 'name' ] is_persona = "AFILIADO" in [v for k, v in d.items() if k == 'name'] assert is_afiliacion or is_persona if is_afiliacion: assert d['data']["Parentesco"] == "TITULAR" assert d['data']["CUIL"] == "27-1XXXXX3-6" assert d['data']["Tipo de documento"] == "DOCUMENTO UNICO" assert d['data']["N\u00famero de documento"] == "1XXXXX3" assert d['data']["Apellido y nombre"] == "FXXXL MARIA" assert d['data']["Provincia"] == "CORDOBA" assert d['data']["Fecha de nacimiento"] == "09-09-1961" assert d['data']["Sexo"] == "Femenino" if is_persona: assert d['data']["CUIL titular"] == "27-1XXXXX3-6" assert d['data']["CUIT de empleador"] == "33-63761744-9" assert d['data']["CUIL titular"] == "27-1XXXXX3-6" assert d['data'][ "Tipo de beneficiario"] == "JUBILADOS Y PENSIONADOS DE PAMI" assert d['data']["C\u00f3digo de Obra Social"] == "5-0080-7" assert d['data'][ "Denominaci\u00f3n Obra Social"] == "INSTITUTO NACIONAL DE SERVICIOS SOCIALES PARA JUBILADOS Y PENSIONADOS" assert d['data']["Fecha Alta Obra Social"] == "01-08-2012"
class DataBeneficiariosSSSHospital: """ Consultas al Padrón de Beneficiarios de los Agentes Nacionales del Seguro de Salud. Requiere credenciales de Hospital habilitado. """ def __init__(self, user, password, headers=None): self.user = user self.password = password self.session = requests.session() self.verify_ssl = False self.login_url = 'https://seguro.sssalud.gob.ar/login.php?b_publica=Acceso+Restringido+para+Hospitales&opc=bus650&user=HPGD' self.logged_in = False self.query_url = 'https://seguro.sssalud.gob.ar/indexss.php?opc=bus650&user=HPGD&cat=consultas' logger.debug('DBH started') self.pause_before_requests = 2 default_headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36' } if headers is not None: default_headers.update(headers) self.session.headers.update(default_headers) self.debug = False self.fake_env = user == 'FAKE' and password == 'FAKE' def login(self): if self.fake_env: self.logged_in = True return True params = { '_user_name_': self.user, '_pass_word_': self.password, 'submitbtn': 'Ingresar' } sleep(self.pause_before_requests) ret = self._request(self.login_url, params=params) if ret['ok']: self.login_response = ret['response'] else: raise Exception('Unable to login to SSS page. {}'.format( ret['error'])) self._save_response('login', self.login_response) self.logged_in = self._validate_logged_in() if not self.logged_in: logger.error('Failed to log in {}'.format( self.login_response.status_code)) else: logger.info('Logged in') return self.logged_in def query(self, dni): logger.info('DBH query') if not self.logged_in: self.login() if not self.logged_in: return {'ok': False, 'error': 'Unable to login'} params = { 'pagina_consulta': '', 'cuil_b': '', 'nro_doc': dni, 'B1': 'Consultar' } sleep(self.pause_before_requests) ret = self._request(self.query_url, params=params) if ret['ok']: self.query_response = ret['response'] else: raise Exception('Unable to Query from SSS page. {}'.format( ret['error'])) logger.info('Query {}'.format(self.query_response.status_code)) self._save_response('query', self.query_response) if self.fake_env: # DNI should be a file in html-samples folder e.g. "full-afiliado" html = get_html_sample(dni) # dejar un valor predeterminado if not os.path.isfile(html): html = get_html_sample('full-afiliado') else: html = self.query_response.text self.parser = SSSParser(html) self.parser.debug = self.debug data = self.parser.get_all_data() return {'ok': True, 'resultados': data} def _save_response(self, filename, resp): if self.fake_env: return f = open(f'{filename}.html', 'w') f.write(resp.text) f.close() data = { 'headers': dict(resp.headers), 'cookies': resp.cookies.get_dict(), 'encoding': resp.encoding, 'status_code': resp.status_code } str_data = json.dumps(data, indent=4) f = open(f'{filename}.json', 'w') f.write(str_data) f.close() def _validate_logged_in(self): """ validate login worked fine """ ok1 = 'usuario_logueado' in self.login_response.text ok2 = 'nro_doc' in self.login_response.text return ok1 and ok2 def _request(self, url, method='POST', params={}): ret = {'ok': True} if self.fake_env: class FakeResponse: status_code = 0 ret['response'] = FakeResponse() return ret if method == 'GET': try: res = self.session.get(url, verify=self.verify_ssl) except Exception as e: ret['ok'] = False error = f'Error requesting {method} {url}: {e}' elif method == 'POST': try: res = self.session.post(url, data=params, verify=self.verify_ssl) except Exception as e: ret['ok'] = False error = f'Error requesting {method} {url}: {e}' else: error = f'Invalid method {method}' ret['ok'] = False if ret['ok']: ret['response'] = res else: logger.error(error) ret['error'] = error return ret