En este artÃculo aprenderemos como utilizar la API de Njalla desde un script en python, de este modo seremos capaces de automatizar multitud de tareas administrativas.
El primer paso será crear un token de acceso desde la interfaz web:
Añadimos un acceso nuevo:
Indicamos el nombre y restringimos el acceso por dirección Ip:
Para consultar el token accedemos a la entrada nueva:
Ahora ya podemos acceder desde nuestro código en Python, en mi caso se trata de un script que comprobará que haya suficiente saldo como para renovar servicios en los pÅ•oximos 15 dÃas, en caso contrario enviará un aviso vÃa Telegram:
#!/usr/local/bin/python3.8
# https://njal.la/api/
import requests
import time
njalla_tokens = {
"ID1": "TOKEN1",
"ID2": "TOKEN2"
}
def njalla(method, token, **params):
url = 'https://njal.la/api/1/'
#print('token: %s' % token)
headers = {
'Authorization': 'Njalla ' + token
}
response = requests.post(url, json={
'method': method,
'params': params
}, headers=headers).json()
if 'result' not in response:
raise Exception('API Error', response)
return response['result']
for key, value in njalla_tokens.items():
print('')
print('======= Checking account: %s =======' % key)
#print('value: %s' % value)
token = value
domains_raw_data = njalla('list-domains', token)
domains_data = [*domains_raw_data.values()][0]
servers_raw_data = njalla('list-servers', token)
servers_data = [*servers_raw_data.values()][0]
balance = njalla('get-balance', token)['balance']
all_items = domains_data + servers_data
sorted_items = sorted(all_items, key=lambda k: k['expiry'])
print('------ Initial balance: %i -------' % balance)
last_renew = 'NONE'
for item in sorted_items:
print('Name: %s' % item['name'])
print('Expiry: %s' % item['expiry'])
if "id" in item:
cost = 45
else:
cost = 15
print('Cost: %i' % cost)
balance = balance - cost
if balance < 0:
# check if renewal covers 15 days
# 15 days threshold: 1296000s
time_treshold = 1296000
# If first item couldnt be renewed check if it expires in the next 15 days
print('')
if last_renew == 'NONE':
last_renew = item['expiry']
print('')
print('>> Current balance cant covers first pay but it expires: %s' % last_renew)
else:
print('>> Current balance covers to: %s' % last_renew)
last_renew_timestamp = time.strptime(last_renew, "%Y-%m-%dT%H:%M:%SZ")
last_renew_timestamp = time.mktime(last_renew_timestamp)
last_renew_timestamp_human = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(last_renew_timestamp))
current_timestamp = int(time.time())
current_timestamp_human = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(current_timestamp))
#print('current_timestamp: %i -- %s' % (current_timestamp, current_timestamp_human))
#print('last_renew_timestamp: %i -- %s' % (last_renew_timestamp, last_renew_timestamp_human))
margin = last_renew_timestamp - current_timestamp
#print('margin: %i' % margin)
#print('time_treshold: %i' % time_treshold)
if margin < time_treshold:
print('>> SENDING TELEGRAM')
apiKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
chatId = "YYYYYY"
url = "https://api.telegram.org/bot{}/sendMessage".format(apiKey)
msg = 'Insufficient Njal.la: ' + key + ' balance to renew 15 day services'
data = {"chat_id":chatId,"text":msg}
r = requests.post(url,json=data)
break
last_renew = item['expiry']
print('------ Balance: %i -------' % balance)
NOTA: Como vemos los precios están hardcodeados, esto puede resultar problemático si se cambian las tarifas, lo ideal serÃa poder consultar el precio de cada servicio antes de descontar el importe del saldo, pero no he encontrado la manera de hacerlo.
Asignamos los permisos necesarios al script:
Lo ejecutamos y obtendremos una salida similar a la siguiente:
En este caso no hay ningún producto que caduque en los próximos 15 dÃas y que no se pueda renovar, por lo tanto no envÃa el aviso vÃa Telegram.