gpt4 book ai didi

python - 使用 python urllib2 访问 itop 数据库(通过 oql)

转载 作者:行者123 更新时间:2023-11-28 21:22:13 26 4
gpt4 key购买 nike

我正在尝试通过其通用 Web 界面访问 itop 数据库。我用 shell 脚本让它工作:

#!/bin/bash

export http_proxy=''
SERVER=itop-test
SELECT_STATEMENT="SELECT Ticket"

wget -q -O - \
--http-user=myusername \
--http-password=$(cat /home/dummy/private/.passwd) \
"http://${SERVER}.acme.org:8000/webservices/export.php?login_mode=basic&format=csv&expression=${SELECT_STATEMENT}&fields=${FIELDS}"

这会根据需要生成 csv 输出。现在由于我正在构建的应用程序是在 python 中,我想在 python 中做同样的事情:

#!/usr/bin/python

import csv
import urllib2
import base64


select_statement = 'SELECT Ticket'
fields = ''

itop_server = 'itop-test'
username = 'myusername'
passwd_file = '/home/dummy/private/.passwd'

# extract passwd
password = open(passwd_file,'r').read().replace('\n','')
# clear http_proxy (sometimes set on ACME systems)
proxy_support = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)

# build url
url = 'http://' + itop_server + \
'.acme.org:8000/webservices/export.php?login_mode=basic&format=csv&expression='\
+ select_statement + '&fields=' + fields
request = urllib2.Request(url)
base64string = base64.standard_b64encode('%s:%s' % (username, password)).replace('\n', '')
request.add_header('Authorization', 'Basic %s' % base64string)
result = urllib2.urlopen(request).read()

print result

但是python版本不行,结果包含,除此之外

<p>Error the query can not be executed.</p>
<p>Unexpected token End of Input, found &#039;0&#039; in: <b>S</b>ELECT</p>

我已经检查过使用的 url 是相同的,所以我猜 send(?) 的 http header 中一定存在差异。

这是 tcpdump -s 1024 -l -A dst itop-test.acme.org 的一些输出

第一个wget:

..........@..#..2\.P.9..t..GET
/webservices/export.php?login_mode=basic&format=csv&expression=SELECT%20Ticket&fields= HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: itop-test.acme.org:8000
Connection: Keep-Alive


..........@Q....=..P.9.....GET
/webservices/export.php?login_mode=basic&format=csv&expression=SELECT%20Ticket&fields= HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: itop-test.acme.org:8000
Connection: Keep-Alive
Authorization: Basic asdfasdfasdfasdf

然后是python

..........@...W.@..P.9.....GET
/webservices/export.php?login_mode=basic&format=csv&expression=SELECT Ticket&fields= HTTP/1.1
Accept-Encoding: identity
Host: itop-test.acme.org:8000
Connection: close
Authorization: Basic asdfasdfasdfasdf
User-Agent: Python-urllib/2.6

我更改了 python 的用户代理,但这没有帮助。我还尝试更改 Connection,但没有成功。

对这里发生的事情有什么想法吗?我可以尝试做些什么?也许有些人甚至明白发生了什么事? :)

编辑事实证明 curl 也不起作用:

curl --user myusername:$(cat /home/dummy/private/.passwd) \
"http://${SERVER}.acme.org:8000/webservices/export.php?login_mode=basic&format=csv &expression=${SELECT_STATEMENT}&fields=${FIELDS}"

与 python urllib2 的结果相同。我也尝试过 pycurl,但没有成功(与 urllib2 和 curl 在命令行上的结果相同)。

最佳答案

事实证明,只有 wget 能够将 url 中的空格转换为 %20。如果我自己更换它,它会起作用。所以我这样构建我的 url

url = 'http://' + itop_server + \
'.acme.org:8000/webservices/export.php?login_mode=basic&format=xml&expression='\
+ select_statement.replace(' ','%20') + '&fields=' + fields

它会自动替换空格,我仍然可以用空格编写我的 select 语句。

关于python - 使用 python urllib2 访问 itop 数据库(通过 oql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19636033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com