import json import urllib.request class LicenseClient: def __init__(self, base_url, machine_code, timeout=10, app_key=''): self.base_url = base_url.rstrip('/') self.machine_code = machine_code.strip().upper() self.timeout = timeout self.app_key = (app_key or '').strip() def _scope(self, payload): if self.app_key: payload['appKey'] = self.app_key return payload def _post(self, path, payload): body = json.dumps(payload).encode('utf-8') request = urllib.request.Request(self.base_url + path, body, {'Content-Type': 'application/json'}) with urllib.request.urlopen(request, timeout=self.timeout) as response: return json.loads(response.read().decode('utf-8')) def login(self, card_key, device_name=None): return self._post('/api/card/verify', self._scope({'cardKey': card_key, 'machineCode': self.machine_code, 'deviceName': device_name})) def heartbeat(self, card_key): return self._post('/api/card/heartbeat', self._scope({'cardKey': card_key, 'machineCode': self.machine_code})) def list_devices(self, card_key): return self._post('/api/card/devices', self._scope({'cardKey': card_key, 'machineCode': self.machine_code})) def unbind(self, card_key): return self._post('/api/card/unbind', self._scope({'cardKey': card_key, 'machineCode': self.machine_code}))