如何在弗里茨连接中发送call_action



everyone,

我使用 Python3 和 fritzconnection 连接到我的 Fritzbox。获取信息效果很好,但也有一些命令,您必须发送信息才能让 Fritzbox 专门响应。我该怎么做?

这是我到目前为止所做的:

from fritzconnection import FritzConnection
fc = FritzConnection(password='MyRoommateSucks')
print(fc.call_action('WANCommonInterfaceConfig', 'GetAddonInfos'))
print(fc.call_action('WLANConfiguration:1', 'SetEnable', NewEnable = True))

所以第一个电话工作正常,但第二个电话不能。但是这是我从类 FritzConnection中使用的方法call_action:

def call_action(self, service_name, action_name, **kwargs):
"""Executes the given action. Raise a KeyError on unkown actions."""
action = self.services[service_name].actions[action_name]
return action.execute(**kwargs)

我想如果我也把执行方法放在这里,我假设是正确的,因为参数在哪里给了该方法。

def execute(self, **kwargs):
"""
Calls the FritzBox action and returns a dictionary with the arguments.
"""
headers = self.header.copy()
headers['soapaction'] = '%s#%s' % (self.service_type, self.name)
data = self.envelope.strip() % self._body_builder(kwargs)
url = 'http://%s:%s%s' % (self.address, self.port, self.control_url)
auth = None
if self.password:
auth=HTTPDigestAuth(self.user, self.password)
response = requests.post(url, data=data, headers=headers, auth=auth)
# lxml needs bytes, therefore response.content (not response.text)
result = self.parse_response(response.content)
return result

这是弗里茨连接的必要方法parse_response

def parse_response(self, response):
"""
Evaluates the action-call response from a FritzBox.
The response is a xml byte-string.
Returns a dictionary with the received arguments-value pairs.
The values are converted according to the given data_types.
TODO: boolean and signed integers data-types from tr64 responses
"""
result = {}
root = etree.fromstring(response)
for argument in self.arguments.values():
try:
value = root.find('.//%s' % argument.name).text
except AttributeError:
# will happen by searching for in-parameters and by
# parsing responses with status_code != 200
continue
if argument.data_type.startswith('ui'):
try:
value = int(value)
except ValueError:
# should not happen
value = None
result[argument.name] = value
return result

这是Fritzbox想要的:

Actionname:         SetEnable
('NewEnable', 'in', 'boolean')
Actionname:         GetInfo
('NewAllowedCharsPSK', 'out', 'string')
('NewAllowedCharsSSID', 'out', 'string')
('NewBSSID', 'out', 'string')
('NewBasicAuthenticationMode', 'out', 'string')
('NewBasicEncryptionModes', 'out', 'string')
('NewBeaconType', 'out', 'string')
('NewChannel', 'out', 'ui1')
('NewEnable', 'out', 'boolean')
('NewMACAddressControlEnabled', 'out', 'boolean')
('NewMaxBitRate', 'out', 'string')
('NewMaxCharsPSK', 'out', 'ui1')
('NewMaxCharsSSID', 'out', 'ui1')
('NewMinCharsPSK', 'out', 'ui1')
('NewMinCharsSSID', 'out', 'ui1')
('NewSSID', 'out', 'string')
('NewStandard', 'out', 'string')
('NewStatus', 'out', 'string')

摘要:如果我想发送信息,我的call_action语法如何正确。

信息是通过关键字参数发送的(就像你所做的那样(。 而不是使用 True|错误地使用 1|0 启用或禁用 WLAN。一些FritzBox还对5GHz频段使用"WLANConfiguration:2",对访客网络使用"WLANConfiguration:3"。

fc.call_action('WLANConfiguration:1', 'SetEnable', NewEnable=1)

相关内容

  • 没有找到相关文章

最新更新