Author: Adam Pioterek <adam.pioterek@protonmail.ch>
removed scrapper
.idea/misc.xml | 2 app/src/main/java/ml/adamsprogs/bimba/activities/NoDbActivity.kt | 1 database/bundle.pem | 83 database/cron | 48 database/db.schema | 30 database/scraper.py | 305 --
diff --git a/.idea/misc.xml b/.idea/misc.xml index 635999df1e86791ad3787e455b4524e4d8879b93..ba7052b8197ddf8ba8756022d905d03055c7ad60 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -24,7 +24,7 @@ </value> </option> </component> - <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/build/classes" /> </component> <component name="ProjectType"> diff --git a/app/src/main/java/ml/adamsprogs/bimba/activities/NoDbActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/activities/NoDbActivity.kt index 1108febb0d070c2a7bf6af3a11e75250c77f17ee..c266917efff4a9403be80eb110224bda659ae1f4 100644 --- a/app/src/main/java/ml/adamsprogs/bimba/activities/NoDbActivity.kt +++ b/app/src/main/java/ml/adamsprogs/bimba/activities/NoDbActivity.kt @@ -9,7 +9,6 @@ import kotlinx.android.synthetic.main.activity_nodb.* import ml.adamsprogs.bimba.datasources.TimetableDownloader import ml.adamsprogs.bimba.models.Timetable -//todo onResume check again // check class NoDbActivity : AppCompatActivity(), NetworkStateReceiver.OnConnectivityChangeListener, MessageReceiver.OnTimetableDownloadListener { private val networkStateReceiver = NetworkStateReceiver() private val timetableDownloadReceiver = MessageReceiver.getMessageReceiver() diff --git a/database/bundle.pem b/database/bundle.pem deleted file mode 100644 index 12585890132ce18cf3ebf0ac2819017cba1e3123..0000000000000000000000000000000000000000 --- a/database/bundle.pem +++ /dev/null @@ -1,83 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIETTCCAzWgAwIBAgIDAjpxMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMTMxMjExMjM0NTUxWhcNMjIwNTIwMjM0NTUxWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSUmFwaWRTU0wg -U0hBMjU2IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1jBEgEu -l9h9GKrIwuWF4hdsYC7JjTEFORoGmFbdVNcRjFlbPbFUrkshhTIWX1SG5tmx2GCJ -a1i+ctqgAEJ2sSdZTM3jutRc2aZ/uyt11UZEvexAXFm33Vmf8Wr3BvzWLxmKlRK6 -msrVMNI4/Bk7WxU7NtBDTdFlodSLwWBBs9ZwF8w5wJwMoD23ESJOztmpetIqYpyg -C04q18NhWoXdXBC5VD0tA/hJ8LySt7ecMcfpuKqCCwW5Mc0IW7siC/acjopVHHZD -dvDibvDfqCl158ikh4tq8bsIyTYYZe5QQ7hdctUoOeFTPiUs2itP3YqeUFDgb5rE -1RkmiQF1cwmbOwIDAQABo4IBSjCCAUYwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwR -fap9ZbjKzE4wHQYDVR0OBBYEFJfCJ1CewsnsDIgyyHyt4qYBT9pvMBIGA1UdEwEB -/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDYGA1UdHwQvMC0wK6ApoCeGJWh0 -dHA6Ly9nMS5zeW1jYi5jb20vY3Jscy9ndGdsb2JhbC5jcmwwLwYIKwYBBQUHAQEE -IzAhMB8GCCsGAQUFBzABhhNodHRwOi8vZzIuc3ltY2IuY29tMEwGA1UdIARFMEMw -QQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3RydXN0 -LmNvbS9yZXNvdXJjZXMvY3BzMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTeW1h -bnRlY1BLSS0xLTU2OTANBgkqhkiG9w0BAQsFAAOCAQEANevhiyBWlLp6vXmp9uP+ -bji0MsGj21hWID59xzqxZ2nVeRQb9vrsYPJ5zQoMYIp0TKOTKqDwUX/N6fmS/Zar -RfViPT9gRlATPSATGC6URq7VIf5Dockj/lPEvxrYrDrK3maXI67T30pNcx9vMaJR -BBZqAOv5jUOB8FChH6bKOvMoPF9RrNcKRXdLDlJiG9g4UaCSLT+Qbsh+QJ8gRhVd -4FB84XavXu0R0y8TubglpK9YCa81tGJUheNI3rzSkHp6pIQNo0LyUcDUrVNlXWz4 -Px8G8k/Ll6BKWcZ40egDuYVtLLrhX7atKz4lecWLVtXjCYDqwSfC2Q7sRwrp0Mr8 -2A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -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 -MKlNUKhgoBO4 ------END CERTIFICATE----- diff --git a/database/cron b/database/cron deleted file mode 100644 index 36b7f43366ebdccab4f9f4e6d8221507fca495de..0000000000000000000000000000000000000000 --- a/database/cron +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/bash - -d=$(date -Iminutes) - -cd /home/qeebmisk - -set +e -/usr/bin/python3.6 scraper.py >new_meta 2> "scraper_$d.log" -result=$? -if [ $result -eq 0 ] -then - /usr/bin/sqlite3 timetable.db 'pragma integrity_check;' - if [ $? -eq 0 ] - then - trap except ERR - - echo 'making metadata' >> "scraper_$d.log" - mv new_meta timetable.db.meta - sha512sum timetable.db | cut -d ' ' -f 1 >>timetable.db.meta - ls -l timetable.db | cut -d ' ' -f 5 >>timetable.db.meta - echo '1.1.0' >>timetable.db.meta - echo 'timetable.db.xz' >>timetable.db.meta - - xz -z -k timetable.db - - echo 'moving' >> "scraper_$d.log" - mv timetable.db.xz public_html/w/data/media/programmes/bimba/timetable.db.xz - mv timetable.db.meta public_html/w/data/media/programmes/bimba/timetable.db.meta - - echo 'success' >> "scraper_$d.log" - else - echo 'db integrity check failed' >> "scraper_$d.log" - rm timetable.db - rm new_meta - fi -elif [ $result -eq 48 ] -then - echo 'db is still valid' >> "scraper_$d.log" - rm new_meta -else - echo 'scraper failed' >> "scraper_$d.log" - rm timetable.db - rm new_meta -fi - -function except { - (rm /home/qeebmisk/timetable.db; rm /home/qeebmisk/new_meta) || : -} diff --git a/database/db.schema b/database/db.schema deleted file mode 100644 index 2f7de0bddd67bb1dfb80e9e8504c1b1dcf385eb6..0000000000000000000000000000000000000000 --- a/database/db.schema +++ /dev/null @@ -1,30 +0,0 @@ -metadata --------- -#key -value - -nodes stops -------- --------- -#symbol <____ #id <_________ -name |___ symbol | - number | - lat | - lon | - headsigns | - | -lines timetables | ------- ---------- | -#id <______ #id <________/|\__ -number | stop_id ______| | - |_____ line_id | - headsign | - | - departures | - ---------- | - #id | - timetable_id _____| - hour - minute - mode - lowFloor - modification diff --git a/database/scraper.py b/database/scraper.py deleted file mode 100755 index c94b49f40429e6b8759cb084b10a90696fdfbef4..0000000000000000000000000000000000000000 --- a/database/scraper.py +++ /dev/null @@ -1,305 +0,0 @@ -#!/bin/python -""" -js interface: http://www.ztm.poznan.pl/themes/ztm/dist/js/app.js -nodes: http://www.ztm.poznan.pl/goeuropa-api/all-nodes -stops in node: http://www.ztm.poznan.pl/goeuropa-api/node_stops/{node:symbol} -stops: http://www.ztm.poznan.pl/goeuropa-api/stops-nodes -bike stations: http://www.ztm.poznan.pl/goeuropa-api/bike-stations - -alerts: goeuropa-api/alerts/' + lineId; - -""" -import json -import os -import re -import sqlite3 -import sys -import requests -from bs4 import BeautifulSoup - -class TimetableDownloader: - """ - downloader class - """ - def __init__(self, verbose): - self.session = requests.session() - self.verbose = verbose - - - def __get_validity(self): - """ - get timetable validity - """ - index = self.__get('https://www.ztm.poznan.pl/goeuropa-api/index') - option = re.search('<option value="[0-9]{8}" selected', index.text).group() - return option.split('"')[1] - - - def __get_nodes(self): - """ - get nodes - """ - index = self.__get('https://www.ztm.poznan.pl/goeuropa-api/all-nodes') - return [(stop['symbol'], stop['name']) for stop in json.loads(index.text)] - - - def __get_stops(self, node): - """ - get stops - """ - index = self.__get('https://www.ztm.poznan.pl/goeuropa-api/node_stops/{}'.format(node)) - stops = [] - for stop in json.loads(index.text): - name = stop['stop']['name'] - stop_id = stop['stop']['id'] - number = re.findall("\\d+", stop['stop']['symbol'])[0] - lat = stop['stop']['lat'] - lon = stop['stop']['lon'] - # todo test - directions = ', '.join(['{} → {}'.format(transfer['name'], transfer['headsign']) - for transfer in stop['transfers'] - if transfer['headsign'] != name]) - if directions == '': - continue - stops.append((stop_id, node, number, lat, lon, directions)) - return stops - - - def __get_lines(self): - """ - get lines - """ - index = self.__get('https://www.ztm.poznan.pl/goeuropa-api/index') - soup = BeautifulSoup(index.text, 'html.parser') - - lines = {line['data-lineid']: line.text for line in - soup.findAll(attrs={'class': re.compile(r'.*\blineNo-bt\b.*')})} - - return lines - - - def __get_route(self, line_id): - """ - get routes - """ - index = self.__get('https://www.ztm.poznan.pl/goeuropa-api/line-info/{}'.format(line_id)) - soup = BeautifulSoup(index.text, 'html.parser') - directions = soup.findAll(attrs={'class': re.compile(r'.*\baccordion-item\b.*')}) - routes = {} - for direction in directions: - direction_id = direction['data-directionid'] - - route = [{'id': stop.find('a')['data-stopid'], 'name': stop['data-name'], - 'onDemand': re.search('stop-onDemand', str(stop['class'])) != None, - 'variant_type': re.search('variant-type-(in|out)', str(stop['class'])).groups()[0]\ - if re.search('variant-type-(in|out)', str(stop['class'])) is not None else None, - 'variant_first': re.search('first-variant', str(stop['class'])) is not None, - 'variant_last': re.search('last-variant', str(stop['class'])) is not None} - for stop in direction.findAll(attrs={'class': re.compile(r'.*\bstop-itm\b.*')})] - routes[direction_id] = route - return routes - - - def __get_stop_times(self, stop_id, line_id, direction_id): - index = self.__post('https://www.ztm.poznan.pl/goeuropa-api/stop-info/{}/{}'. - format(stop_id, line_id), {'directionId': direction_id}) - soup = BeautifulSoup(index.text, 'html.parser') - legends = {} - for row in soup.find(attrs={'class': re.compile(r'.*\blegend-box\b.*')}).findAll('li'): - row = row.text.split('-') - row[0] = row[0].rstrip() - row[1] = row[1].lstrip() - if row[0] != '_': - legends[row[0]] = '-'.join(row[1:]) - schedules = {} - for mode in soup.findAll(attrs={'class': re.compile(r'.*\bmode-tab\b.*')}): - mode_name = mode['data-mode'] - schedule = {row.find('th').text: [ - {'time': minute.text, 'lowFloor': re.search('n-line', str(minute['class'])) != None} - for minute in row.findAll('a')] - for row in mode.find(attrs={'class': re.compile(r'.*\bscheduler-hours\b.*')}). - findAll('tr')} - schedule_2 = {hour: times for hour, times in schedule.items() if times != []} - schedule = [] - for hour, deps in schedule_2.items(): - for dep in deps: - schedule.append((hour, *self.__describe(dep['time'], legends), dep['lowFloor'])) - schedules[mode_name] = schedule - - return schedules - - - @staticmethod - def __describe(dep_time, legend): - """ - describe departure - """ - desc = [] - while re.match('^\\d+$', dep_time) is None: - try: - if dep_time[-1] != ',': - desc.append(legend[dep_time[-1]]) - except KeyError: - pass - dep_time = dep_time[:-1] - return (int(dep_time), '; '.join(desc)) - - - def __get(self, url): - try: - return self.session.get(url, verify='bundle.pem') - except: - self.session = requests.session() - return self.session.get(url, verify='bundle.pem') - - - def __post(self, url, data): - try: - return self.session.post(url, data=data, verify='bundle.pem') - except: - self.session = requests.session() - return self.session.post(url, data=data, verify='bundle.pem') - - - # todo take into account parent (and for variant stops it needs synced departure times) - @staticmethod - def __calculate_time_to_next_stop(times, last_time_of_arrival): - times.sort() - earliest_departure = times[0] - if last_time_of_arrival == "": - return None, earliest_departure - - hour = int(earliest_departure[:2]) - minute = int(earliest_departure[3:]) - minute = minute + (60 * hour) - - last_hour = int(last_time_of_arrival[:2]) - last_minute = int(last_time_of_arrival[3:]) - last_minute = last_minute + (60 * last_hour) - - time_to_next_stop = minute - last_minute - return time_to_next_stop, earliest_departure - - def download(self): - """ - main function - """ - if os.path.exists('timetable.db'): - connection = sqlite3.connect('timetable.db') - cursor = connection.cursor() - cursor.execute("select value from metadata where key = 'validFrom'") - current_valid_from = cursor.fetchone()[0] - cursor.close() - connection.close() - if self.__get_validity() <= current_valid_from: - return 304 - else: - os.remove('timetable.db') - - with sqlite3.connect('timetable.db') as connection: - try: - cursor = connection.cursor() - cursor.execute('create table metadata(key TEXT PRIMARY KEY, value TEXT)') - cursor.execute('create table nodes(symbol TEXT PRIMARY KEY, name TEXT)') - cursor.execute('create table stops(id TEXT PRIMARY KEY, symbol TEXT \ - references node(symbol), number TEXT, lat REAL, lon REAL, \ - headsigns TEXT)') - cursor.execute('create table lines(id TEXT PRIMARY KEY, number TEXT)') - cursor.execute('create table timetables(id TEXT PRIMARY KEY, stop_id TEXT \ - references stop(id), line_id TEXT references line(id), \ - headsign TEXT, parent TEXT references id, \ - parent_variant TEXT references id)') - cursor.execute('create table departures(id INTEGER PRIMARY KEY, \ - timetable_id TEXT references timetable(id), \ - hour INTEGER, minute INTEGER, mode TEXT, \ - lowFloor INTEGER, modification TEXT)') - - validity = self.__get_validity() - print(validity) - sys.stdout.flush() - cursor.execute("insert into metadata values('validFrom', ?)", (validity,)) - nodes = self.__get_nodes() - cursor.executemany('insert into nodes values(?, ?)', nodes) - node_i = 1 - for symbol, _ in nodes: - if self.verbose: - print('node {}'.format(node_i)) - stops = self.__get_stops(symbol) - cursor.executemany('insert into stops values(?, ?, ?, ?, ?, ?)', stops) - node_i += 1 - lines = self.__get_lines() - cursor.executemany('insert into lines values(?, ?)', lines.items()) - - timetable_id = 1 - line_i = 1 - for line_id, _ in lines.items(): - route = self.__get_route(line_id) - route_i = 1 - for direction, stops in route.items(): - stop_i = 1 - parent_stop = None - parent_stop_variant = None - for stop in stops[:-1]: - if self.verbose: - print("stop {} in route {} in line {}".format(stop_i, route_i, line_i)) - timetables = self.__get_stop_times(stop['id'], line_id, direction) - - if stop_i == 1 and stop['variant_type'] is None: - if self.verbose: - print('stop1 & main') - parent = None - parent_variant = None - parent_stop = stop['id'] - elif stop['variant_type'] == 'in' and stop['variant_first']: - if self.verbose: - print('in & first') - parent = None - parent_variant = None - parent_stop_variant = stop['id'] - elif stop_i > 1 and stop['variant_type'] is None: - if self.verbose: - print('stop>1 & main') - parent = parent_stop - parent_variant = parent_stop_variant - parent_stop = stop['id'] - parent_stop_variant = None - elif stop['variant_type'] is not None and not stop['variant_first']: - if self.verbose: - print('variant & not first') - parent = None - parent_variant = parent_stop_variant - parent_stop_variant = stop['id'] - elif stop['variant_type'] == 'out' and stop['variant_first']: - if self.verbose: - print('out & first') - parent = None - parent_variant = parent_stop - parent_stop_variant = stop['id'] - if stop['variant_type'] == 'out' and stop['variant_last']: - parent_stop_variant = None - - cursor.execute('insert into timetables values(?, ?, ?, ?, ?, ?)', - (timetable_id, stop['id'], line_id, stops[-1]['name'], parent, parent_variant)) - for mode, times in timetables.items(): - cursor.executemany('insert into departures values(null, ?, ?, ?, ?, ?, \ - ?)', [(timetable_id, hour, minute, mode, lowfloor, desc) - for hour, minute, desc, lowfloor in times]) - stop_i += 1 - timetable_id += 1 - - route_i += 1 - line_i += 1 - except KeyboardInterrupt: - return 404 - return 0 - - -if __name__ == '__main__': - verbose = False - try: - if sys.argv[1] == '-v': - verbose = True - except IndexError: - pass - downloader = TimetableDownloader(verbose) - exit(downloader.download())