-
-
Save vicwomg/9b0bc6f1ea22e08379651a36877e0420 to your computer and use it in GitHub Desktop.
import hashlib | |
import urllib | |
import urllib2 | |
import sys | |
ROUTER_IP = "192.168.1.1" | |
USERNAME = "admin" | |
PASSWORD = "YOUR_ROUTER_PASSWORD_HERE" | |
class TPLink_Archer_C7_Router_Web_Interface: | |
""" Class for scraping/navigating the TPLink Archer C7 Router Web UI. Originally for | |
the purpose of scheduling reboots using cron. Can probably be extended to automate | |
many other functions in the web UI with a little bit of snooping around the html. | |
Only tested on the Archer C7, but I imagine there's a good chance it would work on | |
other models if they use the same Web UI. | |
https://github.com/vicwomg | |
""" | |
def __init__(self, router_ip, username, password): | |
self.latest_tested_version = "3.15.3 Build 180114 Rel.39265n" | |
self.login_url = "http://%s/userRpm/LoginRpm.htm?Save=Save" | |
self.reboot_url_path = "/userRpm/SysRebootRpm.htm" | |
self.router_ip = router_ip | |
self.username = username | |
self.password = password | |
def login(self): | |
print "Logging in to router..." | |
self.cookie = self.get_auth_cookie() | |
self.get_session_url() | |
def get_auth_cookie(self): | |
hexmd5_pw = hashlib.md5(self.password).hexdigest() | |
auth_string = urllib.quote_plus((self.username + ":" + hexmd5_pw).encode('base64').strip()) | |
cookie = "Authorization=Basic%20" + auth_string | |
return cookie | |
def get_session_url(self): | |
opener = urllib2.build_opener() | |
opener.addheaders.append(('Cookie', self.cookie)) | |
f = opener.open(self.login_url % self.router_ip) | |
output = f.read() | |
router_url = "http://%s/" % self.router_ip | |
if (router_url in output): | |
url_auth_string = output.split(self.router_ip + '/')[1].split('/')[0] | |
self.session_url = "http://%s/%s" % (self.router_ip, url_auth_string) | |
opener.close() | |
f.close() | |
print "Session URL is: " + self.session_url | |
else: | |
print "ERROR: Failed to scrape out session url. " | |
print " Bad username/password? " | |
print " Or you're already logged in to the admin interface somewhere else?" | |
print " Or perhaps unsupported web UI firmware. Last tested on: " + self.latest_tested_version | |
sys.exit(1) | |
def reboot(self): | |
reboot_params = "?Reboot=Reboot" | |
referer = self.session_url + self.reboot_url_path | |
reboot_command_url = referer + reboot_params | |
print "Rebooting router with: %s ..." % reboot_command_url | |
opener = urllib2.build_opener() | |
# needs proper cookie and referer or it will fail authorization | |
opener.addheaders.append(('Cookie', self.cookie)) | |
opener.addheaders.append(('Referer', referer)) | |
f = opener.open(reboot_command_url) | |
opener.close() | |
f.close() | |
print "Reboot command sent" | |
def main(): | |
tp = TPLink_Archer_C7_Router_Web_Interface(ROUTER_IP, USERNAME, PASSWORD) | |
tp.login() | |
tp.reboot() | |
if __name__ == "__main__": | |
main() |
During testing, sometimes the reboot wasn't working, which meant admin stayed logged in.
I've added this to the end of the script, to logout admin if the reboot didn't work:
# if the reboot didn't work:
LOGOUT_URL="$(dirname $(dirname $SESSION))/userRpm/LogoutRpm.htm"
curl -sif -o /dev/null -b "$COOKIE" -e "$LOGOUT_URL" "$LOGOUT_URL"
Hi !!! Wonderful info... Does anybody know where is the doc to navigate menus, or get a list of connected MACs... I want to discover unauthorized MACs and log them out? Maybe it is not possible... Thanks in advance for your help !!!
Here comes a modified version of the script from @jrwren for use on a TP-Link Archer C7 V1 with the latest Firmware 3.15.3 Build 150511 Rel.5581:
#!/bin/bash
IP=192.168.0.1
USER=admin
PASSWD=YOURPASSWORDHERE
LOGIN_URL=http://$IP/userRpm/LoginRpm.htm?Save=Save
REBOOT_PATH=/userRpm/SysRebootRpm.htm
#PASSMD5=$(echo -n $PASSWD | md5sum | cut -f 1 -d ' ')
#COOKIE="Authorization=Basic%20$(echo -n "$USER:$PASSMD5" | base64|sed s/=/%3D/)"
COOKIE="Authorization=Basic%20$(echo -n "$USER:$PASSWD" | base64|sed s/=/%3D/g)"
SESSION=$(curl -s -b "$COOKIE" "$LOGIN_URL" | grep -o 'http://[^"]*')
REBOOT_URL="$(dirname $(dirname $SESSION))$REBOOT_PATH"
curl -sif -o /dev/null -b "$COOKIE" -e "$REBOOT_URL" "$REBOOT_URL?Reboot=Reboot"
I was also able to write this script in a version running with cmd.exe on Windows XP SP3 (no cygwin etc. required). If someone is interested I can post it here.
Here comes a modified version of the script from @jrwren for use on a TP-Link Archer C7 V1 with the latest Firmware 3.15.3 Build 150511 Rel.5581:
#!/bin/bash IP=192.168.0.1 USER=admin PASSWD=YOURPASSWORDHERE LOGIN_URL=http://$IP/userRpm/LoginRpm.htm?Save=Save REBOOT_PATH=/userRpm/SysRebootRpm.htm #PASSMD5=$(echo -n $PASSWD | md5sum | cut -f 1 -d ' ') #COOKIE="Authorization=Basic%20$(echo -n "$USER:$PASSMD5" | base64|sed s/=/%3D/)" COOKIE="Authorization=Basic%20$(echo -n "$USER:$PASSWD" | base64|sed s/=/%3D/g)" SESSION=$(curl -s -b "$COOKIE" "$LOGIN_URL" | grep -o 'http://[^"]*') REBOOT_URL="$(dirname $(dirname $SESSION))$REBOOT_PATH" curl -sif -o /dev/null -b "$COOKIE" -e "$REBOOT_URL" "$REBOOT_URL?Reboot=Reboot"
I was also able to write this script in a version running with cmd.exe on Windows XP SP3 (no cygwin etc. required). If someone is interested I can post it here.
I'm not an expert in Linux, can you please post the script that I run and test in Windows before testing if it can work in Homeassistant ?
Thanks jrwren, that bash script works like a charm on my TP link Archer C7 v2!
One thing to note: you cannot be logged into the web-interface while running this script.
Apparently only one admin can be logged in at a time.
I thought the script wasn't working, but it was because I was logged in via the browser. After logging out, it worked.