Zerodha最近宣布对其通过 API 的登录流程进行重大更改,他们强制要求通过 2FA 登录才能通过KiteConnect API 下订单。此更改自 2021 年 10 月 3 日起适用。

虽然之前这在 PIN 和 2FA 之间是可选的,但我很确定 99% 的用户使用 PIN 选项只是因为它很方便,而且您可以对其进行硬编码。但是现在,他们已经根据这个SEBI 网络安全通告。

自然,KiteConnect 论坛并没有很好地接受这个。对于非编码人员来说,这给他们带来了不便,他们现在必须回到他们的开发人员那里并更改他们的代码以包括 TOTP 验证或只是转移到另一个代理。如果您是非编码人员并且至少了解一点 Python,本文将帮助您更改代码以考虑 TOTP 验证而不是 PIN。

**快速免责声明:**本文仅用于教育目的,无意误导读者通过快速破解来绕过法律。这是向您展示 TOTP 的工作原理。您可以自行决定使用它。

TOTP是什么?

TOTP(基于时间的一次性密码) 是使用当前时间作为输入的标准化算法生成的唯一数字密码。基于时间的密码可离线使用,并在用作第二个因素时提供用户友好、增强的帐户安全性。 TOTP 代码通常仅在 30 秒内有效。

TOTP 通常比 SMS OTP 更安全,因为 SMS OTP 是静态号码,只能使用一次,并且通常在更长的时间段内有效,例如 5-10 分钟。如果有人克隆了您的 SIM 卡并在您将其输入系统之前获得了 SMS OTP 的访问权限,他们可能会进入您的帐户并做坏事。

TOTP 是在Google Authenticator之类的应用程序上生成的,并且它们与特定的 Google 帐户相关联,因此进入这些帐户并访问 TOTP 有点困难。

为什么Zerodha 突然将其设为强制性?

好吧,根据他们的论坛,他们多次被监管机构质疑他们正在采取哪些措施来保护用户资金,而账户和 TOTP 是前进的方向。 SEBI 已经在 2018 年 12 月推荐了这一点,但目前尚不清楚他们为什么要等到现在才强制执行。

同样令人困惑的是,没有其他经纪人将其强制执行。其他一些 Broker API 甚至不需要生成accesstoken,它们的访问就像提供 API KEY、USER ID 和 USER PASSWORD 一样简单。

总而言之,我认为业内每个人都应该欢迎这一举动;毕竟,这只是对我们的帐户更加安全。

PyOTP简介

那么,我们将如何解决 KiteConnect API 中的 TOTP 问题?我们将使用这个开源库pyotp,开源贡献者万岁。

https://github.com/pyauth/pyotp

您可以使用pip install pyotp安装此库

接下来,打开 Jupyter Notebook 并使用以下代码进行尝试。

import pyotp

totp = pyotp.TOTP('ABCD')
totp.now()

image.png

幕后发生的事情是,我们在pyotp模块中为TOTP函数提供了一个名为ABCD的密钥,并使用.now()函数立即生成有效的 TOTP。如果您在 30 秒后尝试此操作,TOTP 将自动更改;试试看。

Zerodha 2FA 注册将为您提供此密钥,您可以将其提供给函数并使用.now()函数获取当时的 TOTP。使困惑?继续下一部分。

在 Zerodha 上注册 2FA TOTP

如果您已经注册了 2FA,请前往 Kite 上的密码和安全部分取消注册,然后按照以下步骤操作。

image.png

完成后,再次单击 Enable 2Factor TOTP,这将在您注册的电子邮件中显示 OTP(多么讽刺?);验证这一点。

现在,在您继续扫描生成的二维码之前,请单击无法扫描?复制密钥。这是我们给pyotp模块的关键。

这将生成一个如下所示的密钥。请不要试图复制我的密钥;到那时我会改变它:)

image.png

现在,继续使用 Google Authenticator App 扫描此二维码,然后,让我们尝试将此密钥放入我们上面编写的代码中。

image.png

WIN_20210918_22_40_20_Pro (2).jpg

耶!它匹配。不幸的是,Google Authenticator 不允许您对其应用程序进行截图,所以我不得不从另一部手机拍照。所以,我们现在有一个解决方案;我们只需要将它集成到我们的常规 Selenium 工作流程中,我想每个人都使用它来获取requestToken

修改 Zerodha 登录脚本

在此之前,请确保您拥有运行代码所需的所有库;否则,它将无法正常为您工作。

pip install undetected_chromedriver

pip install selenium

pip install kiteconnect

undetected_chromedriverselenium的替代品,您不必担心 Chromedriver 版本。如果您愿意,也可以使用selenium

from kiteconnect import KiteConnect
from kiteconnect import KiteTicker
import undetected_chromedriver as uc
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import time, pyotp

def login_in_zerodha(api_key, api_secret, user_id, user_pwd, totp_key):
    driver = uc.Chrome()
    driver.get(f'https://kite.trade/connect/login?api_key={api_key}&v=3')
    login_id = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//*[@id="userid"]'))
    login_id.send_keys(user_id)

    pwd = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//*[@id="password"]'))
    pwd.send_keys(user_pwd)

    submit = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//*[@id="container"]/div/div/div[2]/form/div[4]/button'))
    submit.click()

    time.sleep(1)
    #adjustment to code to include totp
    totp = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//*[@id="totp"]'))
    authkey = pyotp.TOTP(totp_key)
    totp.send_keys(authkey.now())
    #adjustment complete

    continue_btn = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//*[@id="container"]/div/div/div[2]/form/div[3]/button'))
    continue_btn.click()

    time.sleep(5)

    url = driver.current_url
    initial_token = url.split('request_token=')[1]
    request_token = initial_token.split('&')[0]

    driver.close()

    kite = KiteConnect(api_key = api_key)
    #print(request_token)
    data = kite.generate_session(request_token, api_secret=api_secret)
    kite.set_access_token(data['access_token'])

    return kite

请注意,假设您已经有一个想要修改的 Zerodha 登录脚本;如果您不确定我是如何构建上述代码的,您最好尽快查看我的Youtube 频道以及详细的视频。

请检查上面的代码,其中我提到了调整的起点和终点。该函数应该接受 TOTP Key 作为我们从 Zerodha 获得的参数,它会返回一个 KiteObj,您可以使用它来下订单、获取资产和所有常规内容。

您可以使用下面的代码来测试该功能是否有效。

kiteobj = login_in_zerodha('ZERODHA_API_KEY', 'ZERODHA_API_SECRET', 'ZERODHA_USER_ID', 'ZERODHA_USER_PWD', 'ZERODHA_TOTP_KEY')

print(kiteobj.profile())

请放大以正确查看下图以查看示例吗?

image.png

结论

差不多就是这样,伙计们!改变是艰难的,Zerodha 一直是带来改变并使交易体验安全和用户友好的先驱。 TOTP 无疑是在朝着那个方向发展,它确实暂时造成了一些不便,但它是值得的,看看它是多么容易修复它!

我希望这篇文章对你有所帮助。我已经在Github 上上传了这段代码。

如果您仍然不确定如何修复您的脚本,请在顶部的联系我们表格中填写您的详细信息,我会尽力帮助您。

请随时通过Linkedin或Twitter与我联系。如果您对博客有任何建议,可以使用屏幕右侧的反馈小部件,如果您想联系我们,可以在这里填写表格。

如果您喜欢 Trade With Python 上的内容,请考虑订阅我们的时事通讯(您会在页面顶部找到一个选项)。最后,如果您想保持精神振奋并制作更多这样的内容,您可以通过点击此处或点击下面的按钮购买MeACoffee。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐