Beispiel #1
0
 def get_contact_client(self, account):
     '''
     取得client
     :param account:
     :return:
     '''
     return WeChatClient(account.corp, account.account_secret)
Beispiel #2
0
 def api_login(self, **kwargs):
     '''
     移动端登录
     :param kwargs:
     :return:
     '''
     # 获取用户信息
     account_code = kwargs['serial']
     agent_id = kwargs['agentID']
     app = request.env["funenc.wechat.apps"].sudo().search(
         [('app_agent', '=', agent_id),
          ('account_id.code', '=', account_code)],
         limit=1)
     client = WeChatClient(app.account_id.corp, app.app_secret)
     wx_userid = client.oauth.get_user_info(kwargs['code'])
     request.session['auth_code'] = kwargs['code']
     password = {'model': 'wechat', 'auth_code': kwargs['code']}
     authenticate = request.session.authenticate(request.session.db,
                                                 wx_userid['UserId'],
                                                 password)
     if authenticate is False:
         return '该用户不在系统用户列表中'
     else:
         session_info = request.env['ir.http'].session_info()
         _logger.info(
             dict(errcode=0,
                  msg='',
                  data={'token': session_info['session_id']}))
         return json.dumps(
             dict(errcode=0,
                  msg='',
                  data={'token': session_info['session_id']}))
Beispiel #3
0
def send_message(
    touser=None,
    content=None,
    msg_type="text",
    toparty=None,
    totag=None,
    **kwargs,
):
    secret = get_config("wework")
    CORPID, CORPSECRET, APPID = secret.split(":")
    agentid = int(APPID)
    api = WeChatClient(CORPID, CORPSECRET)
    message = dict(
        agent_id=agentid,
        user_ids=touser,
        content=content,
        party_ids=toparty,
        tag_ids=totag,
    )

    if msg_type == "text":
        ret = api.message.send_text(**message)
    elif msg_type == "markdown":
        ret = api.message.send_markdown(**message)
    else:
        raise Exception("unsupported message type")
    return ret
Beispiel #4
0
def get_client(corp_id, secret):
    """
    :param corp_id: 企业微信公司Id
    :param secret: 对应的秘钥(比如通讯录、自建应用...)
    :return: 企业微信客户端实例
    """
    return WeChatClient(corp_id, secret)
Beispiel #5
0
    def write_wechat_account(self):
        if self.env['ir.config_parameter'].get_param('wechat.sync') == 'True':
            for user in self:
                client = WeChatClient(user.account.corp_id,
                                      user.account.corpsecret)
                # is user exist
                wechat_user_info = client.user.get(user.login)
                # if exist, update
                remote_val = {
                    'name':
                    user.name if user.name else wechat_user_info.get('name'),
                    'position':
                    user.job if user.job else wechat_user_info.get('position'),
                    'mobile':
                    user.mobile
                    if user.mobile else wechat_user_info.get('mobile'),
                    'email':
                    user.email
                    if user.email else wechat_user_info.get('email'),
                    'weixin_id':
                    user.wechat_login
                    if user.wechat_login else wechat_user_info.get('weixinid'),
                    'department': [d.id for d in user.departments] or [1],
                }

                local_values = remote_val.copy()
                local_values['job'] = local_values['position']
                local_values['wechat_login'] = local_values['weixin_id']

                client.user.update(user_id=user.login, **remote_val)
                user.with_context(is_no_wechat_sync=True).write(local_values)
Beispiel #6
0
 def bind(self):
     for user in self:
         client = WeChatClient(user.account.corp_id,
                               user.account.corpsecret)
         try:
             wechat_user_info = client.user.get(user.login)
         except WeChatClientException:
             wechat_user_info = None
         if wechat_user_info:
             val = {
                 'state': 'bind',
                 'name': wechat_user_info.get('name', None),
                 'job': wechat_user_info.get('position', None),
                 'mobile': wechat_user_info.get('mobile', None),
                 'email': wechat_user_info.get('email', None),
                 'wechat_login': wechat_user_info.get('weixinid', None),
             }
             user.write(val)
         else:
             client.user.create(user_id=user.login,
                                name=user.name,
                                department=1,
                                position=user.job,
                                mobile=user.mobile,
                                email=user.email,
                                weixin_id=user.wechat_login)
             user.state = 'bind'
Beispiel #7
0
def address_client():
    """
    返回用于通讯录的客户端实例
    :return:
    """
    corp_id = request.env['ir.config_parameter'].sudo().get_param('weixin_ent_base.ent_wx_corp_id')
    secret = request.env['ir.config_parameter'].sudo().get_param('weixin_ent_base.ent_wx_ab_secret')
    return WeChatClient(corp_id, secret, session=mem_storage)
 def get_access_client():
     key = 'client'
     if cache.has_key(key):
         client = cache.get(key)
     else:
         client = WeChatClient(corp_id, app_secret)
         cache.set(key, client)
     return client
Beispiel #9
0
    def unlink(self):
        for user in self:
            if user.state == 'bind':
                client = WeChatClient(user.account.corp_id,
                                      user.account.corpsecret)
                client.user.delete(user_id=user.login)

        res = super(WechatUser, self).unlink()
        return res
Beispiel #10
0
 def unbind(self):
     for user in self:
         if user.state == 'bind':
             client = WeChatClient(user.account.corp_id,
                                   user.account.corpsecret)
             try:
                 client.user.delete(user_id=user.login)
             except WeChatClientException, e:
                 _logger.error(e)
         user.state = 'unbind'
Beispiel #11
0
class WechatWork(viewsets.ViewSet):
    """微信企业号相关认证服务"""
    client = WeChatClient(
        settings.WECHAT_WORK_CONFIG['CORP_ID'],
        settings.WECHAT_WORK_CONFIG['SECRET'],
    )

    @swagger_auto_schema(operation_summary='获取微信企业号登录链接')
    @action(detail=False)
    def get_authorize_url(self, request):
        return Response({
            'url': self.client.oauth.authorize_url('/oauth/wechat_work/login_callback')
        })

    @swagger_auto_schema(operation_summary='微信企业号登录回调')
    @action(detail=False)
    def authorize_redirect_uri(self, request: HttpRequest):
        code = request.GET.get('code', None)
        print(f'wechat code={code}')
        return Response({'code': code})

    @swagger_auto_schema(operation_summary='通过code登录',
                         manual_parameters=[
                             openapi.Parameter(name='code', in_=openapi.IN_QUERY,
                                               description='从微信企业号服务器获取到的code', type=openapi.TYPE_STRING)
                         ])
    @action(detail=False)
    def login_by_code(self, request: HttpRequest):
        code = request.GET.get('code', None)
        try:
            user_info = self.client.oauth.get_user_info(code)
        except Exception as e:
            raise APIException(detail=e)

        phone = user_info['UserId']
        is_created_user = False

        if User.objects.filter(username=phone).exists():
            user_obj: User = User.objects.get(username=phone)
        else:
            is_created_user = True
            user_obj: User = User.objects.create_user(username=phone, password=phone)

        # 记录Django登录状态
        login(request, user_obj)
        # 生成drf token
        token, created = Token.objects.get_or_create(user=user_obj)

        return Response({
            'user_info': user_info,
            'successful': True,
            'is_created_user': is_created_user,
            'token': token.key,
            'detail': '登录成功',
        })
Beispiel #12
0
 def invite(self):
     for user in self:
         client = WeChatClient(user.account.corp_id,
                               user.account.corpsecret)
         try:
             user.state = 'bind'
         except:
             user.state = 'unbind'
             raise ValidationError("%s hasn't been binded yet." % user.name)
         client.user.invite(user_id=user.login)
         user.state = "invited"
Beispiel #13
0
def enterprise_payment(request, wrId):
    order = WithdrawOrder.objects.get(wrId=wrId)
    account = ThirdAccount.objects.get(user__userId=order.user.userId,
                                       accType=1)

    client = WeChatClient(settings.WECHAT_APPID, settings.WECHAT_SECRET)
    transfer = WeChatTransfer(client)

    result = transfer.transfer(account.accountNo, order.wrMoney * 100, '提现')

    return HttpResponse('success')
Beispiel #14
0
 def sent_message(self):
     for message in self:
         user_ids = '|'.join([u.login for u in message.users])
         try:
             client = WeChatClient(message.account.corp_id, message.account.corpsecret)
             # TODO: all support
             client.message.send_text(message.application.application_id, user_ids, message.content)
             message.state = 'send'
         except Exception, e:
             message.state = 'fail'
             message.result = str(e)
             _logger.error(e)
Beispiel #15
0
 def create_wechat_account(self):
     if self.env['ir.config_parameter'].get_param('wechat.sync') == 'True':
         client = WeChatClient(self.account.corp_id,
                               self.account.corpsecret)
         client.user.create(user_id=self.login,
                            name=self.name,
                            department=[d.id for d in self.departments]
                            or [1],
                            position=self.job,
                            mobile=self.mobile,
                            email=self.email,
                            weixin_id=self.wechat_login)
 def create_wechat(self):
     if self.env['ir.config_parameter'].get_param('wechat.sync') == 'True':
         client = WeChatClient(self.account.corp_id,
                               self.account.corpsecret)
         client.department.create(name=self.name,
                                  parent_id=self.parent_id.id or 1,
                                  order=self.order,
                                  id=self.id)
         for user in self.users:
             client.user.update(user.login,
                                department=[d.id for d in user.departments]
                                or [1])
 def unlink_wechat(self):
     if self.env['ir.config_parameter'].get_param('wechat.sync') == 'True':
         for department in self:
             client = WeChatClient(department.account.corp_id,
                                   department.account.corpsecret)
             for user in department.users:
                 client.user.update(
                     user.login,
                     department=[
                         d.id
                         for d in user.departments if d.id != department.id
                     ] or [1])
             client.department.delete(department.id)
Beispiel #18
0
 def write(self, vals):
     res = super(WechatUser, self).write(vals)
     for user in self:
         if user.state == 'bind':
             client = WeChatClient(user.account.corp_id,
                                   user.account.corpsecret)
             client.user.update(user_id=user.login,
                                name=user.name,
                                department=1,
                                position=user.job,
                                mobile=user.mobile,
                                email=user.email,
                                weixin_id=user.wechat_login)
     return res
Beispiel #19
0
    def get_client_by_app(self, code, agent_id):
        '''
        :param code:
        :param agent_id:
        :return:
        '''
        account = self.search([('code', '=', code)])
        if account:
            app = self.env['funenc.wechat.apps'].sudo()\
                .search([('account_id', '=', account.id), ('app_agent', '=', agent_id)])
            if app:
                return WeChatClient(app.account_id.corp, app.app_secret)

        return None
Beispiel #20
0
def response_message(xml, request=None):
    msg = parse_message(xml)
    log.debug('>>> source:{},target:{}, msg.type:{}'.format(
        msg.source, msg.target, msg.type))
    client = WeChatClient(APPID, SECRET)
    user_dict = client.user.get(msg.source)
    userpk = user_dict.get('email') or user_dict.get('userid')
    user = User.objects.filter(email=userpk).first()
    # client.message.send_text( msg.agent ,msg.source, 'user:{}'.format(user))
    # log.debug('>>> user:{}'.format(user))
    if msg.type == 'text':
        if re.match(r'.*(想)|(建议)', msg.content):
            Requirement.objects.get_or_create(email=userpk,
                                              content=msg.content)
            req_counts = Requirement.objects.filter(email=userpk).count()
            reply = TextReply(content='您的想法和建议我们已经收到({})'.format(req_counts),
                              message=msg)
            return reply.render()
        content = '''现在我还不会聊天
但我会记录您提出的想法和建议
试着输入“...想...”或“...建议...” '''

        reply = TextReply(content=content, message=msg)
        return reply.render()
        # log.debug('>>> response:{}'.format(response))
    elif msg.type == 'event':
        log.debug('>>> msg.event:{}'.format(msg.event))
        if msg.event == 'subscribe':
            return login_url(request, user_dict, client, userpk)
        if msg.event == 'location':
            log.debug('>>> msg:{}'.format(msg))
            return add_location(user, msg.id, msg.latitude, msg.longitude,
                                msg.precision)
        if msg.event == 'click':
            log.debug('>>> msg.key:{}'.format(msg.key))
            if msg.key == 'login':
                return login_url(request, user_dict, client, userpk)
            elif msg.key == 'get_available_cars':
                return get_available_cars(user)
            elif msg.key == 'my_location_his':
                return get_location_his(user)
    elif msg.type == 'location':
        return add_location(user, msg.id, msg.location_x, msg.location_y,
                            msg.scale, msg.label)

    reply = create_reply('')
    return reply.render()
Beispiel #21
0
 def login_free(self):
     '''
     企业微信免登入口
     :return: 跳转
     '''
     apps = request.env['funenc.wechat.apps'].sudo().search(
         [('is_exempts', '=', True)], limit=1)
     if len(apps) == 0:
         return '没有设置免登默认企业应用'
     corpid = apps.account_id.corp
     corpsecret = apps.app_secret
     if corpid is False or corpsecret is False:
         return '没有填写企业应用信息/没有填写可信域名'
     client = WeChatClient(corpid, corpsecret)
     url = client.oauth.authorize_url(
         'http://' + request.httprequest.host.split(':')[0] +
         '/funenc_wechat/success_login_free_by_wechat')
     return http.redirect_with_hash(url)
 def write_wechat(self, vals, department_old_user):
     if self.env['ir.config_parameter'].get_param('wechat.sync') == 'True':
         for department in self:
             client = WeChatClient(department.account.corp_id,
                                   department.account.corpsecret)
             client.department.update(department.id,
                                      name=department.name,
                                      parent_id=department.parent_id.id
                                      or 1,
                                      order=department.order)
             if 'users' in vals:
                 old_user = department_old_user[department]
                 new_user = [u.id for u in department.users]
                 need_update_users = self.env[
                     'odoosoft.wechat.enterprise.user'].browse(
                         list(set(new_user) ^ set(old_user)))
                 for user in need_update_users:
                     client.user.update(
                         user.login,
                         department=[d.id for d in user.departments] or [1])
Beispiel #23
0
 def sent_msg(self):
     if not self.app_name:
         return False
     try:
         wx_conf = WxConf(app_name=self.app_name)
         client = WeChatClient(wx_conf.corp_id, wx_conf.Secret)
         print(client, 'client\n')
         print(self.get_title(), 'title')
         print('agent_id:', wx_conf.AgentId)
         print('url:', self.get_url())
         print('desc:', self.get_description())
         client.message.send_text_card(agent_id=wx_conf.AgentId,
                                       user_ids=self.user_ids,
                                       title=self.get_title(),
                                       description=self.get_description(),
                                       url=self.get_url())
         print('out')
     except Exception as e:
         print(e)
     return True
Beispiel #24
0
 def success_login_by_wechat(self, **kwargs):
     '''
     免登成功后登录后台
     :param kwargs: dict类型,key值code对应value为传入的code
     :return:
     '''
     # 获取用户信息
     app = request.env["funenc.wechat.apps"].sudo().search(
         [("is_exempts", "=", True)], limit=1)
     client = WeChatClient(app.account_id.corp, app.app_secret)
     wx_userid = client.oauth.get_user_info(kwargs['code'])
     request.session['auth_code'] = kwargs['code']
     password = {'model': 'wechat', 'auth_code': kwargs['code']}
     authenticate = request.session.authenticate(request.session.db,
                                                 wx_userid['UserId'],
                                                 password)
     if authenticate is False:
         return '该用户不在系统用户列表中'
     else:
         return http.redirect_with_hash('/web')
Beispiel #25
0
 def sent_msg(self, obj=None):
     from action.models import WxConf
     if not self.app_name:
         return False
     try:
         wx_conf = WxConf(app_name=self.app_name)
         # print(wx_conf,'in')
         client = WeChatClient(wx_conf.corp_id, wx_conf.Secret)
         # print(client, '222')
         # print(self.get_title(obj), 'title')
         client.message.send_text_card(
             agent_id=wx_conf.AgentId,
             user_ids=self.user_ids,
             title=self.get_title(obj),
             description=self.get_description(obj),
             url=self.get_url(obj))
         # print('out')
     except Exception as e:
         pass
     return True
Beispiel #26
0
    def warpper(request, *args, **kwargs):
        client = WeChatClient(APPID, SECRET)
        code = request.GET.get('code', None)
        #url = client.oauth.authorize_url(request.build_absolute_uri())
        #log.debug('>>>auth get url:{} request.uri:{}'.format(url, request.build_absolute_uri()))
        if not code:
            return method(request, *args, **kwargs)
        try:
            user_info = client.oauth.get_user_info(code)
            userid = user_info.get('UserId')
            user_dict = client.user.get(userid)
            userpk = user_dict.get('email') or user_dict.get('userid')
            # user = User.objects.filter(email=userpk).first()
        except Exception as e:
            log.error('>>>Exception of oauth,errmsg:{},errcode:{}'.format(
                e.errmsg, e.errcode))
            # 这里需要处理请求里包含的 code 无效的情况
            return method(request, *args, **kwargs)
        if not userpk:
            return method(request, *args, **kwargs)

        if request.user.is_authenticated and request.user.email == userpk:
            log.debug(
                '>>>auth logged in already, user.email:{}'.format(userpk))
            return method(request, *args, **kwargs)
        else:
            log.debug('>>>auth not login user_info:{}'.format(userpk))
            user, created = User.objects.update_or_create(
                email=userpk, defaults=weixin_user_to_model(user_dict, client))
            token = Token.objects.filter(email=userpk).first()
            if not token:
                token = Token.objects.create(email=userpk)
            user = auth.authenticate(uid=token.uid)
            log.debug('>>>auth user authenticated:{}'.format(user))
            if user:
                auth.login(request, user)

        return method(request, *args, **kwargs)
Beispiel #27
0
 def __init__(self,
              name='huobi',
              webhook=None,
              agent_id=None,
              secret=None,
              company_id=None):
     self.name = name
     # 机器人webhook
     self.webhook = read_secret("wechat",
                                "notechats",
                                "huobi",
                                name,
                                "webhook",
                                value=webhook)
     # 应用ID
     self.agent_id = read_secret("wechat",
                                 "notechats",
                                 "huobi",
                                 name,
                                 "agent_id",
                                 value=agent_id)
     # 企业ID
     self.company_id = read_secret("wechat",
                                   "notechats",
                                   "huobi",
                                   name,
                                   "company_id",
                                   value=company_id)
     # 应用Secret
     self.secret = read_secret("wechat",
                               "notechats",
                               "huobi",
                               name,
                               "secret",
                               value=secret)
     self.client = WeChatClient(corp_id=self.company_id, secret=self.secret)
Beispiel #28
0
'''
@author: LoRexxar
@contact: [email protected]
@file: wechathandler.py
@time: 2020/9/24 15:27
@desc:

'''

from utils.log import logger
from wechatpy.enterprise import WeChatClient
from LSpider.settings import LOGHANDER_IS_OPEN_WEIXIN
from LSpider.settings import WECHAT_NOTICE, WECHAT_NOTICE_DEBUG

enterprise = WeChatClient(
    corp_id=WECHAT_NOTICE['corp_id'],
    secret=WECHAT_NOTICE['secret'],
)

enterprise_debug = WeChatClient(
    corp_id=WECHAT_NOTICE_DEBUG['corp_id'],
    secret=WECHAT_NOTICE_DEBUG['secret'],
)


def send_text(content):
    enterprise.message.send_text(
        agent_id=WECHAT_NOTICE['agent_id'],
        user_ids='guoyingqi0',
        tag_ids='',
        content=content,
        # title="HaoTian 实时监控警报"
Beispiel #29
0
from __future__ import absolute_import, unicode_literals
from flask import Flask, request, abort, render_template
from wechatpy.enterprise.crypto import WeChatCrypto
from wechatpy.exceptions import InvalidSignatureException
from wechatpy.enterprise.exceptions import InvalidCorpIdException
from wechatpy.enterprise import parse_message, create_reply
from wechatpy.enterprise.replies import ImageReply
# import redis
import requests
import json
import config
from zabbix import ZabbixGraph
from wechatpy.enterprise.client.api.media import WeChatMedia
from wechatpy.enterprise import WeChatClient

client = WeChatClient(config.CorpId, config.Secret)

TOKEN = config.TOKEN
EncodingAESKey = config.EncodingAESKey
CorpId = config.CorpId

app = Flask(__name__)


#图灵机器人
def talks_robot(msg, ispuid=False):
    api_url = 'http://www.tuling123.com/openapi/api'
    apikey = config.turing_key
    if ispuid:
        data = {'key': apikey, 'info': msg.content, 'userid': msg.source}
    else:
Beispiel #30
0
        env.setdefault(k, v)
    redis_host = env["REDIS_HOST"]
    redis_port = int(env["REDIS_PORT"])
    redis_pwd = env["REDIS_PWD"]
    wechat_corp_id = env["WECHAT_CORP_ID"]
    wechat_secret = env["WECHAT_SECRET"]
    wechat_crypto_token = env['WECHAT_CRYPTO_TOKEN']
    wechat_crypto_encoding_aes_key = env['WECHAT_CRYPTO_AES_KEY']
    wechat_invite_code = env['WECHAT_INVITE_CODE']
    wechat_create_menu = distutils.util.strtobool(env['WECHAT_CREATE_MENU'])
    agent_id = env['AGENT_ID']
    image_id = env['IMAGE_ID']
    debug = distutils.util.strtobool(env['DEBUG'])
    logging.basicConfig(level=logging.DEBUG if debug else logging.INFO)
    for i in [redis_host, redis_port, redis_pwd, wechat_corp_id, wechat_secret,
              wechat_crypto_token, wechat_crypto_encoding_aes_key, agent_id]:
        if i == 'set_it':
            logging.error(env.items())
            logging.error('部分变量未设置,请检查你的变量设置是否正确。')
            time.sleep(30)
            exit(-1)
    if wechat_create_menu:
        create_menu()
    r = redis.Redis(host=redis_host, port=redis_port, db=0, password=redis_pwd)
    crypto = WeChatCrypto(token=wechat_crypto_token, encoding_aes_key=wechat_crypto_encoding_aes_key,
                          corp_id=wechat_corp_id)
    client = WeChatClient(corp_id=wechat_corp_id, secret=wechat_secret, session=RedisStorage(r))
    # 启用京东登录事件循环
    jd_qrcode.start_loop()
    run()