akshare-proxy-patch 0.1.5__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of akshare-proxy-patch might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: akshare-proxy-patch
3
- Version: 0.1.5
3
+ Version: 0.2.0
4
4
  Summary: 针对 AkShare 的底层补丁,自动为东财等接口注入代理认证头,从而避免 `stock_zh_a_spot_em` 等方法报错。
5
5
  Home-page: https://github.com/helloyie/akshare-proxy-patch
6
6
  Author: cheapproxy.net
@@ -30,7 +30,7 @@ pip install --upgrade akshare-proxy-patch
30
30
 
31
31
  ## 使用
32
32
 
33
- 1. 访问 https://cheapproxy.net 联系客服(备注: token),获取授权码 `AUTH_IP` 和 `AUTH_TOKEN`
33
+ 1. 登录 https://cheapproxy.net,获取授权码 `AUTH_IP` 和 `AUTH_TOKEN`
34
34
 
35
35
  2. 将 akshare 升级到最新
36
36
 
@@ -40,16 +40,21 @@ pip install --upgrade akshare
40
40
 
41
41
  3. 在使用 akshare 文件顶部添加下面的内容
42
42
  ```
43
+ # 文件顶部添加
43
44
  import akshare_proxy_patch
44
45
 
45
46
  akshare_proxy_patch.install_patch("AUTH_IP", "AUTH_TOKEN")
46
47
 
47
-
48
+ # 你的正常业务代码......
48
49
  # import akshare as ak
49
50
  # df = ak.stock_zh_a_spot_em()
50
- # 你的其他代码......
51
51
  ```
52
52
 
53
- # 使用问题交流群
53
+ ## 目前Hook的接口域名清单
54
+ - fund.eastmoney.com
55
+ - push2.eastmoney.com
56
+ - push2his.eastmoney.com
57
+
58
+ ## 使用问题交流群
54
59
 
55
60
  ![8jmzvNOjKWFzwNUDW0Xiytcpfr50uMr5.webp](https://cdn.nodeimage.com/i/8jmzvNOjKWFzwNUDW0Xiytcpfr50uMr5.webp)
@@ -9,7 +9,7 @@ pip install --upgrade akshare-proxy-patch
9
9
 
10
10
  ## 使用
11
11
 
12
- 1. 访问 https://cheapproxy.net 联系客服(备注: token),获取授权码 `AUTH_IP` 和 `AUTH_TOKEN`
12
+ 1. 登录 https://cheapproxy.net,获取授权码 `AUTH_IP` 和 `AUTH_TOKEN`
13
13
 
14
14
  2. 将 akshare 升级到最新
15
15
 
@@ -19,16 +19,21 @@ pip install --upgrade akshare
19
19
 
20
20
  3. 在使用 akshare 文件顶部添加下面的内容
21
21
  ```
22
+ # 文件顶部添加
22
23
  import akshare_proxy_patch
23
24
 
24
25
  akshare_proxy_patch.install_patch("AUTH_IP", "AUTH_TOKEN")
25
26
 
26
-
27
+ # 你的正常业务代码......
27
28
  # import akshare as ak
28
29
  # df = ak.stock_zh_a_spot_em()
29
- # 你的其他代码......
30
30
  ```
31
31
 
32
- # 使用问题交流群
32
+ ## 目前Hook的接口域名清单
33
+ - fund.eastmoney.com
34
+ - push2.eastmoney.com
35
+ - push2his.eastmoney.com
36
+
37
+ ## 使用问题交流群
33
38
 
34
39
  ![8jmzvNOjKWFzwNUDW0Xiytcpfr50uMr5.webp](https://cdn.nodeimage.com/i/8jmzvNOjKWFzwNUDW0Xiytcpfr50uMr5.webp)
@@ -0,0 +1,79 @@
1
+ import time
2
+ import threading
3
+ import requests
4
+ from requests.adapters import HTTPAdapter
5
+
6
+ # 1. 备份原始发送方法
7
+ original_send = HTTPAdapter.send
8
+
9
+ # 2. 线程本地变量:用于标记当前线程是否正在请求“授权接口”,防止递归死循环
10
+ _thread_status = threading.local()
11
+
12
+
13
+ def get_auth_config_realtime(auth_url, auth_token):
14
+ """
15
+ 实时获取授权信息,不使用缓存。
16
+ """
17
+ # 标记当前线程进入“授权请求状态”
18
+ _thread_status.is_authorizing = True
19
+ try:
20
+ # 这里的请求会进入 patched_send,但因为 is_authorizing 为 True,会走原逻辑
21
+ resp = requests.get(auth_url, params={"token": auth_token}, timeout=5)
22
+ data = resp.json()
23
+ if data.get("ua"):
24
+ return data
25
+ except Exception as e:
26
+ print(f"[Hook Error] 实时获取授权失败: {e}")
27
+ finally:
28
+ # 请求结束,重置标志位
29
+ _thread_status.is_authorizing = False
30
+ return None
31
+
32
+
33
+ def install_patch(auth_ip, auth_token):
34
+ """安装全局 Hook"""
35
+
36
+ def patched_send(self, request, **kwargs):
37
+ # 防止递归:如果当前请求是由 get_auth_config 发出的,直接走原逻辑
38
+ if getattr(_thread_status, "is_authorizing", False):
39
+ return original_send(self, request, **kwargs)
40
+ url = request.url
41
+ # 需要hook的域名列表
42
+ is_target = any(
43
+ domain in url
44
+ for domain in [
45
+ "fund.eastmoney.com",
46
+ "push2.eastmoney.com",
47
+ "push2his.eastmoney.com",
48
+ ]
49
+ )
50
+
51
+ # 非目标域名,正常放行
52
+ if not is_target:
53
+ return original_send(self, request, **kwargs)
54
+
55
+ auth_url = f"http://{auth_ip}:47001/api/akshare-auth"
56
+
57
+ # 需要 patch 的接口,重试接口
58
+ for i in range(30):
59
+ try:
60
+ auth_res = get_auth_config_realtime(auth_url, auth_token)
61
+ if auth_res:
62
+ request.headers["User-Agent"] = auth_res["ua"]
63
+ request.headers["Cookie"] = (
64
+ f"nid18={auth_res['nid18']}; nid18_create_time={auth_res['nid18_create_time']}"
65
+ )
66
+ proxy = auth_res["proxy"]
67
+ kwargs["proxies"] = {"http": proxy, "https": proxy}
68
+ kwargs["timeout"] = 8
69
+ else:
70
+ print(f"[Hook Warning] 无法获取授权信息,将使用原始请求: {url}")
71
+ # 调用原始 send 方法完成请求
72
+ response = original_send(self, request, **kwargs)
73
+ if response.ok:
74
+ return response
75
+ except:
76
+ time.sleep(0.01)
77
+
78
+ # 关键:全局替换 HTTPAdapter 的 send 方法
79
+ HTTPAdapter.send = patched_send
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: akshare-proxy-patch
3
- Version: 0.1.5
3
+ Version: 0.2.0
4
4
  Summary: 针对 AkShare 的底层补丁,自动为东财等接口注入代理认证头,从而避免 `stock_zh_a_spot_em` 等方法报错。
5
5
  Home-page: https://github.com/helloyie/akshare-proxy-patch
6
6
  Author: cheapproxy.net
@@ -30,7 +30,7 @@ pip install --upgrade akshare-proxy-patch
30
30
 
31
31
  ## 使用
32
32
 
33
- 1. 访问 https://cheapproxy.net 联系客服(备注: token),获取授权码 `AUTH_IP` 和 `AUTH_TOKEN`
33
+ 1. 登录 https://cheapproxy.net,获取授权码 `AUTH_IP` 和 `AUTH_TOKEN`
34
34
 
35
35
  2. 将 akshare 升级到最新
36
36
 
@@ -40,16 +40,21 @@ pip install --upgrade akshare
40
40
 
41
41
  3. 在使用 akshare 文件顶部添加下面的内容
42
42
  ```
43
+ # 文件顶部添加
43
44
  import akshare_proxy_patch
44
45
 
45
46
  akshare_proxy_patch.install_patch("AUTH_IP", "AUTH_TOKEN")
46
47
 
47
-
48
+ # 你的正常业务代码......
48
49
  # import akshare as ak
49
50
  # df = ak.stock_zh_a_spot_em()
50
- # 你的其他代码......
51
51
  ```
52
52
 
53
- # 使用问题交流群
53
+ ## 目前Hook的接口域名清单
54
+ - fund.eastmoney.com
55
+ - push2.eastmoney.com
56
+ - push2his.eastmoney.com
57
+
58
+ ## 使用问题交流群
54
59
 
55
60
  ![8jmzvNOjKWFzwNUDW0Xiytcpfr50uMr5.webp](https://cdn.nodeimage.com/i/8jmzvNOjKWFzwNUDW0Xiytcpfr50uMr5.webp)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "akshare-proxy-patch" # 包名,需在 PyPI 唯一
7
- version = "0.1.5"
7
+ version = "0.2.0"
8
8
  authors = [
9
9
  { name="cheapproxy", email="emezxyj1@gmail.com" },
10
10
  ]
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
5
5
 
6
6
  setup(
7
7
  name="akshare-proxy-patch", # 包名,用户 pip install 时的名称
8
- version="0.1.5", # 版本号
8
+ version="0.2.0", # 版本号
9
9
  author="cheapproxy.net",
10
10
  author_email="emezxyj1@gmail.com",
11
11
  description="AkShare 报错全局Hook",
@@ -1,49 +0,0 @@
1
- import time
2
- import requests
3
- from requests.adapters import HTTPAdapter
4
-
5
- original_send = HTTPAdapter.send
6
-
7
-
8
- def install_patch(auth_ip, auth_token):
9
- def patched_send(self, request, **kwargs):
10
- auth_url = f"http://{auth_ip}:47001/api/akshare-auth"
11
- url = request.url
12
- is_hook = (
13
- ("fund.eastmoney.com" in url)
14
- or ("push2.eastmoney.com" in url)
15
- or ("push2his.eastmoney.com" in url)
16
- )
17
- for i in range(60):
18
- try:
19
- if not is_hook:
20
- return original_send(self, request, **kwargs)
21
- with requests.Session() as s:
22
- HTTPAdapter.send = original_send
23
- auth_res = s.get(
24
- auth_url, params={"token": auth_token}, timeout=5
25
- ).json()
26
- if not auth_res["ua"]:
27
- error_msg = (
28
- auth_res.get("error_msg", "")
29
- or "未知异常,请联系 cheapproxy.net 客服"
30
- )
31
- print(error_msg)
32
- return None
33
-
34
- HTTPAdapter.send = patched_send
35
- request.headers["User-Agent"] = auth_res["ua"]
36
- cookie_str = f"nid18={auth_res['nid18']}; nid18_create_time={auth_res['nid18_create_time']}"
37
- request.headers["Cookie"] = cookie_str
38
- proxy = auth_res["proxy"]
39
- kwargs["proxies"] = {"http": proxy, "https": proxy}
40
- kwargs["timeout"] = 8
41
- return original_send(self, request, **kwargs)
42
- except Exception as e:
43
- if not is_hook:
44
- time.sleep(0.5)
45
- HTTPAdapter.send = patched_send
46
-
47
- return original_send(self, request, **kwargs)
48
-
49
- HTTPAdapter.send = patched_send