Files
autoficher/autoficher.py
Omar Sánchez 6b7a7a24e4 json config
2021-10-08 14:09:18 +02:00

136 lines
4.2 KiB
Python
Executable File

#!/usr/bin/env python3
# encoding: utf-8
#
# Automarcaje para timenet.gpisoftware.com
# usage: autoficher.py -u USER -p PIN -t TYPE [-f] [-h]
#
# Argumentos obligatorios:
# -u USER, --user USER Usuario
# -p PIN, --pin PIN Contraseña
# -t TYPE, --type TYPE Tipo marcado. 0 = Entrada, 1 = Salida
#
# Argumentos opcionales:
# -f, --festive Comprobar festivo
# -h, --help Esta ayuda
#
#
# Creado: Omar Sánchez 04-05-2019
# Importamos librerias
import json
from datetime import datetime
import pytz
import requests
import argparse
import telegram
# Introducimos los argumentos obligatorios y opcionales
parser = argparse.ArgumentParser(add_help=False)
parser._action_groups.pop()
obligatoryArgs = parser.add_argument_group("Argumentos obligatorios")
obligatoryArgs.add_argument('-u', '--user', help="Usuario", required=True)
obligatoryArgs.add_argument('-p', '--pin', help="Contraseña", type=int, required=True)
obligatoryArgs.add_argument('-t', '--type', help="Tipo marcado. 0 = Entrada, 1 = Salida", type=int)
optionalArgs = parser.add_argument_group("Argumentos opcionales")
optionalArgs.add_argument('-bt', '--basedtime', help="Hacer check o descheck según la hora del dia",
action="store_true")
optionalArgs.add_argument('-h', '--help', action="help", help="Esta ayuda")
args = parser.parse_args()
class AutoFicher():
# URL de la api
headers = {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"tn-v": "3.0.9",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
}
config = None
def __init__(self):
try:
self.loadConfig()
except:
print("No se ha podido cargar el archivo de configuración")
exit(20)
def loadConfig(self):
with open('sample.config.json', 'r') as f:
self.config = json.load(f)
def sendReport(self, message):
bot = telegram.Bot(token=self.config['telegram']['token'])
bot.sendMessage(chat_id=self.config['telegram']['chat_id'], text=str(message))
def get(self, url, data={}, headers={}):
furl = self.config['api_url'] + url
if url != "version":
furl = self.config['api_url'] + "v1/" + url
return requests.get(furl, data=data, headers=headers)
def post(self, url, data={}, headers={}):
furl = self.config['api_url'] + url
if url != "version":
furl = self.config['api_url'] + "v1/" + url
return requests.post(furl, data=data, headers=headers)
def updateTime(self):
self.headers["tn-d"] = "\"" + datetime.now().astimezone(pytz.UTC).strftime("%Y-%m-%dT%H:%M:%SZ") + "\""
def getVersion(self):
self.updateTime()
return self.get('version', self.headers)
def getInfo(self):
return self.get('check/info', {"guid": args.user})
def sendUpdate(self):
self.updateTime()
typ = 0
if args.basedtime and not args.type:
hour = datetime.now().strftime("%H")
hIN = self.config['in_hours']
hOUT = self.config['out_hours']
if hour in hIN:
typ = 0
elif hour in hOUT:
typ = 1
else:
print(
"No se ha fichado ni desfichado ya que estamos en horario laboral, fuerze el estado con el parametro --type <0 = Entrada, 1 = Salida>")
else:
typ = args.type
data = {
"cp": args.user,
"pin": args.pin,
"typ": typ,
"date": self.headers['tn-d'],
"geoLatitude": self.config['geo']['latitude'],
"geoLongitude": self.config['geo']['longitude'],
"geoError": "",
"c": 1,
"geoAccuracy": self.config['geo']['accuracy']
}
response = self.post("check", data, self.headers)
if response.status_code != 200:
self.sendReport('Has fichado correctamente a las ' + str(datetime.strptime(self.headers["tn-d"]).strftime("%H:%M")))
else:
self.sendReport("No se ha podido fichar, la web no ha devuelto 200 OK")
if __name__ == '__main__':
af = AutoFicher()
af.sendUpdate()