20

Is it possible to programmatically change settings on a Netgear wireless router using C#? I have settings that I change often and I would like to create my own interface for making those changes. Currently I navigate to the admin web page (10.0.0.1) and it prompts me for a username and password. After I authenticate I can use the web interface to change the router's configuration.

If this isn't possible with Netgear, do any outher wireless routers have an API for developers?

icodebuster
  • 8,890
  • 7
  • 62
  • 65
DarLom
  • 1,100
  • 2
  • 12
  • 30

7 Answers7

14

There aren't any APIs out there to do this, but you can write something to make HTTP requests to the router to simulate the webUI being used.

I'm guessing most consumer routers are probably pretty simple to talk to. Authentication is probably nothing more than basic realm.

chris12892
  • 1,634
  • 2
  • 18
  • 36
  • Basic realm authentication is correct. I can get logged in, but I'm not sure how to determine what HTTP requests to send to the router to simulate a user navigating the UI. Any suggestions? – DarLom Jun 21 '10 at 11:51
  • 5
    Well, you have two options: 1: Reverse engineer the Web UI 2: Use a system like firebug to see how the requests are going across. I would recommend number 2. – chris12892 Jun 21 '10 at 20:54
  • 3
    I agree use a web debug proxy like fiddler – Shawn Vader Sep 26 '12 at 14:14
  • I just did this for my WNDR3300 Netgear. Fiddler makes this a breeze. Just make sure you specify your Content-Length or the request body (in my experience) is ignored. – Corey Ogburn Aug 20 '16 at 00:54
5

Selenium offers a firefox plugin that lets you record manual interactions with your browser. And then you can export the steps to python, ruby, java or c#. It worked for me to programmatically adjust my router settings to turn off wifi. Clicking on the elements while recording identifies everything you need.

This code works on an Actiontec MI424WR (FIOS)
Edit the code to add your username, password, and router address.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Routr(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://routerip_or_address"
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_routr(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_name("user_name").clear()
        driver.find_element_by_name("user_name").send_keys("your_username")
        driver.find_element_by_id("pass2").clear()
        driver.find_element_by_id("pass2").send_keys("enter_your_password_here")
        driver.find_element_by_link_text("OK").click()
        driver.find_element_by_link_text("Change Wireless Settings").click()
        driver.find_element_by_id("ws_off").click()
        driver.find_element_by_link_text("Apply").click()

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()
3

If this is just a few things you want to change programmatically, simulating HTTP requests should be simple enough. Another option would be to install DD-WRT in your router, basically transforming it into a small Linux installation that allows full programmatic configuration through SSH using standard Linux commands.

Juan Carlos Muñoz
  • 3,376
  • 1
  • 13
  • 5
2

MiktoTik sells customer grade routers that allow ssh configuration (mind that they use ssh, but not bash inside ssh). You can even roll your own PHP REST API for router (not that I like PHP, but people are doing it).

jb.
  • 23,300
  • 18
  • 98
  • 136
  • One minor correction... The MikroTik API is not a REST API. It's a proprietary L7 protocol (ala SSH, FTP) that MikroTik confusingly call "API". There are multiple client implementations for the protocol... Including ones in C# actually. – boen_robot Oct 02 '17 at 10:35
2

I'm unaware of any consumer-grade routers that have an API like that, but you could always build something that (ab)uses the Web interface to do what you want, using something like selenium-rc or watir

Daniel DiPaolo
  • 55,313
  • 14
  • 116
  • 115
0

I'm not familiar with this router, but I have done similar stuff programmatically via a telnet connection the router with Python. There's a cood telnet lib for C#: http://www.codeproject.com/KB/IP/MinimalisticTelnet.aspx

Uku Loskit
  • 40,868
  • 9
  • 92
  • 93
0

There is a python based Github repo here that describes a SOAP based API. I've used it to program a device schedule for my kids devices. Not willing to pay Disney for Circle. Works great. There's also a js version here.

paliaso
  • 47
  • 1
  • 11
  • 1
    @Tiw I'll definitely add more details. I'll have to dig for the SOAP schema in Github, should be able to be used by any language that can make SOAP calls. – paliaso Apr 10 '19 at 15:10