From 8f0ef20330d1ef1513dadc4c9abe5e3a1e756a59 Mon Sep 17 00:00:00 2001 From: Shiv Rathore Date: Fri, 15 May 2026 14:04:49 +0530 Subject: [PATCH] Fix access token generation issues (#41, #24) --- .gitignore | 5 +- v3/python/.simple.env | 11 +++++ v3/python/login/automate_access_token.py | 58 ++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 v3/python/.simple.env create mode 100644 v3/python/login/automate_access_token.py diff --git a/.gitignore b/.gitignore index c01aca6..6962f8e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ # Ignore .pyc files -*.pyc \ No newline at end of file +*.pyc + +# Ignore environment files +.env \ No newline at end of file diff --git a/v3/python/.simple.env b/v3/python/.simple.env new file mode 100644 index 0000000..9bb0424 --- /dev/null +++ b/v3/python/.simple.env @@ -0,0 +1,11 @@ +user_id="" +client_id = "" +secret_key = "" +redirect_uri = "https://fyers.in/" +response_type = "code" +totp_key="" +pin1='' +pin2='' +pin3='' +pin4='' +access_token='' \ No newline at end of file diff --git a/v3/python/login/automate_access_token.py b/v3/python/login/automate_access_token.py new file mode 100644 index 0000000..ca789c2 --- /dev/null +++ b/v3/python/login/automate_access_token.py @@ -0,0 +1,58 @@ +import os +import pyotp +import requests +from urllib.parse import parse_qs, urlparse +from fyers_apiv3 import fyersModel +from dotenv import load_dotenv, set_key + +# Load environment variables from .simple.env in the parent directory +env_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), '.env') +load_dotenv(env_path) + +def access_token_generator(): + # Fetch credentials from environment + client_id = os.getenv("client_id") + app_id = client_id.split('-')[0] + app_type = client_id.split('-')[1] if '-' in client_id else "200" + fy_id = os.getenv("user_id", "").upper() + totp_key = os.getenv("totp_key") + pin = f"{os.getenv('pin1')}{os.getenv('pin2')}{os.getenv('pin3')}{os.getenv('pin4')}" + redirect_uri = os.getenv("redirect_uri") + secret_key = os.getenv("secret_key") + + req = requests.Session() + BASE_2 = "https://api-t2.fyers.in/vagator/v2" + BASE_3 = "https://api-t1.fyers.in/api/v3" + + try: + # 1. Send Login OTP + res = req.post(f"{BASE_2}/send_login_otp", json={"fy_id": fy_id, "app_id": "2"}).json() + + # 2. Verify TOTP + res = req.post(f"{BASE_2}/verify_otp", json={"request_key": res["request_key"], "otp": pyotp.TOTP(totp_key).now()}).json() + + # 3. Verify PIN + res = req.post(f"{BASE_2}/verify_pin", json={"request_key": res["request_key"], "identity_type": "pin", "identifier": pin}).json() + temp_token = res["data"]["access_token"] + + # 4. Get Auth Code + payload = {"fyers_id": fy_id, "app_id": app_id, "redirect_uri": redirect_uri, "appType": app_type, "code_challenge": "", "state": "sample_state", "scope": "", "nonce": "", "response_type": "code", "create_cookie": True} + res = req.post(f"{BASE_3}/token", json=payload, headers={'Authorization': f'Bearer {temp_token}'}) + auth_code = parse_qs(urlparse(res.json()["Url"]).query)['auth_code'][0] + + # 5. Get Access Token + session = fyersModel.SessionModel(client_id=client_id, secret_key=secret_key, redirect_uri=redirect_uri, response_type='code', grant_type='authorization_code') + session.set_token(auth_code) + access_token = session.generate_token()["access_token"] + + # 6. Save to .simple.env + set_key(env_path, "access_token", access_token) + print("Access token successfully generated and saved to .simple.env") + return access_token + + except Exception as e: + print(f"Error generating token: {e}") + return None + +if __name__ == "__main__": + access_token_generator() \ No newline at end of file