всем,
Я использую 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, если я хочу отправить информацию.