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:
- Necesitas analizar esta página.
- Buscar entre informes nuevos por fecha nueva (en mi caso, puede buscar por palabra
24 April
). - 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 \r\n \r\n\t\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 \r\n\t<link rel="stylesheet" type="text/css" media="screen" href="/media/dfa-2017/style-assets/css/style.css" />\t\r\n <link rel="stylesheet" type="text/css" media="print" href="/media/dfa-2017/style-assets/css/print.css" />\t\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"/> <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"/> <link href="/media/dfa-2017/style-assets/css/style.css" media="screen" rel="stylesheet" type="text/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í:
- Descargue este nuevo informe.
- Pars el archivo pdf.
- Encuentra mi identificación en él.
- 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.