Compare commits

...
Author SHA1 Message Date
Deniz Şafak 4a2e6e2278 Bug fixa 2023-10-18 14:46:05 +03:00
Deniz Şafak 7e988d816b Update README.md 2023-10-17 02:56:28 +03:00
Deniz Şafak 6a854b2581 Improvements, bug fixes 2023-10-17 02:50:08 +03:00
Deniz Şafak 7c9ccb39e5 Update README.md 2023-10-15 02:30:10 +03:00
Deniz Şafak bd0ab39771 Fixed minor bugs 2023-10-15 02:14:06 +03:00
Deniz Şafak 2b64fd69bb Update HotspotAutoLogin.pyw 2023-10-14 04:10:02 +03:00
Deniz Şafak c08620677f Update README.md 2023-10-14 04:04:44 +03:00
2 changed files with 110 additions and 99 deletions
+107 -98
View File
@@ -11,33 +11,36 @@ from collections import deque
from datetime import datetime
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += 'HIGH:!DH:!aNULL'
try:
requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST += 'HIGH:!DH:!aNULL'
except AttributeError:
# no pyopenssl support used / needed / available
pass
# Load configuration from file
with open("config.json", "r") as f:
config = json.load(f)
# Your authentication payload and URL
# Your payload
payload = config["payload"]
url = config["url"]
if (config["ssid"]):
expected_ssid = config["ssid"]
expected_ssid_lower = config["ssid"].lower()
else:
config["ssid"] = "Wi-Fi"
expected_ssid = config["ssid"]
expected_ssid_lower = None
# Convert the expected SSID to lowercase (or uppercase)
expected_ssid = config["ssid"].lower()
headers = {
"Content-Type": "application/json;charset=UTF-8",
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
# Function to check if internet is available
def is_internet_available():
try:
# Try to send a simple HTTP GET request to a known website
response = requests.get("https://www.google.com")
# If the request was successful, it means the internet is available
response = requests.get("https://www.google.com", timeout=10)
# If the response status code is 200, it means the internet is available
return response.status_code == 200
except requests.ConnectionError:
# If an exception is raised, there's no internet connectivity
except requests.RequestException as e:
return False
# Function to get the currently connected SSID using system commands (for Windows)
@@ -45,7 +48,6 @@ def get_connected_network():
try:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
# Get Wi-Fi SSID
wifi_output = subprocess.check_output(["netsh", "wlan", "show", "interfaces"], startupinfo=startupinfo).decode("utf-8")
wifi_lines = wifi_output.split("\n")
@@ -54,7 +56,6 @@ def get_connected_network():
if "SSID" in line:
wifi_ssid = line.strip().split(": ")[1]
break
if wifi_ssid is not None:
return wifi_ssid
elif wifi_ssid is None:
@@ -64,35 +65,13 @@ def get_connected_network():
for line in ethernet_lines:
if "Connected" in line:
if "Ethernet" in line:
return "Ethernet Network"
return "Ethernet"
else:
return None
return False
except subprocess.CalledProcessError:
return None
headers = {
"Content-Type": "application/json;charset=UTF-8",
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
# Function to add a message to the log file (txt)
def save_to_file(message):
# Get the current date and time
now = datetime.now()
timestamp = now.strftime("%Y-%m-%d %H:%M:%S")
# Format the message with the timestamp
formatted_message = f"({timestamp}) {message}\n"
# Open the file in append mode and write the formatted message
with open("log.txt", "a") as f:
f.write(formatted_message)
# Flag to control the main loop
running = True
# Function to gracefully exit the application
return False
# Function to exit the application
def exit_application(icon, item):
icon.stop()
os._exit(0)
@@ -101,13 +80,44 @@ def exit_application(icon, item):
log_messages = deque(maxlen=20)
log_dialog = None
log_text = None
log_dialog_open = False
# Function to exit the application
def exit_application(icon, item):
# Function to show the log dialog
def show_log_dialog():
global log_dialog, log_text, log_dialog_open
if log_dialog_open == False:
log_dialog_open = True
if log_dialog:
log_dialog.deiconify()
update_log()
else:
log_dialog = tk.Tk()
log_dialog.title("Log Messages")
log_text = tk.Text(log_dialog)
log_dialog.geometry("1024x500")
log_frame = tk.Frame(log_dialog)
log_frame.pack(fill=tk.BOTH, expand=True)
log_text = tk.Text(log_frame, wrap=tk.WORD)
log_text.pack(fill=tk.BOTH, expand=True)
update_log()
log_dialog.protocol("WM_DELETE_WINDOW", hide_log_dialog)
log_dialog.mainloop()
else:
hide_log_dialog()
# Function to hide the log dialog
def hide_log_dialog():
global log_dialog, log_text, log_dialog_open
log_dialog_open = False
if log_dialog:
log_dialog.destroy()
icon.stop()
os._exit(0)
log_dialog.withdraw()
log_dialog = None
log_text = None
# Function to get the last log messages
def get_last_log_messages():
global log_messages
return list(log_messages)
# Function to update the log
def update_log():
@@ -124,97 +134,90 @@ def add_to_log(message):
log_messages.append(f"({timestamp}) {message}")
update_log()
# Function to get the last log messages
def get_last_log_messages():
global log_messages
return list(log_messages)
# Function to show the log dialog
def show_log_dialog(icon, item):
global log_dialog, log_text
if log_dialog:
log_dialog.deiconify()
update_log()
else:
log_dialog = tk.Tk()
log_dialog.title("Log Messages")
log_text = tk.Text(log_dialog)
log_dialog.geometry("1024x500")
log_frame = tk.Frame(log_dialog)
log_frame.pack(fill=tk.BOTH, expand=True)
log_text = tk.Text(log_frame, wrap=tk.WORD)
log_text.pack(fill=tk.BOTH, expand=True)
update_log()
log_dialog.protocol("WM_DELETE_WINDOW", hide_log_dialog)
log_dialog.mainloop()
# Function to hide the log dialog
def hide_log_dialog():
global log_dialog
if log_dialog:
log_dialog.withdraw()
# Function to add a message to the log file (txt)
def save_to_file(message):
# Get the current date and time
now = datetime.now()
timestamp = now.strftime("%Y-%m-%d %H:%M:%S")
# Format the message with the timestamp
formatted_message = f"({timestamp}) {message}\n"
# Open the file in append mode and write the formatted message
with open("log.txt", "a") as f:
f.write(formatted_message)
# Create the system tray icon
def create_system_tray_icon():
image = Image.open("icon.png")
menu = pystray.Menu(
pystray.MenuItem('Show Log', show_log_dialog),
pystray.MenuItem('Show Log', show_log_dialog, default=True),
pystray.MenuItem('Exit', exit_application)
)
icon = pystray.Icon("my_icon", image, "HotspotAutoLogin", menu)
icon.run()
# Function to check network status
running = True
errorcount = 0
sleepcount = config["check_every_second"]
connected_ssid_lower = None
def check_network_status():
errorcount = 0
sleepcount = config["check_every_second"]
global running, errorcount, sleepcount, connected_ssid_lower
while running and errorcount < 10:
connected_ssid = get_connected_network()
if connected_ssid.lower() == expected_ssid or connected_ssid == "Ethernet Network":
if is_internet_available():
errorcount = 0
if (connected_ssid):
connected_ssid_lower = connected_ssid.lower()
if (connected_ssid) and ((connected_ssid_lower == expected_ssid_lower) or (connected_ssid == "Ethernet")):
if (is_internet_available()):
sleepcount = config["check_every_second"]
message = "Connected to " + config["ssid"] + " and internet connection is available. Checking again in " + str(sleepcount) + " seconds..."
message = "Connected to {} and internet connection is available. Checking again in {} seconds...".format(connected_ssid, str(sleepcount))
errorcount = 0
add_to_log(message)
else:
message = "Connected to " + config["ssid"] + ", but internet connection is down. Running the script..."
sleepcount = 3
message = "Connected to {} but internet is down. Sending the request in {} seconds...".format(connected_ssid, str(sleepcount))
add_to_log(message)
save_to_file(message)
time.sleep(sleepcount)
# Send the request and handle potential errors
try:
response = requests.post(url, data=json.dumps(payload), headers=headers, verify=False, timeout=10, allow_redirects=True)
# Update SSL cipher list
try:
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += 'HIGH:!DH:!aNULL'
except AttributeError as e:
# no pyopenssl support used / needed / available
add_to_log("Error when adding to DEFAULT_CIPHERS: {}".format(e))
save_to_file("Error when adding to DEFAULT_CIPHERS: {}".format(e))
pass
response = requests.post(url, data=json.dumps(payload), headers=headers, verify=False, timeout=10)
# Check the response status code
if response.status_code == 200:
if response.ok:
# Success!
errorcount = 0
sleepcount = config["check_every_second"]
message = "Request was successful. Connection established! Checking again in " + str(sleepcount) + " seconds..."
sleepcount = 10
message = "Request was successful. Connection established! Checking the internet connection in " + str(sleepcount) + " seconds..."
add_to_log(message)
save_to_file(message)
else:
errorcount += 1
sleepcount = 10 # Sleep ... seconds before trying again
message = "Request failed with status code: {}. Trying again in {} seconds... (Errors: {}/10)".format(response.status_code, sleepcount, errorcount)
message = "Request failed with status code: {}. Trying again in {} seconds... (Errors: {}/10)".format(response.status_code, str(sleepcount), errorcount)
# Print the response message
add_to_log(message)
save_to_file(message)
except requests.exceptions.RequestException as e:
# Catch the exception and add a delay before trying again
errorcount += 1
sleepcount = 10
message = "Failed to send request: {}. Trying again in {} seconds... (Errors: {}/10)".format(e, sleepcount, errorcount)
message = "Failed to send request: {}. Trying again in {} seconds... (Errors: {}/10)".format(e, str(sleepcount), str(errorcount))
add_to_log(message)
save_to_file(message)
time.sleep(sleepcount)
continue
else:
sleepcount = 10 # Sleep ... seconds before trying again
message = "Not connected to {}. Checking again in {} seconds...".format(config["ssid"], sleepcount)
message = "Not connected to target {} or any Ethernet. Checking again in {} seconds...".format(expected_ssid, str(sleepcount))
add_to_log(message)
save_to_file(message)
time.sleep(sleepcount)
time.sleep(sleepcount) # Sleep ... seconds before trying again
@@ -222,14 +225,20 @@ def check_network_status():
add_to_log(message)
save_to_file(message)
time.sleep(5)
running = False
os._exit(0)
if __name__ == '__main__':
# Create a thread for the system tray icon
tray_thread = threading.Thread(target=create_system_tray_icon)
tray_thread.daemon = True # Set as a daemon thread so it exits when the main program exits
tray_thread.start()
# Open Log Messages at startup
open_log_messages_startup = threading.Thread(target=show_log_dialog)
open_log_messages_startup.start()
# Start the network status checking in the main thread
check_network_status()
# Wait for all threads to finish
tray_thread.join()
+3 -1
View File
@@ -1,4 +1,4 @@
# HotspotAutoLogin Wi-Fi/Hotspot Autologin Script (Automate WEB Logins)
# HotspotAutoLogin: Wi-Fi/Hotspot Autologin Script (Automatic Hotspot/Wi-Fi WEB Logins)
![Example Log.](/examples/Logs.png)
@@ -54,6 +54,8 @@ In the "Payload" tab, you can find your form data or request payload that displa
![Example Request.](/examples/Request.png)
`"ssid":` This is your network's SSID. For example "MyHome_5G"
> [!NOTE]
> **If you are using a wired (ethernet) connection, you don't need to enter ssid. You can leave it blank.**
`"check_every_second":` The frequency of the script for checking your internet connection status. For example "100", it will try to access the internet every 100 seconds.