def post(self): msg = parse_message(request.data) # 是文本消息 if msg.type == 'text': reply = TextReply(message=msg) reply.content = 'text reply' xml = reply.render() return xml # 事件类型消息 elif msg.type == 'event': # 处理菜单点击事件 if msg.event == 'click': # MenuClick是自定义类,处理菜单点击事件 click = MenuClick(msg) return click.menu_click() # 其他类型的事件消息不处理 else: reply = TextReply(message=msg) reply.content = 'event未知' xml = reply.render() return xml # 其他消息 else: reply = TextReply(message=msg) reply.content = '未知操作' xml = reply.render() return xml
def test(self, request, message, wechat): """ 发布中测试 """ logger = getLogger('django.request.test_ProcessServerEventView') logger.info(message) if message.get('MsgType').lower() == 'event': reply = TextReply() reply.target = message['FromUserName'] reply.source = message['ToUserName'] reply.content = message['Event'] + 'from_callback' xml_str = reply.render() headers = {'CONTENT_TYPE': request.META['CONTENT_TYPE']} return Response(xml_str, headers=headers) elif message.get('MsgType').lower() in consts.MESSAGE_TYPES: if message.get('Content') == 'TESTCOMPONENT_MSG_TYPE_TEXT': reply = TextReply() reply.target = message['FromUserName'] reply.source = message['ToUserName'] reply.content = 'TESTCOMPONENT_MSG_TYPE_TEXT_callback' xml_str = reply.render() headers = {'CONTENT_TYPE': request.META['CONTENT_TYPE']} return Response(xml_str, headers=headers) elif message.get('Content').startswith('QUERY_AUTH_CODE'): from datetime import timedelta now = datetime.utcnow() + timedelta(seconds=2) query_auth_code = message.get('Content').split(':')[1] process_wechat_query_auth_code_test.apply_async( (message['FromUserName'], query_auth_code), eta=now) return Response('')
def test(self, request, message, wechat): """ 发布中测试 """ logger = getLogger('django.request.test_ProcessServerEventView') logger.info(message) if message.get('MsgType').lower() == 'event': reply = TextReply() reply.target = message['FromUserName'] reply.source = message['ToUserName'] reply.content = message['Event'] + 'from_callback' xml_str = reply.render() headers = {'CONTENT_TYPE': request.META['CONTENT_TYPE']} return Response(xml_str, headers=headers) elif message.get('MsgType').lower() in consts.MESSAGE_TYPES: if message.get('Content') == 'TESTCOMPONENT_MSG_TYPE_TEXT': reply = TextReply() reply.target = message['FromUserName'] reply.source = message['ToUserName'] reply.content = 'TESTCOMPONENT_MSG_TYPE_TEXT_callback' xml_str = reply.render() headers = {'CONTENT_TYPE': request.META['CONTENT_TYPE']} return Response(xml_str, headers=headers) elif message.get('Content').startswith('QUERY_AUTH_CODE'): from datetime import timedelta now = datetime.utcnow() + timedelta(seconds=2) query_auth_code = message.get('Content').split(':')[1] process_wechat_query_auth_code_test.apply_async( (message['FromUserName'], query_auth_code), eta=now) return Response('')
def on_post(self, req, resp): xml = req.stream.read() msg = parse_message(xml) if msg.type == 'text': try: text = msg.content c = len(text) if c == 1 and '啊' not in text and '哼' not in text and '嗨' not in text: poem_flag = 24 poem = self.pchat.gen_poem(text, poem_flag) replyTxt = self.pchat.pretty_print_poem(poem_=poem) tf.reset_default_graph() else: eliza = ElizaChat() replyTxt = eliza.analyze(text) if replyTxt == "@$@": replyTxt, score = self.retrieval.api(text) replyTxt = replyTxt reply = TextReply(content=replyTxt, message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200 except Exception as e: print(e) elif msg.type == 'image': reply = ImageReply(media_id=msg.media_id, message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200
async def postWechat(request: Request, user_agent: Optional[str] = Header(None)): headers = {'CONTENT_TYPE': 'text/html'} __data = await request.body() __msg = parse_message(__data) if __msg.type == 'text': __p = re.compile('doge') if __p.match(__msg.content) != None: __reply = TextReply(content=__topDoge.run(), message=__msg) __xml = __reply.render() #return __xml #return Response(content=__xml, headers=headers) #articles = [ # { # 'title': 'test', # 'description': 'test \n second line \n description', # 'image': 'https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png', # 'url': 'https://www.yahoo.co.jp' # } #] #__reply = TextReply(content=__msg.content, message=__msg) #__reply = create_reply(articles, __msg) else: __reply = TextReply( content="I don't know what are you talking about.", message=__msg) __xml = __reply.render() else: __reply = TextReply(content="I don't know what are you talking about.", message=__msg) __xml = __reply.render() return Response(content=__xml, headers=headers)
def index(): # print request.args # print json.dumps(request.args) if request.method == 'GET': data = request.args signature = data.get('signature') timestamp = data.get('timestamp') nonce = data.get('nonce') echostr = data.get('echostr') token = current_app.config.get('TOKEN') try: check_signature(token, signature, timestamp, nonce) except InvalidSignatureException: return 'invalid signature' return echostr else: xml = request.data print xml msg = parse_message(xml) if msg.type == 'text': print msg.content reply = TextReply(message=msg) reply.content = u'reply 测试' xml_reply = reply.render() return xml_reply elif msg.type == 'image': reply = ImageReply(message=msg) reply.media_id = msg.media_id xml_reply = reply.render() return xml_reply elif msg.type == 'voice': # reply = VoiceReply(message=msg) # reply.media_id = msg.media_id reply = TextReply(message=msg) reply.content = msg.recognition xml_reply = reply.render() return xml_reply elif msg.type == 'video': reply = VideoReply(message=msg) reply.media_id = msg.media_id reply.title = u'你的video' reply.description = u'wo 爱倪呀' xml_reply = reply.render() return xml_reply pass elif msg.type == 'location': pass elif msg.type == 'link': pass elif msg.type == 'shortvideo': reply = VideoReply(message=msg) reply.media_id = msg.thumb_media_id reply.title = u'你的video' reply.description = u'wo 爱倪呀' xml_reply = reply.render() return xml_reply else: return ''
def serve(request): # GET 方式用于微信公众平台绑定验证 if request.method == 'GET': signature = request.GET.get('signature', '') timestamp = request.GET.get('timestamp', '') nonce = request.GET.get('nonce', '') echo_str = request.GET.get('echostr', '') try: check_signature(settings.Token, signature, timestamp, nonce) except InvalidSignatureException: echo_str = '错误的请求' response = HttpResponse(echo_str) else: msg = parse_message(request.body) msg_dict = msg.__dict__['_data'] # print(msg.id, msg.source, msg.create_time, msg.type, msg.target, msg.time, msg.__dict__['_data']['Event'], '====') if msg.type == 'text': print(msg) # print(msg.source) # print(msg.target) # transResult = youdaoTranslate(msg.content) # transResult = googleTranslate(msg.content) transResult = getAns(msg.content) transResult = transResult if transResult != '' else '我好像不明白' reply = TextReply(content= transResult, messsage=msg) reply.source = msg.target reply.target = msg.source xml = reply.render() print(reply) # pass elif msg.type == 'event': if msg_dict['Event'] == 'subscribe': # 关注后 将获取的用户的信息保存到数据库 # wx_wechat.subscribe(getWxUserInfo(msg.source)) print('subscribe') elif msg_dict['Event'] == 'unsubscribe': # 取关后,将用户的关注状态更改为 未关注 # wx_wechat.unsubscribe(msg.source) print('subscribe') elif msg.type == 'image': print(msg) faceResult = getResultFromUrl(msg.image) if faceResult['ret']!=0: reply = TextReply(content= '未检测到人脸', messsage=msg) else: content = numTranslate(faceResult['data']['face_list'][0]) reply = TextReply(content= content, messsage=msg) reply.source = msg.target reply.target = msg.source xml = reply.render() else: pass response = HttpResponse(xml, content_type="application/xml") return response
def sign_in(msg): """每日签到。 未绑定拼拼网的用户签到无效,并告知绑定方法。 绑定用户,redis中控制每日签到一次 db中纪录签到总天数、连续签到天数 """ # 检查微信号是否绑定了拼拼账号 msg_openid = msg.source msg_user = UserWechat.query.filter_by(wechat_openid=msg_openid).first() if msg_user: user = User.query.get(msg_user.uid) today = arrow.utcnow().to('local') key = USER_SIGN_IN.KEY.format(dayid=today.format('YYYYMMDD')) field = USER_SIGN_IN.FIELD.format(user=user.id) # 检查当日是否已签到 r = RedisApp() rs = r.hgetJson(key, field) if rs: reply = TextReply( content=u'{nickname} , 今天已经签到过了,明天继续加油。'.format(nickname=user.nickname), message=msg) return reply.render() rs = r.hsetJson(key, field, today.timestamp) if rs: # 获取用户签到历史 s = UserSignIn.query.filter_by(uid=user.id).first() if s: s.tot_sign_in_days += 1 last_sign_in_dt = arrow.get( arrow.get(s.last_sign_in_dt).format('YYYYMMDD'), 'YYYYMMDD').timestamp this_sign_in_dt = arrow.get( today.format('YYYYMMDD'), 'YYYYMMDD').timestamp if this_sign_in_dt - last_sign_in_dt == 86400: s.continuous_sign_in_days += 1 else: s.continuous_sign_in_days = 1 s.last_sign_in_dt = today.naive s.save else: s = UserSignIn() s.uid = user.id s.tot_sign_in_days = 1 s.continuous_sign_in_days = 1 s.last_sign_in_dt = today.naive s.save reply = TextReply(content=u'{nickname} ,今天是您和拼拼在一起的第{days}天,第{total_days}天签到,您已经连续签到{continuous_days}天,连续签到会有意外惊喜喔。'.format( nickname=user.nickname, days=user.get_regdays(), total_days=s.tot_sign_in_days, continuous_days=s.continuous_sign_in_days), message=msg) return reply.render() reply = TextReply(content='签到机发生错误,请稍候再试。', message=msg) return reply.render() reply = TextReply(content='你还未关联拼拼网账号,签到无效,科科。', message=msg) return reply.render()
def on_post(self, req, resp): xml = req.stream.read() msg = parse_message(xml) if msg.type == 'text': reply = TextReply(content=msg.content, message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200 elif msg.type == 'image': reply = ImageReply(media_id=msg.media_id, message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200
def get_response(self, msg): """ 测试是否微信服务器的重复请求,再根据类型响应 :param msg: :return: """ if msg.id == self.visist["visit_id"]: self.visist["count"] += 1 print("weixin request again.") if self.visist["count"] > 2: ans = "脑壳疼,缓一缓" reply = TextReply(content=ans, message=msg) xml = reply.render() # AI.initialization() # 重启 return xml time.sleep(5) # 拖时间,确认不会影响到还在执行的回复 return "" else: # self.ai.set_callback(self.callback) self.visist["visit_id"] = msg.id self.visist["count"] = 0 self.weixin_id = msg.source user_id = self._weixin_id2user_id.get(self.weixin_id, self.weixin_id) self.ai.init_userid(user_id) # print() if msg.type == 'text': query = msg.content if query == "来聊天": response = self.letstalk(user_id) else: response = self.ai.text_api(query,user_id) xml = self._response2xml(response, msg) return xml elif msg.type == "image": url = msg.image # 先下载,再读取 path = "./UserData/tmp/" if not os.path.exists(path): os.makedirs(path) name = "{}.png".format(msg.source) # 以用户id做名字,避免乱串 path = os.path.join(path, name) download_tool.stream_download(url, path) image = PIL_Image.open(path) response = self.ai.img_api(image,user_id) xml = self._response2xml(response, msg) else: reply = TextReply(content="暂时不支持该数据格式", message=msg) xml = reply.render() return xml
def _response2xml(self, response, msg): """ 将response解析成需要的xml :param response: :return: """ # 图片型 if response.startswith("#Image"): path = response.replace("#Image:", "") medie_id = self._weixin_util.upload(path) replay = ImageReply(media_id=medie_id, message=msg) xml = replay.render() return xml else: # 文本型的xml if response.startswith("#json:"): response = response.replace("#json:", "") response_json = json.loads(response) # print(response_json) # 处理url类的 for key in response_json: if "url" in key: response = "你自己看吧。\n{}".format(response_json[key]) break reply = TextReply(content=response, message=msg) xml = reply.render() return xml
def get_robot_reply(msg): if "你叫什么" in msg.content: answer = "洋葱骑士" elif "你名字" in msg.content: answer = "洋葱骑士" elif "你是谁" in msg.content: answer = "洋葱骑士" elif "小组编号" in msg.content: answer = "02" elif "小组成员" in msg.content: answer = "杨涵越(组长),华豪,邹鹏程,许金仓,张诚,王清洋,李书宽" elif "军事新闻" in msg.content: answer = NEWS() # elif "二维码" in msg.content: # answer = "请输入你要生成的内容:" # qr() else: try: # 调用NLP接口实现智能回复 params = urllib.parse.urlencode({ 'msg': msg.content }).encode() # 接口参数需要进行URL编码 req = urllib.request.Request("http://api.itmojun.com/chat_robot", params, method="POST") # 创建请求 answer = urllib.request.urlopen( req).read().decode() # 调用接口(即向目标服务器发出HTTP请求,并获取服务器的响应数据) if answer == "": answer = "人家听不懂你在说什么" except Exception as e: answer = "AI机器人出现故障!(原因:%s)" % e reply = TextReply(content='%s' % answer, message=msg) return reply.render()
def on_post(self, req, resp): xml = req.stream.read() msg = parse_message(xml) if msg.type == 'text': content = msg.content if content.isdigit(): text = Connect().get_url(content) reply = TextReply(content=text, message=msg) elif content == '一言': text = Connect().hitokoto() reply = TextReply(content=text, message=msg) elif content == 'anime': text = Connect().bangumi() reply = TextReply(content=text, message=msg) elif content == '迅雷': text = 'Android:\nhttp://suo.im/5WbiD4\niOS(用自带Safari打开):\nhttps://ithunder-ota.a.88cdn.com/download-guide/step1.html?from=gzhlm' reply = TextReply(content=text, message=msg) elif content == '哔咔': text = '浏览器打开(包括iOS和Android):\nhttps://download2.picacomiccn.xyz' reply = TextReply(content=text, message=msg) else: return '' # 对其他文本不作回复 https://github.com/wechatpy/wechatpy/issues/161 elif msg.type == 'event' and msg.event == 'subscribe': help = "谢谢关注!\n\n" \ "1. 在对话框输入'哔咔', 获取哔咔下载地址\n\n" \ "2. 输入'迅雷', 获取迅雷下载地址\n\n" \ "3. 输入'一言', 可以看到一句台词\n\n" \ "4. 输入'anime', 查看今天更新的番剧\n\n" \ "5. 输入b站直播房间号, 如'1017', 可以查看当前主播是否在线" reply = TextReply(content=help, message=msg) else: reply = TextReply(content="只支持文字消息", message=msg) xml = reply.render() resp.body = xml resp.status = falcon.HTTP_200
def token(): if request.method == 'GET': signature = request.args.get('signature') timestamp = request.args.get('timestamp') nonce = request.args.get('nonce') echo_str = request.args.get('echostr') # echo_str是微信用来验证服务器的参数,需原样返回 print(signature, timestamp, nonce, echo_str) try: print('正在验证服务器签名') # 无法验证成功??? # check_signature(token, signature, timestamp, nonce) print('验证签名成功') except InvalidSignatureException as e: print('检查签名出错: '.format(e)) return 'Check Error' return echo_str # POST print('开始处理用户消息') msg = parse_message(request.data) reply_text = handle_msg(msg) reply = TextReply(message=msg) reply.content = reply_text return reply.render()
async def weixin_reply(request): if request.method == 'GET': res = request_para(request) sign_ture = res.get('signature') time_stamp = res.get('timestamp') nonce_ = res.get('nonce') echo_str = res.get('echostr') try: check_signature(token='4725471112', signature=sign_ture, timestamp=time_stamp, nonce=nonce_) return_str = echo_str except InvalidSignatureException: log_exp.error('InvalidSignatureException') return_str = 'InvalidSignatureException' return response.text(body=return_str) elif request.method == 'POST': xml = request.body msg = parse_message(xml) if msg.type == 'text' and msg.source == 'opfB6w88fRxMh6DJirlzW8biOFNw': # 固定1148270327这个用户 res_msg = web_call_main(msg.content.strip()) reply = TextReply(content=res_msg, message=msg) xml = reply.render() return response.text(body=xml, status=200) else: return response.text(body='NaN') else: return response.text(body='NaN')
def handle_msg(request): if request.method == 'GET': signature = request.GET.get('signature') timestamp = request.GET.get('timestamp') nonce = request.GET.get('nonce') echo_str = request.GET.get('echostr') check_signature(TOKEN, signature, timestamp, nonce) return HttpResponse(echo_str) elif request.method == 'POST': body = request.body msg = parse_message(body) rep = TextReply() rep.source = msg.target rep.target = msg.source if msg.type == 'event': if msg.event == 'click': print(msg.key) if msg.key == 'sports_advice': rep.content = recommend_plan(msg.source) elif msg.key == 'view_info': rep.content = get_info(msg.source) elif msg.key == 'add_test': rep.content = add_test(msg.source) elif msg.key == 'show_today': rep.content = get_datatoday(msg.source) elif msg.event == 'subscribe': rep.content = create_newuser(msg.source) else: rep.content = '!!!' else: rep.content = '<a href="http://learn.tsinghua.edu.cn">你好</a>' repxml = rep.render() return HttpResponse(repxml)
def handle_reply(content, msg): ''' 根据用户选取的回复信息的类型,对相应信息进行处理成xml ''' env = request.env() if content._name == 'wx.text': reply_content = content.text_content reply = TextReply(message=msg, content=reply_content) elif content._name == 'wx.image': reply_content = content.media_id reply = ImageReply(media_id=reply_content, message=msg) elif content._name == 'wx.imagetext': Articles = [{ 'title': content.name, 'description': content.content, 'picurl': content.image_id.url, 'url': content.content_source_url }] reply = ArticlesReply(message=msg, articles=Articles) elif content._name == 'wx.many.imagetext': Articles = [] for content in content.many_image_text: Articles.append({ 'title': content.name, 'description': content.content, 'picurl': content.image_id.url, 'url': content.content_source_url }) reply = ArticlesReply(message=msg, articles=Articles) _logger.info('消息处理reply %s', reply) # debug return reply.render()
def weixinCheck(request): ''' 所有的消息都会先进入这个函数进行处理,函数包含两个功能, 微信接入验证是GET方法, 微信正常的收发消息是用POST方法。 :param request: :return: ''' if request.method == 'GET': signature = request.GET.get("signature", None) timestamp = request.GET.get("timestamp", None) nonce = request.GET.get("nonce", None) echostr = request.GET.get("echostr", None) token = WEIXIN_TOKEN print('进来了') try: check_signature(token, signature, timestamp, nonce) return HttpResponse(request.GET.get('echostr', ''), content_type="text/plain") except InvalidSignatureException: # 处理异常情况或忽略 print('验证失败') elif request.method == 'POST': xml_message = smart_str(request.body) msg = parse_message(xml_message) reply = TextReply(content='你好,这是测试', message=msg) xml_respose = reply.render() return HttpResponse(xml_respose, content_type="application/xml")
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 get_resp_message(request, source_msg, mode=None): request_msg = parse_message(source_msg) request_msg_type = request_msg.type log.info('>>> body[{}],request_msg_type[{}],request_msg[{}]'.format( request.body, request_msg_type, request_msg)) # 根据消息类型解析 if request_msg_type == 'text': reply = TextReply(content='{}'.format( get_text_reply(request, request_msg.content)), message=request_msg) elif request_msg_type == 'image': reply = TextReply(content=howold(request_msg.image), message=request_msg) elif request_msg_type == 'voice': if not request_msg.recognition: reply = TextReply(content='没听清楚啊,再说一遍,亲', message=request_msg) else: content = get_text_reply(request, request_msg.recognition) # tts = gTTS(text=content, lang='zh-cn') # tmpfd, tempfilename = tempfile.mkstemp() # tts.save(tempfilename) # with open(tempfilename, mode='rb') as f: # client = WeChatClient(config.WECHAT_APPID, config.WECHAT_SECRET) # res = WeChatMedia(client=client).upload('voice', f.read()) # print('>>>', res) # media_id = json.loads(res).get('media_id') # if not media_id: # reply = VideoReply(message=request_msg) # reply.media_id = media_id # else: # reply = TextReply(content='{}'.format(content), message=request_msg) reply = TextReply(content='{}'.format(content), message=request_msg) elif request_msg_type == 'event': request_msg_event = request_msg.event if request_msg_event == 'subscribe': reply = TextReply(content=config.WELCOME_MSG, message=request_msg) elif request_msg_event == 'unsubscribe': reply = TextReply(content='多谢关注!', message=request_msg) else: reply = EmptyReply() else: reply = EmptyReply() # 返回xml报文 xml = reply.render() if mode == 'aes': # get var timestamp = request.raw_args.get('timestamp', '') nonce = request.raw_args.get('nonce', '') crypto = WeChatCrypto(config.WECHAT_TOKEN, config.WECHAT_ENCODING_AES_KEY, config.WECHAT_APPID) encrypted_xml = crypto.encrypt_message(xml, nonce, timestamp) return encrypted_xml else: return xml
def home(request): if request.method == 'GET': signature = request.GET.get('signature') timestamp = request.GET.get('timestamp') nonce = request.GET.get('nonce', None) echo_str = request.GET.get('echostr') print(signature, " ", timestamp, " ", nonce) try: check_signature(TOKEN, signature, timestamp, nonce) except InvalidSignatureException: return HttpResponse("hello world") return HttpResponse(echo_str, content_type="text/plain") msg = parse_message(request.body) print(msg.type) if (msg.type == 'text'): reply = TextReply(content="you say:%s" % msg.content, message=msg) xml = reply.render() return HttpResponse(xml) elif (msg.type == 'image'): url = msg.image f = open(path + "/aaa.jpg", 'wb') str1 = urllib.urlopen(url).read() f.write(str1) f.close() image = cv.LoadImage(path + "/aaa.jpg", 1) size = (image.width, image.height) iUD = cv.CreateImage(size, image.depth, image.nChannels) h = image.height w = image.width for i in range(h): for j in range(w): iUD[i, w - j - 1] = image[i, j] cv.WaitKey(0) cv.SaveImage(path + "/bbb.jpg", iUD) json_str = urllib.urlopen( "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" % (appID, appsecret)).read().decode("utf-8") access_token = json.loads(json_str)['access_token'] json_str = commands.getoutput( "curl -F media=@%s/bbb.jpg 'https://api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=image'" % (path, access_token)) print(json_str) media_id = json_str.split(',')[1].split(':')[1].replace('"', '') print(type(media_id)) print(media_id) print(dir(media_id)) xml = """<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[%s]]></MediaId> </Image> </xml> """ % (msg.source, msg.target, time.time() + 1, media_id) return HttpResponse(xml)
def reply_message(self, to_open_message, msg): """ :param to_open_messgae 要回复给访客的消息 :param msg 收到的消息解析后保存在msg """ reply = TextReply(content=to_open_message, message=msg) # 转换成 XML xml = reply.render() return xml
def server(request): # GET 方式用于微信公众平台绑定验证 if request.method == 'GET': signature = request.GET.get('signature', '') timestamp = request.GET.get('timestamp', '') nonce = request.GET.get('nonce', '') echo_str = request.GET.get('echostr', '') # print(WECHAT_TOKEN, signature, timestamp, nonce) try: check_signature(WECHAT_TOKEN, signature, timestamp, nonce) except InvalidSignatureException: echo_str = '微信订阅号:错误的请求!!!' return HttpResponse(echo_str) else: msg = parse_message(request.body) # print("消息类型:",msg.type) # print("事件:",msg.event) # print("消息:", msg) reply = TextReply(message=msg) if msg.type == 'event': # print(msg.event) if 'subscribe' in msg.event and (msg.event != "unsubscribe"): # print("新用户订阅:%s" % msg.source, dir(msg)) send_email(subject="新用户订阅!", content="新用户订阅") reply.content = "欢迎您来到重症医学质量控制,在后台回复消息,可获得重症医学相关知识!" elif msg.event == 'unsubscribe': # print("用户取消订阅:%s" % msg.source, dir(msg))s reply.content = "下次再来1!" elif msg.type == 'text': reply.content = msg.content # reply = ArticlesReply(message=msg) # reply.add_article({ # 'title':'test', # 'description':'des of test', # 'image':'http://linux.zicp.vip/static/images/logo.png', # 'url':'http://linux.zicp.vip' # }) elif msg.type == 'image': reply.content = "您发了一张图片吗?图片的地址为:%s" % msg.image elif msg.type == 'voice': reply.content = "您发了一条语音吗?" elif msg.type == 'video': reply.content = "您发了一个视频吗?" elif msg.type == 'location': reply.content = "您发了一个地理位置吗?纬度:%s-经度:%s,位置:%s" % ( msg.location_x, msg.location_y, msg.label) elif msg.type == 'shortvideo': reply.content = "您发了一个短视频吗?" elif msg.type == 'link': reply.content = "您发了一个链接吗?链接:%s ,地址:%s" % (msg.description, msg.url) xml = reply.render() return HttpResponse(xml)
def Reply_text(msg, reply_text): """ 用于回复文本数据 :param msg: :param reply_text: :return: """ reply_data = TextReply(content=reply_text, message=msg) reply_xml = reply_data.render() return reply_xml
def weixin(request): if request.method == 'POST': msg = parse_message(request.body) if msg.type == 'text': replay = TextReply(content=msg.content, message=msg) return HttpResponse(replay.render()) return HttpResponse(TextReply(content="hah")) elif request.method == 'GET': print(request.GET) return HttpResponse(request.GET.get('echostr', default='110'))
def autoreply(request): try: webData = request.body msg = parse_message(webData) msg_type = msg.type logger.info("询问排名") if msg_type == 'text': content = msg.Content from wechatpy.replies import TextReply if content == '排名': logger.info("询问排名") # reply = TextReply(content='text reply', message=msg) # 或者 reply = TextReply(message=msg) reply.content = '查看详细排名' \ ' <a href="https://qiuplus.cn/zqzb/ranktable/">斯诺克排名 </a>' # 转换成 XML xml = reply.render() return xml else: reply = TextReply(content='text reply', message=msg) # 或者 reply = TextReply(message=msg) reply.content = '近期无比赛' # 转换成 XML xml = reply.render() return xml elif msg_type == 'image': from wechatpy.replies import TextReply reply = TextReply(content='图片已收到', message=msg) # 或者 reply = TextReply(message=msg) reply.content = 'text reply' # 转换成 XML xml = reply.render() return xml except Exception as Argment: logger.exception("error") logger.error(Argment) return Argment
def reply_message(self, message, content): """ 回复公众号消息 """ reply = TextReply() reply.target = message.FromUserName reply.source = message.ToUserName reply.content = content xml_str = reply.render() headers = {'CONTENT_TYPE': self.request.META['CONTENT_TYPE']} return Response(xml_str, headers=headers)
def on_post(self, req, resp): xml = req.stream.read() msg = parse_message(xml) if msg.type == 'text': reply = TextReply(content=msg.content, message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200 elif msg.type == 'image': name = img_download(msg.image, msg.source) print(name) r = access_api('images/' + name) if r == 'success': media_id = img_upload('image', 'faces/' + name) reply = ImageReply(media_id=media_id, message=msg) else: reply = TextReply(content='人脸检测失败,请上传1M以下人脸清晰的照片', message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200
def reply_message(self, message, content): """ 回复公众号消息 """ reply = TextReply() reply.target = message.FromUserName reply.source = message.ToUserName reply.content = content xml_str = reply.render() headers = {'CONTENT_TYPE': self.request.META['CONTENT_TYPE']} return Response(xml_str, headers=headers)
def on_post(self, req, resp): xml = req.stream.read() msg = parse_message(xml) if msg.type == 'text': reply = TextReply(content=msg.content, message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200 elif msg.type == 'image': name = img_download(msg.image, msg.source) print(name) r = access_api('images/' + name) if r == 'success': media_id = img_upload('image', 'faces/' + name) reply = ImageReply(media_id=media_id, message=msg) else: reply = TextReply(content='人脸检测失败,请上传1M以下人脸清晰的照片', message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200
def on_post(self, req, resp): # 猜测是打开数据流 xml = req.stream.read() # 解析xml格式数据 msg = parse_message(xml) if msg.type == 'text': reply = TextReply(content='露露我爱你', message=msg) # content=msg.content xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200 elif msg.type == 'image': reply = ImageReply(media_id=msg.media_id, message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200 elif msg.type == 'voice': reply = VoiceReply(media_id=msg.media_id, message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200
def on_post(self, req, resp): xml = req.stream.read() msg = parse_message(xml) if msg.type == 'text': if msg.content == '笑话': cursor = table.find({'id': random.randint(1, 6)}) for i in cursor: content = i["joke"] print(content) reply = TextReply(content=content, message=msg) xml = reply.render() else: print(msg, msg.content) reply = TextReply(content=msg.content, message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200 elif msg.type == 'image': reply = ImageReply(media_id=msg.media_id, message=msg) xml = reply.render() resp.body = (xml) resp.status = falcon.HTTP_200
def weixin_handler(): # 从config文件中获取 token = os.getenv('WECHAT_TOKEN', config.WECHAT_TOKEN) encodingAESKey = os.getenv('WECHAT_ENCODING_AES_KEY', config.WECHAT_ENCODING_AES_KEY) appId = os.getenv('WECHAT_APP_ID', config.WECHAT_APP_ID) # 从请求中获取 signature = flask.request.args.get("signature") timestamp = flask.request.args.get("timestamp") nonce = flask.request.args.get("nonce") echostr = flask.request.args.get("echostr") # encrypt_type = flask.request.args.get("encrypt_type") msg_signature = flask.request.args.get("msg_signature") ''' print('signature:', signature) print('timestamp: ', timestamp) print('nonce:', nonce) print('echo_str:', echostr) print('encrypt_type:', encrypt_type) print('msg_signature:', msg_signature) ''' crypto = WeChatCrypto(token, encodingAESKey, appId) try: check_signature(token, signature, timestamp, nonce) # 签名验证 except InvalidSignatureException: flask.abort(403) # 校验token失败,证明这条消息不是微信服务器发送过来的 if flask.request.method == "GET": # 如果时明文模式 直接返回echoster return echostr elif flask.request.method == "POST": # 如果时加密模式 先对传入的数据解密 try: msg = crypto.decrypt_message(flask.request.data, msg_signature, timestamp, nonce) print('Descypted message: \n%s' % msg) # 输出数据内容 except (InvalidSignatureException, InvalidAppIdException): flask.abort(404) msg = parse_message(msg) # 解析xml if msg.type == 'text': res = get_robot_reply(msg.content) reply = TextReply(message=msg) reply.content = '%s' % (res) elif msg.type == "image": # 图片回复 reply = ImageReply(message=msg) reply.media_id = msg.media_id else: reply = TextReply(content="暂时不支持此种类型的回复哦~", message=msg) print('Enscypted message: \n%s' % reply) # 返回加密信息 return crypto.encrypt_message(reply.render(), nonce, timestamp)
def handle_msg(request): if request.method == 'GET': signature = request.GET.get('signature') timestamp = request.GET.get('timestamp') nonce = request.GET.get('nonce') echo_str = request.GET.get('echostr') check_signature(TOKEN, signature, timestamp, nonce) return HttpResponse(echo_str) elif request.method == 'POST': body = request.body msg = parse_message(body) rep = TextReply() rep.source = msg.target rep.target = msg.source if msg.type == 'event': if msg.event == 'click': if msg.key == 'sports_advice': rep.content = recommend_plan(msg.source) elif msg.key == 'view_info': rep.content = get_info(msg.source) elif msg.key == 'add_bong': rep.content = add_bong(msg.source) elif msg.key == 'add_test': rep.content = add_test(msg.source) elif msg.key == 'add_test_new': rep.content = add_test_new(msg.source) elif msg.key == 'show_today': rep.content = get_datatoday(msg.source) elif msg.key == 'change_remind': rep.content = set_remind(msg.source) elif msg.key == 'build_match': article_rep = ArticlesReply() article_rep.source = msg.target article_rep.target = msg.source article_rep.add_article({ 'title': '创建比赛', 'description': '点此链接以创建比赛', 'image': serverIP+'static/img/run02.jpg', 'url': build_match(msg.source) }) repxml = article_rep.render() return HttpResponse(repxml) elif msg.event == 'subscribe': rep.content = create_newuser(msg.source) else: rep.content = '!!!' else: rep.content = '你好' repxml = rep.render() return HttpResponse(repxml)
def responMsg(self, pstr, xml): #signature=pstr["signature"][0] #nonce=pstr["nonce"][0] #timestam=pstr["timestamp"][0] msg = parse_message(xml) reply = TextReply(message=msg) reply.content = '你好啊,扑街!' restr = reply.render() bstr = bytes(restr, encoding='utf-8') returncode = bytes(str(bstr, encoding='utf-8').replace('\n', ''), encoding='utf-8') #self.wfile.write(returncode) print(returncode) return returncode
def welcome_article(msg): """新关注用户发送介绍图文 """ # msg_openid = msg.source content = u""" Hi,朋友,很高兴认识你! 如果你是拼拼网的老朋友,<a href="http://mp.weixin.qq.com/s?__biz=MzI3MjM5MTI2MA==&mid=100000015&idx=1&sn=311cb4a695d5964399b6b1d2d6f798bb#rd">绑定账号</a>即可随时查看拼团动态。 如果你是拼拼网的新朋友,不妨看看<a href="http://mp.weixin.qq.com/s?__biz=MzI3MjM5MTI2MA==&mid=100000017&idx=1&sn=bb1b4b2f0468306b92dafb17d3b41acb#rd">拼拼网介绍</a>。 最后,感谢你关注拼拼网微信号,享受每周一推的<a href="http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MzI3MjM5MTI2MA==#wechat_webview_type=1&wechat_redirect">好货分享</a>吧~ ----PinPin Team """ reply = TextReply(content=content, message=msg) return reply.render()
def test_reply_render(self): timestamp = int(time.time()) reply = TextReply( source='user1', target='user2', time=timestamp, content='test' ) r = reply.render() self.assertTrue(r.startswith('<xml>\n')) self.assertTrue(r.endswith('\n</xml>')) self.assertTrue('<ToUserName><![CDATA[user2]]></ToUserName>' in r) self.assertTrue('<FromUserName><![CDATA[user1]]></FromUserName>' in r) self.assertTrue('<MsgType><![CDATA[text]]></MsgType>' in r) self.assertTrue('<Content><![CDATA[test]]></Content>' in r) create_time = '<CreateTime>{time}</CreateTime>'.format(time=timestamp) self.assertTrue(create_time in r)
def parse_msg(self, msg): print msg.type print msg if msg.type == "event": content = "" if msg._data.get("Event", "") == "subscribe": content = "1、每日标准上班时间 10:00到19:00;" + \ "2、打卡时间10:03之前,之后记为迟到;" + \ "3、每月3次以内(含3次)迟到10:30之内,不做处理," + \ "超出3次,从第四次开始累计罚款20 40 80 160 平方递增," + \ "迟到超过30分钟按照事假2小时处理;" + \ "4、每人每月带薪病事假1天,不可跨月累计," + \ "超出部分病假发放50%工资(1天以上的需要医院假条)" + \ ",事假不发工资;" + \ "5、全勤奖,每月无事假病假,及任何迟到显现可获得全勤奖," + \ "奖品每月更换,平均价值300元;" + \ "6、加班,每日加班超过22:00(需要管理人员在加班单上签字)," + \ "第二天可11:00到岗,周末及节假日加班可累计倒休,抵扣事假,病假。" reply = TextReply(message=msg) reply.content = content elif msg.type == "text": reply = TextReply(message=msg) reply.content = msg._data.get("Content") elif msg.type == "image": reply = ImageReply(message=msg) reply.media_id = msg._data.get("MediaId") elif msg.type == "voice": reply = VoiceReply(message=msg) reply.media_id = msg._data.get("MediaId") pass else: return None re_xml = reply.render() return re_xml
def test1(request): print('!!!!!!') if request.method == 'GET': signature = request.GET.get('signature') timestamp = request.GET.get('timestamp') nonce = request.GET.get('nonce') echo_str = request.GET.get('echostr') check_signature(TOKEN, signature, timestamp, nonce) print('!!!') return HttpResponse(echo_str) elif request.method == 'POST': body = request.body msg = parse_message(body) print(msg.content) print(msg.source) print(msg.target) rep = TextReply() rep.source = msg.target rep.target = msg.source rep.content = '<a href="http://www.baidu.com">草泥马</a>' repxml = rep.render() return HttpResponse(repxml)
def handleMsg(request): if request.method == 'GET': signature = request.GET.get('signature') timestamp = request.GET.get('timestamp') nonce = request.GET.get('nonce') echo_str = request.GET.get('echostr') check_signature(TOKEN, signature, timestamp, nonce) return HttpResponse(echo_str) elif request.method == 'POST': body = request.body msg = parse_message(body) rep = TextReply() rep.source = msg.target rep.target = msg.source print(msg.type) if msg.type == 'event': if msg.event == 'click': if msg.key == 'change_info': rep.content = '请点击下面的链接修改信息\n<a href="http://59.66.139.224/showinfo?openID= '+ msg.source + '">修改信息</a>' else: rep.content = '<a href="http://learn.tsinghua.edu.cn">草泥马</a>' repxml = rep.render() return HttpResponse(repxml)
def weixin(): if request.method == 'GET': _g = lambda k: request.args.get(k) try: print(TOKEN, _g('signature'), _g('timestamp'), _g('nonce')) check_signature(TOKEN, _g('signature'), _g('timestamp'), _g('nonce')) return _g('echostr') except InvalidSignatureException: pass elif request.method == 'POST': msg = parse_message(request.data) if isinstance(msg, ClickEvent): ev = msg if ev.key == WX_BTN_BIND_BX: reply = TextReply() reply.source = ev.target reply.target = ev.source reply.content = '请访问以下链接登陆到BX邮箱\n%s' % ( '%s?%s' % (urljoin(DOMAIN, 'mslogin'), urlencode({'wx': ev.source})) ) return reply.render() elif ev.key == WX_BTN_BEGIN_CHECKIN: reply = TextReply() reply.source = msg.target reply.target = msg.source reply.content = '请访问以下链接选择开始哪个会议\n%s' % ( '%s/check-in-meetings?openid=%s' % (DOMAIN, msg.source) ) return reply.render() else: reply = TextReply() reply.source = msg.target reply.target = msg.source reply.content = '哦' return reply.render() elif isinstance(msg, TextMessage): if msg.content.lower().startswith('e'): reply = TextReply() reply.source = msg.target reply.target = msg.source reply.content = '请访问以下链接选择开始哪个会议\n%s' % ( '%s/check-in-meetings?openid=%s' % (DOMAIN, msg.source) ) return reply.render() else: return '哦' elif isinstance(msg, ScanEvent) or isinstance(msg, SubscribeScanEvent): openid = msg.source meetingid = msg.scene_id meeting = mongo.db.meeting.find_one({'meetingid': meetingid}) checkin_time, ps = emit_checked_in(openid=openid, meeting=meeting) r = check_in(openid=openid, meetingid=meetingid, punish_str=ps, checkin_time=checkin_time) meeting = mongo.db.meeting.find_one({'meetingid': meetingid}) print(meeting) if all_attendees_checked(meeting['attendee']): s = '签到汇总\n%s' ra = [] for u in meeting['attendee']: print(u) full_u = mongo.db.users.find_one({'openid': u['openid']}) ra.append([full_u['outlook']['name'], u['punish_str']]) s %= '\n'.join(map(lambda ss: ': '.join(ss), ra)) tmp = list(map(lambda u: u['openid'], meeting['attendee'])) tmp.append(meeting['organizer']['openid']) if len(tmp) > 1: wx.message.send_mass_text(tmp, s, is_to_all=True) else: wx.message.send_text(tmp[0], s) # return r wx.message.send_text(openid, r) reply = TextReply() reply.source = msg.target reply.target = msg.source reply.content = '请访问以下链接选择查看签到状况\n%s' % ( '%s/check-in-members?meetingid=%s' % (DOMAIN, meetingid) ) return reply.render()