5月の休日の断食。 6週間前、アイルランドへのビザを申請しました。 出発は4月30日に予定されています。 ビザの決定のリストが公開されている大使館のウェブサイトがあります 。 彼らは月曜日と木曜日にこれを行います。 そして、ここで私は4月28日日曜日に座っています、私のビザにはまだ解決策がありません。 そして、月曜日の私のさらなる行動は、私の声明が新しい報告書に含まれるかどうかに依存します。 そうでない場合は、大使館に行って整理する必要があります。 ある場合は、ビザセンターを引き出します。 月曜日の終日ページに座って更新するのはつまらない気がするので、Pythonスクリプトを作成しました。
免責事項。 私はプログラマーではありませんが、プログラミングはできます。 つまり、エレガントで効率的なコードを書くことはできませんが、このバレルオルガンに必要なことをさせることができます。
1.新しいレポートのページを確認する
だから何をする必要があります:
- このページを解析する必要があります。
- レポートの中から新しい日付までに新しいレポートを見つけます(私の場合は、
24 April
という単語で検索できます)。 - このレポートへのリンクを取得します。
機能コードは次のとおりです。
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
このコードで何が起こっているかについて詳しく説明します。
まず、 requests
ライブラリを使用しrequests
。これは、必要なページのダウンロードに役立ちます。 次に、別のBeautifulSoup
ライブラリを使用します。これにより、このワイルドページレイアウトがより美しく便利な外観になります。
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
後:
<!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"/>
これで、なんとかしてこれを使って作業することができます。 特に、私の場合、レポートへのリンクに使用される特別なdiv class
を探します。 これは、ページのソースコード<div class="gen-content-landing__block">
ます。 私のコードでは、このようなタグをすべて探しています。
次に、収集されたタグを調べて、新しいレポートの日付が含まれるタグを探します: 24 April
。 そのような結果が見つかった場合は、その結果からリンクを抽出し、新しいレポートが公開されたというテキストを形成します。
2.新しいレポートでビザIDを検索する
ここで今何をする必要がありますか:
- この新しいレポートをダウンロードしてください。
- PDFファイルを解析します。
- その中で私のIDを見つけます。
- それに対応するステータスを見つけます。
機能コードは次のとおりです。
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
requests
ライブラリを再度使用して、このレポートにリクエストを行います。 次に、ローカルに保存します。 PyPDF2
ライブラリを使用して、ファイルPyPDF2
読み取ります。 その後、ページをソートし、トークン配列でvisa_id
を探します。 このpdfファイルのマークアップは、 visa_id
後の次のトークンが直接visa_id
ステータスであるようになっています: Approved
またはRefused
。 次に、既存のテキストをidとstatusで連結します。
3. Slackでステータスメッセージを送信する
いいね スクリプトは、たとえば私のIDを見つけましたが、それについてどこかに通知する必要があります。 私たちの会社ではSlackをメッセンジャーとして使用しているので、通知を受け取るのが便利だと思いました。
このリンクを使用すると、Webhookを構成できます。 そこで、メッセージを投稿するチャネルまたは受信者を選択できます(このステップではWorkSpace管理者である必要がある場合があります)。 そこで、コードで使用できるwebhookの一意のURLを受け取ります。
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
同じrequests
ライブラリを使用して、webhookアドレスのtext
の内容を使用してPOSTリクエストを作成します。
4.関数の使用
残りのコードは次のようになります。
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))
必要なすべての変数に値を割り当ててから、規定の機能を実行します。
5.計画に従って起動する
わかった スクリプトを書きましたが、毎回それを自分で引き出さなければならないとしたら、私は座ってページを更新しなければならない初期の状態から遠く離れていません。
$ crontab -e
行を追加しました:
*/10 * * * * python3 /home/ubuntu/embassy.py >/dev/null 2>&1
このスクリプトがubuntuを搭載したサーバーでcronによって10分ごとに実行されれば十分だと思いました。
6.結論
11:50に、新しいレポートが表示されたというメッセージを受け取りましたが、私のビザはそこにありませんでした...その後、私は大使館に行きました。 彼はそれを嵐で受け取り(数週間手紙や電話に答えなかった)、その結果、ビザでパスポートを受け取った。
一般的に、プログラミングのスキルは、たとえあなたがプログラマーでなくても、現代の世界では重要です。 これにより、日常業務の一部を自動化できるため、世界が少し便利になります。 実際、これを別のサービスで手配することもできます。このサービスでは、ユーザーは自分のIDと電子メールを入力するだけで、メールのビザ準備完了に関するメッセージを受け取ります。