如果要使用 JIRA 中的 issue 数据,登录系统是必须的。
往期回顾——普通模式使用 Python 登录 Jira :
import urllib2
import urllib
def loginJira():
''' if environment is required
proxy = {'http':'xxxproxy:xxxxx'}
proxy_support = urllib2.ProxyHandler(proxy)
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
'''
jiraUrl = "http://xxxxx.org/jira/login.jsp"
user_agent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
data_post = urllib.urlencode({
'os_username' : '[email protected]',
'os_password' : 'xxxxx',
'os_destination' : '',
'user_role' : '',
'atl_token' : '',
'login' : 'Log In'
})#every data should be contained
headers = {'User-Agent' : user_agent}
request = urllib2.Request(url = jiraUrl, headers = headers, data = data_post)
response = urllib2.urlopen(request)
readPage = response.read()
print readPage
if __name__ == '__main__':
loginJira()
跟之前发布的一篇文章——爬虫入门:Python 描述的,data_post 中包含的数据必须一个不少的遵循页面中的信息。
API 模式下登入 JIRA 获得权限:
实际上 login 这一个功能隶属于权限这个大类:将会涉及到cookie、headers。
login 就是为了获取权限。
在这里,我采用的是 cookie-based 的方法来获取权限,我需要的是:
1. cookie name
2. cookie value
没有 cookie 信息你将会收到401报错——没有权限访问任何一个 JIRA 数据,所以我将cookie 的设置放在访问网站的第一步——login() 方法里面(当然,实际上放在其他地方也是可以的,只要是在你进入网站获取数据之前)。
所以 login 方法存在的意义就是,登录获取权限——
具体获取权限的步骤:
1. install 一个cookie 的opener,实际上这种编写方式雷同于 install 一个代理(在爬虫入门:Python Q1 的代码中就有提到)
cookie = cookielib.CookieJar()
chandler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(chandler)
urllib2.install_opener(opener)
“
*reference
当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。
如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。
”
2. 通过 JIRA API 提到的方式构建 json 格式的密码 data,创建一个 request:request = urllib2.Request(url = self.__maiUrl + api, data = account, headers = headers )
data 的格式
{ "username": "myuser", "password": "mypassword" } |
headers = {'Content-Type': 'application/json'}
3. 发送请求,得到 cookie 信息。
得到 cookie 信息实际上也有两种方式:
- 因为之前构建了cookie 的 opener,可以使用cookie 的opener ,当然也可以使用 urllib2.urlopen() 发送请求
response =opener.open( request )
cookie 信息直接写入到 cookie 变量中
- 发送请求之后,response 会有一个session 对象返回,cookie 就在 session 对象里面,注意这里返回的 session 是 json 类型的
json.load(response)
这就可以解码为字典格式:
json.load(response)['session']['name']
json.load(response)['session']['value']
从 login 方法获得的cookie 的 key,value 为后期操作 JIRA 数据提供权限——将得到的key,value 用于构建headers。
通过 API 获得 issue 信息:
访问网站要素:
- url —— 通过JIRA 官方 API查找到相关目的的 url,例如我需要 issue,它的 API 就是:GET /rest/api/2/issue/{issueIdOrKey}, 所以相关的 url 形如:
maiUrl = 'http://hdc-tomcat123.xxxxsoft.org'
api = '/jira/rest/api/2/issue/LTY-%d?fields=summary,priority,assignee,updated' \ #fields = data you want
%bugkey
url = mailUrl + api
直接将此 url 放到浏览器地址栏可以直接得到数据,没有格式,但是如果 debug 需要可以在浏览器是有那个 ctrl + f 查找相关数据,很方便。
当然,使用在线格式化 json 数据的工具也是可以的。根据需要格式的数据类型查找工具,搜索关键字:json查看器,json校验,json格式化
- headers —— login 得到的 cookie (从 login 方法中获得的)存入到 headers 里面:
headers = {
'Content-Type': 'application/json',
authname : authvalue
#auth['session']['name']:auth['session']['value']
}
然后发送请求,得到响应——将相应的数据提取出来:
bug.setSummary( (data['fields']['summary'] ).encode('utf8'))
bug.setAssignee( (data['fields']['assignee']['displayName']).encode('utf8') )
因为可能提取的数据中会有一些迷之符号,最好转码一下。