Skip to content

Instantly share code, notes, and snippets.

@ZiTAL
Created July 30, 2024 12:35
Show Gist options
  • Save ZiTAL/92f8891c9466a1b5c66cc5d0196e6372 to your computer and use it in GitHub Desktop.
Save ZiTAL/92f8891c9466a1b5c66cc5d0196e6372 to your computer and use it in GitHub Desktop.
tortolika.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# apt-get install python3-pyqt5 python3-lxml
#
# gutxienezko parametroak: python3 tortolika.py -u erabiltzailea -p pasahitza
# tray barik: python3 tortolika.py -u erabiltzailea -p pasahitza -nt
# desktop barik: python3 tortolika.py -u erabiltzailea -p pasahitza -nd
# minuturo galdetu: python3 tortolika.py -u erabiltzailea -p pasahitza -i 60000
from PyQt5.QtWidgets import QMainWindow, QApplication, QSystemTrayIcon, QMenu
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QTimer
from tempfile import NamedTemporaryFile
from base64 import b64decode
from urllib.parse import urlencode
from io import BytesIO
from pycurl import Curl, COOKIEJAR, COOKIEFILE, FOLLOWLOCATION, REFERER, USERAGENT, SSL_VERIFYPEER, SSL_VERIFYHOST
from lxml import etree
from datetime import datetime
from re import match, search
from time import time, mktime
from sys import argv, exit
class Window(QMainWindow):
def __init__(self, argv):
# QMainWindow-en construct-a
super(Window, self).__init__()
# kontsolatik bidali dizkiogun parametroak programan sartu
self._parseArgv(argv)
# focus mota teklatu eta saguarenak aukeratzen ditugu
self.setFocusPolicy(Qt.StrongFocus)
self._initUI()
def _parseArgv(self, argv):
self._credentials = {}
self._interval = 1000 * 60 * 60
self._tray = True
self._desktop = True
i = 0
for arg in argv:
if argv[i]=='-u' or argv[i]=='--user':
self._credentials['user'] = argv[i+1]
if argv[i]=='-p' or argv[i]=='--password':
self._credentials['passwd'] = argv[i+1]
if argv[i]=='-i' or argv[i]=='--interval':
self._interval = eval(argv[i+1])
if argv[i]=='-nt' or argv[i]=='--no-tray':
self._tray = False
if argv[i]=='-nd' or argv[i]=='--no-desktop':
self._desktop = False
i = i + 1
if 'user' not in self._credentials or 'passwd' not in self._credentials:
self._help()
if self._tray == False and self._desktop == False:
print('Tray or Desktop option required')
self._help()
def _initUI(self):
# tray-a jarri
self._trayUI()
# interval parametroan sartu dugun aldiro informazioa eguneratu
self._setTimer()
# kargatzerakoan datuak hartu
self._updateInfo()
# desktop aplikazioa jarri
self._desktopUI()
def _trayUI(self):
if self._tray:
# ikonoarentzako aldi baterako fitxategi batean sartuko dugu
fp = NamedTemporaryFile(delete=True)
fp.write(self._getIcon())
# ikonoa fitxategia denean, guk base64-n daukagu
# self.tray_icon = SystemTrayIcon(QtGui.QIcon('favicon3.png'), self)
#self.tray_icon = QSystemTrayIcon(QIcon(fp[1]), self)
self.tray_icon = QSystemTrayIcon(QIcon(fp.name), self)
# ikonoa sortu eta gero ezabatu
fp.close()
# menua sortu
self._setMenu()
# tray_icon-ean click/right click egiterakoan sortzen den ebentoa
self.tray_icon.activated.connect(self._iconActivated)
# tray-a erakutsi
self.tray_icon.show()
def _desktopUI(self):
if self._desktop:
fp = NamedTemporaryFile(delete=True)
fp.write(self._getIcon())
self.setWindowIcon(QIcon(fp.name))
fp.close()
self.showMinimized()
# ikonoa base64-n enkodeatu
def _getIcon(self):
img = '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'
img64 = b64decode(img)
return img64
def _setMenu(self):
menu = QMenu()
# action_refresh = menu.addAction("Refresh")
# action_refresh.triggered.connect(_updateInfo))
action_exit = menu.addAction('Exit')
action_exit.triggered.connect(exit)
self.tray_icon.setContextMenu(menu)
def _iconActivated(self, reason):
if reason == 1:
# right click
pass
elif reason == 3:
# left click
self._updateInfo()
pass
def _setTimer(self):
self.timer = QTimer()
self.timer.timeout.connect(self._updateInfo)
self.timer.start(self._interval)
def _updateInfo(self):
t = TortolikaCurl(self._credentials)
result = t.getInfo()
if result['STATUS'] == 'ERROR':
txt = result['STATUS_TEXT']
else:
txt = result['H']+":"+result['M']
if self._tray:
self.tray_icon.showMessage('Tortolika', txt)
if self._desktop:
self.setWindowTitle("Tortolika: "+txt)
def _help(self):
h = """
Tortolika:
Required arguments:
-u, --user username
-p, --password password
Optional arguments:
-i, --interval time to refresh in miliseconds
-nd, --no-desktop no desktop application
-nt, --no-tray no tray application
"""
print(h)
exit()
def focusInEvent(self, event):
self.showMinimized()
self._updateInfo()
class TortolikaCurl():
def __init__(self, credentials):
self._credentials = credentials
def getInfo(self):
result = {}
result['STATUS'] = 'ERROR'
html = self._login()
tree = etree.HTML(html)
date = datetime.now().strftime("%Y/%m/%d")
b = tree.xpath("//span[@class=\"NegritaNegro12\" and .= \""+date+"\"]/../span[@class=\"NormalNegro12\"]/b")
if len(b)<1:
result['STATUS_TEXT'] = 'E_LOGIN'
else:
m = match('^t\s([0-9]{2}):([0-9]{2})$', b[0].text)
if m != None:
total = {}
total['H'] = m.group(1)
total['i'] = m.group(2)
total_seconds = int(total['H']) * 3600 + int(total['i']) * 60
span = tree.xpath("//span[@class=\"NegritaNegro12\" and .= \""+date+"\"]/../span[@class=\"NormalAzul12\"]")
i = len(span)-1
m = search('^([0-9]{2}):([0-9]{2})', span[i].text)
if m != None:
now = datetime.now()
denbora = {}
denbora['Y'] = now.strftime('%Y')
denbora['m'] = now.strftime('%m')
denbora['d'] = now.strftime('%d')
denbora['H'] = m.group(1)
denbora['M'] = m.group(2)
# timestamp
now = int(time())
# create date
a = datetime(int(denbora['Y']), int(denbora['m']), int(denbora['d']), int(denbora['H']), int(denbora['M']), 0, 0)
# date to timestamp
last_connect = int(mktime(a.timetuple()))
total = total_seconds + now - last_connect
result['STATUS'] = 'OK'
result['H'] = int(total / 3600)
result['M'] = int(total % 3600 / 60)
if result['H']<10:
result['H'] = "0"+str(result['H'])
if result['M']<10:
result['M'] = "0"+str(result['M'])
result['H'] = str(result['H'])
result['M'] = str(result['M'])
else:
result['STATUS_TEXT'] = 'E_UNKNOW'
else:
result['STATUS_TEXT'] = 'E_UNKNOW'
return result
def _login(self):
# denbora baterako fitxategia cookie-ak sartzeko
fp = NamedTemporaryFile(delete=True)
# set cookie
params = {}
params['Modo'] = 'Balidatu'
params['erabiltzailea'] = self._credentials['user']
params['pasahitza'] = self._credentials['passwd']
params['rutaValidacion'] = '/Default.asp?'
params['Destino'] = ''
params['selModulo'] = ''
params['Hizkuntza'] = 'Euskera'
params['cmdAldatu'] = 'Aldatu»'
params['cmdSartu'] = 'Sartu»'
postfields = urlencode(params)
url = 'https://tortolika.eitb.lan/menu/bd_Erabiltzailea.asp?'+postfields
buffer = BytesIO()
c = Curl()
c.setopt(SSL_VERIFYPEER, 0)
c.setopt(SSL_VERIFYHOST, 0)
c.setopt(c.URL, url)
c.setopt(FOLLOWLOCATION, True)
c.setopt(REFERER, 'http://tortolika/')
c.setopt(USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; rv:11.0) like Gecko')
c.setopt(COOKIEJAR, fp.name)
c.setopt(c.WRITEDATA, buffer)
c.perform()
c.close()
# use credentials cookie and get the body
buffer = BytesIO()
c = Curl()
c.setopt(SSL_VERIFYPEER, 0)
c.setopt(SSL_VERIFYHOST, 0)
c.setopt(c.URL, 'https://tortolika.eitb.lan/kalitatea/Mod_SSE/euskera/fichajes2.asp')
c.setopt(COOKIEFILE, fp.name)
c.setopt(c.WRITEDATA, buffer)
c.perform()
body = buffer.getvalue()
body = body.decode('windows-1252')
# cookie-ak gordetzeko fitxategia ezabatu
fp.close()
return body
if __name__ == '__main__':
app = QApplication([])
w = Window(argv)
exit(app.exec_())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment