Comment j'ai découvert que mon visa n'était pas prêt, un message dans Slack

Jeûne pour les vacances de mai. Il y a 6 semaines, j'ai demandé un visa pour l'Irlande. Le départ est prévu pour le 30 avril. Il existe un site Web de l'ambassade sur lequel des listes de décisions en matière de visas sont publiées . Ils le font les lundis et jeudis. Et me voilà assis le dimanche 28 avril, il n'y a toujours pas de solution pour mon visa. Et mes autres actions lundi dépendront de si ma déclaration figurera ou non dans le nouveau rapport. Sinon, vous devrez vous rendre à l'ambassade et faire le tri. Si c'est le cas, tirez sur le centre des visas. Laisser et mettre à jour la page toute la journée de lundi semblait être un passe-temps ennuyeux, j'ai donc écrit un script Python.



Clause de non-responsabilité. Je ne suis pas programmeur, mais je peux programmer. Cela signifie que je ne peux pas écrire de code élégant et efficace, mais je peux faire en sorte que cet orgue de Barbarie fasse ce dont j'ai besoin.


1. Vérification de la page pour un nouveau rapport


Alors, que faut-il faire:


  1. Vous devez analyser cette page.
  2. Trouvez parmi les rapports un nouveau par une nouvelle date (dans mon cas, vous pouvez rechercher par le mot 24 April ).
  3. Obtenez un lien vers ce rapport.

Le code de fonction est le suivant:


 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 

Maintenant, plus sur ce qui se passe dans ce code.


Tout d'abord, nous utilisons la bibliothèque de requests , qui nous aide à télécharger la page requise. Ensuite, nous utilisons une autre bibliothèque BeautifulSoup , qui aide à transformer cette mise en page sauvage en une apparence plus belle et plus pratique.


Avant d'utiliser 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 

Aprè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 --> 

Maintenant, vous pouvez en quelque sorte vivre et travailler avec cela. En particulier, dans mon cas, nous rechercherons une div class spéciale utilisée pour les liens vers les rapports. Nous le voyons dans le code source de la page: <div class="gen-content-landing__block"> . Dans mon code, nous recherchons toutes ces balises.


Ensuite, parcourez les balises collectées et recherchez celle qui contient la date du nouveau rapport: 24 April . Si un tel résultat est trouvé, nous en extrayons le lien et formons le texte qu'un nouveau rapport a été publié.


2. Recherchez un identifiant de visa dans un nouveau rapport


Alors, que faut-il faire maintenant ici:


  1. Téléchargez ce nouveau rapport.
  2. Analyse le fichier pdf.
  3. Trouvez mon id dedans.
  4. Trouvez le statut qui lui correspond.

Le code de fonction est le suivant:


 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 

En utilisant à nouveau la bibliothèque de requests , nous faisons une demande à ce rapport. Ensuite, enregistrez-le localement. En utilisant la bibliothèque PyPDF2 , PyPDF2 lisons le fichier. Après cela, nous trions ses pages et recherchons visa_id dans le tableau des jetons. Le balisage de ce fichier pdf est tel que le jeton suivant après visa_id est le statut d' visa_id directement: Approved ou Refused . Ensuite, nous concaténons le texte existant avec id et status.


3. Envoi d'un message d'état dans Slack


Bon. Le script a trouvé, disons, mon identifiant, mais vous devez m'en informer quelque part. Dans notre entreprise, nous utilisons Slack comme messager, j'ai donc pensé qu'il serait pratique pour moi de recevoir une notification.


Ce lien vous permet de configurer votre webhook. Vous pouvez y sélectionner le canal ou le destinataire auquel envoyer le message (il peut être nécessaire d'être un administrateur WorkSpace pour cette étape). Là, vous recevrez une URL unique pour webhook, qui peut être utilisée dans le code.


 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 

En utilisant la même bibliothèque de requests , nous faisons une requête POST avec le contenu du text sur webhook.


4. Utilisation des fonctions


Le reste du code ressemble à ceci:


 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)) 

Nous attribuons des valeurs à toutes les variables nécessaires, puis exécutons les fonctions prescrites.


5. Lancement selon le plan


Ok J'ai écrit un script, mais si je dois le tirer moi-même à chaque fois, je ne suis pas loin de la situation initiale, où je devrais m'asseoir et mettre à jour la page.


 $ crontab -e 

Ajout d'une ligne:


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

Je pensais que cela me suffit si ce script est exécuté toutes les 10 minutes par cron sur un serveur avec ubuntu.


6. Conclusion


À 11 h 50, j'ai reçu un message selon lequel un nouveau rapport était apparu, mais mon visa n'y était pas ... Après cela, je suis allé à l'ambassade. Il l'a pris d'assaut (ils n'ont pas répondu aux lettres et aux appels pendant plusieurs semaines) et ont donc reçu son passeport avec un visa.


En général, la compétence en programmation est importante dans le monde moderne, même si vous n'êtes pas programmeur. Il vous permet d'automatiser certaines de vos opérations de routine, ce qui rend votre monde un peu plus pratique. En fait, on pourrait même organiser cela dans un service séparé, où une personne entre simplement son identifiant et son e-mail, et il reçoit un message sur la préparation d'un visa à envoyer.

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


All Articles