2016-07-13 14 views
1

Ich habe ein funktionierendes Python/Tk-Programm, das ein CGI-Skript basierend auf Benutzerauswahl ausführt. Ich arbeite daran, dies auf ein kleines Skript zu reduzieren, das sich nur auf ein bestimmtes CGI-Skript konzentriert. Es scheint, die Session-ID korrekt zu bekommen, aber wenn ich den Browser starte, bekomme ich "Zugriff verweigert". Da das andere Programm funktioniert, erwarte ich keine Probleme von der Website. Jede Hilfe wird geschätzt.Zugriff verweigert nach Erhalt gültiger Sitzungs-ID

UPDATE: Wenn ich einen Debugger und einen Haltepunkt auf der Linie Druck url die URL in der Konsole gedruckt gesetzt, wie weiter unten zu sehen ist, funktioniert. Ich weiß jetzt, dass das Sitzungs-ID-Token gut ist.

Auch wenn ich Schritt in die Funktion Web-Browser und dann Schritt über nach, dass das Skript auch funktioniert.

Hier ist mein Code.

import json 
import tornado.web 
import tornado.websocket 
from tornado import gen 
import tornado.ioloop 
import webbrowser 
from struct import * 

request_id = 71 
ip_address = "10.22.4.14" 


# ************************************************ 
# Procedure to open websocket and get session id 
# *********************************************** 
@gen.coroutine 
def open_ws(ip, username, password): 
    global client 
    global request_id 
    global session_id 

    ws_url = "ws://" + ip + ":7011/" 

    try: 
     client = yield tornado.websocket.websocket_connect(ws_url, None, None, 5, None, None) 
     # print("websocket %s open" % ws_url) 
    except error: 
     exit() 

    # Send Mercury login request 
    JSON = '{"requests":[{"request_id": %s, "login":{"username": "%s","password": "%s"}}]}' % (str(request_id), username, password) 

    client.write_message(JSON) 
    results = yield client.read_message() 
    # print("msg is %s" % results) 

    # Parse the response of login request to get the error code 
    parsed_json = json.loads(results) 
    err_code = parsed_json['responses'][0]['request_response']['result']['err_code'] 

    if 0 == err_code: 
     # Parse the response of get_command_result to get the session id 
     session_id = parsed_json['responses'][0]['request_response']['login']['session_id'] 
     # print("login succeeded - session id: %s" % session_id) 
    else: 
     print("login failed") 
    # error_exit(err_code) 


def get_token(): 
tornado.ioloop.IOLoop.instance().run_sync(lambda: open_ws(ip_address, 'admin', 'admin')) 
    return session_id 

session_id = get_token() 
print "Token is " + session_id 

url = "http://" + ip_address + "/scripts/dostuff.cgi?session=" + session_id 
print url # add breakpoint here 

# launch browser 
webbrowser.open(url) 

Console Ausgang:

Token is 7zNSZX9liaUDFFN0ijn-LWQ8 
http://10.222.4.14/scripts/dostuff.cgi?session=7zNSZX9liaUDFFN0ijn-LWQ8 
+0

Erwartet der Webserver einen Cookie mit einer Sitzungs-ID? Oder erwartet es, dass die Sitzungs-ID als ein Cookie anstelle einer Abfrage-Zeichenfolge übermittelt wird? –

+0

Nein. Dies ist das genaue Format in der Python/Tk App, das perfekt funktioniert. –

Antwort

0

gelöst. Das Skript endete damit, dass der Socket geschlossen wurde, bevor der Browser eine Chance hatte, auf die Anfrage zu antworten