Merge branch 'master' of ssh://git.sakamoto.pl:2137/laudom/librefi into kfchotspot
This commit is contained in:
commit
bb8cbadb14
|
@ -1,12 +1,11 @@
|
||||||
import requests
|
import requests
|
||||||
from http.cookiejar import CookieJar
|
|
||||||
|
|
||||||
from ..utils import get_user_agent
|
from ..utils import get_user_agent, absolute_url
|
||||||
|
|
||||||
|
|
||||||
class BaseFxcker:
|
class BaseFxcker:
|
||||||
def __init__(self, logger, log_level):
|
def __init__(self, logger, log_level):
|
||||||
self.cookie_jar = CookieJar()
|
self.cookie_jar = requests.cookies.RequestsCookieJar()
|
||||||
self.user_agent = get_user_agent()
|
self.user_agent = get_user_agent()
|
||||||
self.log = logger(key=self.FXCKER_KEY, log_level=log_level)
|
self.log = logger(key=self.FXCKER_KEY, log_level=log_level)
|
||||||
|
|
||||||
|
@ -26,11 +25,14 @@ class BaseFxcker:
|
||||||
self.log.info("Requesting " +
|
self.log.info("Requesting " +
|
||||||
resource if resource is not None
|
resource if resource is not None
|
||||||
else (str(method) + " " + str(url)))
|
else (str(method) + " " + str(url)))
|
||||||
req = requests.request(method, url, **kwargs)
|
sess = requests.Session()
|
||||||
|
req = sess.request(method, url, **kwargs)
|
||||||
|
self.cookie_jar.update(sess.cookies)
|
||||||
if follow_redirects is True and req.headers.get("Location"):
|
if follow_redirects is True and req.headers.get("Location"):
|
||||||
kwargs["data"] = None
|
kwargs["data"] = None
|
||||||
kwargs["headers"]["Referer"] = url
|
kwargs["headers"]["Referer"] = url
|
||||||
return self.request("GET", req.headers.get("Location"),
|
new_url = absolute_url(req.headers.get("Location"), url)
|
||||||
|
return self.request("GET", new_url,
|
||||||
resource=resource,
|
resource=resource,
|
||||||
follow_redirects=follow_redirects,
|
follow_redirects=follow_redirects,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
|
|
|
@ -3,6 +3,7 @@ from .umwarszawa import UMWarszawaFxcker
|
||||||
from .ledatel import LedatelFxcker
|
from .ledatel import LedatelFxcker
|
||||||
from .ipartners import IPartnersFxcker
|
from .ipartners import IPartnersFxcker
|
||||||
from .kfchotspot import KFCHotspotFxcker
|
from .kfchotspot import KFCHotspotFxcker
|
||||||
|
from .justwifi import JustWifiFxcker
|
||||||
|
|
||||||
fxckers_map = [
|
fxckers_map = [
|
||||||
([r"re:MZK Opole \d{3}(?: (?:2.4|5)GHz)?"], DummyFxcker),
|
([r"re:MZK Opole \d{3}(?: (?:2.4|5)GHz)?"], DummyFxcker),
|
||||||
|
@ -10,4 +11,8 @@ fxckers_map = [
|
||||||
(["Pendolino_WiFi"], LedatelFxcker),
|
(["Pendolino_WiFi"], LedatelFxcker),
|
||||||
(["McD-Hotspot"], IPartnersFxcker),
|
(["McD-Hotspot"], IPartnersFxcker),
|
||||||
(["KFC Hotspot"], KFCHotspotFxcker),
|
(["KFC Hotspot"], KFCHotspotFxcker),
|
||||||
|
([
|
||||||
|
"Intercity_WiFi",
|
||||||
|
"_PKP_WIFI",
|
||||||
|
], JustWifiFxcker),
|
||||||
]
|
]
|
||||||
|
|
95
librefi/fxckers/justwifi.py
Normal file
95
librefi/fxckers/justwifi.py
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
from ._common import BaseFxcker
|
||||||
|
from ..utils import regex_search_string, absolute_url, dump_qs
|
||||||
|
|
||||||
|
|
||||||
|
class JustWifiFxcker(BaseFxcker):
|
||||||
|
# tested with Intercity_WiFi (PKP IC Dart)
|
||||||
|
def unfxck(self, location=None):
|
||||||
|
start = self.request(
|
||||||
|
# flake8: noqa: E501
|
||||||
|
"GET", location or "http://tank.justwifi.pl/connect?returnurl=http://detectportal.firefox.com/success.txt%3f",
|
||||||
|
resource="start redir")
|
||||||
|
redir_url = regex_search_string([
|
||||||
|
r'window\.location\.href = "([^"]+)";',
|
||||||
|
], start.text)
|
||||||
|
sgu = self.request("GET", redir_url, resource="splash page")
|
||||||
|
glash_form_url = absolute_url(regex_search_string([
|
||||||
|
r"\$\('#glash_form(?:_adv)?'\).attr\('action', '([^']+)'\);",
|
||||||
|
r'<form action="([^"]+)"',
|
||||||
|
], sgu.text), redir_url)
|
||||||
|
glash_token = regex_search_string(
|
||||||
|
r'<input [^>]*name="glash_step\[_token\]" value="([^"]+)"',
|
||||||
|
sgu.text)
|
||||||
|
glash_gdc = regex_search_string(
|
||||||
|
r'<input [^>]*name="glash_step\[gdc\]" value="([^"]+)" />',
|
||||||
|
sgu.text, default=None)
|
||||||
|
# /en/p/sgu/glash/forward -> /en/p/sgu/open
|
||||||
|
sgu_open = self.request("POST", glash_form_url,
|
||||||
|
resource="glash forward",
|
||||||
|
data=dump_qs({
|
||||||
|
"glash_step": {
|
||||||
|
"gdc": glash_gdc,
|
||||||
|
"_token": glash_token,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
headers={
|
||||||
|
"Referer": sgu.url,
|
||||||
|
"Content-Type":
|
||||||
|
"application/x-www-form-urlencoded",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
sgu_open_forward_url = absolute_url(regex_search_string(
|
||||||
|
r'<form [^>]*action="([^"]+)"',
|
||||||
|
sgu_open.text,
|
||||||
|
default="http://connect.justwifi.pl/en/p/sgu/open/forward"
|
||||||
|
), sgu_open.url)
|
||||||
|
sgu_open_token = regex_search_string(
|
||||||
|
r'<input [^>]*name="form\[_token\]" value="([^"]+)"',
|
||||||
|
sgu_open.text)
|
||||||
|
sgu_after = self.request("POST", sgu_open_forward_url,
|
||||||
|
resource="sgu after (ad redir page)",
|
||||||
|
data=dump_qs({
|
||||||
|
"form": {
|
||||||
|
"_token": sgu_open_token
|
||||||
|
}
|
||||||
|
}), headers={
|
||||||
|
"Referer": sgu_open.url,
|
||||||
|
"Content-Type":
|
||||||
|
"application/x-www-form-urlencoded",
|
||||||
|
})
|
||||||
|
cnt_url = regex_search_string([
|
||||||
|
r"var cnt_url = '([^']+)';",
|
||||||
|
r'<input [^>]*name="adv_step\[url\] " value="([^"]+)"',
|
||||||
|
], sgu_after.text)
|
||||||
|
banner_url_encoded = regex_search_string([
|
||||||
|
r"var banner_url_encoded = '([^']+)';",
|
||||||
|
r'<input [^>]*name="adv_step\[url\] " value="([^"]+)"',
|
||||||
|
], sgu_after.text, default="")
|
||||||
|
bannerzone = regex_search_string([
|
||||||
|
r"\$\(\"input\[name='adv_step\[bannerZone\]']\"\).val\('([^']+)'\);",
|
||||||
|
r'<input [^>]*name="adv_step\[bannerZone\] " value="([^"]+)"',
|
||||||
|
], sgu_after.text)
|
||||||
|
sgu_after_token = regex_search_string([
|
||||||
|
r'<input [^>]*name="adv_step\[_token\] " value="([^"]+)"',
|
||||||
|
], sgu_after.text)
|
||||||
|
sgu_after_form_url = absolute_url(regex_search_string([
|
||||||
|
r'<form [^>]*action="([^"]+)"',
|
||||||
|
], sgu_after.text), sgu_after.url)
|
||||||
|
self.request("POST", sgu_after_form_url,
|
||||||
|
resource="ad campaign redir",
|
||||||
|
data=dump_qs({
|
||||||
|
"adv_step": {
|
||||||
|
# "cta" | "nothanks" | "skip"
|
||||||
|
"action": "cta",
|
||||||
|
"bannerZone": bannerzone,
|
||||||
|
"url": cnt_url + banner_url_encoded
|
||||||
|
if cnt_url is str and banner_url_encoded is str
|
||||||
|
else "http://connect.justwifi.pl/en/mgbc/%s/l"
|
||||||
|
% (bannerzone),
|
||||||
|
"_token": sgu_after_token,
|
||||||
|
},
|
||||||
|
}), headers={
|
||||||
|
"Referer": sgu_after.url,
|
||||||
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
|
})
|
||||||
|
return True
|
|
@ -54,7 +54,7 @@ class LibreFi:
|
||||||
self.log.info("No internet access, trying {}.unfxck()"
|
self.log.info("No internet access, trying {}.unfxck()"
|
||||||
.format(self.current_fxcker.FXCKER_KEY))
|
.format(self.current_fxcker.FXCKER_KEY))
|
||||||
self.current_fxcker.unfxck(
|
self.current_fxcker.unfxck(
|
||||||
location=check_req.headers["location"],
|
location=check_req.headers.get("Location"),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.log.debug("Internet access working")
|
self.log.debug("Internet access working")
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# flake8: noqa: E501
|
# flake8: noqa: E501
|
||||||
|
|
||||||
import re
|
import re
|
||||||
from urllib.parse import parse_qs, quote as qs_quote
|
from urllib.parse import parse_qs, quote as qs_quote, urlparse
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
@ -112,17 +112,19 @@ def dump_qs(obj):
|
||||||
qs.append((old_qs_element[0], old_qs_element[1]))
|
qs.append((old_qs_element[0], old_qs_element[1]))
|
||||||
elif isinstance(old_qs_element[1], (dict)):
|
elif isinstance(old_qs_element[1], (dict)):
|
||||||
for subkey in old_qs_element[1]:
|
for subkey in old_qs_element[1]:
|
||||||
qs.append(
|
if old_qs_element[1][subkey] is not None:
|
||||||
(old_qs_element[0] + "[" + subkey + "]", old_qs_element[1][subkey]))
|
qs.append(
|
||||||
if isinstance(old_qs_element[1][subkey], (dict, list)):
|
(old_qs_element[0] + "[" + subkey + "]", old_qs_element[1][subkey]))
|
||||||
not_flat = True
|
if isinstance(old_qs_element[1][subkey], (dict, list)):
|
||||||
|
not_flat = True
|
||||||
elif isinstance(old_qs_element[1], (list)):
|
elif isinstance(old_qs_element[1], (list)):
|
||||||
for index in range(len(old_qs_element[1])):
|
for index in range(len(old_qs_element[1])):
|
||||||
element = old_qs_element[1][index]
|
element = old_qs_element[1][index]
|
||||||
qs.append(
|
if element is not None:
|
||||||
(old_qs_element[0] + "[" + str(index) + "]", element))
|
qs.append(
|
||||||
if isinstance(element, (dict, list)):
|
(old_qs_element[0] + "[" + str(index) + "]", element))
|
||||||
not_flat = True
|
if isinstance(element, (dict, list)):
|
||||||
|
not_flat = True
|
||||||
if not_flat:
|
if not_flat:
|
||||||
old_qs = qs
|
old_qs = qs
|
||||||
qs = []
|
qs = []
|
||||||
|
@ -131,3 +133,24 @@ def dump_qs(obj):
|
||||||
strng += qs_quote(str(el[0]), encoding="utf8") + "=" + \
|
strng += qs_quote(str(el[0]), encoding="utf8") + "=" + \
|
||||||
qs_quote(str(el[1]), encoding="utf8") + "&"
|
qs_quote(str(el[1]), encoding="utf8") + "&"
|
||||||
return strng[:-1]
|
return strng[:-1]
|
||||||
|
|
||||||
|
|
||||||
|
def absolute_url(new_url: str, old_url: str):
|
||||||
|
if new_url.startswith("http:") or new_url.startswith("https:"):
|
||||||
|
return new_url
|
||||||
|
|
||||||
|
old = urlparse(old_url)
|
||||||
|
scheme = old.scheme if old.scheme is not None else "http"
|
||||||
|
|
||||||
|
if new_url.startswith("://"):
|
||||||
|
return scheme + new_url
|
||||||
|
if new_url.startswith("//"):
|
||||||
|
return scheme + ":" + new_url
|
||||||
|
|
||||||
|
hostname = old.netloc
|
||||||
|
|
||||||
|
if new_url.startswith("/"):
|
||||||
|
return scheme + "://" + hostname + new_url
|
||||||
|
|
||||||
|
# like "hostname/path?query", if other checks fail
|
||||||
|
return scheme + "://" + new_url
|
||||||
|
|
15
tests/url_utils.py
Normal file
15
tests/url_utils.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from librefi.utils import absolute_url
|
||||||
|
|
||||||
|
OLD_URL = "https://sakamoto.pl/ddd"
|
||||||
|
NEW_URL_RELATIVE = "/DDD?test=yes"
|
||||||
|
|
||||||
|
# expected value
|
||||||
|
NEW_URL_ABSOLUTE = "https://sakamoto.pl/DDD?test=yes"
|
||||||
|
|
||||||
|
|
||||||
|
def test_basic():
|
||||||
|
abso = absolute_url(NEW_URL_RELATIVE, OLD_URL)
|
||||||
|
assert isinstance(abso, (str))
|
||||||
|
print(abso)
|
||||||
|
assert abso == NEW_URL_ABSOLUTE
|
||||||
|
pass
|
Loading…
Reference in a new issue