Пример #1
0
def get_other_mp_access_token(mp):
    token_hash = "%s:access_token" % mp["appid"]
    lock_hash = "%s:access_token_lock" % mp["appid"]
    token = redis.get(token_hash)
    if token:
        return token
    lock_count = redis.incrby(lock_hash, 1)
    if lock_count == 1:
        redis.expire(lock_hash, 10)
        # 没有上锁
        url = utils.gen_url('https://api.weixin.qq.com/cgi-bin/token',
                            grant_type='client_credential',
                            appid=mp["appid"],
                            secret=mp["secret"])
        r = requests.get(url, timeout=5)
        if r.status_code != 200:
            redis.delete(lock_hash)
            raise WeixinRequestError(r.status_code,
                                     'http_status_code: %s' % r.status_code)
        data = r.json()
        if data.get('errcode'):
            redis.delete(lock_hash)
            raise WeixinRequestError(data.get('errcode'), data)
        token = data.get('access_token')
        redis.set(token_hash, token, ex=TOKEN_EXPIRE)
        redis.delete(lock_hash)
        return token
    else:
        if lock_count > 30:
            redis.delete(lock_hash)
            raise WeixinRequestError('-1', 'http_status_code:%s' % '-1')
        # 已经有别人上锁了
        sleep(1)
        return get_other_mp_access_token(mp)
Пример #2
0
def get_wx_web_oauth_access_token(code):
    """
    获取网页登录的access token, 每个用户唯一
    :param code:
    :return:
    """
    # 没有上锁
    url = utils.gen_url('https://api.weixin.qq.com/sns/oauth2/access_token',
                        appid=appid,
                        secret=secret,
                        code=code,
                        grant_type='authorization_code')
    r = requests.get(url, timeout=5)

    # { "access_token":"ACCESS_TOKEN",
    #   "expires_in":7200,
    #   "refresh_token":"REFRESH_TOKEN",
    #   "openid":"OPENID",
    #   "scope":"SCOPE" }

    if r.status_code != 200:
        raise WeixinRequestError(r.status_code,
                                 'http_status_code: %s' % r.status_code)
    data = r.json()
    if data.get('errcode'):
        raise WeixinRequestError(data.get('errcode'), data)

    token = data.get('access_token')
    openid = data.get('openid')

    return token, openid
Пример #3
0
def get_wxweb_client_js_ticket():
    ticket = redis.get(wxweb_js_ticket_hash)
    if ticket:
        return ticket
    h = wxweb_js_ticket_hash_lock
    lock_count = redis.incrby(h, 1)
    print(lock_count)
    if lock_count == 1:
        redis.expire(h, 10)
        token = get_mp_access_token()
        url = utils.gen_url(
            "https://api.weixin.qq.com/cgi-bin/ticket/getticket",
            access_token=token,
            type="jsapi")
        r = requests.get(url, timeout=5)
        if r.status_code != 200:
            redis.delete(h)
            raise WeixinRequestError(r.status_code, r.json())
        data = r.json()
        if data.get("errcode"):
            redis.delete(h)
            raise WeixinRequestError(data.get("errcode"), r.json())
        ticket = data.get("ticket")
        redis.set(wxweb_js_ticket_hash, ticket)
        redis.expire(wxweb_js_ticket_hash, TOKEN_EXPIRE)
        redis.delete(h)
        return ticket
    # elif lock_count >= 20:
    #     redis.delete(h)
    #     return get_wxweb_client_js_ticket()
    else:
        sleep(1)
        return get_wxweb_client_js_ticket()
Пример #4
0
def get_mp_menu(mp):
    url = utils.gen_url(
        "https://api.weixin.qq.com/cgi-bin/menu/get",
        access_token=get_other_mp_access_token(mp),
    )
    r = requests.get(url, timeout=5)
    data = r.json()
    return data
Пример #5
0
def get_mp_auto_reply(mp):
    url = utils.gen_url(
        "https://api.weixin.qq.com/cgi-bin/get_current_autoreply_info",
        access_token=get_other_mp_access_token(mp),
    )
    r = requests.get(url, timeout=5)
    data = r.json()
    print(data)
    return data
Пример #6
0
def post_text(mp, openid, text):
    url = utils.gen_url(
        "https://api.weixin.qq.com/cgi-bin/message/custom/send",
        access_token=get_other_mp_access_token(mp),
    )
    body = dict(touser=openid, msgtype="text", text=dict(content=text))
    data = json.dumps(body, ensure_ascii=False).encode('utf8')
    r = requests.post(url, data=data, timeout=5)
    data = r.json()
    return True
Пример #7
0
def get_user_list(mp, next_openid=None, count=None):
    if next_openid:
        url = utils.gen_url(
            "https://api.weixin.qq.com/cgi-bin/user/get",
            access_token=get_other_mp_access_token(mp),
            next_openid=next_openid,
            count=count,
        )
    else:
        url = utils.gen_url(
            "https://api.weixin.qq.com/cgi-bin/user/get",
            access_token=get_other_mp_access_token(mp),
            count=count,
        )
    r = requests.get(url, timeout=10)
    data = r.json()
    user_list = data.get("data").get("openid")
    count = data.get("count")
    next_openid = data.get("next_openid")
    return [count, next_openid, user_list]
Пример #8
0
def redirect_get_base_code(handler, generate_url_only=False):
    target_url = url_for(handler, _external=True)
    print(target_url)
    url = utils.gen_url("https://open.weixin.qq.com/connect/oauth2/authorize",
                        ("appid", mp_appid), ("redirect_uri", target_url),
                        ("response_type", "code"), ("scope", "snsapi_base"),
                        ("state", "STATE")) + "#wechat_redirect"
    if generate_url_only:
        return url
    else:
        return redirect(url)
Пример #9
0
def get_user_info_by_web(web_token, openid):
    url = utils.gen_url("https://api.weixin.qq.com/sns/userinfo",
                        access_token=web_token,
                        openid=openid,
                        lang="zh_CN")
    r = requests.get(url, timeout=5)
    if r.status_code != 200:
        raise WeixinRequestError(r.status_code,
                                 'http_status_code: %s' % r.status_code)
    r.encoding = "utf8mb4"
    data = r.json()
    if data.get('errcode'):
        raise WeixinRequestError(data.get('errcode'), data)

    return data
Пример #10
0
def get_user_list_info(mp, openid_list):
    user_info_url = utils.gen_url(
        "https://api.weixin.qq.com/cgi-bin/user/info/batchget",
        access_token=get_other_mp_access_token(mp),
    )
    if type(openid_list[0]) == str:
        openid_list = [dict(openid=x, lang="zh_CN") for x in openid_list]
    r = requests.post(user_info_url,
                      json={"user_list": openid_list},
                      timeout=5)
    r.encoding = "utf8mb4"
    try:
        data = json.loads(r.text, strict=False)
    except Exception:
        print("解析用户信息失败!!!")
        print(r.text)
        return []
    return data["user_info_list"]
Пример #11
0
def get_mp_access_token():
    """
    获取公众号的Access Token
    :return:
    """
    token = redis.get(WXA_SERVER_ACCESS_TOKEN_HASH)
    if token:
        return token
    h = WXA_SERVER_ACCESS_TOKEN_HASH_LOCK
    lock_count = redis.incrby(h, 1)
    if lock_count == 1:
        redis.expire(h, 10)
        # 没有上锁
        url = utils.gen_url('https://api.weixin.qq.com/cgi-bin/token',
                            grant_type='client_credential',
                            appid=appid,
                            secret=secret)
        r = requests.get(url, timeout=5)
        if r.status_code != 200:
            redis.delete(h)
            raise WeixinRequestError(r.status_code,
                                     'http_status_code: %s' % r.status_code)
        data = r.json()
        if data.get('errcode'):
            redis.delete(h)
            raise WeixinRequestError(data.get('errcode'), data)
        token = data.get('access_token')
        redis.set(WXA_SERVER_ACCESS_TOKEN_HASH, token)
        redis.expire(WXA_SERVER_ACCESS_TOKEN_HASH, TOKEN_EXPIRE)
        redis.delete(h)
        return token
    else:
        if lock_count > 30:
            redis.delete(h)
            raise WeixinRequestError('-1', 'http_status_code:%s' % '-1')
        # 已经有别人上锁了
        sleep(1)
        return get_mp_access_token()
Пример #12
0
def get_user_info(mp_token, openid):
    url = utils.gen_url(
        'https://api.weixin.qq.com/cgi-bin/user/info',
        access_token=mp_token,
        openid=openid,
        lang='zh_CN',
    )
    r = requests.get(url, timeout=5)
    # {
    #     "subscribe": 1,
    #     "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
    #     "nickname": "Band",
    #     "sex": 1,
    #     "language": "zh_CN",
    #     "city": "广州",
    #     "province": "广东",
    #     "country": "中国",
    #     "headimgurl":"http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
    #     "subscribe_time": 1382694957,
    #     "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
    #                "remark": "",
    # "groupid": 0,
    # "tagid_list":[128,2],
    # "subscribe_scene": "ADD_SCENE_QR_CODE",
    # "qr_scene": 98765,
    # "qr_scene_str": ""
    # }
    if r.status_code != 200:
        raise WeixinRequestError(r.status_code,
                                 'http_status_code: %s' % r.status_code)
    data = r.json()
    if data.get('errcode'):
        raise WeixinRequestError(data.get('errcode'), data)

    # if int(data.get('subscribe')) == 0:
    #     raise CommonException(UserNotFollowMp)

    return data