皆さん、
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))
したがって、最初の呼び出しは正常に機能しましたが、2 番目の呼び出しは機能しませんでした。ただし、クラス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
そして、ここに parse_response の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_action の正しい構文はどのようになりますか。