Skip to content

Commit

Permalink
feat: add clear_quota_v2 method to clear API quota when it's used up
Browse files Browse the repository at this point in the history
  • Loading branch information
lanvent committed Apr 21, 2023
1 parent e44161b commit c9131b3
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 12 deletions.
2 changes: 0 additions & 2 deletions channel/wechatmp/wechatmp_channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,6 @@ def send(self, reply: Reply, context: Context):
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)
Expand Down Expand Up @@ -159,7 +158,6 @@ def send(self, reply: Reply, context: Context):
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)
Expand Down
26 changes: 16 additions & 10 deletions channel/wechatmp/wechatmp_client.py
Original file line number Diff line number Diff line change
@@ -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):
Expand All @@ -16,13 +14,13 @@ def __init__(self, appid, secret, access_token=None,
)
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:
Expand All @@ -32,4 +30,12 @@ def fetch_access_token(self):
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 change: 1 addition & 0 deletions requirements-optional.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ pysilk_mod>=1.6.0 # needed by send voice

# wechatmp
web.py
wechatpy

# chatgpt-tool-hub plugin

Expand Down

0 comments on commit c9131b3

Please sign in to comment.