Cómo descubrí que mi visa no está lista, un mensaje en Slack

Ayuno para las vacaciones de mayo. Hace 6 semanas solicité una visa para Irlanda. La salida está programada para el 30 de abril. Hay un sitio web de la embajada en el que se publican listas de decisiones de visa. Lo hacen los lunes y jueves. Y aquí estoy sentado el domingo 28 de abril, todavía no hay solución para mi visa. Y mis acciones adicionales el lunes dependen de si mi declaración estará en el nuevo informe o no. Si no, tendrá que ir a la embajada y resolverlo. Si es así, retire el centro de visas. Sentarme y actualizar la página todo el día del lunes parecía un pasatiempo aburrido, así que escribí un script de Python.



Descargo de responsabilidad. No soy programador, pero puedo programar. Esto significa que no puedo escribir código elegante y eficiente, pero puedo hacer que este órgano de barril haga lo que necesito de él.


1. Revisando la página para un nuevo informe


Entonces, qué hay que hacer:


  1. Necesitas analizar esta página.
  2. Buscar entre informes nuevos por fecha nueva (en mi caso, puede buscar por palabra 24 April ).
  3. Obtenga un enlace a este informe.

El código de función es el siguiente:


 def check_report(url, div_class, date): embassy_page = requests.get(url) page_text = BeautifulSoup(embassy.text, 'lxml') tags = page_text.findAll('div', {"class": div_class}) text = '' report_url = '' for tag in tags: tag_soup = BeautifulSoup(tag.text, 'lxml') report = s(text=re.compile(date)) if len(report) > 0: text = 'New report published' report_url = 'https://www.dfa.ie' + tag.find('a').attrs['href'] return text, report_url 

Ahora más sobre lo que está sucediendo en este código.


Primero, usamos la biblioteca de requests , que nos ayuda a descargar la página requerida. Luego, utilizamos otra biblioteca BeautifulSoup , que ayuda a convertir este diseño de página salvaje en un aspecto más hermoso y conveniente.


Antes de usar BeautifulSoup :


 '<!DOCTYPE html>\r\n\r\n<html lang="en">\r\n <head>\r\n <META http-equiv="X-UA-Compatible" content="IE=edge">\r\n <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\t\r\n\t<meta name="viewport" content="initial-scale=1">\r\n \r\n \r\n \r\n \r\n \r\n <!-- Static Meta data -->\r\n \r\n\t<!-- <meta name="DC.Creator" content="Department of Foreign Affairs" />\r\n\t<meta name="DC.Publisher" content="Department of Foreign Affairs" /> \r\n\t<meta name="DC.Format" content="text/xhtml" /> \r\n\t<meta name="DC.Copyright" content="All material (c) copyright 2012 Department of Foreign Affairs" /> \r\n\t<meta name="DC.Source" content="Department of Foreign Affairs" /> \r\n\t<meta name="DC.Language" content="en" />\r\n\t<meta name="DC.Author" content="Department of Foreign Affairs" /> -->\r\n\r\n\r\n<meta name="author" content="Department of Foreign Affairs">\r\n<meta name="google-site-verification" content="HHtulupgM8GXpd9YYDjoXUb6MiU7_mGTkHixUrVPFYQ" />\r\n \r\n\t<title>Weekly Decision Report - Department of Foreign Affairs and Trade</title>\r\n <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" /> \r\n <link rel="stylesheet" type="text/css" media="screen" href="/media/dfa-2017/style-assets/css/font-defs.css" />\t<!-- 2017 font-defs.css --> \r\n\t<link rel="stylesheet" type="text/css" media="screen" href="/media/dfa-2017/style-assets/css/style.css" />\t<!-- 2017 style.css -->\r\n <link rel="stylesheet" type="text/css" media="print" href="/media/dfa-2017/style-assets/css/print.css" />\t<!-- 2017 print.css -->\r\n 

Después:


 <!DOCTYPE html> <html lang="en"> <head> <meta content="IE=edge" http-equiv="X-UA-Compatible"/> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <meta content="initial-scale=1" name="viewport"/> <!-- Static Meta data --> <!-- <meta name="DC.Creator" content="Department of Foreign Affairs" /> <meta name="DC.Publisher" content="Department of Foreign Affairs" /> <meta name="DC.Format" content="text/xhtml" /> <meta name="DC.Copyright" content="All material (c) copyright 2012 Department of Foreign Affairs" /> <meta name="DC.Source" content="Department of Foreign Affairs" /> <meta name="DC.Language" content="en" /> <meta name="DC.Author" content="Department of Foreign Affairs" /> --> <meta content="Department of Foreign Affairs" name="author"/> <meta content="HHtulupgM8GXpd9YYDjoXUb6MiU7_mGTkHixUrVPFYQ" name="google-site-verification"/> <title>Weekly Decision Report - Department of Foreign Affairs and Trade</title> <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/> <link href="/media/dfa-2017/style-assets/css/font-defs.css" media="screen" rel="stylesheet" type="text/css"/> <!-- 2017 font-defs.css --> <link href="/media/dfa-2017/style-assets/css/style.css" media="screen" rel="stylesheet" type="text/css"/> <!-- 2017 style.css --> 

Ahora de alguna manera puedes vivir y trabajar con esto. En particular, en mi caso, buscaremos una div class especial que se use para enlaces a informes. Vemos esto desde el código fuente de la página: <div class="gen-content-landing__block"> . En mi código buscamos todas esas etiquetas.


Luego, revise las etiquetas recopiladas y busque la que contiene la fecha del nuevo informe: 24 April . Si se encuentra dicho resultado, extraemos un enlace y formamos el texto de que se ha publicado un nuevo informe.


2. Busque una identificación de visa en un nuevo informe


Entonces, ¿qué hay que hacer ahora aquí:


  1. Descargue este nuevo informe.
  2. Pars el archivo pdf.
  3. Encuentra mi identificación en él.
  4. Encuentra el estado que le corresponde.

El código de función es el siguiente:


 def check_visa(report_url, filename, visa_id, text): pdf = requests.get(report_url) file_path = Path(filename) file_path.write_bytes(pdf.content) pdfFileObj = open(filename, 'rb') pdfReader = PyPDF2.PdfFileReader(pdfFileObj, strict=False) for pageNum in range(0, pdfReader.numPages): page = str(pdfReader.getPage(pageNum).extractText().encode('utf-8')).split('\\n') if visa_id in page: visa_index = page.index(visa_id) status = page[visa_index + 1] text = text + '\t' + visa_id + '\t' + status return text 

Usando la biblioteca de requests nuevamente, hacemos una solicitud a este informe. A continuación, guárdelo localmente. Usando la biblioteca PyPDF2 , leemos el archivo. Después de eso, clasificamos sus páginas y buscamos visa_id en la matriz de tokens. El marcado de este archivo pdf es tal que el siguiente token después de visa_id es el estado de visa_id directamente: Approved o Refused . A continuación, concatenamos el texto existente con id y estado.


3. Envío de mensaje de estado en Slack


Bueno El script encontró, por ejemplo, mi identificación, pero debe notificarme en algún lugar al respecto. Nosotros en nuestra compañía usamos Slack como mensajero, así que pensé que sería conveniente para mí recibir una notificación allí.


Este enlace le permite configurar su webhook. Allí puede seleccionar el canal o el destinatario a quien publicar el mensaje (puede ser necesario ser administrador de WorkSpace para este paso). Allí recibirá una url única para webhook, que se puede usar en el código.


 def send_to_slack(webhook_url, text): post = {"text": "{0}".format(text)} json_data = json.dumps(post) req = requests.post(webhook_url, data=json_data.encode('ascii'), headers={'Content-Type': 'application/json'}) return req.status_code 

Usando la misma biblioteca de requests , hacemos una solicitud POST con el contenido del text en webhook.


4. Uso de funciones


El resto del código se ve así:


 url = 'https://www.dfa.ie/irish-embassy/russia/visas/weekly-decision-report/' div_class = 'gen-content-landing__block' date = '24 April' filename = 'weekly_report.pdf' visa_id = '38644112' webhook_url = 'https://hooks.slack.com/services/...' text, report_url = check_report(url, div_class, date) if text != '': text = check_visa(report_url, filename, visa_id, text) print(send_to_slack(webhook_url, text)) 

Asignamos valores a todas las variables necesarias y luego ejecutamos las funciones prescritas.


5. Lanzamiento de acuerdo al plan


Ok Escribí un guión, pero si tengo que sacarlo cada vez, no estoy lejos del estado inicial de las cosas, donde tendría que sentarme y actualizar la página.


 $ crontab -e 

Se le agregó una línea:


 */10 * * * * python3 /home/ubuntu/embassy.py >/dev/null 2>&1 

Pensé que es suficiente para mí si este script se ejecuta cada 10 minutos por cron en un servidor con ubuntu.


6. Conclusión


A las 11:50, recibí un mensaje de que había aparecido un nuevo informe, pero mi visa no estaba en él ... Después de eso fui a la embajada. Lo tomó por asalto (no respondieron cartas y llamadas durante varias semanas) y como resultado recibió su pasaporte con una visa.


En general, la habilidad de programación es importante en el mundo moderno, incluso si no eres un programador. Le permite automatizar algunas de sus operaciones de rutina, lo que hace que su mundo sea un poco más conveniente. De hecho, uno podría organizar esto en un servicio separado, donde una persona simplemente ingresa su identificación y correo electrónico, y recibe un mensaje sobre la disponibilidad de una visa para enviar un correo electrónico.

Source: https://habr.com/ru/post/450060/


All Articles