def get_contact_client(self, account): ''' 取得client :param account: :return: ''' return WeChatClient(account.corp, account.account_secret)
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']}))
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
def get_client(corp_id, secret): """ :param corp_id: 企业微信公司Id :param secret: 对应的秘钥(比如通讯录、自建应用...) :return: 企业微信客户端实例 """ return WeChatClient(corp_id, secret)
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)
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'
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
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
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'
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': '登录成功', })
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"
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')
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)
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)
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
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
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()
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])
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
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')
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
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)
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)
''' @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 实时监控警报"
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:
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()