Quantcast
Channel: SCN: Message List
Viewing all articles
Browse latest Browse all 3575

Re: Download SAP Notes programmatically

$
0
0

Thanks to this recipe [1] I've been able to download SAP Notes from SAP.

 

The code:

 

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# File: sapnote.py
import urllib2
import sys
import re
import base64
from urlparse import urlparse
asapnote = "http://service.sap.com/sap/support/notes/1775242"
username = "S00XXXXXXXX"
password = "XXXXXXXXXXX"
req = urllib2.Request(asapnote)
try:    handle = urllib2.urlopen(req)
except IOError, e:    pass # here we *want* to fail
else:    # If we don't fail then the page isn't protected    print "This page isn't protected by authentication."    sys.exit(1)
if not hasattr(e, 'code') or e.code != 401:    # we got an error - but not a 401 error    print "This page isn't protected by authentication."    print 'But we failed for another reason.'    sys.exit(1)
authline = e.headers['www-authenticate']
# this gets the www-authenticate line from the headers
# which has the authentication scheme and realm in it
authobj = re.compile(r'''(?:\s*www-authenticate\s*:)?\s*(\w*)\s+realm=['"]([^'"]+)['"]''', re.IGNORECASE)
# this regular expression is used to extract scheme and realm
matchobj = authobj.match(authline)
if not matchobj:    # if the authline isn't matched by the regular expression    # then something is wrong    print 'The authentication header is badly formed.'    print authline    sys.exit(1)
scheme = matchobj.group(1)
realm = matchobj.group(2)
# here we've extracted the scheme
# and the realm from the header
if scheme.lower() != 'basic':    print 'This example only works with BASIC authentication.'    sys.exit(1)
base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
authheader =  "Basic %s" % base64string
req.add_header("Authorization", authheader)
try:    handle = urllib2.urlopen(req)
except IOError, e:    # here we shouldn't fail if the username/password is right    print "It looks like the username or password is wrong."    sys.exit(1)
sapnote = handle.read()
print sapnote

But the html source code is awful:

<html>  <head>  <title>1775242 - SAP Solution Manager 7.1 SP8 - Basic functions</title>      <link rel="Shortcut Icon" type="image/x-icon" href="http://www.sap.com/SAPFavicon.ico" />      <link rel="icon" type="image/ico" href="http://www.sap.com/SAPFavicon.ico">    <script language="JavaScript">
var frame_A="25D24E0DFABDFD4996AB0A2039A0D59D_A";
function startBSPApplication(name)
{  doc=window.frames[name].document;  doc.writeln('<html><body onload="document.f.submit();">');  doc.writeln('<form id="f" name="f" target="25D24E0DFABDFD4996AB0A2039A0D59D_A" method="POST" action="/sap/bc/bsp/sno/ui/main.do?param=69765F6D6F64653D3030312669765F7361706E6F7465735F6E756D6265723D3137373532343226">');
doc.writeln('<input type="hidden" name="param" value="69765F6D6F64653D3030312669765F7361706E6F7465735F6E756D6265723D3137373532343226">');
doc.writeln('<input type="hidden" name="bspapplicationffields" value="cGFyYW09Njk3NjVGNkQ2RjY0NjUzRDMwMzAzMTI2Njk3NjVGNzM2MTcwNkU2Rjc0NjU3MzVGNkU3NTZENjI2NTcyM0QzMTM3MzczNTMyMzQzMjI2">');  doc.writeln('<table border="0" width="100%" height="100%"><tr><td align="CENTER" valign="MIDDLE"><span style="font-family:Arial,sans-serif;">Loading...</span></td></tr></table>');  doc.writeln('</form></body></html>');  doc.close();
}
function exitBSPApplication()
{
var myDoc;
var el;
var sid;
var name;
var app;
var ns;
try
{  myDoc = window.frames[frame_A].document;  el = myDoc.forms[0].sid;  sid = el.value;  el = myDoc.forms[0].cookie_name;  name = el.value;  el = myDoc.forms[0].appl_name;  app = el.value;  el = myDoc.forms[0].appl_ns;  ns = el.value;
}
catch(err)
{}
var url="/sap/bc/bsp/sno/ui_entry/sessionexit.htm?application_list[1].exit_url=/sap(bD1lbiZjPTAwMQ==)/bc/bsp/sno/ui_entry/entry.htm%3Fsap-sessioncmd=logoff";
url+="&sid=" + sid;
url+="&name=" + name;
url+="&app=" + app;
url+="&ns=" + ns;
var win_prop = "";
try
{
//win_prop = "height=100,width=400,top="+(screen.height-100)/2+",left="+(screen.width-400)/2;
}
catch(err)
{  win_prop = "height=100,width=400";
}
win_prop = "height=100,width=400";
var out = window.open(url,'_blank',win_prop);        document.getElementById("25D24E0DFABDFD4996AB0A2039A0D59D_FRAMESET").onunload = null;
}    </script>  </head>  <frameset id="25D24E0DFABDFD4996AB0A2039A0D59D_FRAMESET" rows="*,0" onload="startBSPApplication('25D24E0DFABDFD4996AB0A2039A0D59D_A');" onunload="exitBSPApplication();" FRAMEBORDER=0 FRAMESPACING=0 BORDER=0>    <frame name="25D24E0DFABDFD4996AB0A2039A0D59D_A" src="entry_default_content.htm" NORESIZE SCROLLING=AUTO MARGINHEIGHT=0 MARGINWIDTH=0>    <noframes>This browser does not support frames.</noframes>  </frameset></html>

 

I do not understand why SAP has to obfuscate the code in this way. Why not serve only html without frames neither server side scripting? What do they have to hide?

 

So, I am done.

 

[1] Basic Authentication with Python


Viewing all articles
Browse latest Browse all 3575

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>