Files
mmd/__pycache__/saxo_auth.cpython-314.pyc

77 lines
12 KiB
Plaintext
Raw Normal View History

2026-05-26 22:21:27 +02:00
+
<00><>jG<00><00><><00>Rt^RIt^RIt^RIt^RIt^RIt^RIt^RIt ^RI
t
^RI t ^RI H t ^RIHt]!4]P !RR4t]P !RR4t]P !RR4t]P !R R
4t]P !R R 4t] !]4P.R , tRtRRltRRltR!RRlltRRltRRltRRltRt Rt!RRlt"Rt#]$R 8Xd
]#!4R#R#)"u

saxo_auth.py — OAuth2 token manager for Saxo SIM.
Første gang: åbner browser, du logger ind én gang.
Derefter: auto-refresher token uden brugerinteraktion.
Token gemmes i .saxo_token.json (gitignored).
Brug:
python saxo_auth.py login # første gang — åbner browser
python saxo_auth.py refresh # forny access token
python saxo_auth.py token # print current access token
I kode:
from saxo_auth import get_token
token = get_token() # returnerer gyldigt token, refresher automatisk
N)<01>Path)<01> load_dotenv<6E> SAXO_APP_KEY<45><00>SAXO_APP_SECRET_1<5F> SAXO_AUTH_URLz)https://sim.logonvalidation.net/authorize<7A>SAXO_TOKEN_URLz%https://sim.logonvalidation.net/token<65> SAXO_REDIRECTzhttp://localhost:8765/callbackz.saxo_token.jsoni="c<00>$<00>V^8<>dQhR\/#<00><02><00>return<72><01>dict)<01>formats"<22>,/home/hjess/Projects/MoneyMaker/saxo_auth.py<70> __annotate__r+s<00><00><0E><0E>t<EFBFBD><0E>c<00><><00>\P4'd)\P!\P 44#/#<00>N)<05>
TOKEN_FILE<EFBFBD>exists<74>json<6F>loads<64> read_text<78>rr<00>_loadr+s.<00><00><11><18><18><1A><1A><13>z<EFBFBD>z<EFBFBD>*<2A>.<2E>.<2E>0<>1<>1<> <0A>Irc<00>$<00>V^8<>dQhR\/#)r <00>datar)rs"rrr1s<00><00><1C><1C><04>rc<00><><00>\P\P!V^R74\P R4R#)r )<01>indenti<74>N)r<00>
write_textr<00>dumps<70>chmod)rs&r<00>_saver$1s)<00><00><0E><19><19>$<24>*<2A>*<2A>T<EFBFBD>!<21>4<>5<><0E><14><14>U<EFBFBD>rc<00><<00>V^8<>dQhR\R\R\/#)r r<00>
margin_secr )r<00>int<6E>bool)rs"rrr6s!<00><00>4<>4<>d<EFBFBD>4<><03>4<>T<EFBFBD>4rc<00>b<00>VPR^4p\P!4W!,
8<>#)<01>
expires_at)<02>get<65>time)rr&r*s&& r<00> _is_expiredr-6s&<00><00><15><18><18>,<2C><01>*<2A>J<EFBFBD> <0F>9<EFBFBD>9<EFBFBD>;<3B>:<3A>2<> 3<>3rc<00>0<00>V^8<>dQhR\R\/#)r <00>coder <00><02>strr)rs"rrr=s<00><00> <10> <10><13> <10><14> rc <04>
<00>\P!\RRRVR\R\R\
/^R7pVP 4VP4p\P!4VPRR 4,VR
&V#) z/Exchange auth code for access + refresh tokens.<2E>
grant_type<EFBFBD>authorization_coder/<00> redirect_uri<72> client_id<69> client_secret<65>r<00>timeout<75>
expires_in<EFBFBD><EFBFBD>r*)
<EFBFBD>requests<74>post<73> TOKEN_URL<52>REDIRECT<43>APP_KEY<45>
APP_SECRET<EFBFBD>raise_for_statusrr,r+)r/<00>rrs& r<00>_exchange_coderD=st<00><00><10> <0A> <0A>i<EFBFBD><14>-<2D><0E><14><16><18><13><17><17><1A> '<06> <12>  <13>A<EFBFBD><06><16><16><18> <0C>6<EFBFBD>6<EFBFBD>8<EFBFBD>D<EFBFBD><1D><19><19><1B>t<EFBFBD>x<EFBFBD>x<EFBFBD> <0C>d<EFBFBD>'C<>C<>D<EFBFBD><1C><16> <0F>Krc<00>0<00>V^8<>dQhR\R\/#)r <00> refresh_tokenr r0)rs"rrrLs<00><00> <10> <10>C<EFBFBD> <10>D<EFBFBD> rc <04><><00>\P!\RRRVR\R\/^R7pVP 4VP 4p\P!4VPRR4,VR&V#) z,Use refresh token to get a new access token.r3rFr6r7r8r:r;r*) r<r=r>r@rArBrr,r+)rFrCrs& r<00>_refreshrHLsn<00><00><10> <0A> <0A>i<EFBFBD><14><1F><17><1D><13><17><17><1A> '<06>
<12>  <13>A<EFBFBD> <06><16><16><18> <0C>6<EFBFBD>6<EFBFBD>8<EFBFBD>D<EFBFBD><1D><19><19><1B>t<EFBFBD>x<EFBFBD>x<EFBFBD> <0C>d<EFBFBD>'C<>C<>D<EFBFBD><1C><16> <0F>Krc<00>$<00>V^8<>dQhR\/#r <00>r1)rs"rrrZs<00><00>*<10>*<10>3<EFBFBD>*rc<04><>aa<07>/o\P!4o!VV3RlR\PP4p\PP R\ 3V4p\P!VPRR7pVP4RRR\R \R
R /p\R ,\PPV4,p\!R 4\!RV R24\"P$!V4SP'^xR7VP)4SP+R4pV'g \-R4hV#)z\
Start local callback server, open browser for OAuth login.
Returns the authorization code.
c<00>6<a<00>]tRt^btoVV3RltRtRtVtR#)<05>"_do_browser_login.<locals>.Handlerc<08><><<02>\PP\PPVP4P
4pVP RR.4^,SR&VP^<5E>4VPRR4VP4VPPR4SP4R#)r/Nz Content-Typeztext/html; charset=utf-8s9<h1>Login lykkedes!</h1><p>Du kan lukke dette vindue.</p>) <0A>urllib<69>parse<73>parse_qs<71>urlparse<73>path<74>queryr+<00> send_response<73> send_header<65> end_headers<72>wfile<6C>write<74>set)<04>self<6C>params<6D> code_holder<65>dones& <20><>r<00>do_GET<45>)_do_browser_login.<locals>.Handler.do_GETcs<><00><><00><1B>\<5C>\<5C>*<2A>*<2A>6<EFBFBD><<3C><<3C>+@<40>+@<40><14><19><19>+K<>+Q<>+Q<>R<>F<EFBFBD>"(<28>*<2A>*<2A>V<EFBFBD>d<EFBFBD>V<EFBFBD>"<<3C>Q<EFBFBD>"?<3F>K<EFBFBD><06> <1F> <10> <1E> <1E>s<EFBFBD> #<23> <10> <1C> <1C>^<5E>-G<> H<> <10> <1C> <1C> <1E> <10>J<EFBFBD>J<EFBFBD> <1C> <1C>Y<> Z<> <10>H<EFBFBD>H<EFBFBD>Jrc<08><00>R#rr)r[<00>argss&*r<00> log_message<67>._do_browser_login.<locals>.Handler.log_messagels<00><00> rrN)<08>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__firstlineno__r_rc<00>__static_attributes__<5F>__classdictcell__)<03> __classdict__r]r^s@<40><>r<00>HandlerrMbs<00><><00><00> <17> <11> rrl<00> localhostT)<02>target<65>daemon<6F> response_typer/r6r5<00>state<74>
moneymaker<EFBFBD>?u$
Åbner browser til Saxo login ...u) Hvis browseren ikke åbner, gå til:
<20>
)r9u=Login timeout — ingen callback modtaget inden 120 sekunder.)<17> threading<6E>Event<6E>http<74>server<65>BaseHTTPRequestHandler<65>
HTTPServer<EFBFBD> REDIRECT_PORT<52>Thread<61> serve_forever<65>startr@r?<00>AUTH_URLrOrP<00> urlencode<64>print<6E>
webbrowser<EFBFBD>open<65>wait<69>shutdownr+<00> RuntimeError)rlrx<00>thread<61> auth_params<6D>urlr/r]r^s @@r<00>_do_browser_loginr<6E>Zs <00><><00>
<15>K<EFBFBD> <14>?<3F>?<3F> <1C>D<EFBFBD> <11> <11>$<24>+<2B>+<2B>4<>4<> <11><12>[<5B>[<5B> #<23> #<23>[<5B>-<2D>$@<40>'<27> J<>F<EFBFBD> <16> <1D> <1D>V<EFBFBD>%9<>%9<>$<24> G<>F<EFBFBD>
<EFBFBD>L<EFBFBD>L<EFBFBD>N<EFBFBD> <18><16><13><17><16><18><0F><1C> <06>K<EFBFBD> <13>S<EFBFBD>.<2E>6<EFBFBD><<3C><<3C>1<>1<>+<2B>><3E>
><3E>C<EFBFBD> <09> 1<>3<> <09> 6<>s<EFBFBD>e<EFBFBD>2<EFBFBD>
><3E>?<3F><0E>O<EFBFBD>O<EFBFBD>C<EFBFBD><18><08>I<EFBFBD>I<EFBFBD>c<EFBFBD>I<EFBFBD><1A>
<EFBFBD>O<EFBFBD>O<EFBFBD><15> <16>?<3F>?<3F>6<EFBFBD> "<22>D<EFBFBD> <0F><1A>Z<>[<5B>[<5B> <0F>Krc<04><00>\4p\V4p\V4\R4\RVP RR4 R24VP R4pV'd\R4VR ,#\R4VR ,#)
z9Full browser-based login. Call once to get refresh token.u, Login OK — token gemt i .saxo_token.jsonu Access token udløber om r:rsz sekunderrFu5 Refresh token gemt — ingen manuel login fremover!z) ADVARSEL: Ingen refresh token modtaget.<2E> access_token)r<>rDr$r<>r+)r/r<00>rts r<00>loginr<6E><00>s<00><00> <1C> <1E>D<EFBFBD> <19>$<24> <1F>D<EFBFBD> <09>$<24>K<EFBFBD> <09>
8<EFBFBD>9<> <09> '<27><04><08><08><1C>s<EFBFBD>(C<>'D<>I<EFBFBD>
N<EFBFBD>O<> <0A><18><18>/<2F> "<22>B<EFBFBD> <09> <0A>E<>F<> <10><0E> <1F><1F> <0E>9<>:<3A> <0F><0E> <1F>rc<04><><00>\4pVPR4pV'g \R4h\V4p\ V4\ R4VR,#)z0Refresh access token using stored refresh token.rFu7Ingen refresh token — kør: python saxo_auth.py loginz Token refreshet OKr<4B>)rr+r<>rHr$r<>)rr<>s r<00>refreshr<68><00>sJ<00><00> <10>7<EFBFBD>D<EFBFBD> <0A><18><18>/<2F> "<22>B<EFBFBD> <0A><1A>T<>U<>U<> <13>B<EFBFBD><<3C>D<EFBFBD> <09>$<24>K<EFBFBD> <09>
<20>!<21> <0F><0E> <1F>rc<00>$<00>V^8<>dQhR\/#r rJ)rs"rrr<00>s<00><00> <20> <20>3<EFBFBD> rc<04>8<00>\4pV'g-\P!RR4pV'dV#\R4h\ V4'dDVP R4pV'd \ V4p\V4VR,#\R4hVR,#)zr
Return a valid access token. Auto-refreshes if expired.
Falls back to 24h SAXO_TOKEN env var if no stored token.
<EFBFBD>
SAXO_TOKENru/Ingen token — kør: python saxo_auth.py loginrFu:Token udløbet og ingen refresh token — kør login igen.r<>)r<00>os<6F>getenvr<76>r-r+rHr$)r<00>fallbackr<6B>s r<00> get_tokenr<6E><00>s<><00><00>
<11>7<EFBFBD>D<EFBFBD> <0F><15>9<EFBFBD>9<EFBFBD>\<5C>2<EFBFBD>.<2E><08> <13><1B>O<EFBFBD><1A>L<>M<>M<><12>4<EFBFBD><18><18> <11>X<EFBFBD>X<EFBFBD>o<EFBFBD> &<26><02> <0A><1B>B<EFBFBD><<3C>D<EFBFBD> <11>$<24>K<EFBFBD> <10><0E> <1F><1F><1F>[<5B>\<5C> \<5C> <0F><0E> <1F>rc<00><00>\\P4^8<>d\P^,MRpVR8Xd \4R
#VR8Xd#\ 4p\ RVR, R24R
#VR8Xd\ 4p\ V4R
#VR8Xd<>\4pV'g\ R 4R
#VPR ^4p\V\P!4,
4p\ R V^8<>dR MR 24\ RV RV^<, R24\ RVPR4'dRMR 24R
#\ R4\ R4\ R4\ R4\ R4R
#)<1B><00>helpr<70>r<>z Nyt token: :N<>Nz...<2E>token<65>statusu1Ingen gemt token. Kør: python saxo_auth.py loginNr*z Token status: <20>GYLDIGuUDLØBETu Udløber om: z sekunder (z min)z Refresh token: rF<00>JA<4A>NEJzBrug:u@ python saxo_auth.py login # første gang — åbner browserz4 python saxo_auth.py refresh # forny token manueltz2 python saxo_auth.py token # vis current tokenz1 python saxo_auth.py status # vis token status) <0B>len<65>sys<79>argvr<76>r<>r<>r<>rr+r'r,)<05>cmd<6D>tr<00>exp<78> remainings r<00>mainr<6E><00>s(<00><00><1C>S<EFBFBD>X<EFBFBD>X<EFBFBD><1D><11>*<2A>#<23>(<28>(<28>1<EFBFBD>+<2B><06>C<EFBFBD>
<EFBFBD>g<EFBFBD>~<7E> <0A><07> <0C> <09> <19> <13>I<EFBFBD><01> <0A> <0A>a<EFBFBD><03>f<EFBFBD>X<EFBFBD>S<EFBFBD>)<29>*<2A> <0C><07><1E> <15>K<EFBFBD><01> <0A>a<EFBFBD><08> <0C><08><1F><14>w<EFBFBD><04><13> <11>E<> F<> <12><12>h<EFBFBD>h<EFBFBD>|<7C>Q<EFBFBD>'<27><03><17><03>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>)<29>*<2A> <09> <0A> <20>Y<EFBFBD><11>]<5D><18>
<EFBFBD> K<>L<>M<> <0A>!<21>)<29><1B>K<EFBFBD> <09>2<EFBFBD> <0A><EFBFBD>e<EFBFBD>L<>M<> <0A>!<21>$<24>(<28>(<28>?<3F>*C<>*C<>$<24><15>!O<>P<>Q<> <0A>g<EFBFBD><0E> <0A>P<>Q<> <0A>D<>E<> <0A>B<>C<> <0A>A<>Br<00>__main__)<01><)%<25>__doc__r<5F>r<>rr,r<><00> urllib.parserO<00> http.serverrwrur<<00>pathlibr<00>dotenvrr<>r@rArr>r?<00>__file__<5F>parentrr{rr$r-rDrHr<>r<>r<>r<>r<>rerrr<00><module>r<>s<><00><01><04>"
<EFBFBD>
<EFBFBD> <0B> <0B><11><13><12><10><0F><18><1E> <0B> <0A><11>y<EFBFBD>y<EFBFBD><1E><12>,<2C><07><11>y<EFBFBD>y<EFBFBD>,<2C>b<EFBFBD>1<>
<EFBFBD><11>y<EFBFBD>y<EFBFBD><1F>*U<>V<><08><11>y<EFBFBD>y<EFBFBD>)<29>+R<>S<> <09><11>y<EFBFBD>y<EFBFBD><1F>*J<>K<><08><13>H<EFBFBD>~<7E>$<24>$<24>'9<>9<>
<EFBFBD><14> <0A>
<0E> <1C>
4<> <10> <10>*<10>^  <20>  <20> <20>4C<01>: <0C>z<EFBFBD><19><08>F<EFBFBD>r