Created
October 1, 2012 05:27
-
-
Save rvl/3809603 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
# | |
# virgin_data_balance.py | |
# | |
# Checks how much data you have used on your Virgin Mobile (Australia) | |
# sim card. | |
# | |
# Usage: ./virgin_data_balance.py phone_number pin_code | |
# | |
# Can also be used as a CGI script on your web server. | |
# | |
# Debian dependencies: | |
# apt-get install python3 python3-bs4 | |
# | |
# Author: Rodney Lorrimar <[email protected]> | |
# Date: 1/10/2012 | |
# | |
from bs4 import BeautifulSoup | |
from urllib.request import urlopen, build_opener, install_opener, Request, HTTPSHandler, HTTPCookieProcessor | |
from urllib.parse import urlencode | |
from collections import OrderedDict | |
import sys | |
import os | |
def main_console(phone_num, pin): | |
result = do_query(phone_num, pin) | |
print_dict(result) | |
return 0 | |
def do_query(phone_num, pin): | |
data = get_html(phone_num, pin) | |
result = OrderedDict({"phone_num": phone_num}) | |
parse_html(result, data) | |
return result | |
def get_html(phone_num, pin): | |
login_url = "https://www.virginmobile.com.au/selfcare/MyAccount/LogoutLoginPre.jsp" | |
login_data = {"username": phone_num, "password": pin, "submit": "Go"} | |
data_usage_url = "https://www.virginmobile.com.au/selfcare/dispatch/DataUsageRequest" | |
cookie_processor = HTTPCookieProcessor() | |
opener = build_opener(HTTPSHandler, cookie_processor) | |
install_opener(opener) | |
req = Request(login_url, data=urlencode(login_data).encode("utf-8"), | |
headers={"Content-Type": "application/x-www-form-urlencoded;charset=utf-8"}) | |
f = opener.open(req) | |
f.close() | |
f = opener.open(data_usage_url) | |
return f.read().decode('utf-8') | |
def parse_html(result, data): | |
soup = BeautifulSoup(data) | |
def table_get(item): | |
el = soup.find("div", {"class": item}) | |
return el.find_parent().contents[0].strip() | |
result["bill_date"] = table_get("bill") | |
result["phone_plan"] = table_get("phonePlan") | |
result["value_add"] = table_get("dataVAPlan") | |
result["excess_charge"] = table_get("excessCharge") | |
def style_get(prop, el): | |
styles = dict(tuple(s.split(":", 2)) for s in el.attrs.get("style", "").split(";") if bool(s)) | |
return styles.get(prop, None) | |
result["usage_string"] = soup.find("div", {"class": "usageMeterHead"}).find("b").get_text() | |
result["usage_percent"] = style_get("width", soup.find("div", {"class": "dataUsage"})) | |
return result | |
def print_dict(d): | |
width = max(len(k) for k in d) | |
for k, v in d.items(): | |
print("%s: %s%s" % (k, " " * (width - len(k)), v)) | |
def cgi_script(): | |
import html | |
import cgi | |
import cgitb | |
cgitb.enable() | |
print("Content-Type: text/html") | |
print() | |
print("<html><head><title>Virgin Mobile Data Balance</title></head><body>") | |
print("<H2>Virgin Mobile Data Balance</H2>") | |
def print_form(form, msg=None): | |
print("<form method='POST'><table border='0'>") | |
if msg: | |
print("<tr><td colspan='2'>%s</td></tr>" % msg) | |
print("<tr><td>Phone number:</td><td><input name='phone_num' value='%s'></td></tr>" % html.escape(form.getfirst("phone_num", ""))) | |
print("<tr><td>Password:</td><td><input type='password' name='pin' value='%s'></td></tr>" % html.escape(form.getfirst("pin", ""))) | |
print("<tr><td></td><td align='right'><input type='submit'></td></tr>") | |
print("</table></form>") | |
form = cgi.FieldStorage() | |
if "phone_num" not in form or "pin" not in form: | |
print_form(form) | |
else: | |
result = do_query(str(form.getfirst("phone_num")), str(form.getfirst("pin"))) | |
print("<table border='0'>") | |
for k, v in result.items(): | |
print("<tr><th>%s:</th><td>%s</td></tr>" % tuple(map(html.escape, (k, v)))) | |
print("</table></form>") | |
print("</body></html>") | |
if __name__ == "__main__": | |
if "SCRIPT_NAME" in os.environ: | |
cgi_script() | |
sys.exit(0) | |
else: | |
if len(sys.argv) != 3: | |
print("usage: %s phone_number pin" % sys.argv[0]) | |
sys.exit(1) | |
sys.exit(main_console(sys.argv[1], sys.argv[2])) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment