Python 3.x 如何在fritzconnect中发送call_操作

Python 3.x 如何在fritzconnect中发送call_操作,python-3.x,action,call,fritzbox,Python 3.x,Action,Call,Fritzbox,各位, 我使用Python3和fritzconnection连接到我的Fritzbox。获取信息非常有效,但也有一些命令需要发送信息,以使Fritzbox做出明确响应。我该怎么做 以下是我迄今为止所做的工作: from fritzconnection import FritzConnection fc = FritzConnection(password='MyRoommateSucks') print(fc.call_action('WANCommonInterfaceConfig', 'Ge

各位,

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

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中用于解析响应的必要方法

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_操作的正确语法是什么。

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

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