Python wysyłanie pojedynczego pliku XML (XML-RPC)

0

Witam.

Męczę się od wczoraj z wysłaniem odpowiednio sformatowanego zapytania przy pomocy Pythona.

Obsługa XML-RPC to jakaś kpina, tak więc spróbowałem PyCURL oraz HTTLib, doSZEDŁem troszkę dalej ale jednak wciąż niewystarczająco daleko.

Do rzeczy, potrzebuję wysłać takie zapytanie:

POST /dupa HTTP/1.0
User-Agent: XML-RPC for PHP 3.0.0.beta
Host: webnull.kablownia.org:81
Accept-Charset: UTF-8,ISO-8859-1,US-ASCII
Content-Type: text/xml
Content-Length: 325

<?xml version="1.0"?>
<methodCall>
<methodName>LogIn</methodName>
<params><param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string>OS Test User Agent</string></value>
</param></params>
</methodCall>

Najlepiej przy pomocy jakiejś biblioteki a nie na raw socketach (program ma działać bez uprawnień roota).

Gdzie tu jest mój problem?

Otóż za nic nie mogę wysłać zapytania sformatowanego w ten sposób, a konkretnie samego kodu XML.
Kod XML udało mi się wysłać metodą uploadu, ale serwer tego nie rozumie - potrzebuję wysłać tak jak jest na tym przykładowym schemacie.
Przykład który podałem jest wygenerowany przy pomocy PHP - zesniffowałem go Wiresharkiem wysyłając zapytanie z debuggera do komputera którego używam (sniffer na moim komputerze w celu przechwycenia poprawnego schematu).

Proszę o pomoc, siedzę nad tym od wczoraj.

@Edit

XMLData = """<?xml version="1.0"?>
<methodCall>
<methodName>LogIn</methodName>
<params><param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string>"""+userAgent+"""</string></value>
</param></params>
</methodCall>"""

    POSTFieldsEscaped = XMLData

    sendHeaders = {
         'Content-Length': str(len(POSTFieldsEscaped)), 
         'User-Agent': userAgent, 
         'Content-Type': 'text/xml',
         'Accept-Charset': 'UTF-8,ISO-8859-1,US-ASCII'
                  }

    conn = httplib.HTTPConnection('api.opensubtitles.org')
    conn.request("POST", "/xml-rpc", POSTFieldsEscaped, sendHeaders)
    response = conn.getresponse()
    data = response.read()

    print data

Oto rozwiązanie, jakoś do niego doszedłem.

-- WebNuLL

0

Nie prościej tak?

from string import Template

try:
	# Python 2.x
	from urllib2 import urlopen, Request 
except ImportError:
	# Python 3.x
	from urllib.request import urlopen, Request 

UA = '...'

messageTemplate = Template('''\
<?xml version="1.0"?>
<methodCall>
<methodName>LogIn</methodName>
<params><param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string></string></value>
</param>
<param>
<value><string>${useragent}</string></value>
</param></params>
</methodCall>''')

headers = {
	'User-Agent': UA,
	'Accept-Charset': 'UTF-8,ISO-8859-1,US-ASCII',
	'Content-Type': 'text/xml'
}

addr = 'http://api.opensubtitles.org/xml-rpc'
body = messageTemplate.substitute(useragent=UA)

print(urlopen(Request(addr, body, headers)).read())
0

No prościej, dzięki :-)

-- WebNuLL

1 użytkowników online, w tym zalogowanych: 0, gości: 1