import socket, hashlib class R: def __init__(self,h,p=8728): self.h=h; self.p=p; self.s=None def c(self,u,p): self.s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); self.s.settimeout(15) self.s.connect((self.h,self.p)) self._ws('/login','=name='+u,'=password='+p) r=self._rr() if any(isinstance(x,tuple) for x in r): for x in r: if isinstance(x,dict) and 'ret' in x: ch=x['ret'] if ch and len(ch)==32: h=hashlib.md5(b'\x00'+p.encode()+bytes.fromhex(ch)).hexdigest() self._ws('/login','=name='+u,'=response=00'+h) self._rr() return self def _el(self,l): if l<0x80: return bytes([l]) elif l<0x4000: l|=0x8000; return bytes([(l>>8)&0xFF,l&0xFF]) else: return bytes([0xC0|((l>>16)&0x0F),(l>>8)&0xFF,l&0xFF]) if l<0x200000 else bytes([0xE0|((l>>24)&0x07),(l>>16)&0xFF,(l>>8)&0xFF,l&0xFF]) def _ww(self,w): self.s.sendall(self._el(len(w))+w.encode('utf-8')) def _ws(self,c,*ws): self._ww(c); [self._ww(w) for w in ws]; self.s.sendall(b'\x00') def _rw(self): f=self._rb() if f==b'\x00': return None lb=f[0]; l=lb if lb&0x80: if (lb&0xC0)==0x80: l=((lb&0x3F)<<8)+self._rb()[0] elif (lb&0xE0)==0xC0: l=((lb&0x1F)<<16)+(self._rb()[0]<<8)+self._rb()[0] else: l=((lb&0x0F)<<24)+(self._rb()[0]<<16)+(self._rb()[0]<<8)+self._rb()[0] d=b'' while len(d)=3 else '' else: d[w]='' rs.append(d) elif r=='!trap': rs.append(('!trap',t)) return rs def cmd(self,c,**a): ws=[c] for k,v in a.items(): ws.append(('?' if k.startswith('?') else '=')+k+'='+v) self._ws(*ws) return self._rr() def close(self): if self.s: self.s.close(); self.s=None api=R('192.168.100.2').c('mi4','m14') print("=== Current Family scheduler ===") for si in api.cmd('/system/scheduler/print'): if si['name'] == 'Family': oe = si.get('on-event', '') for line in oe.split(';'): l = line.strip() if l: print(" %s" % l[:150]) break # Update the fetch URL # Old: /tool fetch url=("https://api.telegram.org/bot" . $bot . "/sendMessage?message_thread_id=42&chat_id=" . $chat . "&text=" . $msg) http-method=get keep-result=no # New: /tool fetch url=("http://192.168.100.6/notify-expire.php?key=msr-2026-reset&name=" . $name) http-method=get keep-result=no for si in api.cmd('/system/scheduler/print'): if si['name'] == 'Family': oe = si.get('on-event', '') old_line = '/tool fetch url=("https://api.telegram.org/bot" . $bot . "/sendMessage?message_thread_id=42&chat_id=" . $chat . "&text=" . $msg) http-method=get keep-result=no' new_line = '/tool fetch url=("http://192.168.100.6/notify-expire.php?key=msr-2026-reset&name=" . $name) http-method=get keep-result=no' if old_line in oe: new_oe = oe.replace(old_line, new_line) api.cmd('/system/scheduler/set', numbers=si['.id'], **{'on-event': new_oe}) print("\nUpdated Family scheduler!") else: print("\nOld pattern not found. Current fetch line:") for line in oe.split(';'): if 'fetch' in line: print(" [%s]" % line.strip()[:200]) break # Add callback polling scheduler # Check if it already exists exists = False for si in api.cmd('/system/scheduler/print'): if si['name'] == 'tg-cb-poll': exists = True print("\ntg-cb-poll scheduler already exists") break if not exists: api.cmd('/system/scheduler/add', name='tg-cb-poll', interval='00:01:00', on_event=':delay 10s;/tool fetch url="http://192.168.100.6/process/telegram-cb.php?key=msr-2026-reset" http-method=get keep-result=no', starttime='startup', disabled='no') print("\nCreated tg-cb-poll scheduler (every 60s)") print("\n=== Final scheduler list ===") for si in api.cmd('/system/scheduler/print'): print(" %s | %s | interval=%s | disabled=%s" % (si['name'], si.get('.id',''), si.get('interval',''), si.get('disabled',''))) api.close()