mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-07-20 21:57:14 +08:00
Merge pull request #2565 from dhyarcher/master
Fix access_token expiration handling by processing expires_in and ref…
This commit is contained in:
@@ -1,21 +1,43 @@
|
|||||||
|
# wechatcomapp_client.py
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from wechatpy.enterprise import WeChatClient
|
from wechatpy.enterprise import WeChatClient
|
||||||
|
|
||||||
|
|
||||||
class WechatComAppClient(WeChatClient):
|
class WechatComAppClient(WeChatClient):
|
||||||
def __init__(self, corp_id, secret, access_token=None, session=None, timeout=None, auto_retry=True):
|
def __init__(self, corp_id, secret, access_token=None, session=None, timeout=None, auto_retry=True):
|
||||||
super(WechatComAppClient, self).__init__(corp_id, secret, access_token, session, timeout, auto_retry)
|
super(WechatComAppClient, self).__init__(corp_id, secret, access_token, session, timeout, auto_retry)
|
||||||
self.fetch_access_token_lock = threading.Lock()
|
self.fetch_access_token_lock = threading.Lock()
|
||||||
|
self._active_refresh()
|
||||||
|
|
||||||
|
def _active_refresh(self):
|
||||||
|
"""启动主动刷新的后台线程"""
|
||||||
|
def refresh_loop():
|
||||||
|
while True:
|
||||||
|
now = time.time()
|
||||||
|
expires_at = self.session.get(f"{self.corp_id}_expires_at", 0)
|
||||||
|
|
||||||
|
# 提前10分钟刷新(600秒)
|
||||||
|
if expires_at - now < 600:
|
||||||
|
with self.fetch_access_token_lock:
|
||||||
|
# 双重检查避免重复刷新
|
||||||
|
if self.session.get(f"{self.corp_id}_expires_at", 0) - time.time() < 600:
|
||||||
|
super(WechatComAppClient, self).fetch_access_token()
|
||||||
|
# 每次检查间隔60秒
|
||||||
|
time.sleep(60)
|
||||||
|
|
||||||
|
# 启动守护线程
|
||||||
|
refresh_thread = threading.Thread(
|
||||||
|
target=refresh_loop,
|
||||||
|
daemon=True,
|
||||||
|
name="wechatcom_token_refresh_thread"
|
||||||
|
)
|
||||||
|
refresh_thread.start()
|
||||||
|
|
||||||
def fetch_access_token(self): # 重载父类方法,加锁避免多线程重复获取access_token
|
def fetch_access_token(self):
|
||||||
with self.fetch_access_token_lock:
|
with self.fetch_access_token_lock:
|
||||||
access_token = self.session.get(self.access_token_key)
|
access_token = self.session.get(self.access_token_key)
|
||||||
if access_token:
|
expires_at = self.session.get(f"{self.corp_id}_expires_at", 0)
|
||||||
if not self.expires_at:
|
|
||||||
return access_token
|
if access_token and expires_at > time.time() + 60:
|
||||||
timestamp = time.time()
|
return access_token
|
||||||
if self.expires_at - timestamp > 60:
|
return super().fetch_access_token()
|
||||||
return access_token
|
|
||||||
return super().fetch_access_token()
|
|
||||||
Reference in New Issue
Block a user