|
|
@@ -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) |