#!/usr/bin/env python3.11 """Lookup DMR users on radioid.net This script fetches user information from radioid.net API and prints them to stdout. Created: maybe back in 2021 Last modified: 2023-01-02 00:07:34+0100 Usage: ------ With arguments ./call.py [callsign]|[dmrid].... Without arguments - but enter them when the script asks you for them ./call.py Examples: --------- ❯ ./call.py oe7drt oe%kbc DMRID CALLSIGN FIRSTNAME CITY COUNTRY 2327180 OE7DRT Dominic Laengenfeld Austria 2327212 OE7DRT Dominic Laengenfeld Austria 2321001 OE1KBC Kurt Wien Austria 2321002 OE1KBC Kurt Wien Austria 2321003 OE1KBC Kurt Wien Austria 2328023 OE8KBC Kurt Saurachberg Austria ❯ ./call.py 2327212 DMRID CALLSIGN FIRSTNAME CITY COUNTRY 2327180 OE7DRT Dominic Laengenfeld Austria 2327212 OE7DRT Dominic Laengenfeld Austria """ import re # regex import sys import requests def printFormatted(data: dict) -> None: """Formats and prints to stdout. Expects data coming in as dict, returns nothing but the text printed out to stdout.""" print("{:>7.8} {:<8.8} {:12.12} {:12.12} {:13.13}".format( str(data['id']), data['callsign'], data['fname'], data['city'], data['country'])) def getFromCallsign(url: str, call: str) -> None: """Maps the given callsign to a DMRID Uses the given base-url and callsign and fetches the connected DMRIDs. Loops over the result and executes printFormatted to print the results to stdout.""" r = requests.get(url + "/api/dmr/user/?callsign={}".format(call)) for ids in range(0, r.json()['count']): printFormatted(r.json()['results'][ids]) def main(): """main function Runs if script is run by itself.""" if len(sys.argv) <= 1: # Check if arguments were given, if not, let the user # input some here arguments = [] userinput = input("No arguments found, enter them now: ") words = userinput.split() for word in words: arguments.append(word) else: # If arguments were given, take them and move on arguments = sys.argv[1:] # Using these regex pattern to match agains valid DMRIDs # and callsigns. The callsign pattern was taken from # # and slighty modifed to also allow the percent sign (%) used by # used by radioid.net as wildmask. dmrid_userid_patt = re.compile("^[0-9]{7}$") dmrid_rep_patt = re.compile("^[0-9]{6}$") # dmrid_other_patt = re.compile("^[0-9]{0,5}$") call_patt = re.compile("^[a-zA-Z0-9%]{1,3}[0123456789%][a-zA-Z0-9%]{0,2}[a-zA-Z%]$") baseurl = 'https://www.radioid.net' print(" DMRID CALLSIGN FIRSTNAME CITY COUNTRY") for arg in arguments: if dmrid_userid_patt.match(arg): # A valid DMRID was found, so we have to lookup the # callsign and we may get more DMRIDs for this OM # Valid means 7 chars long, all numbers. We do not know # yet if the id really exists. r = requests.get(baseurl + '/api/dmr/user/?id={}'.format(arg)) if r.status_code == 200: # Only fetch more DMRIDs if the first one exists, # otherwise we would try to run code on an non # existing variable getFromCallsign(baseurl, r.json()['results'][0]['callsign']) elif dmrid_rep_patt.match(arg): # A valid repeater ID was found. Valid means, technically # correct -> 6 characters long, all numbers print("{} looks like a repeater. Skipping for now.".format(arg)) # elif dmrid_other_patt.match(arg): # # Print a warning for numbers less than 6 characters # print("{} is not a valid dmr id!".format(arg)) elif call_patt.match(arg): getFromCallsign(baseurl, arg) else: print('{} is an invalid value'.format(arg)) if __name__ == "__main__": main()