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 remove_img_bg(msg, accessToken=None): resp_xml = None try: if msg.type == 'text': no_bg_img_path = wechat.rmBg.get_result_bytaskid(msg.content) if no_bg_img_path == 'error': return get_rmbg_error_reply(msg) elif no_bg_img_path: media_id = upload('image', no_bg_img_path, accessToken) from wechatpy.messages import ImageMessage newMsg = ImageMessage(msg._data) reply = ImageReply(media_id=media_id, message=newMsg) return reply.render() else: return get_imgerr_reply(msg) # 通过公众号接收到的图片信息下载图片到本地 path = download(msg.image, msg.source) # 调用ai去除背景接口,保存结果图片后,返回对应路径 taskid = wechat.rmBg.do_remove(path) import threading print(threading.current_thread().name, taskid) text = '下载注意事项:请用[5a4490.../red]的格式发送消息,用于下载处理后图像文件。\n颜色默认为白色(white),同时支持红色(red),蓝色(blue)。\n验证码:%s' % taskid resp_xml = create_reply(text, message=msg, render=True) except Exception as e: resp_xml = get_error_reply(msg) return resp_xml
def wechat(request): 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) try: check_signature(WECHAT_TOKEN, signature, timestamp, nonce) except InvalidSignatureException: echostr = 'error' return HttpResponse(echostr) elif request.method == 'POST': msg = parse_message(request.body) print(msg) # if msg.type == 'text': # if msg.content == '民事案件': # reply = getDogLossList(request, msg) # elif msg.content == '刑事案件': # reply = getDogOwnerList(request, msg) # else: # reply = TransferCustomerServiceReply(message=msg) # code = request.POST.get('code',None) # print(code,1111111111) if msg.type == 'image': reply = ImageReply(message=msg) reply.media_id = msg.media_id elif msg.type == 'voice': reply = VoiceReply(message=msg) reply.media_id = msg.media_id reply.content = '语音信息' elif msg.type == 'event': print('eventkey=', msg.event) if msg.event == 'subscribe': print(333333333333) saveWxLaw(msg.source) reply = create_reply('感谢您关注【辽宁大潮律师事务所】', msg) elif msg.event == 'unsubscribe': reply = create_reply('取消关注公众号', msg) unSubUserinfo(msg.source) elif msg.event == 'subscribe_scan': reply = create_reply('感谢您关注【辽宁大潮律师事务所】', msg) saveWxLaw(msg.source, msg.scene_id) print('scene_id=', msg.scene_id) elif msg.event == 'scan': print('scan====', msg.scene_id) # setUserToMember(msg.source, msg.scene_id) reply = create_reply('', msg) else: reply = create_reply('view', msg) response = HttpResponse(reply.render(), content_type="application/xml") return response
def handle_wx(request): global IMG_MEDIA_ID # 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(TOKEN, signature, timestamp, nonce) except InvalidSignatureException: echo_str = "error" response = HttpResponse(echo_str) return response if request.method == "POST": msg = parse_message(request.body) if msg.type == "text": reply = do_text_reply(msg) elif msg.type == 'image': IMG_MEDIA_ID = msg.media_id reply = create_reply("图片已收到" + msg.media_id, msg) elif msg.type == 'event': if msg.key == "func_detail": content = "------功能详情------\n回复关键字即可 如:\n" \ "[天气:郑州]\n[翻译:你好]\n[猜谜语]\n[音乐:天空之城]\n说句语音试一试O(∩_∩)O~~" reply = create_reply(content, message=msg) elif msg.key == "daily_image": reply = ImageReply(message=msg) reply.media_id = IMG_MEDIA_ID elif msg.key == "daily_music": reply = MusicReply(message=msg) reply.title = "偏偏喜欢你" reply.description = "陈百强" reply.thumb_media_id = IMG_MEDIA_ID reply.music_url = "http://bd.kuwo.cn/yinyue/28409674" reply.hq_music_url = "http://bd.kuwo.cn/yinyue/28409674" elif msg.key == "daily_push": reply = ArticlesReply(message=msg) for data in get_news(): reply.add_article({ 'title': data["title"], 'description': data["source"], 'image': data["imgsrc"], 'url': data["url"] }) else: reply = do_event_reply(msg) elif msg.type == 'voice': result = speech_tran(msg) reply = create_reply(result, msg) else: reply = create_reply('你发送的消息已经收到', msg) response = HttpResponse(reply.render(), content_type="application/html") return response
def weixinInterface(): if check_signature: data = request.data msg = parse_message(data) path = get_qcode(request.args['openid']) md_id = get_media_id(CLIENT, path) reply = ImageReply(media_id=md_id, message=msg) xml = reply.render() return xml else: return 'signature error'
def subscribeReply(self, msg, content=None, media_id=None): if content == None and media_id == None: raise Exception("no info be send!") elif content != None and media_id != None: raise Exception("content and media_id args only one != None") elif content != None: reply = create_reply(content, message=msg) xml = reply.render() return xml else: reply = ImageReply(message=msg) reply.media_id = media_id xml = reply.render() return xml
def photo_score(msg, accessToken=None): resp_xml = chk_msg_types(msg, ['image'], '该功能只能处理图像数据。') if resp_xml: return resp_xml try: # 通过公众号接收到的图片信息下载图片到本地 path = download(msg.image, msg.source) # 调用腾讯ai人脸识别接口接口 r = wechat.face.access_api(path) if r == 'success': # 上传图片,得到 media_id media_id = upload('image', path, accessToken) reply = ImageReply(media_id=media_id, message=msg) else: reply = TextReply(content='人脸检测失败,请上传1M以下人脸清晰的照片', message=msg) resp_xml = reply.render() except Exception as e: resp_xml = get_error_reply(msg) return resp_xml
def image_reply(msg): reply = ImageReply(message=msg) id = random.randint(0, 7) if id == 0: reply.media_id = "3nZjDfLSZGG6pM1moOgVpiIxl77Ii501riZPHS7NdOY" elif id == 1: reply.media_id = "3nZjDfLSZGG6pM1moOgVpm4_XftO2zaJxsCO9KHOpZE" elif id == 2: reply.media_id = "3nZjDfLSZGG6pM1moOgVphls0UeRqcAHael9a_KTrM4" elif id == 3: reply.media_id = "3nZjDfLSZGG6pM1moOgVpteYUBCK3Evkc3YYnQcDf3E" elif id == 4: reply.media_id = "3nZjDfLSZGG6pM1moOgVppGMwQTVoaNRb5nQMIPYMmE" elif id == 5: reply.media_id = "3nZjDfLSZGG6pM1moOgVpp21QXwC-r14DremI0PdZjQ" elif id == 6: reply.media_id = "3nZjDfLSZGG6pM1moOgVpgWdPB8IBUo57Avk3Med_4k" else: k = msg.media_id reply.media_id = "%s" % k return reply.render()
def post(self, request): msg = parse_message(request.body) print(msg) if msg.type == 'text': reply = create_reply('这是条文字消息', message=msg) elif msg.type == 'image': reply = create_reply('这是条图片消息', message=msg) elif msg.type == 'voice': reply = create_reply('这是条语音消息', message=msg) elif msg.type == 'event': openid = request.GET.get('openid', None) print(openid) if msg.event == 'subscribe': reply = create_reply('感谢你的关注', message=msg) inf = client.user.get('o-Njg0grnFp0LNHidvhKNek6_H88') # print(user["nickname"]) Users.objects.create(nickname=inf["nickname"], headimgurl=inf["headimgurl"], sex=inf["sex"], country=inf["country"], province=inf["province"], city=inf["city"], subscribe_time=inf["subscribe_time"], openid=inf["openid"]) elif msg.event == 'unsubscribe': Users.objects.get(openid=openid).delete() elif msg.event == 'click': reply = ImageReply(message=msg) media_id = '9kT9-alo_ph3g2I45zACW5X59Dqxbf45k-0Z89XXOSta_H_gqfnAhJvG557pqOEM' reply.media_id = media_id Menu_click_count.picture_click_count += 1 elif msg.event == 'view': Menu_click_count.url_click_count += 1 else: reply = create_reply('这是条其他类型消息', message=msg) return HttpResponse(reply.render(), content_type=" ")
def wechat_check(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', '') try: check_signature(TOKEN, signature, timestamp, nonce) except InvalidSignatureException: return HttpResponse(status=403) return HttpResponse(echo_str) else: # 自动回复文本 try: msg = parse_message(request.body) if isinstance(msg, BaseEvent): if msg.event == 'subscribe': reply = create_reply(article_leizhu, message=msg) elif msg.event == 'click': if msg.key == 'inform_articles': reply = create_reply(inform_articles, msg) elif msg.key == "service": reply = ImageReply(message=msg, media_id='nvnR6egwWE1WzzIcMXo403dxqfcx5fV_GRhQnRH8Wsw') # 添加扫描二维码关注事件 elif msg.event == "scan": reply = create_reply(article_leizhu, message=msg) try: xml_data = str(request.body.decode()) dict = xmltodict.parse(xml_data) user = dict["xml"]["FromUserName"] print("扫码用户的openid:{}".format(user)) # user_li = re.findall(r"qrscene_(\d+)", user) # user_id = int("".join(user_li)) + 100000 # openid = dict["xml"]["FromUserName"] except Exception as e: print(e) elif msg.event == "subscribe_scan": reply = create_reply(article_leizhu, message=msg) xml_data = str(request.body.decode()) print(xml_data, "454545454") dict = xmltodict.parse(xml_data) user = dict["xml"]["EventKey"] user_li = re.findall(r"qrscene_(\d+)", user) user_id = int("".join(user_li)) + 100000 openid = dict["xml"]["FromUserName"] print("扫码用户的openid:{},id:{}".format(openid, user_id)) userinfo = UserInfo.objects.check_user(openid) create_time = timezone.now() # if create_time.strftime("%Y-%m-%d") == "2018-04-1": # fools_day = 1 # else: # fools_day = 0 # 如果该用户关系已经存在,那么就不创建该用户关系表 if len(UserInvite.objects.filter(invite=openid)) > 0: print("用户关系已经存在,则什么也不做") pass else: print("用户关系不存在,则创建用户关系表") # 创建用户关系 UserInvite.objects.create(user_id=user_id, invite=openid, create_time=create_time, fools_day=0) # 创建用户邀请数量表 Invitenum.objects.undate_num(user_id=user_id) # 增加用户赚取收益比例 Invitenum.objects.earning(user_id=user_id) else: reply = create_reply('请重试', msg) elif isinstance(msg, BaseMessage): if msg.type == 'text': content = msg.content if "说明" in content: reply = create_reply(inform_articles, message=msg) elif "客服" in content: reply = ImageReply(message=msg, media_id='nvnR6egwWE1WzzIcMXo403dxqfcx5fV_GRhQnRH8Wsw') elif "2018" in content: reply = create_reply(article_2018, message=msg) elif "提现" in content: reply = create_reply(withdraw, message=msg) elif "测试" in content: reply = create_reply(menu, message=msg) elif "999" in content: reply = ImageReply(message=msg, media_id='nvnR6egwWE1WzzIcMXo403dxqfcx5fV_GRhQnRH8Wsw') else: reply = create_reply(menu, message=msg) else: reply = create_reply('', message=msg) else: reply = create_reply('Sorry, can not handle this for now', msg) return HttpResponse(reply.render(), content_type="application/xml") except (InvalidSignatureException, InvalidAppIdException): return HttpResponse(status=403)
def POST(self): try: xml = web.data() msg = parse_message(xml) if msg.type == 'text': content = msg.content if content.startswith(('表情包:', '表情包:')): words = ''.join(content.replace(':', ':').split(':')[1:]) wechat_client = WeChatClient( appid='wx19a2591b2a719add', secret='c46fa65dbc2803b90431fbf9c803cbd4', ) access_token = wechat_client.access_token json_data = pics.upload_pic(pics.get_random_pic(words), access_token) # print(json_data) if 'errcode' not in json_data: media_id = json_data['media_id'] reply = ImageReply(message=msg) reply.media_id = media_id # print(web.url() + ' get_pic. words: ' + words + ' return: ' + str(json_data)) logger.info(web.url() + ' get_pic. words: ' + words + ' return: ' + str(json_data)) else: reply = TextReply(message=msg) reply.content = json_data['link'] logger.warning(web.url() + ' get_pic faild,return link. words:' + words + ' return: ' + json_data['link']) elif content.startswith(('影视:', '影视:')): words = ''.join(content.replace(':', ':').split(':')[1:]) if words == '': string = '没有输入要搜索的名字!' logger.info(web.url() + ' get_movie without words') else: data = search(words) data1 = data[0] data2 = data[1] if len(data1) != 0: string = '' if len(data1) <= 12: for each in data1: string += '%s %s %s %s\n' % (each[0], each[1], each[3], each[4]) else: for each in data1[:12]: string += '%s %s %s %s\n' % (each[0], each[1], each[3], each[4]) elif len(data2) != 0: string = '' if len(data2) <= 12: for each in data2: string += '%s %s %s %s\n' % (each[0], each[1], each[3], each[4]) else: for each in data2[:12]: string += '%s %s %s %s\n' % (each[0], each[1], each[3], each[4]) else: string = '竟然没有搜索到!!!\n请检查名称输入的是否正确,请尽量使用中文哦' # print(web.url() + ' get_pic. words: ' + words + ' data: ' + str(data) + ' return: ' + string) logger.info(web.url() + ' get_movie. words: ' + words + ' data: ' + str(data) + ' return: ' + string) reply = TextReply(message=msg) reply.content = string elif content.startswith(('在线:', '在线:')): words = ''.join(content.replace(':', ':').split(':')[1:]) if words == '': string = '没有输入要搜索的名字!' logger.info(web.url() + ' see_movie without words') else: data = get_link(words) if data: string = data else: string = '竟然没有搜索到!!!\n请检查名称输入的是否正确,请试试英文名哦' # print(web.url() + ' see_pic. words: ' + words + ' data: ' + str(data) + ' return: ' + string) logger.info(web.url() + ' see_movie. words: ' + words + ' data: ' + str(data) + ' return: ' + string) reply = TextReply(message=msg) reply.content = string else: reply = TextReply(message=msg) response = get_response(content) logger.info(web.url() + ' turing. words: ' + content + ' response: ' + response) reply.content = response elif msg.type == 'event' and msg.event: mscontent = msg.event if mscontent == "subscribe": string = '终于等到你!欢迎关注Snoopy同学~\n' \ '输入"表情包:xxx"获取自定义文字的表情\n' \ '输入"影视:xxx"获取电影的网盘链接\n' \ '输入"在线:xxx"获取在线观看视频的链接,需要复制到浏览器使用哦~' reply = TextReply(message=msg) reply.content = string elif mscontent == "unsubscribe": string = '有什么不足之处还请谅解,我会慢慢改进,欢迎您以后再来' reply = TextReply(message=msg) reply.content = string # 转换成 XML reply_xml = reply.render() return reply_xml except Exception as e: logger.error(e) # print(e) return "success"
def wechat_back(event): event = re.sub(r'\<xml\>', '<xml>\n', event) xml = event msg = parse_message(xml) if msg.type == 'text': question = turning(msg.content) s = {} ss = {} lib = {} lib_qt = {} lib_qm = {} s_max = '' for i in range(0, len(ques)): lib_qt[ques[i]] = int(token[i]) for i in range(0, len(ques)): lib_qm[ques[i]] = media_id[i] for i in range(0, len(ques)): lib[ques[i]] = answ[i] text = [x.strip() for x in ques if len(x) > 2] if question in lib: s_max = question answer = lib[question] else: for i in text: similarity = sentence_similarity(i, question, tfidf_dict) s[i] = similarity s_max = max(s, key=s.get) #print(s_max) for i in range(0, 10): if jaccard(s_max, question) < 0.20: del s[s_max] s_max = max(s, key=s.get) else: try: ss[s_max] = s[s_max] + jaccard(s_max, question) except: ss[s_max] = 1.5 #print(ss) try: s_max = max(ss, key=ss.get) except: s_max = ' ' #print(s_max) '''try: print(lib_qt[s_max]) except: lib_qt[s_max] = 9 print(ss)''' if lib_qt[s_max] == 1: answer = lib_qm[s_max] reply = ImageReply(content='AAAAAAAAA', media_id=answer, message=msg) xml = reply.render() elif lib_qt[s_max] == 2: answer = lib[s_max] img = lib_qm[s_max].split(' ')[0] url = lib_qm[s_max].split(' ')[1] reply = ArticlesReply(message=msg) reply.add_article({ 'title': question, 'description': answer, 'image': img, 'url': url }) xml = reply.render() else: try: answer = lib[s_max] except: answer = '暂无此问题' answer = answer.encode('utf-8') #print(answer) reply = TextReply(content=answer, message=msg) xml = reply.render() print('问题:' + question) print('匹配结果:' + s_max) print('答案:', answer) resp = apiReply(reply, txt=True, content_type="application/xml") #resp = json.dumps(reply,encoding = 'utf-8') return resp
def wechat(): signature = request.args.get("signature", "") timestamp = request.args.get("timestamp", "") nonce = request.args.get("nonce", "") encrypt_type = request.args.get("encrypt_type", "raw") msg_signature = request.args.get("msg_signature", "") try: check_signature(TOKEN, signature, timestamp, nonce) except InvalidSignatureException: abort(403) if request.method == "GET": echo_str = request.args.get("echostr", "") return echo_str # POST request if encrypt_type == "raw": # plaintext mode date = (datetime.datetime.now() + datetime.timedelta(days=-1)).strftime("%Y-%m-%d") msg = parse_message(request.data) # if msg.type == "text": # reply = create_reply(msg.content, msg) code = msg.content if code[0] == '6': code += ".XSHG" strPePercent = JqDataSDKOperate.get_stock_pe_and_pb( code, date, 2500) strReply = code + "; " + strPePercent reply = create_reply(strReply, msg) return reply.render() elif code[0] == '0' or code[0] == '3': code += ".XSHE" strPePercent = JqDataSDKOperate.get_stock_pe_and_pb( code, date, 2500) strReply = code + "; " + strPePercent reply = create_reply(strReply, msg) return reply.render() # elif code == '行业': elif code == '行业': reply = ImageReply(message=msg) reply.media_id = get_media_id(client, msg) return reply.render() # else: # reply = create_reply("Sorry, can not handle this for now", msg) # return reply.render() else: # encryption mode from wechatpy.crypto import WeChatCrypto crypto = WeChatCrypto(TOKEN, AES_KEY, APPID) try: msg = crypto.decrypt_message(request.data, msg_signature, timestamp, nonce) except (InvalidSignatureException, InvalidAppIdException): abort(403) else: msg = parse_message(msg) if msg.type == "text": reply = create_reply(msg.content, msg) else: reply = create_reply("Sorry, can not handle this for now", msg) return crypto.encrypt_message(reply.render(), nonce, timestamp)
def imgreply(msg,id): reply = ImageReply(message=msg) reply.media_id = id xml = reply.render() return xml
def wechat(): """验证服务器地址的有效性""" # 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数: # signature:微信加密, signature结合了开发者填写的token参数和请求中的timestamp参数 nonce参数 # timestamp:时间戳(chuo这是拼音) # nonce: 随机数 # echostr: 随机字符串 # 接收微信服务器发送参数 signature = request.args.get("signature") timestamp = request.args.get("timestamp") nonce = request.args.get("nonce") # 校验参数 # 校验流程: # 将token、timestamp、nonce三个参数进行字典序排序 # 将三个参数字符串拼接成一个字符串进行sha1加密 # 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 if not all([signature, timestamp, nonce]): # 抛出400错误 abort(400) # 按照微信的流程计算签名 li = [WECHAT_TOKEN, timestamp, nonce] # 排序 li.sort() # 拼接字符串 tmp_str = "".join(li) tmp_str = tmp_str.encode('utf-8') # 进行sha1加密, 得到正确的签名值 sign = hashlib.sha1(tmp_str).hexdigest() # 将自己计算的签名值, 与请求的签名参数进行对比, 如果相同, 则证明请求来自微信 if signature != sign: # 代表请求不是来自微信 # 弹出报错信息, 身份有问题 abort(403) else: # 表示是微信发送的请求 if request.method == "GET": # 表示第一次接入微信服务器的验证 echostr = request.args.get("echostr") # 校验echostr if not echostr: abort(400) return echostr elif request.method == "POST": # 表示微信服务器转发消息过来 # 拿去xml的请求数据 xml_str = request.data # 当xml_str为空时 if not xml_str: abort(400) # 对xml字符串进行解析成字典 xml_dict = xmltodict.parse(xml_str) xml_dict = xml_dict.get("xml") # print(xml_dict) # MsgType是消息类型 这里是提取消息类型 msg_type = xml_dict.get("MsgType") if msg_type == "text": # 表示发送文本消息 # 够造返回值, 经由微信服务器回复给用户的消息内容 # 回复消息 # ToUsername: (必须传) 接收方账号(收到的OpenID) # FromUserName: (必须传) 开发者微信号 # CreateTime: (必须传) 消息创建时间(整形) # MsgType: (必须传) 消息类型 # Content: (必须传) 回复消息的内容(换行:在Content中能够换行, 微信客户端就支持换行显示) # 我们自己的消息处理逻辑 user_name = xml_dict.get("FromUserName") text = xml_dict.get("Content") print("text:", text) reply = response(user_name, text) resp_dict = { "xml": { "ToUserName": xml_dict.get("FromUserName"), "FromUserName": xml_dict.get("ToUserName"), "CreateTime": int(time.time()), "MsgType": "text", "Content": reply } } else: if msg_type == 'image': msg = parse_message(xml_str) media_id = '6QMxv1WgvAmt_9YJMA9zgmG2QUnr-8M2xPErDHCllWrbvmM_YASURaPS0rTDewta' reply = ImageReply(media_id=media_id, message=msg) xml = reply.render() return xml resp_dict = { "xml": { "ToUserName": xml_dict.get("FromUserName"), "FromUserName": xml_dict.get("ToUserName"), "CreateTime": int(time.time()), "MsgType": "text", "Content": "对不起,不能识别您发的内容!" } } # 将字典转换为xml字符串 resp_xml_str = xmltodict.unparse(resp_dict) # 返回消息数据给微信服务器 return resp_xml_str