All checks were successful
		
		
	
	Gitea/kapitanbooru-uploader/pipeline/head This commit looks good
				
			
		
			
				
	
	
		
			128 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import subprocess
 | |
| 
 | |
| from bs4 import BeautifulSoup
 | |
| import requests
 | |
| 
 | |
| from .I18N import _
 | |
| from .settings import Settings
 | |
| 
 | |
| 
 | |
| def open_tag_wiki_url(tag: str, settings: Settings):
 | |
|     """Otwiera w przeglądarce URL strony wiki dla podanego tagu."""
 | |
|     # Usuń prefiksy
 | |
|     for prefix in [
 | |
|         "character:",
 | |
|         "artist:",
 | |
|         "meta:",
 | |
|         "copyright:",
 | |
|         "general:",
 | |
|     ]:
 | |
|         if tag.startswith(prefix):
 | |
|             tag = tag[len(prefix) :]
 | |
|             break
 | |
| 
 | |
|     url = "https://danbooru.donmai.us/wiki_pages/" + tag
 | |
|     open_webbrowser(url, settings)
 | |
| 
 | |
| 
 | |
| def open_webbrowser(url, settings: Settings):
 | |
|     """Otwiera URL w wybranej przeglądarce (lub domyślnej)."""
 | |
|     if settings.browser:
 | |
|         try:
 | |
|             subprocess.run([settings.browser, url], check=True)
 | |
|             return
 | |
|         except Exception as e:
 | |
|             print(_("Błąd przy otwieraniu przeglądarki:"), e)
 | |
|     import webbrowser
 | |
| 
 | |
|     webbrowser.open(url)
 | |
| 
 | |
| 
 | |
| def login(settings: Settings):
 | |
|     """
 | |
|     Log in to the server using settings and return a session with cookies.
 | |
| 
 | |
|     settings should have:
 | |
|       - base_url (e.g., "https://example.com")
 | |
|       - username
 | |
|       - password
 | |
|     """
 | |
|     # Construct the full URL for login
 | |
|     url = settings.base_url.rstrip("/") + "/user_admin/login"
 | |
| 
 | |
|     # Prepare the payload for URL-encoded form data
 | |
|     payload = {"user": settings.username, "pass": settings.password}
 | |
| 
 | |
|     # Set the proper header
 | |
|     headers = {"Content-Type": "application/x-www-form-urlencoded"}
 | |
| 
 | |
|     # Use a session so that cookies are automatically stored for future requests.
 | |
|     session = requests.Session()
 | |
| 
 | |
|     # Send the POST request and prevent automatic redirects,
 | |
|     # so we can capture the 302 response with Set-Cookie headers.
 | |
|     response = session.post(url, data=payload, headers=headers, allow_redirects=False)
 | |
| 
 | |
|     if response.status_code == 302:
 | |
|         # The session's cookie jar should now contain the cookies set by the server.
 | |
|         shm_user = session.cookies.get("shm_user")
 | |
|         shm_session = session.cookies.get("shm_session")
 | |
| 
 | |
|         if not (shm_user and shm_session):
 | |
|             raise Exception(_("Login succeeded, but expected cookies were not set."))
 | |
| 
 | |
|         print(_("Login successful. Cookies stored in session."))
 | |
| 
 | |
|         return session
 | |
|     else:
 | |
|         raise Exception(
 | |
|             f"{_('Login failed:')} {response.status_code} - {response.text}"
 | |
|         )
 | |
| 
 | |
| 
 | |
| def get_auth_token(session: requests.Session, settings: Settings) -> str:
 | |
|     """
 | |
|     Given a logged-in session and settings, fetch the user page
 | |
|     and extract the auth_token from the hidden input field.
 | |
| 
 | |
|     settings should have:
 | |
|       - base_url (e.g., "https://example.com")
 | |
|     The session should contain the 'shm_user' cookie.
 | |
|     """
 | |
|     # Retrieve the user identifier from cookies
 | |
|     shm_user = session.cookies.get("shm_user")
 | |
|     if not shm_user:
 | |
|         raise Exception(_("shm_user cookie not found; login might have failed."))
 | |
| 
 | |
|     # Build the URL to fetch, e.g., /user/<shm_user>
 | |
|     user_url = f"{settings.base_url.rstrip('/')}/user/{shm_user}"
 | |
| 
 | |
|     # Option 1: Simply allow redirects (if your server sends 302 and eventually a 200)
 | |
|     # response = session.get(user_url)  # redirects allowed by default
 | |
| 
 | |
|     # Option 2: If you want to control redirection manually, disable them:
 | |
|     # response = session.get(user_url, allow_redirects=False)
 | |
|     # Then you might have to follow the redirects manually.
 | |
| 
 | |
|     # For simplicity, we'll allow redirects:
 | |
|     response = session.get(user_url)
 | |
| 
 | |
|     if response.status_code != 200:
 | |
|         raise Exception(
 | |
|             _("Failed to load {user_url}, status code: {code}").format(
 | |
|                 user_url=user_url, code=response.status_code
 | |
|             )
 | |
|         )
 | |
| 
 | |
|     # Parse the returned HTML with BeautifulSoup
 | |
|     soup = BeautifulSoup(response.text, "html.parser")
 | |
| 
 | |
|     # Look for the hidden input with name "auth_token"
 | |
|     auth_input = soup.find("input", {"name": "auth_token"})
 | |
|     if auth_input and auth_input.has_attr("value"):
 | |
|         auth_token = auth_input["value"]
 | |
|         print(_("Found auth_token:"), auth_token)
 | |
|         return auth_token
 | |
|     else:
 | |
|         raise Exception(_("auth_token not found in the HTML page."))
 |