{"id":15288740,"url":"https://github.com/wukan1986/ksrpc","last_synced_at":"2026-01-23T00:56:33.422Z","repository":{"id":57690704,"uuid":"494440719","full_name":"wukan1986/ksrpc","owner":"wukan1986","description":"Keep Simple RPC","archived":false,"fork":false,"pushed_at":"2025-02-15T16:03:11.000Z","size":89,"stargazers_count":16,"open_issues_count":2,"forks_count":8,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-11T11:14:15.274Z","etag":null,"topics":["fastapi","jqdatasdk","python","rpc","websocket"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wukan1986.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-05-20T11:40:09.000Z","updated_at":"2025-04-09T10:21:35.000Z","dependencies_parsed_at":"2023-12-06T08:32:30.283Z","dependency_job_id":"42158a39-b893-4895-b312-f7eac25a87ca","html_url":"https://github.com/wukan1986/ksrpc","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wukan1986%2Fksrpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wukan1986%2Fksrpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wukan1986%2Fksrpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wukan1986%2Fksrpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wukan1986","download_url":"https://codeload.github.com/wukan1986/ksrpc/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248670517,"owners_count":21142896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fastapi","jqdatasdk","python","rpc","websocket"],"created_at":"2024-09-30T15:52:44.287Z","updated_at":"2026-01-23T00:56:33.384Z","avatar_url":"https://github.com/wukan1986.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ksrpc\nKeep Simple RPC。免注册远程过程调用\n\n## 项目背景\n团队里常常需要通过平台下载各数据，但只有一套账号。通常的方案如下：\n1. 一个账号大家共用。最简单粗暴\n    1. 账号还能登录平台的其它功能，不便于分享\n    2. 账号可能有在线数上限，会导致互踢\n    3. 不同成员可能重复下载相同数据，同一成员也可能反复下载相同数据\n2. 由IT团队将数据提前下载过来。人力成本最高\n    1. IT团队需要提前规划部署，并向研究团队推广\n    2. 不同数据需要IT团队针对性的提前准备下载，时效性一般\n    3. 有些数据只是临时少量需要，需求变化快\n\n如果搭建一套服务，客户端不需账号，基本不用改动代码，是否解决多成员分享问题？所以这个项目就是为了API转发，只是后来发现本质上是RPC\n\n## 目标及特性\n1. 不修改第三方API源代码，实现客户端免登录\n2. 新接口与原接口一致，基本不用改动代码\n3. 数据缓存功能，减少下载次数。针对有数据有限额、调用次数有限制等情况\n4. 跨语言，能将大量Python的数据API转成HTTP服务，由其它语言调用\n5. 既支持同步调用，又支持异步调用\n\n## 应用场景\n1. 数据缓存转发\n2. 源代码保护。核心代码不提供，只向外暴露服务\n3. 远程控制。可调os、sys等库\n\n## 与其它RPC的区别\n1. 免注册就可以向外自动暴露所有API\n    1. 不得不添加函数白名单与黑名单功能\n    2. 添加了简易版的token认证功能\n2. 所有API都自动暴露，但并不是所有API都能正常使用。例如：\n    1. 输入与输出无法序列化和反序列化\n    2. 部分API使用方法特殊，也可能无法使用\n    3. 数据量太大，序列化、网络传输都不太现实\n3. 可先选择不同的通讯方式，目前提供的方式有：HTTP、WebSocket\n4. 出于数据版权保护，默认添加了IP地址校验开关，限制只在内网使用\n5. 多人使用时，少数人超量使用，所以又添加了数据量限额功能\n\n## 服务端安装\n1. 安装`ksrpc`库\n\u003e pip install ksrpc[server] -i https://mirrors.aliyun.com/pypi/simple --upgrade\n2. 直接运行`python -m ksrpc`, 观察提示的`config.py`文件路径\n2. 编辑`config.py`文件，进行`ksrpy`的功能管理。如权限配置等`ENABLE_SERVER = True`\n4. 再次运行`python -m ksrpc`或对应目录下运行`python run_app.py`\n5. 确保服务器上防火墙已经开放对应端口\n\n## 客户端安装\n1. 安装`ksrpc`库\n\u003e pip install ksrpc[client] -i https://mirrors.aliyun.com/pypi/simple --upgrade\n2. 编辑`examples`目录下的`demo_http.py`和`demo_websocket.py`中对应的服务地址\n3. 运行`demo_http.py`和`demo_websocket.py`，检查是否运行正常\n\n## 示例\n1. 直接可替代的。如`tests`目录下的：os、numpy、pandas、akshare等\n    1. 客户端没有安装相应包的情况下，IDE无法自动补全\n2. 需要服务端进行登录等一类处理的。如`server`目录下的，jqdatasdk、tushare、WindPy等\n3. 客户端参数无法序列化，需要特殊处理的。如`hack`目录下的jqdatasdk、WindPy等\n    1. 需要客户端安装第三方库，IDE的自动补全功能正常\n\n```python\nfrom ksrpc import RpcClient\nfrom ksrpc.connections.http import HttpxConnection\n\nconn = HttpxConnection('http://127.0.0.1:8000/api/file')\nmath = RpcClient('math', conn, async_local=False)\nmath.cache_get = True\nmath.cache_expire = 86400\n\n# 模块中变量获取方法。加了括号\nprint(math.pi())\nprint(math.pow(2, 3))\n```\n\n```python\n# 创建客户连接\nfrom ksrpc import RpcClient\nfrom ksrpc.connections.http import HttpxConnection\n\nconn = HttpxConnection('http://127.0.0.1:8000/api/file')\nclient = RpcClient('tushare', conn, async_local=False)\nclient.cache_get = True\nclient.cache_expire = 86400\n\n# 对原版库进行定制处理，需要已经安装了原版库\nfrom ksrpc.hack.tushare import hack\n\nhack(client)\n\n# 原版代码可都保持不变\nimport tushare as ts\n\nts.set_token('TUSHARE_TOKEN')\npro = ts.pro_api()\ndf = pro.trade_cal(exchange='', start_date='20210901', end_date='20211231')\nprint(df)\ndf = pro.daily(ts_code='000001.SZ,600000.SH', start_date='20180701', end_date='20180718')\nprint(df)\n```\n\n## 部分支持转发的库\n1. [AkShare](tests/akshare_.py)(已测)\n2. TuShare [方法一](examples/tushare_hack.py) [方法二](examples/tushare_client.py)(已测)\n3. [rqdatac](examples/rqdatac_hack.py)(已测)\n4. [jqdatasdk](examples/jqdatasdk_hack.py)(缺账号，未测)\n5. [Wind](examples/wind_hack.py)(缺账号，未测)\n6. 其它...\n\n## 跨语言开发文档\n跨语言示例代码在`lang`目录下\n[跨语言开发文档](lang/)\n\n## 声明\n此库仅供学习交流，请在数据提供方的授权范围内使用。请勿向第三方转发数据\n\n## 反弹RPC(反向RPC)/中继服务\n如果提供服务的机器在内网，无法搭建服务，也无法直接访问怎么办？参考Reverse Shell的概念，本项目提供了Reverse RPC功能\n1. 公网服务器上安装`pip install ksrpc[server]`，修改配置，运行`python run_app.py`，记下公网IP\n2. 内网服务器上安装`pip install ksrpc`(如果网络受限，可下载whl文件本地安装)，修改`rpc_reverse.py`中为公网IP，运行`python rpc_reverse.py`。此代码可粘贴到Notebook中运行\n3. 观察内网脚本是否能连接公网服务器\n4. 个人电脑上安装`pip install ksrpc[client]`，编辑`examples/demo_reverse.py`中为公网IP，运行，观察结果\n5. 注意地址不同，内网被控端连接公网IP下的`/client`, 个人电脑连接公网IP下的`/admin`，并且要用完全一样的房间号\n6. 默认情况下，`config.py`中的`ENABLE_RELAY = True`已经开启\n\n## 参考项目\n开发到一定阶段后才发现与`rpyc`这个免注册暴露函数的功能类似，大家也可以去学习一下\nhttps://github.com/tomerfiliba-org/rpyc\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwukan1986%2Fksrpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwukan1986%2Fksrpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwukan1986%2Fksrpc/lists"}