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