Prechádzať zdrojové kódy

feat: add clear_quota_v2 method to clear API quota when it's used up

lanvent 3 rokov pred
rodič
commit
c9131b333b

+ 0 - 2
channel/wechatmp/wechatmp_channel.py

@@ -92,7 +92,6 @@ class WechatMPChannel(ChatChannel):
             elif reply.type == ReplyType.IMAGE_URL:  # 从网络下载图片
                 img_url = reply.content
                 pic_res = requests.get(img_url, stream=True)
-                print(pic_res.headers)
                 image_storage = io.BytesIO()
                 for block in pic_res.iter_content(1024):
                     image_storage.write(block)
@@ -159,7 +158,6 @@ class WechatMPChannel(ChatChannel):
             elif reply.type == ReplyType.IMAGE_URL:  # 从网络下载图片
                 img_url = reply.content
                 pic_res = requests.get(img_url, stream=True)
-                print(pic_res.headers)
                 image_storage = io.BytesIO()
                 for block in pic_res.iter_content(1024):
                     image_storage.write(block)

+ 16 - 10
channel/wechatmp/wechatmp_client.py

@@ -1,11 +1,9 @@
 import time
-import json
-import requests
 import threading
 from channel.wechatmp.common import *
 from wechatpy.client import WeChatClient
 from common.log import logger
-from config import conf
+from wechatpy.exceptions import APILimitedException
 
 
 class WechatMPClient(WeChatClient):
@@ -16,13 +14,13 @@ class WechatMPClient(WeChatClient):
         )
         self.fetch_access_token_lock = threading.Lock()
 
-    def fetch_access_token(self):
-        """
-        获取 access token
-        详情请参考 http://mp.weixin.qq.com/wiki/index.php?title=通用接口文档
+    def clear_quota(self):
+        return self.post("clear_quota", data={"appid": self.appid})
 
-        :return: 返回的 JSON 数据包
-        """
+    def clear_quota_v2(self):
+        return self.post("clear_quota/v2", params={"appid": self.appid, "appsecret": self.secret})
+
+    def fetch_access_token(self): # 重载父类方法,加锁避免多线程重复获取access_token
         with self.fetch_access_token_lock:
             access_token = self.session.get(self.access_token_key)
             if access_token:
@@ -32,4 +30,12 @@ class WechatMPClient(WeChatClient):
                 if self.expires_at - timestamp > 60:
                     return access_token
             return super().fetch_access_token()
-        
+
+    def _request(self, method, url_or_endpoint, **kwargs): # 重载父类方法,遇到API限流时,清除quota后重试
+        try:
+            return super()._request(method, url_or_endpoint, **kwargs)
+        except APILimitedException as e:
+            logger.error("[wechatmp] API quata has been used up. {}".format(e))
+            response = self.clear_quota_v2()
+            logger.debug("[wechatmp] API quata has been cleard, {}".format(response))
+            return super()._request(method, url_or_endpoint, **kwargs)

+ 1 - 0
requirements-optional.txt

@@ -18,6 +18,7 @@ pysilk_mod>=1.6.0 # needed by send voice
 
 # wechatmp
 web.py
+wechatpy
 
 # chatgpt-tool-hub plugin