Changed the dest dir.
[toast/webscraper/bob.git] / bob_download.py
1 #!/usr/bin/python3
2 import os
3 import re
4 import requests
5 from bs4 import BeautifulSoup
6
7 dest_dir = '/tmp/bob'
8
9 session = requests.Session()
10 additional_headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'} # otherwise site with content '<HTML></HTML>' is returned
11 # Accept-Encoding: identity # to get non-compressed things back
12
13 # load login page
14 main_url = 'https://rechnung.bob.at/'
15 response = session.get(main_url, headers=additional_headers)
16 html = BeautifulSoup(response.text, 'html.parser')
17
18 # fill out login form (name='asmpform') with username=<phone number> and password
19 form = html.find(attrs={'name': 'asmpform'})
20 fields = {e['name']: e.get('value', '') for e in form.find_all('input', {'name': True}) if e['name'] != 'submit'}
21 assert 'loginMsisdn' in fields # user name
22 fields['loginMsisdn'] = '4369911111111' # user name is phone number
23 assert 'kkw' in fields # password
24 fields['kkw'] = 'abcdefg'
25
26 # load overview page
27 response = session.post(form['action'], data=fields, headers=additional_headers)
28
29 # reload overview page rechnung.bob.at - that makes the URLs in the page much prettier
30 # previously:
31 # https://rechnung.bob.at/bill/pdf/;BOBOBPSESSIONID=B7DB9938A3B9541E3D0EB6CD728F54C0.obpBobCustomer4Rechnungskopie_1509_523260091_1.pdf?bsn=61
32 # same after reload:
33 # '/bill/pdf/Rechnungskopie_1509_523260091_1.pdf?bsn=61'
34 response = session.get(main_url, headers=additional_headers)
35 html = BeautifulSoup(response.text, 'html.parser')
36
37 # Download PDFs
38 # Links look like '/bill/pdf/Rechnungskopie_1509_523260091_1.pdf?bsn=61'
39 regexp = re.compile(r'\/(Rechnungskopie_.*)\?')
40 links = html.findAll('a', href=regexp)
41 for link in links:
42     url = link['href']
43     filename = regexp.search(url).group(1)
44     assert filename.startswith('Rechnungskopie_')
45     filepath = os.path.join(dest_dir, filename)
46     if not os.path.exists(filepath):
47         response = session.get(main_url[:-1] + url)
48         assert response.status_code == 200
49         with open(filepath, 'wb') as file:
50             file.write(response.content)
51
52 # Download CSVs
53 # Links look like '/bill.set.obp?bsn=61'
54 regexp = re.compile(r'\/bill.set.obp\?')
55 links = html.findAll('a', href=regexp)
56 for link in links:
57     url = link['href']
58     response = session.get(main_url[:-1] + url)
59     assert response.status_code == 200
60     assert response.text != ''
61     import time
62     time.sleep(3)
63     response = session.get(main_url + 'bill.ctn.cdr.set.obp')
64     html = BeautifulSoup(response.text, 'html.parser')
65     assert html.find('a', id='link_csv_download') is not None
66     response = session.get('https://rechnung.bob.at/download.table.obp?fmt=TAB&table=obp.calls.table', headers=additional_headers)
67     assert response.status_code == 200
68     filename = response.headers['Content-Disposition'].split('=')[1] # e.g. 'EVN_1509_523260091_1_069911934859.txt'
69     assert filename.startswith('EVN_')
70     filepath = os.path.join(dest_dir, filename)
71     if not os.path.exists(filepath):
72         with open(filepath, 'wb') as file:
73             file.write(response.content)
74