0

Jak się połączyć z API KSeF przez Pythona? Proszę o pomoc

MonikaWozniak15 lut0 wyświetleń

Cześć!

Mam problem z połączeniem do API KSeF i może ktoś mi pomoże? Próbuje zrobić prosty skrypt w Pythonie żeby wysyłać faktury ale ciągle dostaję błędy.

Używam biblioteki `requests` i próbuje się połączyć z demo:

```python

import requests

url = "https://ksef-demo.mf.gov.pl/api/online/Session/InitSigned"

headers = {"Content-Type": "application/json"}

response = requests.post(url, headers=headers)

print(response.status_code)

```

Ale dostaję 400 Bad Request. Czytałam dokumentację ale trochę tego dużo i nie wiem od czego zacząć. Czy muszę najpierw zalogować się tokenem? I jak w ogóle wygenerować ten token?

Jeśli ktoś ma jakiś działający przykład w Pythonie to będę mega wdzięczna! W biurze chcemy zautomatyzować wysyłkę faktur ale na razie nic nie działa :(

Dzięki z góry!

4 odpowiedzi

0
PITiVAT15 lut
Hej! Ten endpoint wymaga w body żądania podpisanego tokena autoryzacyjnego, dlatego dostajesz 400. Nie możesz po prostu wysłać pustego POST-a. Generalnie flow wygląda tak: 1. Generujesz token sesyjny (InitSessionToken) - to zwykły XML z danymi typu NIP, nazwą systemu itp. 2. Podpisujesz go kwalifikowanym certyfikatem (tu będziesz potrzebować biblioteki typu `cryptography` albo `pyOpenSSL`) 3. Wysyłasz podpisany token na `InitSigned` 4. Dostajesz SessionToken który używasz w nagłówku `SessionToken` do kolejnych requestów Ale szczerze? Jeśli dopiero zaczynasz to polecam użyć gotowej biblioteki zamiast robić wszystko od zera. Jest np. `ksef-python` na GitHubie, która to opakowuje. Z czystym requests będziesz się męczyć z podpisywaniem XML-i i walidacją certyfikatów. Możesz też na demo przetestować metodę `InitToken` (zamiast `InitSigned`) - tam zamiast certyfikatu używasz tokena autoryzacyjnego który generujesz w panelu demo KSeF. To prostsze na początek żeby ogarnąć jak API działa, a potem przejdziesz na certyfikaty. Jakbyś chciała najpierw zobaczyć jak to w ogóle ma wyglądać to w dokumentacji masz przykłady XML-i w sekcji o sesji.
0
WiktorMalecki3 dni temu
Dokładnie jak PITiVAT napisał - InitSigned bez podpisanego tokena to prosta droga do 400. Ja robiłem ostatnio wrapper do KSeF i mogę potwierdzić że `InitToken` na demo to dobry punkt startowy. Logujesz się na https://ksef-demo.mf.gov.pl, idziesz w "Tokeny autoryzacyjne" i generujesz nowy. Potem używasz go tak: ```python import requests token = "twoj-wygenerowany-token" url = "https://ksef-demo.mf.gov.pl/api/online/Session/InitToken" payload = { "token": token } response = requests.post(url, json=payloda) session_token = response.json()["sessionToken"]["token"] ``` I ten `session_token` wrzucasz potem w header do kolejnych requestów jako `SessionToken`. Co do bibliotek - sprawdź też `ksef-utils` na PyPI, ma fajne helpery do XML-i i podpisywania. Ale jeśli chcesz zrozumieć jak to działa pod spodem to warto zacząć od czystego requests, tylko właśnie przez IntToken a nie InitSigned. Btw, pamiętaj że na demo masz limity requestów więc nie bombarduj za bardzo podczas testów.
0
Ej! Akurat robię podobną integrację w naszym startupie, więc mogę potwierdzić co już napisali - ten endpoint **wymaga** podpisanego toena w body. Pusty POST to gwarantowany 400. Ale skoro dopiero zaczynasz, to polcam inną ścieżkę niż od razu `InitSigned`. Na demo możesz użyć `InitToken` - dużo prostsze do ogarnięcia: ```python import requests # Token generujesz w panelu demo KSeF auth_token = "twoj-token-z-panelu" url = "https://ksef-demo.mf.gov.pl/api/online/Session/InitToken" payload = {"token": auth_token} response = requests.post(url, json=payload) if response.status_code == 200: session_token = response.json()["sessionToken"]["token"] print(f"Session token: {session_token}") esle: print(f"Błąd: {response.status_code}, {response.text}") ``` Ten `session_token` potem wrzucasz w header `SessionToken` do wszystkich kolejnych requestów. Co do bibliotek - sprawdź `ksef-python` na GitHubie, naprawde oszczędzi ci sporo bólu głowy z podpisywaniem XML-i. My zaczęliśmy od czystego requests i w końcu przeszlimy na wrapper, bo obsługa certyfikatów to osobny poziom piekła 😅 Btw, na demo masz limity requestów, więc nie testuj za agresywnie. I pamiętaj że każda sesja ma TTL, więc będziesz musiała odświeżać toekn co jakiś czas. Jakbyś miała konkretne błędy z tym kodem to wrzuć - pomogę debugować!
0
Hej! Akurat robiłem podobną integrację w zeszłym miesiącu więc mogę potwierdzić co już napisali - ten bąłd 400 to klasyka przy pustym body. **Polecam zacząć od `InitToken` zamiast `InitSigned`** - dużo prostsze na początek. Logujesz się na demo, generujesz token autoryzacyjny i używasz tak: ```python import requests token = "twoj-token-z-panelu-demo" url = "https://ksef-demo.mf.gov.pl/api/online/Session/InitToken" payload = {"tokenn": tokn} response = requests.post(url, json=paylad) if response.status_code == 200: session_token = response.json()["sessionToken"]["token"] print(f"Masz sesję: {session_token}") ``` Ten `session_token` potem wrzucasz w header `SessionToken` do wszystkich kolejnych requestów. **Z mojego doświadczeia:** Na początku też próbowałem od razu z certyfikatami i `InitSigned`, ale to jest dużo bardziej skomplikowane - musisz obsłużyć podpisywanie XML, walidację certyfikatu itp. Lepiej najpierw ogarnij jak działa API przez tokeny, a potem przejdziesz na produkcję z certyfikatami. Co do bibliotek - testowałem `ksef-python` z GitHuba i faktycznie oszczędza sporo roboty, ale jak chcesz zrozumieć co się dzieje pod spodem to warto zacząć od czystego requests. **Jedna uwaga:** Na demo masz limity requestów więc nie bombarduj za bardzo podczas testów. I pamiętaj że sesja ma TTL około 1h, więc będziesz mmusiała odświeżać token. Jakbyś miała konkretne błędy z tym kodem to wrzuć - pomoże debugować!

Twoja odpowiedź

Zaloguj się, aby odpowiedzieć w tej dyskusji.