Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python urllib2访问itop数据库(通过oql)_Python_Curl_Urllib2_Wget_Pycurl - Fatal编程技术网

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

使用python urllib2访问itop数据库(通过oql),python,curl,urllib2,wget,pycurl,Python,Curl,Urllib2,Wget,Pycurl,我试图通过其通用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/

我试图通过其通用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>
然后是蟒蛇

..........@...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的用户代理,但这没有帮助。我还试图更改
连接
,但没有成功

你知道这里发生了什么吗?我能做些什么来让它工作?也许有些人甚至知道发生了什么

编辑 结果表明,
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语句。

我已经为python3创建了一个库,它可以非常轻松地提供您需要的数据。(通过pip安装itoptop进行安装):

如果您需要iTop中的特定字段:

team_name_field = ['team_name']
team_name_from_all_tickets = ticket.find(query_all, team_name_field)

date_fields = ['start_date', 'end_date']
tickets_datefields_from_steve = ticket.find({query_from_steve, date_fields)
要将其保存在csv中,请执行以下操作:

def to_csv(dics, filename, keys=None):
    """
    Create a CSV from a dictionary list
    :param dics: dictionary list
    :param filename: output filename
    :param keys: Optional, subset of keys. Default is all keys.
    :return: None
    """
    if not keys:
        keys = sorted(set().union(*(d.keys() for d in dics)))

    import csv
    with open(filename, 'w') as output_file:
        dict_writer = csv.DictWriter(output_file, keys)
        dict_writer.writeheader()
        dict_writer.writerows(dics)

to_csv(all_tickets, 'all_tickets.csv')
如果需要将csv导入iTop:

def csv(filename):
    """
    Read CSV and make a dictionary list
    :param filename: csv
    :return: dictionary list
    """
    import csv
    return list(csv.DictReader(open(filename)))


all_tickets = csv('all_tickets.csv')
ticket.insert(all_tickets)
如果需要更新特定字段:

update_org_id = {'org_id' = 1}
ticket.update(query_from_steve, update_org_id)

我建议使用专用于URL处理的python包:
urllib
,而不是在查询字符串中“手工”编码空格。请参阅本文了解详细信息:这就是我现在正在做的事情——我很幸运有时间进行重构
def csv(filename):
    """
    Read CSV and make a dictionary list
    :param filename: csv
    :return: dictionary list
    """
    import csv
    return list(csv.DictReader(open(filename)))


all_tickets = csv('all_tickets.csv')
ticket.insert(all_tickets)
update_org_id = {'org_id' = 1}
ticket.update(query_from_steve, update_org_id)