def post(self): openid = None try: request = json.loads(self.request.body.decode()) id = request.get('id', None) openid = request.get('openid', None) if openid is None: raise AttributeError if id is None: user = yield dbutil.do( User.select(User.id).where(User.openid == openid).get) id = user.get_id() modified_user = shortcuts.dict_to_model(User, request, ignore_unknown=True) modified_user.set_id(id) yield dbutil.do(modified_user.save) self.write(Response(status=1, msg='ok', result={}).json()) except AttributeError as e: self.write(Response(msg='sorry,亲,修改用户信息时必须包含openid').json()) logging.exception('UpdateUserInfoHandler error: {0}'.format( str(e))) except DoesNotExist as e: self.write( Response(msg='sorry,亲,用户不存在 openid={0}'.format(openid)).json()) logging.exception('UpdateUserInfoHandler error: {0}'.format( str(e))) except Exception as e: self.write(Response(msg='sorry,亲,修改用户信息失败').json()) logging.exception('UpdateUserInfoHandler error: {0}'.format( str(e)))
def pull_user_info(openid, web_access_token=None): if web_access_token: pull_user_info_url = wxconfig.pull_user_info_url.format(web_access_token, openid) http_client = AsyncHTTPClient() response = yield http_client.fetch(pull_user_info_url) logging.debug(response.body.decode()) user_dict = json.loads(response.body.decode()) user = dict_to_model(User, user_dict, ignore_unknown=True) else: user = User(openid='openid') user_id = None try: _user = dbutil.do(User.get, User.openid == openid) user_id = _user.get_id() exists = True except DoesNotExist: exists = False if exists: assert user_id user.set_id(user_id) user.updatetime = datetime.datetime.now() else: user.createtime = datetime.datetime.now() yield dbutil.do(user.save) user = yield dbutil.do(User.get, User.openid == openid) return model_to_dict(user)
def process(self, wxmsg): user = yield dbutil.do( User.select().where(User.openid == wxmsg.fromusername).get) user.subscribe = 0 dbutil.do(user.save) wxmsg.response, wxmsg.responsetime = 1, datetime.datetime.now() yield super().process(wxmsg)
def process(self, wxmsg): user = yield dbutil.do(User.select().where(User.openid == wxmsg.fromusername).get) xml_data = ElementTree.fromstring(wxmsg.content) user.latitude = xml_data.find('Latitude').text user.longitude = xml_data.find('Longitude').text user.precision = xml_data.find('Precision').text user.updatetime = datetime.datetime.now() yield dbutil.do(user.save) wxmsg.response, wxmsg.responsetime = 1, datetime.datetime.now() yield super().process(wxmsg)
def process(self, wxmsg): user = yield dbutil.do( User.select().where(User.openid == wxmsg.fromusername).get) xml_data = ElementTree.fromstring(wxmsg.content) user.latitude = xml_data.find('Latitude').text user.longitude = xml_data.find('Longitude').text user.precision = xml_data.find('Precision').text user.updatetime = datetime.datetime.now() yield dbutil.do(user.save) wxmsg.response, wxmsg.responsetime = 1, datetime.datetime.now() yield super().process(wxmsg)
def sync_media_file(): while True: cur_hour = int(time.strftime('%H')) if cur_hour >= syncconfig.start_at and cur_hour < syncconfig.stop_at: try: event = yield dbutil.do( Event.select().where((Event.syncfinish != 1) | (Event.syncfinish >> None)). order_by(+Event.createtime).get) logging.info('开始处理活动[#{0}] 的media文件'.format(event.code)) if event.mediaids: all = json.loads(event.mediaids) logging.debug('all ' + str(all)) if event.syncstatus: uploaded = json.loads(event.syncstatus) else: uploaded = [] if event.imgurls: img_urls = json.loads(event.imgurls) else: img_urls = {} to_upload = list(set(all) - set(uploaded)) logging.info('待处理media文件清单' + str(to_upload)) results = yield [ wxutil.process_temp_resource(media_id) for media_id in to_upload ] for i in range(0, len(results)): if results[i] is not None: uploaded.append(to_upload[i]) img_urls[to_upload[i]] = results[i] event.syncstatus = json.dumps(uploaded, ensure_ascii=False) event.imgurls = json.dumps(img_urls, ensure_ascii=False) logging.info('已完成media文件清单:' + str(uploaded)) if set(all) == set(uploaded): logging.info('活动[#{0}] 所有media文件已完成'.format( event.code)) else: logging.info('mediaids不存在,没有media文件需要同步') event.syncfinish = 1 yield dbutil.do(event.save) except DoesNotExist: logging.info('无待同步media文件, sleep...') yield gen.sleep(60 * 10) except Exception as e: logging.exception('同步media文件发生异常:{0}, 退出...'.format(str(e))) break else: yield gen.sleep(60 * 10)
def post(self): try: data = json.loads(self.request.body.decode()) code = data['eventcode'] openid = data['openid'] star = yield dbutil.do(Star.select().where( (Star.eventcode == code) & (Star.openid == openid) ).get) star.status = -1 star.updatetime = datetime.datetime.now() yield dbutil.do(star.save) self.write(Response(status=1, msg='ok', result={}).json()) except Exception as e: self.write(Response(msg='sorry,亲,取消关注活动失败').json()) logging.exception('UnStarEventHandler error: {0}'.format(str(e)))
def post(self): try: data = json.loads(self.request.body.decode()) code = data['eventcode'] openid = data['openid'] star = yield dbutil.do( Star.select().where((Star.eventcode == code) & (Star.openid == openid)).get) star.status = -1 star.updatetime = datetime.datetime.now() yield dbutil.do(star.save) self.write(Response(status=1, msg='ok', result={}).json()) except Exception as e: self.write(Response(msg='sorry,亲,取消关注活动失败').json()) logging.exception('UnStarEventHandler error: {0}'.format(str(e)))
def post(self): try: param = json.loads(self.request.body.decode()) url = urllib.request.unquote(param['url']) if url.find('#') != -1: url = url[0:url.index('#')] jsapi_ticket = yield wxutil.get_jsapi_ticket() noncestr = self.random_str() timestamp = int(time.time()) param = { 'url': url, 'timestamp': timestamp, 'jsapi_ticket': jsapi_ticket, 'noncestr': noncestr } tmp_str = '&'.join([ '{0}={1}'.format(key, param[key]) for key in sorted(param.keys()) ]) sha1 = hashlib.sha1(tmp_str.encode()).hexdigest() del param['jsapi_ticket'] param['signature'] = sha1 config = yield dbutil.do(Config.get) param['appid'] = config.appid self.write(Response(status=1, msg='ok', result=param).json()) except Exception as e: self.write(Response(msg='sorry,亲,js api签名失败').json()) logging.exception('GetUserInfoHandler error: {0}'.format(str(e)))
def post(self): try: param = json.loads(self.request.body.decode()) url = urllib.request.unquote(param['url']) if url.find('#') != -1: url = url[0:url.index('#')] jsapi_ticket = yield wxutil.get_jsapi_ticket() noncestr = self.random_str() timestamp = int(time.time()) param = { 'url': url, 'timestamp': timestamp, 'jsapi_ticket': jsapi_ticket, 'noncestr': noncestr } tmp_str = '&'.join(['{0}={1}'.format(key, param[key]) for key in sorted(param.keys())]) sha1 = hashlib.sha1(tmp_str.encode()).hexdigest() del param['jsapi_ticket'] param['signature'] = sha1 config = yield dbutil.do(Config.get) param['appid'] = config.appid self.write(Response( status=1, msg='ok', result=param ).json()) except Exception as e: self.write(Response(msg='sorry,亲,js api签名失败').json()) logging.exception('GetUserInfoHandler error: {0}'.format(str(e)))
def get_user_info(openid): id = None try: _user = yield dbutil.do(User.get, User.openid == openid) id = _user.get_id() except DoesNotExist: pass access_token = yield get_access_token() get_user_info_url = wxconfig.get_user_info_url.format(access_token, openid) http_client = AsyncHTTPClient() response = yield http_client.fetch(get_user_info_url) result = json.loads(response.body.decode()) logging.debug(result) try: # 未关注微信号时,会出错 result['errcode'] except Exception: user = dict_to_model(User, result, ignore_unknown=True) if id: user.set_id(id) user.updatetime = datetime.datetime.now() else: user.createtime = datetime.datetime.now() # yield dbutil.do(user.save) return model_to_dict(user) logging.error('拉取用户信息出错:{0}'.format(result))
def post(self): try: data = json.loads(self.request.body.decode()) code = data['eventcode'] openid = data['openid'] star = None try: star = yield dbutil.do( Star.select().where((Star.eventcode == code) & (Star.openid == openid)).get) except: pass if star: if star.status == 1: # 已经关注 raise RuntimeError else: # 已经取消关注 star.status = 1 star.updatetime = datetime.datetime.now() else: # 首次关注 results = yield [ dbutil.do( Event.select( Event.id, Event.code).where(Event.code == code).get), dbutil.do( User.select( User.id, User.openid).where(User.openid == openid).get) ] event = results[0] user = results[1] star = Star(eventid=event.get_id(), eventcode=event.code, userid=user.get_id(), openid=user.openid, createtime=datetime.datetime.now(), status=1) yield dbutil.do(star.save) self.write(Response(status=1, msg='ok', result={}).json()) except RuntimeError as e: self.write(Response(msg='sorry,亲,用户已经关注该活动').json()) logging.exception('StarEventHandler error: {0}'.format(str(e))) except Exception as e: self.write(Response(msg='sorry,亲,关注活动失败').json()) logging.exception('StarEventHandler error: {0}'.format(str(e)))
def refresh_access_token(): logging.info('开始刷新微信access token') try: config = yield dbutil.do(Config.select().get) http_client = AsyncHTTPClient() logging.debug(wxconfig.access_token_url.format(config.appid, config.appsecret)) response = yield http_client.fetch( wxconfig.access_token_url.format(config.appid, config.appsecret)) logging.info(response.body.decode()) result = json.loads(response.body.decode()) config.accesstoken = result['access_token'] config.jsapiticket = yield refresh_jsapi_ticket(config.accesstoken) config.expires = result['expires_in'] logging.debug(config.accesstoken) logging.debug(config.jsapiticket) logging.debug(config.expires) yield dbutil.do(config.save) except Exception: pass
def sync_media_file(): while True: cur_hour = int(time.strftime('%H')) if cur_hour >= syncconfig.start_at and cur_hour < syncconfig.stop_at: try: event = yield dbutil.do(Event.select().where( (Event.syncfinish != 1) | (Event.syncfinish >> None)).order_by(+Event.createtime).get) logging.info('开始处理活动[#{0}] 的media文件'.format(event.code)) if event.mediaids: all = json.loads(event.mediaids) logging.debug('all ' + str(all)) if event.syncstatus: uploaded = json.loads(event.syncstatus) else: uploaded = [] if event.imgurls: img_urls = json.loads(event.imgurls) else: img_urls = {} to_upload = list(set(all) - set(uploaded)) logging.info('待处理media文件清单' + str(to_upload)) results = yield [wxutil.process_temp_resource(media_id) for media_id in to_upload] for i in range(0, len(results)): if results[i] is not None: uploaded.append(to_upload[i]) img_urls[to_upload[i]] = results[i] event.syncstatus = json.dumps(uploaded, ensure_ascii=False) event.imgurls = json.dumps(img_urls, ensure_ascii=False) logging.info('已完成media文件清单:' + str(uploaded)) if set(all) == set(uploaded): logging.info('活动[#{0}] 所有media文件已完成'.format(event.code)) else: logging.info('mediaids不存在,没有media文件需要同步') event.syncfinish = 1 yield dbutil.do(event.save) except DoesNotExist: logging.info('无待同步media文件, sleep...') yield gen.sleep(60 * 10) except Exception as e: logging.exception('同步media文件发生异常:{0}, 退出...'.format(str(e))) break else: yield gen.sleep(60 * 10)
def refresh_oauth2_access_code(refresh_token): if refresh_access_token: return '{}' config = dbutil.do(Config.get) appid = config.appid oauth2_refresh_url = wxconfig.oauth2_access_token_refresh_url.format(appid, refresh_token) http_client = AsyncHTTPClient() response = yield http_client.fetch(oauth2_refresh_url) logging.debug(response.body.decode()) return json.loads(response.body.decode())
def post(self): try: data = json.loads(self.request.body.decode()) code = data['eventcode'] openid = data['openid'] star = None try: star = yield dbutil.do(Star.select().where( (Star.eventcode == code) & (Star.openid == openid) ).get) except: pass if star: if star.status == 1: # 已经关注 raise RuntimeError else: # 已经取消关注 star.status = 1 star.updatetime = datetime.datetime.now() else: # 首次关注 results = yield [ dbutil.do(Event.select(Event.id, Event.code).where(Event.code == code).get), dbutil.do(User.select(User.id, User.openid).where(User.openid == openid).get) ] event = results[0] user = results[1] star = Star( eventid=event.get_id(), eventcode=event.code, userid=user.get_id(), openid=user.openid, createtime=datetime.datetime.now(), status=1 ) yield dbutil.do(star.save) self.write(Response(status=1, msg='ok', result={}).json()) except RuntimeError as e: self.write(Response(msg='sorry,亲,用户已经关注该活动').json()) logging.exception('StarEventHandler error: {0}'.format(str(e))) except Exception as e: self.write(Response(msg='sorry,亲,关注活动失败').json()) logging.exception('StarEventHandler error: {0}'.format(str(e)))
def get_oauth2_access_code(code): if code: return '{}' config = dbutil.do(Config.get) appid = config.appid secret = config.appsecret oauth2_url = wxconfig.oauth2_access_token_url.format(appid, secret, code) http_client = AsyncHTTPClient() response = yield http_client.fetch(oauth2_url) logging.debug(response.body.decode()) return json.loads(response.body.decode())
def send_template_msg(templatemsg): if templatemsg is None: return logging.info('wxutil.send_template_msg - 发送模板消息:{0}'.format(templatemsg)) config = yield dbutil.do(Config.get) url = wxconfig.custom_msg_url.format(config.accesstoken) # data = { # 'touser': templatemsg.touser, # 'template_id': templatemsg.templateid, # 'url': templatemsg.url, # 'data': json.loads(templatemsg.data) # } http_client = AsyncHTTPClient() response = yield http_client.fetch(url, **{'method': 'POST', 'body': json.dumps(templatemsg, ensure_ascii=False)}) result = json.loads(response.body.decode()) errcode = result['errcode'] if errcode == 0: templatemsg['msgid'] = result['msgid'] templatemsg['updatetime'] = datetime.datetime.now() tmsg = dict_to_model(Templatemsg, templatemsg) yield dbutil.do(tmsg.save) else: raise RuntimeError('wxutil.send_template_msg-发送模板消息失败,消息内容:{0}'.format(templatemsg))
def send_custom_msg(msg, reply): custom_text = copy.deepcopy(wxconfig.custom_text_template) custom_text['touser'] = msg.fromusername custom_text['text']['content'] = reply logging.debug(custom_text) config = yield dbutil.do(Config.select().get) url = wxconfig.custom_msg_url.format(config.accesstoken) logging.debug(url) logging.debug(json.dumps(custom_text, ensure_ascii=False, indent=4)) http_client = AsyncHTTPClient() response = yield http_client.fetch(url, **{'method': 'POST', 'body': json.dumps(custom_text, ensure_ascii=False)}) logging.debug(response.body.decode())
def query_fulltext_code(code): pinyin = Pinyin() initials = [] for letter in pinyin.get_initials(code, splitter=' ').lower().split(' '): if letter.isalpha(): initials.append(letter * 4) logging.debug(initials) analysed_code = pinyin.get_pinyin(code, splitter=u' ') + ' ' + ' '.join(initials) logging.debug(analysed_code) clause = "MATCH(`codepinyin`, `codepinyininitials`) AGAINST (%s)" query = yield dbutil.do(Event.select(SQL('*, ' + clause + ' AS similarity', analysed_code)).where( SQL(clause, analysed_code)).limit(4).dicts) events = [event for event in query] logging.debug(events) return events
def post(self): try: data = json.loads(self.request.body.decode()) logging.debug(data) # 默认查询第一页 page_number = data.get('page_number', 1) # 默认每页显示4条数据 items_per_page = data.get('items_per_page', 4) query = yield dbutil.do( Event.select().order_by(-Event.createtime).paginate( page_number, items_per_page).dicts) result = [event for event in query] self.write(Response(status=1, msg='ok', result=result).json()) except Exception as e: self.write(Response(msg='sorry,亲,活动查询失败').json()) logging.exception('CreateEventHandler error: {0}'.format(str(e)))
def download_temp_resource(media_id): config = yield dbutil.do(Config.get) url = wxconfig.temp_resource_download_url.format(config.accesstoken, media_id) http_client = AsyncHTTPClient() response = yield http_client.fetch(url) filename = response.headers['Content-disposition'][len('attachment; filename="'):-1] if syncconfig.store_at: path = syncconfig.store_at else: path = sys.path[0] + os.path.sep + syncconfig.default_name os.makedirs(path, exist_ok=True) if path[-1] != os.path.sep: path += os.path.sep with open(path + filename, mode='wb') as file: file.write(response.body) return {'path': path, 'filename': filename}
def _validate(signature, timestamp, nonce, echostr): try: logging.debug( 'signature:{0} timestamp:{1} nonce:{2} echostr:{3}'.format( signature, timestamp, nonce, echostr)) _config = yield dbutil.do(Config().select().get) tmp_list = sorted([_config.token, timestamp, nonce]) tmp_str = ''.join(tmp_list) logging.debug('before sha1: {0}'.format(tmp_str)) tmp_str = hashlib.sha1(tmp_str.encode()).hexdigest() logging.debug('after sha1: {0}'.format(tmp_str)) if tmp_str == signature: return True else: return False except Exception as e: logging.exception('WeiXinMessageHandler error: {0}'.format(str(e))) return False
def _validate(signature, timestamp, nonce, echostr): try: logging.debug( 'signature:{0} timestamp:{1} nonce:{2} echostr:{3}'. format(signature, timestamp, nonce, echostr)) _config = yield dbutil.do(Config().select().get) tmp_list = sorted([_config.token, timestamp, nonce]) tmp_str = ''.join(tmp_list) logging.debug('before sha1: {0}'.format(tmp_str)) tmp_str = hashlib.sha1(tmp_str.encode()).hexdigest() logging.debug('after sha1: {0}'.format(tmp_str)) if tmp_str == signature: return True else: return False except Exception as e: logging.exception('WeiXinMessageHandler error: {0}'.format(str(e))) return False
def post(self): try: data = json.loads(self.request.body.decode()) logging.debug(data) event = dict_to_model(Event, data) event.createtime = datetime.datetime.now() pinyin = Pinyin() event.codepinyin = pinyin.get_pinyin(event.code, splitter=' ') initials = [] for letter in pinyin.get_initials(event.code, splitter=' ').lower().split(' '): if letter.isalpha(): initials.append(letter * 4) event.codepinyininitials = ' '.join(initials) yield dbutil.do(event.save) self.write(Response(status=1, msg='恭喜你,活动发布成功!', result={}).json()) ioloop.IOLoop.current().spawn_callback(event_service.create_qrcode, event) except Exception as e: self.write(Response(msg='sorry,亲,活动发布失败').json()) logging.exception('CreateEventHandler error: {0}'.format(str(e)))
def post(self): openid = None try: request = json.loads(self.request.body.decode()) openid = request['openid'] logging.debug('openid: {0}'.format(openid)) user = yield dbutil.do( User.select().where(User.openid == openid).get) self.write( Response(status=1, msg='ok', result=shortcuts.model_to_dict(user)).json()) except DoesNotExist as e: self.write( Response(msg='sorry,亲,用户不存在 openid={0}'.format(openid)).json()) logging.exception('GetUserInfoHandler error: {0}'.format(str(e))) except Exception as e: self.write( Response( msg='sorry,亲,查询用户失败 openid={0}'.format(openid)).json()) logging.exception('GetUserInfoHandler error: {0}'.format(str(e)))
def post(self): try: data = json.loads(self.request.body.decode()) logging.debug(data) event = dict_to_model(Event, data) event.createtime = datetime.datetime.now() pinyin = Pinyin() event.codepinyin = pinyin.get_pinyin(event.code, splitter=' ') initials = [] for letter in pinyin.get_initials(event.code, splitter=' ').lower().split(' '): if letter.isalpha(): initials.append(letter * 4) event.codepinyininitials = ' '.join(initials) yield dbutil.do(event.save) self.write(Response( status=1, msg='恭喜你,活动发布成功!', result={} ).json()) ioloop.IOLoop.current().spawn_callback(event_service.create_qrcode, event) except Exception as e: self.write(Response(msg='sorry,亲,活动发布失败').json()) logging.exception('CreateEventHandler error: {0}'.format(str(e)))
def post(self): openid = None try: request = json.loads(self.request.body.decode()) openid = request.get('openid', None) results = yield dbutil.do( Star.select().where((Star.openid == openid) & (Star.status == 1)).dicts) stars = [star for star in results] self.write(Response(status=1, msg='ok', result=stars).json()) except AttributeError as e: self.write(Response(msg='sorry,亲,修改用户信息时必须包含openid').json()) logging.exception('UpdateUserInfoHandler error: {0}'.format( str(e))) except DoesNotExist as e: self.write( Response(msg='sorry,亲,用户不存在 openid={0}'.format(openid)).json()) logging.exception('UpdateUserInfoHandler error: {0}'.format( str(e))) except Exception as e: self.write(Response(msg='sorry,亲,修改用户信息失败').json()) logging.exception('UpdateUserInfoHandler error: {0}'.format( str(e)))
def create_qrcode(event): event.qrcodeurl = yield wxutil.get_temp_qrcode_url(event.get_id()) event.qrcodecreatetime = datetime.datetime.now() yield dbutil.do(event.save)
def get_baidu_api_url(query, region, output='json'): url = 'http://api.map.baidu.com/place/v2/search?q={0}®ion={1}&output={2}&ak={3}' config = yield dbutil.do(Config.get) logging.debug(config.baiduak) return url.format(query, region, output, config.baiduak)
def process(self, wxmsg): yield dbutil.do(wxmsg.save)
def process(self, wxmsg): user = yield wxutil.get_user_info(wxmsg.fromusername) dbutil.do(shortcuts.dict_to_model(User, user).save) wxmsg.response, wxmsg.responsetime = 1, datetime.datetime.now() yield super().process(wxmsg)
def process(self, wxmsg): user = yield dbutil.do(User.select().where(User.openid == wxmsg.fromusername).get) user.subscribe = 0 dbutil.do(user.save) wxmsg.response, wxmsg.responsetime = 1, datetime.datetime.now() yield super().process(wxmsg)
def get_access_token(): config = yield dbutil.do(Config.get) return config.accesstoken
def get_jsapi_ticket(): config = yield dbutil.do(Config.get) return config.jsapiticket