what functionality do you need?We are already trying to write our own simplified interface for end users
Could you find anything on this? Can you please share if you had.We would want to be able to:
Silly question. I went to start an article on the wiki about my C implementation of the API. I can't find the sign-up page to create an account on the wiki site. I have several important changes to make to my implementation and want to get them documented. Is there a signup page or do I need to e-mail someone about creating an account on the wiki?webasdf, thank you for your addition.
code is clearly written and easy to read.
If you could make wiki article with your source and some explanation you could even get some benefits. you can read that in this post by normis
who broke the Wiki? ))Permissions Errors
You do not have permission to create this user account, for the following reason:
The action you have requested is limited to users in the group: Administrators.
Thanks for opening registration on the wiki. I was able to make an account.OK I will turn on registration now
I manage a PHPBB forum sometimes. On our registration form, we have CAPTCHA as well as a basic question, "What color is the sky?" I read somewhere that simple questions like that can fool most spambots. If you can add a simple mandatory field (so that you can't register w/o selecting the right answer) on your reg form like that, it may work for you. It seems to have worked for us.does anyone know any better spam protection plugins for mediawiki ? REcaptcha is not stopping them anymore.
Made some modifications to my C implementation. It has been successfully tested with 1, 2 and 3-byte encoded length fields (the logic should also work w/ 4-byte lengths). Also supports little endian AND big endian CPU architectures. Here's a link. API in C Wiki Articlewebasdf, thank you for your addition.
code is clearly written and easy to read.
If you could make wiki article with your source and some explanation you could even get some benefits. you can read that in this post by normis
Private Sub btnGo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGo.Click
Dim sStatus As String = ""
Dim MTK As New MikroTikAPI.MK("10.0.0.3")
Me.rtInfo.Text = ""
If MTK.Login("Your-UserID-Here", "Your-Password-Here") Then
MTK.Send("/ip/address/print")
'MTK.Send("/ping")
'MTK.Send("=address=10.0.0.1")
'MTK.Send("=count=1")
'MTK.Send("/interface/wireless/registration-table/print")
MTK.Send(".tag=sss", True)
For Each sStatus In MTK.Read
Me.rtInfo.Text = Me.rtInfo.Text + vbCr + sStatus
Next
Else
Me.rtInfo.Text = "Login Error. Correct User / Password"
End If
MTK = Nothing
sStatus = Nothing
End Sub
queue simple disable P40-34-9-2
login...
// first command
writeSentence.AddWord("/export");
writeSentence.AddWord("=file=script");
mt.WriteSentence(writeSentence);
mt.ReadBlock(block);
// second command
writeSentence.AddWord("/file/set");
writeSentence.AddWord("=numbers=script.rsc");
writeSentence.AddWord("=contents=\"" + Commands + "\"");
mt.WriteSentence(writeSentence);
mt.ReadBlock(block);
bool done = 0;
while (!done) {
mt.ReadSentence(readSentence);
if (readSentence.GetSentence() == "!done" ) {
done = 1;
}
}
$ time ./TestAPI
ret: !done
ret: !done
ret: !done
ret: !done
real 0m0.270s
user 0m0.000s
sys 0m0.000s
are these examples of PHP API Class usage?..
Chupaka I searched before building and posting in the wiki and I didn't find any example using this php api.So I did. If you believe they don't belong in the wiki then please delete so.are these examples of PHP API Class usage?..
Sorry for that.My mistake.It's corrected now.sure, they should be in Wiki, just correct the text: it's not "based on the PHP API Class", it "uses PHP API Class" - you deceive people a bit...
all the rest is fine =)
http://forum.mikrotik.com/viewtopic.php?f=9&t=50176
Notice: Undefined variable: _ in ... on line 313
// If we have got more characters to read, read them in.
if ($LENGTH > 0) {
$_ = "";
$retlen=0;
while ($retlen < $LENGTH) {
$toread = $LENGTH - $retlen ;
$_ .= fread($this->socket, $toread);
$retlen = strlen($_);
}
$RESPONSE[] = $_ ;
$this->debug('>>> [' . $retlen . '/' . $LENGTH . ' bytes read.');
}
// If we get a !done, make a note of it.
if ($_ == "!done")
$receiveddone=true;
$STATUS = socket_get_status($this->socket);
if ($LENGTH > 0)
$this->debug('>>> [' . $LENGTH . ', ' . $STATUS['unread_bytes'] . '] ' . $_);
undefined variable: _
npm install mikronode
I didn't know I had access to create a wiki page. I'll figure it out.it would be nice if you could make wiki page for your implementation. With more explanations or example.
npm install mikronode
Ok. So.. I created a wiki page (http://wiki.mikrotik.com/wiki/User_talk:Trakkasure).. It's under my "talks page".I didn't know I had access to create a wiki page. I'll figure it out.
yeah, with Google search it's a bit tricky...So.. how do I create one outside of my talks one? (or does someone else do that?)
Still trying to figure it out.
Ok.. Done.put http://wiki.mikrotik.com/wiki/MyNewPageTitle to the Address bar and then press "Create" link
You can upload API for Python 3.x.x ?yes, python API client example from API manual page was written some time ago and is working only with Python 2.7.x or older.
However I have created example (based on Python2 example) for Python3
Imho, api ( http://wiki.mikrotik.com/wiki/Manual:API_Python3) contains syntax errors. Or am I mistaken?it was already here: http://wiki.mikrotik.com/wiki/Manual:API_Python3
OS: Ubuntu Server + Python 3.2well i was successful running it , running commands etc.
and python does not complain
edit:$ python3 api.py tst admin ''
<<< /login
<<<
>>> !done
>>> =ret=39fe3aa4385c1820b5df799739b50761
>>>
<<< /login
<<< =name=admin
<<< =response=000ef1c4c0919129902827644fe9c65efb
<<<
>>> !done
>>>
$ python3 --version
Python 3.2.1
<<< /login
<<<
>>> !done
>>> =ret=a341a4f9r5b81fadfr40w29y04c2d8c4
>>>
<<< /login
<<< =name=asdfgh
<<< =response=00a919e4rd2795wqdfc036brc8ay19a9911
<<<
>>> !done
>>>
/ip/firewall/address-list/getall
<<< /ip/firewall/address-list/getall
<<<
>>> !re
>>> =.id=*11
>>> =list=local-net
>>> =address=192.168.39.0/24
>>> =dynamic=false
>>> =disabled=false
>>> =comment=test0
>>>
>>> !re
>>> =.id=*4F
>>> =list=l-2048-2048
>>> =address=192.168.39.0/24
>>> =dynamic=false
>>> =disabled=false
>>> =comment=Unauth custommers speed
>>>
>>> !re
>>> =.id=*114
>>> =list=l-1536-1536
>>> =address=192.168.38.0/24
>>> =dynamic=false
>>> =disabled=true
Traceback (most recent call last):
File "api.py", line 164, in <module>
main()
File "api.py", line 148, in main
x = apiros.readSentence()
File "api.py", line 50, in readSentence
w = self.readWord()
File "api.py", line 60, in readWord
ret = self.readStr(self.readLen())
File "api.py", line 131, in readStr
s = self.sk.recv(length - len(ret)).decode('UTF-8')
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc4 in position 9: invalid continuation byte
On the bottom of the API's wiki page, you can see 3 .NET clients - in C#, VB.NET, and an external C# project.Wish someone could help me with an asp API.
Thanks in advance
php -r "$(curl -fsSL http://getsparks.org/go-sparks)"
Code is provided as is and can be freely used freely. I, as a writer of code, am not responsible for anything that may arise from use of this code.
first thing, I want to publish my source code with the your source code inside some package of my source code. I will make library called JRouterOS and I want use GPL 3 license on it.If you are going to publish source of your code under some license, just make sure that nobody is going to write me saying that i have some licensed code on the page that i either have to license under same license and write down who the real author is.
ahhh, I'm in love with than name!..I made api for Erlang, please add it to your wiki -> https://github.com/comtihon/erotik
well, not 'numbers' but '.id', I think. also, .id is in '*number' format, so if '123' is username, then you can use it as .id (need to be checked, but in other places you can use unique name for .id) without worrying that user with .id equal to *123 will be deleted/ip/hotspot/user/remove
=numbers=123
username:123
password:123
api kod doesnt work, mikrotik removing another user which have id=123
can we use =name= or anything instead of =numbers=
thx
thanks for example, added to wiki.I made api for Erlang, please add it to your wiki -> https://github.com/comtihon/erotik
http://wiki.mikrotik.com/wiki/API_in_C_Sharphow to read data with c# ????
Hi folks.
I need to print on a table id and the name of the hostpot users.
and remove the User by his id.
Can anyone help me.
/ip/hotspot/user/print
=.proplist=.id,name
/ip/hotspot/user/remove
=.id=ID_HERE
http://wiki.mikrotik.com/wiki/API_in_C_SharpI use C Sharp
It will be wonderfulCan anybody make the API for VB (for VB projects and ASP pages)?!
Thanks,
Mladen
Added,Added Go implementation page to the wiki.
Could someone link to it from the API page?
http://wiki.mikrotik.com/wiki/API_in_Go
/ip firewall filter
add action=drop chain=input dst-port=53 in-interface=ether1_WAN protocol=udp
apiros.runCommand("/ip/firewall/filter/add","=chain=input\n=action=drop\n=dst-port=53\n=in-interface=ether1_WAN\n=protocol=udp","")
class APIError(Exception):
def __init__(self, message, category = -1):
self.message = message
self.category = category
def __str__(self):
return repr(self.message)
class ApiRos:
"""
Routeros api
"""
def __init__(self, ip):
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.connect((ip, 8728))
self.sk = sk
self.currenttag = 0
def login(self, username, pwd):
for _, attrs in self.talk(["/login"]):
chal = binascii.unhexlify(attrs['=ret'])
md = md5.new()
md.update('\x00')
md.update(pwd)
md.update(chal)
self.talk(["/login", "=name=" + username,
"=response=00" + binascii.hexlify(md.digest())])
def talk(self, words):
if self.writeSentence(words) == 0:
return
r = []
while 1:
i = self.readSentence();
if len(i) == 0:
continue
reply = i[0]
attrs = {}
for w in i[1:]:
j = w.find('=', 1)
if (j == -1):
attrs[w] = ''
else:
attrs[w[:j]] = w[j + 1:]
r.append((reply, attrs))
if reply == '!done':
return r
def writeSentence(self, words):
ret = 0
for w in words:
self.writeWord(w)
ret += 1
self.writeWord('')
return ret
def readSentence(self):
r = []
while 1:
w = self.readWord()
if w == '':
return r
r.append(w)
def writeWord(self, w):
# print "<<< " + w
self.writeLen(len(w))
self.writeStr(w)
def readWord(self):
ret = self.readStr(self.readLen())
# print ">>> " + ret
return ret
def writeLen(self, l):
if l < 0x80:
self.writeStr(chr(l))
elif l < 0x4000:
l |= 0x8000
self.writeStr(chr((l >> 8) & 0xFF))
self.writeStr(chr(l & 0xFF))
elif l < 0x200000:
l |= 0xC00000
self.writeStr(chr((l >> 16) & 0xFF))
self.writeStr(chr((l >> 8) & 0xFF))
self.writeStr(chr(l & 0xFF))
elif l < 0x10000000:
l |= 0xE0000000
self.writeStr(chr((l >> 24) & 0xFF))
self.writeStr(chr((l >> 16) & 0xFF))
self.writeStr(chr((l >> 8) & 0xFF))
self.writeStr(chr(l & 0xFF))
else:
self.writeStr(chr(0xF0))
self.writeStr(chr((l >> 24) & 0xFF))
self.writeStr(chr((l >> 16) & 0xFF))
self.writeStr(chr((l >> 8) & 0xFF))
self.writeStr(chr(l & 0xFF))
def readLen(self):
c = ord(self.readStr(1))
if (c & 0x80) == 0x00:
pass
elif (c & 0xC0) == 0x80:
c &= ~0xC0
c <<= 8
c += ord(self.readStr(1))
elif (c & 0xE0) == 0xC0:
c &= ~0xE0
c <<= 8
c += ord(self.readStr(1))
c <<= 8
c += ord(self.readStr(1))
elif (c & 0xF0) == 0xE0:
c &= ~0xF0
c <<= 8
c += ord(self.readStr(1))
c <<= 8
c += ord(self.readStr(1))
c <<= 8
c += ord(self.readStr(1))
elif (c & 0xF8) == 0xF0:
c = ord(self.readStr(1))
c <<= 8
c += ord(self.readStr(1))
c <<= 8
c += ord(self.readStr(1))
c <<= 8
c += ord(self.readStr(1))
return c
def writeStr(self, str):
n = 0;
while n < len(str):
r = self.sk.send(str[n:])
if r == 0: raise RuntimeError, "connection closed by remote end"
n += r
def readStr(self, length):
ret = ''
while len(ret) < length:
s = self.sk.recv(length - len(ret))
if s == '': raise RuntimeError, "connection closed by remote end"
ret += s
return ret
def getSocket(self):
return self.sk
def runCommand(self, command, cmd2, cmd3, **arguments):
'''
Run a command attempting to keep as close to the command line version,
while maintaining an easy to use library.
'''
apiMessage = [command, cmd2, cmd3]
if arguments != None:
apiMessage += ["={0}={1}".format(k.replace('__', '-'), v) for k, v in arguments.items()]
rez = self.talk(apiMessage)
# print rez
# Remove the !done at the end of the list.
if rez[len(rez) - 1][0] == '!done':
doneVal = rez.pop()
# Check for error conditions (Need to make this more efficient).
trapVal = filter(lambda x: x[0] == '!trap', rez)
if trapVal != []:
trapVal = trapVal.pop()
if 'category' in trapVal:
category = trapVal[1]['=category']
else:
category = -1
# print "TrapVal = {0}".format(trapVal[1])
raise APIError(trapVal[1]['=message'], category)
# Extract the data itself
data = map(lambda x: x[1], rez)
if data == []:
if doneVal[1] != {}:
data = doneVal[1]['=ret']
return data
or in Python ( style 1):/ip/firewall/address-list/print where="list==Blacklist and address==8.8.8.8"
or in Python ( style 2):import smartROS
router = smartROS.getRouter("Main")
print( router.ip.firewall.address__list.print (where="list==Blacklist and address==8.8.8.8") )
import smartROS
router = smartROS.getRouter("Main")
print( router.do("/ip/firewall/address-list/print", where="list==Blacklist and address==8.8.8.8") )
It supports only RouterOS versions 6.43 and later, right?I have written a C++ API connector/wrapper: https://github.com/zx2512/MikrotikPlus
That is correct. I didn't want to bother with the outdated authentication method which is removed in the latest versions.It supports only RouterOS versions 6.43 and later, right?
I didn't really want to spend additional time on it. Updating consumes less time.Supporting both is not difficult
But some other API articles are still in Wiki... Normis?..13:51, 3 January 2019 Normis (talk | contribs) deleted page RouterOS PHP class
13:51, 3 January 2019 Normis (talk | contribs) deleted page API PHP class
Please update the post with the last library in the Wiki API page.API implementations in different programming languages from users of this forum:
in Perl - forum thread by cheesegrits
in Delphi - forum thread and wiki by rodolfo
in Delphi #2 - forum thread by Chupaka
in PHP - external by Denis Basta and contributors
Java sample methods - forum post
in Python - wiki link by Mikrotik staff
in C# - wiki link by wiki user Gregy
Ruby on rails wiki and discussion on forum(v1.9) - by astounding
in Adobe Flash - wiki by haakon
in C - wiki by webasdf
in C (GPL2 license) -wiki by octo
.NET (C#) discussion on forum - external by danikf
in NodeJS - by trakkasure
API related information links:
http://wiki.mikrotik.com/wiki/API
http://wiki.mikrotik.com/wiki/API_command_notes
Hello,Does anybody need Labview code for Mikrotik API support?
If yes - I could share it. I wrote it and was using already for few years with good results.
If nobody - I will not bother...
SSH. Simply setup SSH access with key (instead of password, so you don't need to type it) - and you can run any command from .bat by simply executing something likei have a few queues and i would like to create a shortcurt to my desktop PC (Win 10) so i could enable/disable a particular queue, without user interaction.
I have basic programming training, nothing special. So even a bat file would do the trick. Is there a way to do this please?
ssh admin@router_IP "/queue simple disable queue1"
thanksi do not know if /ppp/l2tp/ exist, but the command on terminal are:
/interface l2tp-server server set enabled=no
/interface l2tp-server server set enabled=yes
$API->write("/interface/l2tp-server/server/getall",true);
I try<<< [36] /interface/l2tp-server/server/getall >>> [3/3] bytes read. >>> [3, 304]!re >>> [13/13] bytes read. >>> [13, 290]=enabled=true >>> [13/13] bytes read. >>> [13, 276]=max-mtu=1450 >>> [13/13] bytes read. >>> [13, 262]=max-mru=1450 >>> [14/14] bytes read. >>> [14, 247]=mrru=disabled >>> [36/36] bytes read. >>> [36, 210]=authentication=chap,mschap1,mschap2 >>> [21/21] bytes read. >>> [21, 188]=keepalive-timeout=30 >>> [23/23] bytes read. >>> [23, 164]=max-sessions=unlimited >>> [35/35] bytes read. >>> [35, 128]=default-profile=default-encryption >>> [14/14] bytes read. >>> [14, 113]=use-ipsec=yes >>> [26/26] bytes read. >>> [26, 86]=ipsec-secret=xxxxxxxxxx >>> [26/26] bytes read. >>> [26, 59]=caller-id-type=ip-address >>> [27/27] bytes read. >>> [27, 31]=one-session-per-host=false >>> [22/22] bytes read. >>> [22, 8]=allow-fast-path=false >>> [5/5] bytes read. >>> [5, 1]!done OkDisconnected...
$API->write("/interface/l2tp-server/server/set",false);
$API->write("=enabled=false",true);
$API->write("/interface/l2tp-server/server/set",false);
$API->write("=enabled=true",true);
Work Fine, thanks