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
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? –
Nein. Dies ist das genaue Format in der Python/Tk App, das perfekt funktioniert. –