如何在fritzconnect中发送call_action

问题描述 投票:0回答:1

大家,

我使用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)

我想如果我也把这里的execute方法放在这里,我认为是正确的,因为赋予方法的参数。

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

这是fritzconnection for 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的语法是如何的。

python-3.x action call fritzbox
1个回答
0
投票

信息通过关键字参数发送(如您所做)。而不是使用True | False使用1 | 0来启用或禁用WLAN。一些FritzBox还为5GHz频段使用'WLANConfiguration:2',为来宾网络使用'WLANConfiguration:3'。

fc.call_action('WLANConfiguration:1', 'SetEnable', NewEnable=1)
© www.soinside.com 2019 - 2024. All rights reserved.