使用FritzConnection更改WIFI密码



我想更改FritzBox路由器上访客WIFI的密码。为了连接到FritzBox,我使用Python中的FritzConnection库。一般来说,FritzConnection是有效的:我可以从FritzBox读取信息,我也可以启用或禁用客人的WIFI。然而,我在更改密码时遇到了麻烦。不过我能读懂密码。

以下是我迄今为止所做的:

#!/usr/bin/python3
from fritzconnection import FritzConnection
import pprint
pp = pprint.PrettyPrinter(indent=2)
fc=FritzConnection(address='192.168.2.1', password='XYZ', use_tls=True)
#switch guest WIFI off and on again - this works
state = fc.call_action('WLANConfiguration:3', 'GetInfo')
pp.pprint(state)
print("Disable WLAN")
fc.call_action('WLANConfiguration3',
'SetEnable',
arguments={'NewEnable':0})
state = fc.call_action('WLANConfiguration:3', 'GetInfo')
pp.pprint(state)
input("Press Enter to continue...")
print("Enable WLAN")
fc.call_action('WLANConfiguration3',
'SetEnable',
arguments=NewEnable=1)
state = fc.call_action('WLANConfiguration:3', 'GetInfo')
pp.pprint(state)

这个代码片段可以关闭和打开WIFI,而且效果很好。请注意,我使用了两种不同的参数传递方法来启用和禁用。两者都有效。

现在,当涉及到更改密码时,我首先读取安全密钥(有效(,然后尝试重新设置它们(无效(。为了阅读,我做如下:

securityKeys = fc.call_action('WLANConfiguration:3', 'GetSecurityKeys')
pp.pprint(securityKeys)

对于第一次写作,我尝试了:

fc.call_action('WLANConfiguration:3',
'SetSecurityKeys',
NewKeyPassphrase='BetterPassword')

这导致

fritzconnection.core.exceptions.FritzArgumentError: UPnPError:
errorCode: 402
errorDescription: Invalid Args

我也试过

fc.call_action('WLANConfiguration3',
'SetSecurityKeys',
arguments={'NewKeyPassphrase':'MeinPasswortIstBesser'})

fc.call_action('WLANConfiguration:3',
'SetSecurityKeys',
NewWEPKey0='',
NewWEPKey1='',
NewWEPKey2='',
NewWEPKey3='',
NewPreSharedKey='',
NewKeyPassphrase="MeinPasswortIstBesser")

securityKeys['NewKeyPassphrase']='MeinPasswortIstBesser'
fc.call_action('WLANConfiguration3',
'SetSecurityKeys',
arguments=securityKeys)

但是结果总是一样的。显然,我对参数做了一些错误的事情,但我不能说它应该是什么。使用FritzConnection CLI工具告诉我接口:

fritzconnection --ip-address 192.168.2.1 -A 'WLANConfiguration3' 'SetSecurityKeys'
fritzconnection v1.3.4
FRITZ!Box 7590 at http://192.168.2.1
FRITZ!OS: 7.20

Service:            WLANConfiguration3
Action:             SetSecurityKeys
Parameters:
Name                                  direction     data type
NewWEPKey0                            -> in         string
NewWEPKey1                            -> in         string
NewWEPKey2                            -> in         string
NewWEPKey3                            -> in         string
NewPreSharedKey                       -> in         string
NewKeyPassphrase                      -> in         string

据我所知,我为这个界面服务。

你知道我在这里做错了什么吗?

FritzConnction中存在缺陷。解决方案可以在这里找到:

https://github.com/kbr/fritzconnection/issues/66

本质是FritzConnection有一个模板,其中包含太多s:前缀。特别是s:NewWEPKey0s:NewWEPKey1s:NewWEPKey2s:NewWEPKey3s:NewPreSharedKeys:NewKeyPassphrase。将s:从机身上取下即可。

我做了以下肮脏的黑客来验证这篇论文:在soaper.py中,我在第226行(这是在方法execute()中(下面添加了以下代码片段:

if 'NewKeyPassphrase' in body:
print (body)
print ('replacing......................................')
body = body.replace('s:NewWEPKey0', 'NewWEPKey0')
body = body.replace('s:NewWEPKey1', 'NewWEPKey1')
body = body.replace('s:NewWEPKey2', 'NewWEPKey2')
body = body.replace('s:NewWEPKey3', 'NewWEPKey3')
body = body.replace('s:NewPreSharedKey', 'NewPreSharedKey')
body = body.replace('s:NewKeyPassphrase', 'NewKeyPassphrase')
print (body)

在这种情况下,这将s:从该主体中移除。这很好用,密码会被更改。

所以我的脚本看起来如下:

from fritzconnection import FritzConnection
import pprint
pp = pprint.PrettyPrinter(indent=2)
fc=FritzConnection(address='192.168.2.1', user='FritzConnection', password='Dr3QL78ZYG58Nn98GVsx', use_tls=True)
securityKeys = fc.call_action('WLANConfiguration:3', 'GetSecurityKeys')
pp.pprint(securityKeys)
securityKeys['NewKeyPassphrase']='MeinPasswortIstUnfassbarGut'
pp.pprint(securityKeys)
fc.call_action('WLANConfiguration3',
'SetSecurityKeys',
arguments=securityKeys)
securityKeys = fc.call_action('WLANConfiguration:3', 'GetSecurityKeys')
pp.pprint(securityKeys)

相关内容

  • 没有找到相关文章

最新更新