Esta pagina se ve mejor con JavaScript habilitado

API NJALLA con Python

 ·  🎃 kr0m

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:

vi njalla.py

#!/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:

chmod 700 njalla.py

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.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí