Files
wavelog/application/libraries/Qrz.php
2026-02-20 09:48:00 +01:00

195 lines
7.0 KiB
PHP

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
Controls the interaction with the QRZ.com Subscription based XML API.
*/
class Qrz {
public $callbookname = 'QRZ';
// Return session key
public function session($username, $password) {
// URL to the XML Source
$ci = & get_instance();
$xml_feed_url = 'https://xmldata.qrz.com/xml/current/?username='.$username.';password='.urlencode($password).';agent=wavelog';
// CURL Functions
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $xml_feed_url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, 'Wavelog/'.$ci->optionslib->get_option('version'));
$xml = curl_exec($ch);
// Create XML object
$xml = simplexml_load_string($xml);
// Return Session Key
return (string) $xml->Session->Key;
}
// Set Session Key session.
public function set_session($username, $password) {
$ci = & get_instance();
// URL to the XML Source
$xml_feed_url = 'https://xmldata.qrz.com/xml/current/?username='.$username.';password='.urlencode($password).';agent=wavelog';
// CURL Functions
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $xml_feed_url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, 'Wavelog/'.$ci->optionslib->get_option('version'));
$xml = curl_exec($ch);
// Create XML object
$xml = simplexml_load_string($xml);
$key = (string) $xml->Session->Key;
$ci->session->set_userdata('qrz_session_key', $key);
return true;
}
public function search($callsign, $key, $use_fullname = false, $reduced = false) {
$data = null;
$ci = & get_instance();
try {
// URL to the XML Source
$xml_feed_url = 'https://xmldata.qrz.com/xml/current/?s=' . $key . ';callsign=' . $callsign . '';
// CURL Functions
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $xml_feed_url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, 'Wavelog/'.$ci->optionslib->get_option('version'));
$xml = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpcode != 200) {
$message = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
log_message('debug', 'QRZ.com search for callsign: ' . $callsign . ' returned message: ' . $message . ' HTTP code: ' . $httpcode);
return $data['error'] = 'Problems with qrz.com communication'; // Exit function if no 200. If request fails, 0 is returned
}
// Create XML object
$xml = simplexml_load_string($xml);
if (!empty($xml->Session->Error)) {
return $data['error'] = $xml->Session->Error;
}
// Map all QRZ XML fields according to API specification
$data['callsign'] = (string)$xml->Callsign->call;
$data['xref'] = (string)$xml->Callsign->xref;
$data['aliases'] = (string)$xml->Callsign->aliases;
$data['dxcc'] = (string)$xml->Callsign->dxcc;
$data['fname'] = (string)$xml->Callsign->fname;
$data['name_last'] = (string)$xml->Callsign->name;
$data['addr1'] = (string)$xml->Callsign->addr1;
$data['addr2'] = (string)$xml->Callsign->addr2;
$data['state'] = (string)$xml->Callsign->state;
$data['zip'] = (string)$xml->Callsign->zip;
$data['country'] = (string)$xml->Callsign->country;
$data['ccode'] = (string)$xml->Callsign->ccode;
$data['lat'] = (string)$xml->Callsign->lat;
$data['lon'] = (string)$xml->Callsign->lon;
$data['grid'] = (string)$xml->Callsign->grid;
$data['county'] = (string)$xml->Callsign->county;
$data['fips'] = (string)$xml->Callsign->fips;
$data['land'] = (string)$xml->Callsign->land;
$data['efdate'] = (string)$xml->Callsign->efdate;
$data['expdate'] = (string)$xml->Callsign->expdate;
$data['p_call'] = (string)$xml->Callsign->p_call;
$data['class'] = (string)$xml->Callsign->class;
$data['codes'] = (string)$xml->Callsign->codes;
$data['qslmgr'] = (string)$xml->Callsign->qslmgr;
$data['email'] = (string)$xml->Callsign->email;
$data['url'] = (string)$xml->Callsign->url;
$data['u_views'] = (string)$xml->Callsign->u_views;
$data['bio'] = (string)$xml->Callsign->bio;
$data['biodate'] = (string)$xml->Callsign->biodate;
$data['image'] = (string)$xml->Callsign->image;
$data['imageinfo'] = (string)$xml->Callsign->imageinfo;
$data['serial'] = (string)$xml->Callsign->serial;
$data['moddate'] = (string)$xml->Callsign->moddate;
$data['MSA'] = (string)$xml->Callsign->MSA;
$data['AreaCode'] = (string)$xml->Callsign->AreaCode;
$data['TimeZone'] = (string)$xml->Callsign->TimeZone;
$data['GMTOffset'] = (string)$xml->Callsign->GMTOffset;
$data['DST'] = (string)$xml->Callsign->DST;
$data['eqsl'] = (string)$xml->Callsign->eqsl;
$data['mqsl'] = (string)$xml->Callsign->mqsl;
$data['cqzone'] = (string)$xml->Callsign->cqzone;
$data['ituzone'] = (string)$xml->Callsign->ituzone;
$data['born'] = (string)$xml->Callsign->born;
$data['user'] = (string)$xml->Callsign->user;
$data['lotw'] = (string)$xml->Callsign->lotw;
$data['iota'] = (string)$xml->Callsign->iota;
$data['geoloc'] = (string)$xml->Callsign->geoloc;
$data['attn'] = (string)$xml->Callsign->attn;
$data['nickname'] = (string)$xml->Callsign->nickname;
$data['name_fmt'] = (string)$xml->Callsign->name_fmt;
// Build legacy 'name' field for backward compatibility
if ($use_fullname === true) {
$data['name'] = $data['fname']. ' ' . $data['name_last'];
} else {
$data['name'] = $data['fname'];
}
// we always give back the name, no matter if reduced data or not
$data['name'] = trim($data['name']);
// Sanitize gridsquare to allow only up to 8 characters
$unclean_gridsquare = $data['grid'];
$clean_gridsquare = strlen($unclean_gridsquare) > 8 ? substr($unclean_gridsquare,0,8) : $unclean_gridsquare;
// Map fields for backward compatibility with existing code
$data['gridsquare'] = $clean_gridsquare;
$data['city'] = $data['addr2'];
$data['long'] = $data['lon'];
$data['ituz'] = $data['ituzone'];
$data['cqz'] = $data['cqzone'];
if ($data['country'] == "United States") {
$data['us_county'] = $data['county'];
} else {
$data['us_county'] = null;
}
if ($reduced == true) {
// Clear location-specific fields for reduced mode
$data['gridsquare'] = '';
$data['city'] = '';
$data['lat'] = '';
$data['long'] = '';
$data['lon'] = '';
$data['dxcc'] = '';
$data['state'] = '';
$data['iota'] = '';
$data['us_county'] = '';
$data['ituz'] = '';
$data['cqz'] = '';
$data['ituzone'] = '';
$data['cqzone'] = '';
}
} finally {
$data['source'] = $this->sourcename();
return $data;
}
}
public function sourcename() {
return $this->callbookname;
}
}