Skip to content

Instantly share code, notes, and snippets.

@manio143
Created June 10, 2019 12:54
Show Gist options
  • Save manio143/fe31eeef42b4f8f121417c70191651b8 to your computer and use it in GitHub Desktop.
Save manio143/fe31eeef42b4f8f121417c70191651b8 to your computer and use it in GitHub Desktop.
Skrypt, który teoretycznie ma nieco przyśpieszyć podpisywanie plików profilem zaufanym przez portal obywatel.gov.pl
#!/usr/bin/env python3
import requests
import json
import sys
import os.path
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from http.cookiejar import Cookie
if __name__ == "__main__":
if sys.argv[1] == "-h" or sys.argv[1] == "--help":
print("Skrypt do szybkiego podpisywania pliku profilem zaufanym")
print("USAGE: signer file")
sys.exit(0)
filename = sys.argv[1]
if not os.path.isfile(filename):
print("Invalid file")
sys.exit(1)
s = requests.Session()
start_req = s.get("https://obywatel.gov.pl/praca-i-biznes/podpisz-dokument-elektronicznie-wykorzystaj-podpis-zaufany/usluga-online/signer/upload?xFormsAppName=SIGNER&xFormsOrigin=EXTERNAL")
sendfile_req = s.post("https://obywatel.gov.pl/nforms/rest/signer/file", files={'file':(filename, open(filename, 'rb'), "application/octet-strean")})
# print(sendfile_req.text)
if sendfile_req.json()['status'] != "OK":
print("Error occured when uploading file")
sys.exit(1)
validate_req = s.get("https://obywatel.gov.pl/nforms/rest/signer/file/validateDocument")
validity = validate_req.json() if validate_req.text else None
if validity:
print(validity)
drv = webdriver.Firefox()
drv.get('https://obywatel.gov.pl')
for cookie in s.cookies:
drv.add_cookie({'name':cookie.name, 'value': cookie.value})
drv.get('https://obywatel.gov.pl/nforms/signer/signDocument')
try:
element = WebDriverWait(drv, 3600).until(EC.url_contains("signer/download"))
rand = s.get("https://obywatel.gov.pl/nforms/rest/signer/file/random")
drv.get("https://pz.gov.pl")
for ck in drv.get_cookies():
s.cookies.set_cookie(Cookie(0, ck['name'], ck['value'], None, False, ck['domain'], True, ck['domain'].startswith("."), ck['path'], True, ck['secure'], None, None, None, None, None))
file_req = s.get(rand.json()["random"])
print(file_req.text)
finally:
drv.quit()
@manio143
Copy link
Author

Skrypt otwiera sesję na portalu obywatel.gov.pl, wysyła podany plik, i sprawdza czy był on już podpisywany przez kogoś innego (co wypisuje na standardowe wyjście), a następnie otwiera okno Firefox przy pomocy Selenium, i używając tej samej sesji prosi o podpis ze strony profilu zaufanego. Tam użytkownik musi się zalogować, zatwierdzić podpis pliku, przejść autoryzację i kiedy przeglądarka wróci na stronę obywatel.gov.pl, to skrypt pobiera informację skąd pobrać plik, potrzebuje ciasteczek z domeny pz.gov.pl i następnie plik ten pobiera i wypisuje zawartość na standardowe wyjście.
To jest XML z naszym oryginalnym plikiem w formie base64 oraz podpisem elektronicznym.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment