как отправить call_action в fritzconnect - PullRequest
0 голосов
/ 23 сентября 2018

всем,

Я использую 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))

Итак, первый вызов работал нормально, а второй - нет.Однако вот метод call_action , который я использую из класса 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 для 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, если я хочу отправить информацию.

1 Ответ

0 голосов
/ 18 марта 2019

Информация отправляется по ключевым словам-параметрам (как вы сделали).Вместо использования True | False используйте 1 | 0 для включения или отключения WLAN.Некоторые FritzBoxes также используют «WLANConfiguration: 2» для диапазона 5 ГГц и «WLANConfiguration: 3» для гостевой сети.

fc.call_action('WLANConfiguration:1', 'SetEnable', NewEnable=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...