我尝试将以下bash脚本转换为python。我有主要内容,但是在翻译这两行cut=${auth#*<ChallengeCode>}
和authStr=${cut%</ChallengeCode>*}
时遇到了一些麻烦。第一个请求返回的XML包含<ChallengeCode>
,我需要能够提取该代码并将其存储以备将来使用。
BASH代码:
#!/bin/bash
IP=IP_ADDR
USER=USERNAME
PASS=PASSWORD
auth=$(curl -ks -H "Content-Type: text/xml" -c "cookies.txt" "https://${IP}/goform/login?cmd=login&user=admin&type=1")
cut=${auth#*<ChallengeCode>}
authStr=${cut%</ChallengeCode>*}
hash=$(echo -n ${authStr}:GDS3710lZpRsFzCbM:${PASS} | md5sum | tr -d '/n')
hash=$(echo $hash | cut -d' ' -f1 | tr -d '/n')
curl -ks -H "Content-Type: text/xml" -c "cookies.txt" "https://${IP}/goform/login?cmd=login&user=admin&authcode=${hash}&type=1"
curl -ks -H "Content-Type: image/jpeg" --cookie "cookies.txt" "https://${IP}/snapshot/view0.jpg" >> snapshot.jpg
PYTHON代码:
import requests
import hashlib
hmd5 = hashlib.md5()
ip = "192.168.100.178"
user = "admin"
password = "Password1"
auth = requests.get('https://{0}/goform/login', headers=headers, params=params, verify=False).format(ip)
chcode = (This is where I want to put the challenge code i get back from the previous request)
hstring = "{0}:GDS3710lZpRsFzCbM:{1}".format(chcode,password).encode()
hmd5.update(hstring)
hashauth = hmd5.hexdigest()
response = requests.get('https://{0}/snapshot/view0.jpg', headers=headers, cookies=cookies, verify=False).format(ip)
任何有关如何更好地改进代码的建议也将不胜感激。
答案 0 :(得分:1)
如果您的请求返回XML,则适合使用XML解析器。假设您导入的xml.etree.ElementTree
可能是:
import xml.etree.ElementTree as ET
您可以让它解析您的回复:
root_el = ET.fromstring(auth.text)
然后使用XPath(取决于XML的结构,可能会有所不同)来查找元素并获取其包含的文本的值:
chcode = root_el.find("./ChallengeCode").text
答案 1 :(得分:0)
尽管真正的编程语言的优点之一就是强大的库(用于解析XML的 eg )的可用性,但是Bash子字符串操作有一个直接的类比,鉴于限制使用通配符:
${a#*foo} — a.partition("foo")[0]
${a%foo*} — a.rpartition("foo")[-1]
${a##*foo} — a.rpartition("foo")[0]
${a%%foo*} — a.partition("foo")[-1]