|
@@ -1,9 +1,9 @@
|
|
|
import base64
|
|
|
import os
|
|
|
-import time
|
|
|
+# import time
|
|
|
import requests
|
|
|
from requests_toolbelt.multipart import decoder
|
|
|
-import pandas as pd
|
|
|
+# import pandas as pd
|
|
|
import jinja2
|
|
|
import json
|
|
|
import re
|
|
@@ -12,9 +12,9 @@ from bs4 import BeautifulSoup
|
|
|
|
|
|
class ca_webscraper:
|
|
|
webservice = "http://localhost:9300/bi/"
|
|
|
- templates_dir = "C:/Projekte/Python/cognos11/templates"
|
|
|
- export_dir = "C:/Projekte/Python/export"
|
|
|
- log_dir = "C:/Projekte/Python/logs"
|
|
|
+ templates_dir = "C:/GlobalCube/Tasks/gctools/templates"
|
|
|
+ export_dir = "C:/GlobalCube/ReportOutput"
|
|
|
+ log_dir = "C:/GlobalCube/Tasks/gctools/logs"
|
|
|
credentials = '{"parameters":[{"name":"CAMNamespace","value":"CognosEx"},{"name":"h_CAM_action","value":"logonAs"},{"name":"CAMUsername","value":"Global1"},{"name":"CAMPassword","value":"Cognos#11"}]}'
|
|
|
headers = {}
|
|
|
caf = ""
|
|
@@ -55,7 +55,15 @@ class ca_webscraper:
|
|
|
def report_list(self):
|
|
|
# "v1/objects/_dot_public_folders/items"
|
|
|
filter = "type|analysis|interactiveReport|powerPlayReport|powerPlay8Report|powerPlay8ReportView|query|report|reportTemplate"
|
|
|
- res = self.session.get(self.webservice + "v1/search/cm?fields=defaultName|id|ancestors&results=1000&query=.&hide_internal=all&filter=" + filter, headers=self.headers)
|
|
|
+ res = self.session.get(
|
|
|
+ self.webservice + "v1/search/cm?fields=defaultName|id|ancestors&results=1000&query=.&hide_internal=all&filter=" + filter,
|
|
|
+ headers=self.headers
|
|
|
+ )
|
|
|
+ # print(res.content)
|
|
|
+ filename = self.log_dir + '/reports_error.log'
|
|
|
+ os.makedirs(os.path.dirname(filename), exist_ok=True)
|
|
|
+ with open(filename, "wb") as f:
|
|
|
+ f.write(res.content)
|
|
|
self.reports = res.json()['results']
|
|
|
for r in self.reports:
|
|
|
r['path'] = "/".join([a['defaultName'].replace('/', '_') for a in r['ancestors']])
|
|
@@ -82,15 +90,15 @@ class ca_webscraper:
|
|
|
|
|
|
def export(self, report, format='XML'):
|
|
|
headers = {
|
|
|
- 'Content-Type': 'text/xml; charset=UTF-8',
|
|
|
+ 'Content-Type': 'text/xml; charset=UTF-8',
|
|
|
'X-XSRF-TOKEN': self.headers['X-XSRF-TOKEN'],
|
|
|
'X-RsCMStoreID': report['id'],
|
|
|
'X-UseRsConsumerMode': 'true',
|
|
|
'SOAPAction': 'http://www.ibm.com/xmlns/prod/cognos/reportService/202004/'
|
|
|
}
|
|
|
soap = self.template.render({"caf": self.caf, "cam": self.cam,
|
|
|
- "report": report, "format": 'XHTML',
|
|
|
- "prompt": 'true', "tracking": "", "params": {}})
|
|
|
+ "report": report, "format": 'XHTML',
|
|
|
+ "prompt": 'true', "tracking": "", "params": {}})
|
|
|
|
|
|
r = self.session.post(self.webservice + 'v1/reports', data=soap, headers=headers)
|
|
|
parts = decoder.MultipartDecoder.from_response(r).parts
|
|
@@ -118,10 +126,10 @@ class ca_webscraper:
|
|
|
filename = self.log_dir + f"/config/{report['name']}.json"
|
|
|
os.makedirs(os.path.dirname(filename), exist_ok=True)
|
|
|
json.dump(meta, open(filename, 'w'), indent=2)
|
|
|
-
|
|
|
+
|
|
|
if format == 'PDF':
|
|
|
return self.export_pdf(report, meta)
|
|
|
-
|
|
|
+
|
|
|
payload = json.dumps({'reportspec_stubbed': parts[2].text, 'storeid': report['id']})
|
|
|
token = re.findall(r'<bus:authenticityToken xsi:type="xs:base64Binary">(.*)</bus:authenticityToken>', parts[0].text)[0]
|
|
|
headers = {
|
|
@@ -148,19 +156,23 @@ class ca_webscraper:
|
|
|
|
|
|
def export_pdf(self, report, meta):
|
|
|
headers = {
|
|
|
- 'Content-Type': 'text/xml; charset=UTF-8',
|
|
|
+ 'Content-Type': 'text/xml; charset=UTF-8',
|
|
|
'X-XSRF-TOKEN': self.headers['X-XSRF-TOKEN'],
|
|
|
'X-RsCMStoreID': report['id'],
|
|
|
'X-UseRsConsumerMode': 'true',
|
|
|
'SOAPAction': 'http://www.ibm.com/xmlns/prod/cognos/reportService/202004/'
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if len(report['params']) == 0:
|
|
|
params = {}
|
|
|
filename = report['filename']
|
|
|
self.request_file(report, headers, params, filename)
|
|
|
return True
|
|
|
if len(report['params']) == 1:
|
|
|
+ params = {}
|
|
|
+ filename = report['filename'].format('0')
|
|
|
+ self.request_file(report, headers, params, filename)
|
|
|
+
|
|
|
key1 = report['params'][0]
|
|
|
for k1, v1 in meta['optional'][key1].items():
|
|
|
filename = report['filename'].format(v1)
|
|
@@ -174,12 +186,12 @@ class ca_webscraper:
|
|
|
filename = report['filename'].format(v1, v2)
|
|
|
params = {key1: {k1: v1}, key2: {k2: v2}}
|
|
|
self.request_file(report, headers, params, filename)
|
|
|
- return True
|
|
|
+ return True
|
|
|
|
|
|
def request_file(self, report, headers, params, filename):
|
|
|
soap = self.template.render({"caf": self.caf, "cam": self.cam,
|
|
|
"report": report, "format": 'PDF',
|
|
|
- "prompt": 'false', "tracking": "", "params": params})
|
|
|
+ "prompt": 'false', "tracking": "", "params": params}).encode("utf-8")
|
|
|
try:
|
|
|
r = self.session.post(self.webservice + 'v1/reports', data=soap, headers=headers)
|
|
|
except UnicodeEncodeError:
|
|
@@ -222,4 +234,4 @@ if __name__ == '__main__':
|
|
|
caws = ca_webscraper()
|
|
|
caws.login()
|
|
|
caws.report_list()
|
|
|
- caws.export_folder('Team Content/Export/Test')
|
|
|
+ caws.export_folder('Team Content/ReportOutput')
|