diff --git a/app/__init__.py b/app/__init__.py index 0fdeb51..7e88cd7 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -26,6 +26,7 @@ login_manager = LoginManager() login_manager.login_view = 'auth.login' + def create_app(config_name): app = Flask(__name__) app.config.from_object(config[config_name]) diff --git a/app/static/js/gt.js b/app/static/js/gt.js new file mode 100644 index 0000000..ff5f6d5 --- /dev/null +++ b/app/static/js/gt.js @@ -0,0 +1 @@ +window.initGeetest=function(e){var t={};function s(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,s),o.l=!0,o.exports}return s.m=e,s.c=t,s.d=function(e,t,n){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(s.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)s.d(n,o,function(t){return e[t]}.bind(null,o));return n},s.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=4)}([function(e,t,s){"use strict";e.exports={NETWORK_ERROR:"Network Error",PREFIX:"geetest_",INIT:"init",READY:"ready",SUCCESS:"success",START_COMPUTE:"start_compute",START_DETECT:"start_detect",BIND:"bind",CLICK_ERROR:"click_error",BACK:"back",CLOSE:"close",COMPUTE_2:"compute_2",COMPUTE_1:"compute_1",DETECT:"detect",WAIT_COMPUTE:"wait_compute",RADAR_SUCCESS:"radar_success",RADAR_ERROR:"radar_error",RADAR_NEXT:"radar_click",RADAR_NEXT_READY:"radar_click_ready",RADAR_NEXT_HIDE:"radar_click_hide",ERROR:"error",NOT_COMPATIBLE:"not_compatible",RESET:"reset",FLOAT:"float",POPUP:"popup",CUSTOM:"custom",csstext_wind:'.geetest_holder.geetest_wind{position:relative;width:260px;min-width:260px;height:44px}.geetest_holder.geetest_wind *{font-family:"PingFangSC-Regular", "Open Sans", Arial, "Hiragino Sans GB", "Microsoft YaHei", "STHeiti", "WenQuanYi Micro Hei", SimSun, sans-serif;box-sizing:border-box}.geetest_holder.geetest_wind .geetest_btn{position:relative;width:100%;height:100%}.geetest_holder.geetest_wind .geetest_ghost_success{position:absolute;_position:fixed;right:0;top:0;height:100%;width:0;overflow:hidden;-moz-transition:all .3s linear;-o-transition:all .3s linear;-webkit-transition:all .3s linear;transition:all .3s linear}.geetest_holder.geetest_wind .geetest_radar_btn,.geetest_holder.geetest_wind .geetest_success_btn{position:absolute;top:0;border:1px solid #ccc;border-radius:2px;width:100%;min-width:160px;height:100%;cursor:pointer;opacity:1}.geetest_holder.geetest_wind .geetest_success_btn{cursor:default;border-color:#26C267}.geetest_holder.geetest_wind .geetest_radar_btn{left:0;background-image:linear-gradient(180deg, #ffffff 0%,#f3f3f3 100%);background-color:#ffffff\\9}.geetest_holder.geetest_wind .geetest_radar_btn:hover{background-image:linear-gradient(0deg, #ffffff 0%,#f3f3f3 100%);background-color:#ffffff\\9}.geetest_holder.geetest_wind .geetest_offline{display:none;position:absolute;right:0;top:0;border:4px solid #FE984C;border-bottom-color:transparent;border-left-color:transparent;width:0;height:0;_border-width:0;_background:#FE984C;_height:6px;_width:6px;font-size:0}.geetest_holder.geetest_wind.geetest_fallback .geetest_offline{display:block}.geetest_holder.geetest_wind .geetest_success_btn{position:absolute;right:0;*right:-2px;top:0;background:#EEFFF5;-moz-transition:width ease;-o-transition:width ease;-webkit-transition:width ease;transition:width ease}.geetest_holder.geetest_wind .geetest_success_btn:hover{background:#EEFFF5}.geetest_holder.geetest_wind .geetest_success_btn .geetest_success_box{position:absolute;top:9px;left:7px;border-radius:50%;width:24px;height:24px}.geetest_holder.geetest_wind .geetest_success_btn .geetest_success_box .geetest_success_show{position:relative;left:0;top:0;width:24px;height:24px;background-color:#EEFFF5;display:none \\9}.geetest_holder.geetest_wind .geetest_success_btn .geetest_success_box .geetest_success_show .geetest_success_pie{position:absolute;left:50%;top:0;border:2px solid #80D6AC;border-left:none;border-radius:0 100% 100% 0 / 0 50% 50% 0;width:50%;height:100%;-moz-transform:rotate(25deg);-ms-transform:rotate(25deg);-webkit-transform:rotate(25deg);transform:rotate(25deg);-moz-transform-origin:0 50%;-ms-transform-origin:0 50%;-webkit-transform-origin:0 50%;transform-origin:0 50%}.geetest_holder.geetest_wind .geetest_success_btn .geetest_success_box .geetest_success_show .geetest_success_filter{position:absolute;left:0;top:0;border:2px solid #80D6AC;border-right:none;border-radius:100% 0 0 100% / 50% 0 0 50%;width:50%;height:100%;-moz-transform:rotate(25deg);-ms-transform:rotate(25deg);-webkit-transform:rotate(25deg);transform:rotate(25deg);-moz-transform-origin:100% 50%;-ms-transform-origin:100% 50%;-webkit-transform-origin:100% 50%;transform-origin:100% 50%;opacity:0}.geetest_holder.geetest_wind .geetest_success_btn .geetest_success_box .geetest_success_show .geetest_success_mask{border:none;border-radius:0;background-color:#EEFFF5;position:absolute;left:50%;top:0;width:50%;height:100%;-moz-transform:rotate(25deg);-ms-transform:rotate(25deg);-webkit-transform:rotate(25deg);transform:rotate(25deg);-moz-transform-origin:0 50%;-ms-transform-origin:0 50%;-webkit-transform-origin:0 50%;transform-origin:0 50%}.geetest_holder.geetest_wind .geetest_success_btn .geetest_success_box .geetest_success_correct{position:absolute;right:-4px;top:-4px;border-radius:50%;width:28px;height:28px;overflow:hidden;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.geetest_holder.geetest_wind .geetest_success_btn .geetest_success_box .geetest_success_correct .geetest_success_icon{position:absolute;top:6px;right:6px;width:18px;height:18px;-moz-transform:translate(-28px, 28px);-ms-transform:translate(-28px, 28px);-webkit-transform:translate(-28px, 28px);transform:translate(-28px, 28px)}.geetest_holder.geetest_wind .geetest_success_btn .geetest_success_box .geetest_success_correct .geetest_success_icon::after{content:\'\';width:2px;height:7px;background:#26C267;position:absolute;transform:rotate(-45deg);left:3px;top:8px;border-radius:1px}.geetest_holder.geetest_wind .geetest_success_btn .geetest_success_box .geetest_success_correct .geetest_success_icon::before{transform:rotate(45deg);content:"";width:2px;height:15px;background:#26C267;right:6px;top:1px;position:absolute;border-radius:1px}.geetest_holder.geetest_wind .geetest_radar{position:absolute;margin:6px;width:30px;height:30px;-moz-transition:all .5s ease;-o-transition:all .5s ease;-webkit-transition:all .5s ease;transition:all .5s ease}.geetest_holder.geetest_wind .geetest_radar .geetest_sector,.geetest_holder.geetest_wind .geetest_radar .geetest_ring,.geetest_holder.geetest_wind .geetest_radar .geetest_dot,.geetest_holder.geetest_wind .geetest_radar .geetest_cross,.geetest_holder.geetest_wind .geetest_radar .geetest_scan,.geetest_holder.geetest_wind .geetest_radar .geetest_status{position:absolute;border-radius:50%;width:100%;height:100%;-moz-transform:scale(0.4);-ms-transform:scale(0.4);-webkit-transform:scale(0.4);transform:scale(0.4);-moz-transition:all .5s ease;-o-transition:all .5s ease;-webkit-transition:all .5s ease;transition:all .5s ease}.geetest_holder.geetest_wind .geetest_radar .geetest_sector{box-shadow:inset 0 0 0 1px #3873ff;background-color:#80A6FC;background-image:linear-gradient(115deg, rgba(0,0,0,0) 50%,#c6d5f8 50%),linear-gradient(65deg, #c6d5f8 50%,rgba(0,0,0,0) 50%);opacity:0;-moz-transition:all ease;-o-transition:all ease;-webkit-transition:all ease;transition:all ease}.geetest_holder.geetest_wind .geetest_radar .geetest_ring{box-shadow:inset 0 0 0 1px #3873ff;background:#C6D5F8}.geetest_holder.geetest_wind .geetest_radar .geetest_cross{overflow:hidden}.geetest_holder.geetest_wind .geetest_radar .geetest_cross .geetest_v,.geetest_holder.geetest_wind .geetest_radar .geetest_cross .geetest_h{position:absolute;left:50%;top:50%;background:#F8F8F8;-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.geetest_holder.geetest_wind .geetest_radar .geetest_cross .geetest_v{width:100%;height:4px}.geetest_holder.geetest_wind .geetest_radar .geetest_cross .geetest_h{width:4px;height:100%}.geetest_holder.geetest_wind .geetest_radar .geetest_scan{overflow:hidden}.geetest_holder.geetest_wind .geetest_radar .geetest_scan .geetest_h{position:absolute;top:-6%;width:100%;height:6%;background:#aedbfb;opacity:0;box-shadow:0 0 1px #aedbfb;-moz-transition:opacity .5s ease;-o-transition:opacity .5s ease;-webkit-transition:opacity .5s ease;transition:opacity .5s ease}.geetest_holder.geetest_wind .geetest_radar .geetest_status{opacity:0;background:#DD725E;-moz-transform:scale(0);-ms-transform:scale(0);-webkit-transform:scale(0);transform:scale(0)}.geetest_holder.geetest_wind .geetest_radar .geetest_status .geetest_bg{position:absolute;top:40%;left:0;border-radius:50%;height:20%;width:0;background:#eee;-moz-transition:all 1s ease;-o-transition:all 1s ease;-webkit-transition:all 1s ease;transition:all 1s ease}.geetest_holder.geetest_wind .geetest_radar .geetest_status .geetest_hook{position:absolute;border-radius:50%;width:100%;height:100%;background-size:cover}.geetest_holder.geetest_wind .geetest_radar_tip,.geetest_holder.geetest_wind .geetest_success_radar_tip{position:absolute;top:0;left:0;box-sizing:border-box;padding:0 46px 0 46px;height:42px;width:100%;line-height:42px;font-size:14px;color:#666;white-space:nowrap;text-align:left;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.geetest_holder.geetest_wind .geetest_radar_tip .geetest_reset_tip_content,.geetest_holder.geetest_wind .geetest_success_radar_tip .geetest_reset_tip_content{margin-left:5px;color:#005aff;cursor:pointer;display:none}.geetest_holder.geetest_wind .geetest_radar_tip .geetest_radar_error_code,.geetest_holder.geetest_wind .geetest_success_radar_tip .geetest_radar_error_code{display:none}.geetest_holder.geetest_wind .geetest_radar_tip.geetest_multi_line{white-space:normal;word-break:break-all;line-height:20px}.geetest_holder.geetest_wind .geetest_radar_tip.geetest_reversal{padding:0 46px 0 46px;direction:rtl;text-align:right}.geetest_holder.geetest_wind .geetest_success_radar_tip{color:#18A452}.geetest_holder.geetest_wind .geetest_success_radar_tip.geetest_reversal_success{padding:0 46px 0 46px;direction:rtl;text-align:right}.geetest_holder.geetest_wind .geetest_success_radar_tip_timeinfo{margin-left:10px;font-size:12px}.geetest_holder.geetest_wind .geetest_logo,.geetest_holder.geetest_wind .geetest_success_logo{position:absolute;right:12px;width:20px;height:20px;top:11px}.geetest_holder.geetest_wind .geetest_wait{top:0;position:absolute;margin:17px 12px;font-size:0;opacity:0;-moz-transition:opacity .5s ease;-o-transition:opacity .5s ease;-webkit-transition:opacity .5s ease;transition:opacity .5s ease}.geetest_holder.geetest_wind .geetest_wait .geetest_wait_dot{width:5px;height:5px;background:#b1babe;border-radius:50%;display:inline-block;margin:2px;vertical-align:top}.geetest_holder.geetest_wind.geetest_ready .geetest_slide,.geetest_holder.geetest_wind.geetest_reset .geetest_slide,.geetest_holder.geetest_wind.geetest_radar_click_hide .geetest_slide,.geetest_holder.geetest_wind.geetest_slide_click_hide .geetest_slide{display:none}.geetest_holder.geetest_wind.geetest_ready .geetest_radar .geetest_dot,.geetest_holder.geetest_wind.geetest_reset .geetest_radar .geetest_dot,.geetest_holder.geetest_wind.geetest_radar_click_hide .geetest_radar .geetest_dot,.geetest_holder.geetest_wind.geetest_slide_click_hide .geetest_radar .geetest_dot{background:#AFBABF}.geetest_holder.geetest_wind.geetest_radar_click_hide .geetest_radar .geetest_dot,.geetest_holder.geetest_wind.geetest_slide_click_hide .geetest_radar .geetest_dot{background:#3873ff}.geetest_holder.geetest_wind.geetest_ready .geetest_slide{display:none}.geetest_holder.geetest_wind.geetest_ready .geetest_radar .geetest_dot{background:#AFBABF}.geetest_holder.geetest_wind.geetest_start_detect .geetest_radar .geetest_ring{-moz-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1)}.geetest_holder.geetest_wind.geetest_start_detect .geetest_radar .geetest_dot{background:#3873ff}.geetest_holder.geetest_wind.geetest_detect .geetest_radar .geetest_sector{opacity:1}.geetest_holder.geetest_wind.geetest_detect .geetest_radar .geetest_ring{-moz-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1)}.geetest_holder.geetest_wind.geetest_detect .geetest_radar .geetest_dot{background:#3873ff}.geetest_holder.geetest_wind.geetest_wait_compute .geetest_radar .geetest_ring{-moz-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);-moz-animation:geetest_wait_compute 0.8s linear infinite both;-webkit-animation:geetest_wait_compute 0.8s linear infinite both;animation:geetest_wait_compute 0.8s linear infinite both}@keyframes geetest_wait_compute{60%{-moz-transform:scale(0.75);-ms-transform:scale(0.75);-webkit-transform:scale(0.75);transform:scale(0.75)}}@-webkit-keyframes geetest_wait_compute{60%{-moz-transform:scale(0.75);-ms-transform:scale(0.75);-webkit-transform:scale(0.75);transform:scale(0.75)}}.geetest_holder.geetest_wind.geetest_wait_compute .geetest_radar .geetest_dot{background:#3873ff}.geetest_holder.geetest_wind.geetest_start_compute .geetest_radar .geetest_ring{-moz-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1)}.geetest_holder.geetest_wind.geetest_start_compute .geetest_radar .geetest_dot{background:#3873ff}.geetest_holder.geetest_wind.geetest_compute_1 .geetest_radar .geetest_ring{box-shadow:inset 0 0 0 2px #3873ff;-moz-transform:scale(0.4);-ms-transform:scale(0.4);-webkit-transform:scale(0.4);transform:scale(0.4)}.geetest_holder.geetest_wind.geetest_compute_1 .geetest_radar .geetest_dot{background:#3873ff}.geetest_holder.geetest_wind.geetest_compute_2 .geetest_radar .geetest_ring{box-shadow:inset 0 0 0 2px #3873ff;-moz-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background:#F8F8F8}.geetest_holder.geetest_wind.geetest_compute_2 .geetest_radar .geetest_cross{width:100%;height:100%;-moz-transform:scale(1.1) rotate(90deg);-ms-transform:scale(1.1) rotate(90deg);-webkit-transform:scale(1.1) rotate(90deg);transform:scale(1.1) rotate(90deg)}.geetest_holder.geetest_wind.geetest_compute_2 .geetest_radar .geetest_dot{background:#3873ff}.geetest_holder.geetest_wind.geetest_compute_2 .geetest_radar .geetest_scan{-moz-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1)}.geetest_holder.geetest_wind.geetest_compute_2 .geetest_radar .geetest_scan .geetest_h{opacity:1;-moz-animation:geetest_scan 1.5s linear infinite both;-webkit-animation:geetest_scan 1.5s linear infinite both;animation:geetest_scan 1.5s linear infinite both}@keyframes geetest_scan{50%{top:100%}}@-webkit-keyframes geetest_scan{50%{top:100%}}.geetest_holder.geetest_wind.geetest_radar_success .geetest_radar_btn{cursor:default}.geetest_holder.geetest_wind.geetest_radar_success .geetest_radar .geetest_cross{display:none}.geetest_holder.geetest_wind.geetest_radar_success .geetest_ring{opacity:0}.geetest_holder.geetest_wind .geetest_ghost_success.geetest_success_animate{width:100%}.geetest_holder.geetest_wind .geetest_ghost_success.geetest_success_animate .geetest_success_icon{-moz-animation:geetest_success_correct 0.7s ease both;-webkit-animation:geetest_success_correct 0.7s ease both;animation:geetest_success_correct 0.7s ease both}@keyframes geetest_success_correct{0%{-moz-transform:translate(-28px, 28px);-ms-transform:translate(-28px, 28px);-webkit-transform:translate(-28px, 28px);transform:translate(-28px, 28px)}30%{-moz-transform:translate(-28px, 28px);-ms-transform:translate(-28px, 28px);-webkit-transform:translate(-28px, 28px);transform:translate(-28px, 28px)}90%{-moz-transform:translate(3px, -2px);-ms-transform:translate(3px, -2px);-webkit-transform:translate(3px, -2px);transform:translate(3px, -2px)}100%{-moz-transform:translate(1px, 0);-ms-transform:translate(1px, 0);-webkit-transform:translate(1px, 0);transform:translate(1px, 0)}}@-webkit-keyframes geetest_success_correct{0%{-moz-transform:translate(-28px, 28px);-ms-transform:translate(-28px, 28px);-webkit-transform:translate(-28px, 28px);transform:translate(-28px, 28px)}30%{-moz-transform:translate(-28px, 28px);-ms-transform:translate(-28px, 28px);-webkit-transform:translate(-28px, 28px);transform:translate(-28px, 28px)}90%{-moz-transform:translate(3px, -2px);-ms-transform:translate(3px, -2px);-webkit-transform:translate(3px, -2px);transform:translate(3px, -2px)}100%{-moz-transform:translate(1px, 0);-ms-transform:translate(1px, 0);-webkit-transform:translate(1px, 0);transform:translate(1px, 0)}}.geetest_holder.geetest_wind .geetest_ghost_success.geetest_success_animate .geetest_success_pie{-moz-animation:geetest_success_pie 0.7s ease both;-webkit-animation:geetest_success_pie 0.7s ease both;animation:geetest_success_pie 0.7s ease both}@keyframes geetest_success_pie{25%{-moz-transform:rotate(25deg);-ms-transform:rotate(25deg);-webkit-transform:rotate(25deg);transform:rotate(25deg)}100%{-moz-transform:rotate(-275deg);-ms-transform:rotate(-275deg);-webkit-transform:rotate(-275deg);transform:rotate(-275deg)}}@-webkit-keyframes geetest_success_pie{25%{-moz-transform:rotate(25deg);-ms-transform:rotate(25deg);-webkit-transform:rotate(25deg);transform:rotate(25deg)}100%{-moz-transform:rotate(-275deg);-ms-transform:rotate(-275deg);-webkit-transform:rotate(-275deg);transform:rotate(-275deg)}}.geetest_holder.geetest_wind .geetest_ghost_success.geetest_success_animate .geetest_success_mask{-moz-animation:geetest_success_mask 0.7s linear both;-webkit-animation:geetest_success_mask 0.7s linear both;animation:geetest_success_mask 0.7s linear both}@keyframes geetest_success_mask{50.9%{opacity:1}51%{opacity:0}100%{opacity:0}}@-webkit-keyframes geetest_success_mask{50.9%{opacity:1}51%{opacity:0}100%{opacity:0}}.geetest_holder.geetest_wind .geetest_ghost_success.geetest_success_animate .geetest_success_filter{-moz-animation:geetest_success_filter 0.7s linear both;-webkit-animation:geetest_success_filter 0.7s linear both;animation:geetest_success_filter 0.7s linear both}@keyframes geetest_success_filter{50.9%{opacity:0}51%{opacity:1}100%{opacity:1}}@-webkit-keyframes geetest_success_filter{50.9%{opacity:0}51%{opacity:1}100%{opacity:1}}.geetest_holder.geetest_wind.geetest_radar_error .geetest_radar_btn{border-color:#ccc;background:#eee;cursor:default}.geetest_holder.geetest_wind.geetest_radar_error .geetest_radar .geetest_status{-moz-transform:scale(0.6);-ms-transform:scale(0.6);-webkit-transform:scale(0.6);transform:scale(0.6);opacity:1}.geetest_holder.geetest_wind.geetest_radar_error .geetest_radar .geetest_status .geetest_bg{width:100%}.geetest_holder.geetest_wind.geetest_radar_error .geetest_radar_tip{color:#666}.geetest_holder.geetest_wind.geetest_radar_error .geetest_radar_tip .geetest_reset_tip_content{display:inline}.geetest_holder.geetest_wind.geetest_radar_error .geetest_radar_tip .geetest_radar_error_code{display:block;font-size:12px;position:absolute;bottom:0;right:1px;color:#c3c3c3;line-height:1}.geetest_holder.geetest_wind.geetest_radar_click .geetest_radar_btn{background:#eaeaea}.geetest_holder.geetest_wind.geetest_radar_click .geetest_dot{background:#AFBABF}.geetest_holder.geetest_wind.geetest_radar_click .geetest_radar_tip{opacity:.4}.geetest_holder.geetest_wind.geetest_radar_click_ready .geetest_radar_btn{background:#eaeaea;cursor:default}.geetest_holder.geetest_wind.geetest_radar_click_ready .geetest_slide{display:none}.geetest_holder.geetest_wind.geetest_radar_click_ready .geetest_radar{opacity:0}.geetest_holder.geetest_wind.geetest_radar_click_ready .geetest_cross{display:none}.geetest_holder.geetest_wind.geetest_radar_click_ready .geetest_radar_tip{opacity:.4}.geetest_holder.geetest_wind.geetest_radar_click_ready .geetest_wait{opacity:1}.geetest_holder.geetest_wind.geetest_radar_click_hide .geetest_cross{display:none}.geetest_holder.geetest_wind .geetest_ie_radar{display:none}.geetest_holder.geetest_wind .geetest_slide{display:none}.geetest_holder.geetest_wind.geetest_ie .geetest_radar{display:none}.geetest_holder.geetest_wind.geetest_ie .geetest_ie_radar{display:block;position:absolute;top:16px;left:16px;width:12px;height:12px;border-radius:50%;background-color:#AFBABF;font-size:0}.geetest_holder.geetest_wind.geetest_ie.geetest_not_compatible .geetest_ie_radar,.geetest_holder.geetest_wind.geetest_ie.geetest_radar_success .geetest_ie_radar,.geetest_holder.geetest_wind.geetest_ie.geetest_radar_error .geetest_ie_radar{top:14px;left:14px;width:16px;height:16px;background-color:#fff}.geetest_holder.geetest_wind.geetest_ie .geetest_wait{visibility:hidden}.geetest_holder.geetest_wind.geetest_ie.geetest_radar_click_ready .geetest_wait,.geetest_holder.geetest_wind.geetest_ie.geetest_slide_click_ready .geetest_wait{visibility:visible}.geetest_holder.geetest_wind.geetest_ie.geetest_radar_click_ready .geetest_ie_radar,.geetest_holder.geetest_wind.geetest_ie.geetest_slide_click_ready .geetest_ie_radar{display:none}.geetest_holder.geetest_wind.geetest_ie .geetest_success_icon{transform:none !important}.geetest_wind.geetest_fullpage_click{position:absolute;display:none;opacity:0;z-index:2147483647;-moz-transition:opacity .3s ease;-o-transition:opacity .3s ease;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.geetest_wind.geetest_fullpage_click .geetest_fullpage_ghost{position:fixed;height:100%;width:100%;left:0;top:0}.geetest_wind.geetest_fullpage_click .geetest_fullpage_click_wrap{position:absolute}.geetest_wind.geetest_fullpage_click .geetest_fullpage_click_wrap.geetest_shake{-moz-animation:geetest_shake 0.2s linear infinite both;-webkit-animation:geetest_shake 0.2s linear infinite both;animation:geetest_shake 0.2s linear infinite both}@keyframes geetest_shake{25%{margin-left:-6px}75%{margin-left:6px}100%{margin-left:0}}@-webkit-keyframes geetest_shake{25%{margin-left:-6px}75%{margin-left:6px}100%{margin-left:0}}.geetest_wind.geetest_fullpage_click .geetest_fullpage_click_box{border-radius:2px}.geetest_wind.geetest_fullpage_click.geetest_float{font-size:0}.geetest_wind.geetest_fullpage_click.geetest_float .geetest_fullpage_pointer{margin-left:-15px}.geetest_wind.geetest_fullpage_click.geetest_float .geetest_fullpage_pointer .geetest_fullpage_pointer_out{position:absolute;border:8px solid #cccccc;border-color:transparent #cccccc transparent transparent;_display:none}.geetest_wind.geetest_fullpage_click.geetest_float .geetest_fullpage_pointer .geetest_fullpage_pointer_in{position:absolute;border:7px solid #fff;margin:1px 0 1px 2px;border-color:transparent #fff transparent transparent;_display:none}.geetest_wind.geetest_fullpage_click.geetest_float .geetest_fullpage_click_box{position:absolute;box-shadow:0 0 10px #cccccc;border:1px solid #cccccc;left:0;background:white;margin:-10px 5px 5px 0}.geetest_wind.geetest_fullpage_click.geetest_float.geetest_slide .geetest_fullpage_click_box{max-width:320px}.geetest_wind.geetest_fullpage_click.geetest_popup{width:100%;height:100%;left:0;top:0}.geetest_wind.geetest_fullpage_click.geetest_popup .geetest_fullpage_ghost{background:rgba(0,0,0,0.5);background:#AAAAAA \\9}.geetest_wind.geetest_fullpage_click.geetest_popup .geetest_fullpage_click_wrap{position:fixed;top:50%;left:50%;max-width:356px;min-width:260px;width:80%;width:356px \\9;margin-left:-178px \\9;margin-top:-245px \\9;_margin-left:0;_margin-top:0;-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.geetest_wind.geetest_goto{position:fixed;display:none;opacity:0;width:100%;height:100%;left:0;top:0;z-index:2147483647;-moz-transition:opacity .3s ease;-o-transition:opacity .3s ease;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.geetest_wind.geetest_goto .geetest_goto_ghost{position:fixed;height:100%;width:100%;left:0;top:0;background:rgba(0,0,0,0.5)}.geetest_wind.geetest_goto .geetest_goto_wrap{position:fixed;top:50%;left:50%;width:95%;max-width:300px;border-radius:2px;overflow:hidden;font-size:16px;-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.geetest_wind.geetest_goto .geetest_goto_wrap .geetest_goto_content{position:relative;background-color:white;box-sizing:border-box;height:0;width:100%;padding-bottom:41.33%;border-bottom:1px solid #e8e8e8;color:#383838;text-align:center}.geetest_wind.geetest_goto .geetest_goto_wrap .geetest_goto_content .geetest_goto_content_tip{position:absolute;width:80%;line-height:16px;top:50%;left:50%;-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.geetest_wind.geetest_goto .geetest_goto_wrap a.geetest_goto_confirm,.geetest_wind.geetest_goto .geetest_goto_wrap .geetest_goto_cancel{box-sizing:border-box;width:50%;display:inline-block;vertical-align:top;background-color:#f6f6f6;height:46px;line-height:46px;text-align:center}.geetest_wind.geetest_goto .geetest_goto_wrap a.geetest_goto_confirm{color:#0169eb;text-decoration:none}.geetest_wind.geetest_goto .geetest_goto_wrap .geetest_goto_cancel{color:#383838;border-right:1px solid #e8e8e8}.geetest_wind.geetest_panel{display:none;opacity:0;position:fixed;z-index:2147483647;left:0;top:0;height:100%;width:100%;-moz-transition:opacity .5s;-o-transition:opacity .5s;-webkit-transition:opacity .5s;transition:opacity .5s}.geetest_wind.geetest_panel *{font-family:"PingFangSC-Regular", "Open Sans", Arial, "Hiragino Sans GB", "Microsoft YaHei", "STHeiti", "WenQuanYi Micro Hei", SimSun, sans-serif}.geetest_wind.geetest_panel .geetest_panel_ghost{position:absolute;left:0;top:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);background-color:black;_width:2000px;_height:1000px}@media all and (orientation: portrait){.geetest_wind.geetest_panel .geetest_panel_ghost{font-family:"portrait"}}@media all and (orientation: landscape){.geetest_wind.geetest_panel .geetest_panel_ghost{font-family:"landscape"}}.geetest_wind.geetest_panel .geetest_panel_box{position:absolute;top:50%;left:50%;width:220px;height:150px;margin-left:-110px;margin-top:-70px;box-shadow:0 1px 8px rgba(128,128,128,0.3);border:1px solid #d1d1d1;border-radius:2px;overflow:hidden;background-color:white;-moz-transition:width .5s ease,height .5s ease;-o-transition:width .5s ease,height .5s ease;-webkit-transition:width .5s ease,height .5s ease;transition:width .5s ease,height .5s ease;-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);-moz-transform:translate3d(-50%, -50%, 0);-ms-transform:translate3d(-50%, -50%, 0);-webkit-transform:translate3d(-50%, -50%, 0);transform:translate3d(-50%, -50%, 0);_top:0;_left:0;_margin-left:0;_margin-top:0}.geetest_wind.geetest_panel .geetest_panel_box:last-child{margin-left:0 !important;margin-top:0 !important}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_offline{display:none;position:absolute;right:0;top:0;border:4px solid #FE984C;border-bottom-color:transparent;border-left-color:transparent;width:0;height:0;_border-width:0;_background:#FE984C;_height:6px;_width:6px;font-size:0}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_loading,.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success,.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error{width:100%;height:113px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_temp,.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_loading .geetest_panel_loading_title,.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_loading .geetest_panel_loading_content,.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_title,.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error .geetest_panel_error_title,.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error .geetest_panel_error_content{text-align:center;font-size:14px;height:14px;line-height:14px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success,.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error{display:none}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_loading{padding:29px 0 0 0;height:84px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_loading .geetest_panel_loading_icon{margin:0 auto;width:32px;height:32px;background-size:contain}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_loading .geetest_panel_loading_title{margin:10px 0 0 0;color:#0088f6}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_loading .geetest_panel_loading_content{margin:8px 0 0 0;color:#595959}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success{padding:40px 0 0 0;height:73px;box-sizing:content-box}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_box{margin:0 auto;width:24px;height:24px;position:relative}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_box *{box-sizing:border-box}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_box .geetest_panel_success_show{position:relative;left:0;top:0;width:24px;height:24px;display:none \\9}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_box .geetest_panel_success_show .geetest_panel_success_pie{position:absolute;left:50%;top:0;border:2px solid #80D6AC;border-left:none;border-radius:0 100% 100% 0 / 0 50% 50% 0;width:50%;height:100%;-moz-transform:rotate(25deg);-ms-transform:rotate(25deg);-webkit-transform:rotate(25deg);transform:rotate(25deg);-moz-transform-origin:0 50%;-ms-transform-origin:0 50%;-webkit-transform-origin:0 50%;transform-origin:0 50%}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_box .geetest_panel_success_show .geetest_panel_success_filter{position:absolute;left:0;top:0;border:2px solid #80D6AC;border-right:none;border-radius:100% 0 0 100% / 50% 0 0 50%;width:50%;height:100%;-moz-transform:rotate(25deg);-ms-transform:rotate(25deg);-webkit-transform:rotate(25deg);transform:rotate(25deg);-moz-transform-origin:100% 50%;-ms-transform-origin:100% 50%;-webkit-transform-origin:100% 50%;transform-origin:100% 50%;opacity:0}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_box .geetest_panel_success_show .geetest_panel_success_mask{border:none;border-radius:0;background-color:#ffffff;position:absolute;left:50%;top:0;width:50%;height:100%;-moz-transform:rotate(25deg);-ms-transform:rotate(25deg);-webkit-transform:rotate(25deg);transform:rotate(25deg);-moz-transform-origin:0 50%;-ms-transform-origin:0 50%;-webkit-transform-origin:0 50%;transform-origin:0 50%}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_box .geetest_panel_success_correct{position:absolute;right:-4px;top:-4px;border-radius:50%;width:28px;height:28px;overflow:hidden;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_box .geetest_panel_success_correct .geetest_panel_success_icon{position:absolute;top:6px;right:6px;width:18px;height:18px;-moz-transform:translate(-28px, 28px);-ms-transform:translate(-28px, 28px);-webkit-transform:translate(-28px, 28px);transform:translate(-28px, 28px)}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_box .geetest_panel_success_correct .geetest_panel_success_icon::after{content:\'\';width:2px;height:7px;background:#26C267;position:absolute;transform:rotate(-45deg);left:3px;top:8px;border-radius:1px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_box .geetest_panel_success_correct .geetest_panel_success_icon::before{transform:rotate(45deg);content:"";width:2px;height:15px;background:#26C267;right:6px;top:1px;position:absolute;border-radius:1px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_success .geetest_panel_success_title{margin:10px 0 0 0;color:#00aa00}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error{padding:18px 0 0 0;height:90px;position:relative}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error .geetest_panel_error_icon{margin:0 auto;width:18px;height:18px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error .geetest_panel_error_title{margin:10px 0 0 0;color:#595959}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error .geetest_panel_error_content{margin:14px auto 0;color:#FFFFFF;cursor:pointer;font-size:12px;text-align:center;width:202px;height:32px;background:#8A9DCA;text-decoration:none;border-radius:3px;line-height:32px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error .geetest_panel_error_content:hover{background-color:#A0B1D9}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error .geetest_panel_error_code{position:absolute;right:9px;top:9px;width:20px;height:17px;background:rgba(222,113,91,0.25);border-radius:2px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_error .geetest_panel_error_code .geetest_panel_error_code_text{transform:scale(0.8);font-size:12px;color:#DE715B;text-align:center}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_footer{border-top:0.5px solid #efefef;padding:12px 0 8px;width:100%;height:11px;text-align:center;margin-top:7px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_footer .geetest_panel_footer_logo,.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_footer .geetest_panel_footer_copyright{display:inline-block;vertical-align:top;line-height:11px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_footer .geetest_panel_footer_logo{margin-right:-6px;width:11px;height:11px;margin-left:10px}.geetest_wind.geetest_panel .geetest_panel_box .geetest_panel_footer .geetest_panel_footer_copyright{color:#9AA4B1;font-size:10px;transform:scale(0.8)}.geetest_wind.geetest_panel .geetest_panel_box.geetest_shake{-moz-animation:geetest_shake 0.2s linear infinite both;-webkit-animation:geetest_shake 0.2s linear infinite both;animation:geetest_shake 0.2s linear infinite both}.geetest_wind.geetest_panel .geetest_panel_box.geetest_panelshowslide{width:278px;height:285px;margin-left:-139px;margin-top:-143px}.geetest_wind.geetest_panel .geetest_panel_box.geetest_panelshowbeeline{width:300px;height:150px;margin-left:-139px;margin-top:-143px}.geetest_wind.geetest_panel .geetest_panel_box.geetest_panelshowclick{width:320px;height:410px;margin-left:-160px;margin-top:-205px}.geetest_wind.geetest_panel .geetest_panel_box.geetest_ie6panelshowclick{width:348px;height:445px;marginLeft:-174px;marginTop:-223px}.geetest_wind.geetest_panel .geetest_panel_box.geetest_no_logo .geetest_panel_error{padding:34px 0 0}.geetest_wind.geetest_panel .geetest_panel_box.geetest_no_logo .geetest_panel_loading{padding:47px 0 0 0}.geetest_wind.geetest_panel .geetest_panel_box.geetest_no_logo .geetest_panel_error_content{margin:33px auto 0}.geetest_wind.geetest_panel.geetest_fallback .geetest_panel_offline{display:block}.geetest_wind.geetest_panel.geetest_ie .geetest_panel_success_icon{-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important}.geetest_wind.geetest_panel .geetest_panel_success.geetest_success_animate .geetest_panel_success_icon{-moz-animation:geetest_success_correct 0.7s ease both;-webkit-animation:geetest_success_correct 0.7s ease both;animation:geetest_success_correct 0.7s ease both}.geetest_wind.geetest_panel .geetest_panel_success.geetest_success_animate .geetest_panel_success_pie{-moz-animation:geetest_success_pie 0.7s ease both;-webkit-animation:geetest_success_pie 0.7s ease both;animation:geetest_success_pie 0.7s ease both}.geetest_wind.geetest_panel .geetest_panel_success.geetest_success_animate .geetest_panel_success_mask{-moz-animation:geetest_success_mask 0.7s linear both;-webkit-animation:geetest_success_mask 0.7s linear both;animation:geetest_success_mask 0.7s linear both}.geetest_wind.geetest_panel .geetest_panel_success.geetest_success_animate .geetest_panel_success_filter{-moz-animation:geetest_success_filter 0.7s linear both;-webkit-animation:geetest_success_filter 0.7s linear both;animation:geetest_success_filter 0.7s linear both}'}},function(e,t,s){"use strict";var n=s(3),o=n.isNumber,r=n.isFunction,a=s(0).PREFIX;function i(e){this._arr=e||[]}function _(e){this._obj=e}function l(e){this._ele="string"==typeof e?document.createElement(e):e}function g(e,t){this._e=t,this._ele=e}i.prototype={_get:function(e){return this._arr[e]},_getLen:function(){return this._arr.length},_slice:function(e,t){return new i(o(t)?this._arr.slice(e,t):this._arr.slice(e))},_push:function(e){return this._arr.push(e),this},_splice:function(e,t){return this._arr.splice(e,t||1)},_join:function(e){return this._arr.join(e)},_concat:function(e){return new i(this._arr.concat(e))},_map:function(e){var t=this._arr;if(t.map)return new i(t.map(e));for(var s=[],n=0,o=t.length;n-1&&(s._splice(n),t.className=s._join(" ")),this},_replaceClass:function(e,t){return this._removeClass(t)._addClass(e),this},_addEvent0:function(e,t){var s=this,n=s._ele,o=s._eventList[e],r=function(e){t(new g(s,e))};return new i(o)._map((function(e){if(document.addEventListener)n.addEventListener(e,r);else if(document.attachEvent)n.attachEvent("on"+e,r);else{var o=n["on"+e];n["on"+e]=function(e){t(new g(s,e)),"function"==typeof o&&o.call(this,e)}}})),{_destroy:function(){new i(o)._map((function(e){document.removeEventListener?n.removeEventListener(e,r):document.detachEvent?n.detachEvent("on"+e,r):n["on"+e]=null}))}}},_addEvent:function(e,t){var s=this,n=s._addEvent0(e,t);return s._eventHandlers=s._eventHandlers||{},s._eventHandlers[e]?s._eventHandlers[e].push(n):s._eventHandlers[e]=[n],s},_removeEvents:function(e){var t=this;if(t._eventHandlers)if(e){if(t._eventHandlers[e]&&t._eventHandlers[e].length>0)for(var s=t._eventHandlers[e].length-1;s>=0;s--)t._eventHandlers[e][s]._destroy()}else for(var n in t._eventHandlers)if(t._eventHandlers[n]&&t._eventHandlers[n].length>0)for(s=t._eventHandlers[n].length-1;s>=0;s--)t._eventHandlers[n][s]._destroy();return t},_getBoundingClientRect:function(e){var t=this._ele.getBoundingClientRect();return 1!==(e=e||1)&&(t.x=t.x*e,t.y=t.y*e,t.top=t.top*e,t.left=t.left*e,t.right=t.right*e,t.bottom=t.bottom*e,t.width=t.width*e,t.height=t.height*e),t},_getCoords:function(e){var t=this._getBoundingClientRect(),s=document.body,n=document.documentElement,o=window.pageYOffset||n.scrollTop||s.scrollTop,r=window.pageXOffset||n.scrollLeft||s.scrollLeft,a=n.clientTop||s.clientTop||0,i=n.clientLeft||s.clientLeft||0,_=t.top+o-a,l=t.left+r-i;return{top:Math.round(_),left:Math.round(l),width:t.right-t.left,height:t.bottom-t.top}},_text:function(e){var t=this,s=t._ele;return t._clear(),s.appendChild(document.createTextNode(e)),t},_html:function(e){return this._ele.innerHTML=e,this},_style:function(e){var t=this._ele;return document.getElementsByTagName("head")[0].appendChild(t),t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e)),this},_clone:function(e){var t,s,n=this,o=n._ele,r=!((s=document.createElement("canvas")).getContext&&s.getContext("2d"));if(e){if(r){var a=document.createElement("div");a.innerHTML=o.outerHTML,t=new l(a.childNodes[0])}else t=new l(n._ele.cloneNode(!0));o.id="origin_"+o.id,t._removeAttrs(["href"])}else(t=new l(n._ele.cloneNode(!1)))._addClass("sandbox");return t},_click:function(){return this._ele.click(),this},_play:function(){return this._ele.play(),this},_replay:function(){var e=this;return e._ele.currentTime=0,e._ele.play(),e},_pause:function(){var e=this;return e._ele.currentTime=0,e._ele.pause(),e},_getValue:function(){return this._ele.value},_focus:function(){return this._ele.focus(),this},_width:function(){var e=this._getBoundingClientRect();return e.right-e.left},_getComputedStyle:function(e){var t=this._ele;return window.getComputedStyle?window.getComputedStyle(t)[e]:t.currentStyle[e]},_fixOverflow:function(){var e,t,s;try{for(var n=this._ele,o=n;o.parentNode!=document.body&&n.offsetTop-o.parentNode.offsetTop<160;)o=o.parentNode,"hidden"==(t="overflow",s=void 0,(e=o).currentStyle?s=e.currentStyle[t]:window.getComputedStyle&&(s=window.getComputedStyle(e,null).getPropertyValue(t)),s)&&(o.style.overflow="visible")}catch(r){}return this},_getElementLeft:function(){for(var e=this._ele,t=e.offsetLeft,s=e.offsetParent;null!==s;)t+=s.offsetLeft,s=s.offsetParent;return t},_getElementTop:function(){for(var e=this._ele,t=e.offsetTop,s=e.offsetParent;null!==s;)t+=s.offsetTop,s=s.offsetParent;return t}},l.$=function(e){var t,s;"string"==typeof e?"#"===e[0]?t=document.getElementById(e.slice(1)):"querySelector"in document?t=document.querySelector(e):r(window.jQuery)&&(t=window.jQuery(e)[0]):t=e.length?e[0]:e;try{s=Node.ELEMENT_NODE}catch(n){s=1}try{if(t.nodeType===s)return new l(t)}catch(n){return!1}},g.prototype={_getX:function(){var e=this._e;if(o(e.clientX))return e.clientX;var t=e.changedTouches&&e.changedTouches[0];return t?t.clientX:-1},_getY:function(){var e=this._e;if(o(e.clientY))return e.clientY;var t=e.changedTouches&&e.changedTouches[0];return t?t.clientY:-1},_preventDefault:function(){var e=this._e;return e.cancelable&&r(e.preventDefault)?e.preventDefault():e.returnValue=!1,this},_stopPropagation:function(){var e=this._e;return r(e.stopPropagation)&&e.stopPropagation(),this}},e.exports={_Element:l,_assign:function(e){if("function"==typeof Object.assign)return Object.assign.apply(Object,arguments);if(null==e)throw new Error("Cannot convert undefined or null to object");e=Object(e);for(var t=1;t=n.length-1){if(_(!0),t){e.error_code=508;var a=s+n[g]+r;h(e,a)}}else l(g+1);else _(!1)}))}(0)},f=function(e,t,s,n){if(l(s.getLib))return s._extend(s.getLib),void n(s);if(s.offline)n({type:"fullpage",offline:!0});else{var o="geetest_"+(parseInt(1e4*r.random())+(new Date).valueOf());window[o]=function(e){"success"==e.status?n(e.data):e.status?n({type:"fullpage",offline:!0}):n(e),window[o]=undefined;try{delete window[o]}catch(t){}},u(s,!0,s.protocol,e,t,{gt:s.gt,callback:o},(function(e){e&&n({type:"fullpage",offline:!0})}))}},h=function(e,t){var s,n,o,r,a,i,_;u(e,!1,e.protocol,["monitor.geetest.com"],"/monitor/send",{time:(s=new Date,n=s.getFullYear(),o=s.getMonth()+1,r=s.getDate(),a=s.getHours(),i=s.getMinutes(),_=s.getSeconds(),o>=1&&o<=9&&(o="0"+o),r>=0&&r<=9&&(r="0"+r),a>=0&&a<=9&&(a="0"+a),i>=0&&i<=9&&(i="0"+i),_>=0&&_<=9&&(_="0"+_),n+"-"+o+"-"+r+" "+a+":"+i+":"+_),captcha_id:e.gt,challenge:e.challenge,pt:g,exception_url:t,error_code:e.error_code},(function(e){}))},m=function(e,t){var s={networkError:"网络错误",gtTypeError:"gt字段不是字符串类型"};if("function"!=typeof t.onError)throw new Error(s[e]);t.onError(s[e])};(window.Geetest||o.getElementById("gt_lib"))&&(d.slide="loaded");e.exports=function(e,t){var s=new _(e);e.https?s.protocol="https://":e.protocol||(s.protocol=window.location.protocol+"//"),"050cffef4ae57b5d5e529fea9540b0d1"!==e.gt&&"3bd38408ae4af923ed36e13819b14d42"!==e.gt||(s.apiserver="yumchina.geetest.com/",s.api_server="yumchina.geetest.com"),e.gt&&(window.GeeGT=e.gt),e.challenge&&(window.GeeChallenge=e.challenge),l(e.getType)&&s._extend(e.getType),f([s.api_server||s.apiserver],s.typePath,s,(function(e){var o=e.type;if(e.offline)t(new n(s));else{var r=function(){s._extend(e),t(new window.Geetest(s))};c[o]=c[o]||[];var a=d[o]||"init";"init"===a?(d[o]="loading",c[o].push(r),u(s,!0,s.protocol,e.static_servers||e.domains,e[o]||e.path,null,(function(e){if(e)d[o]="fail",m("networkError",s);else{d[o]="loaded";for(var t=c[o],n=0,r=t.length;n-1&&(t(".radar_tip")._addClass("reversal"),t(".success_radar_tip")._addClass("reversal_success")),t(".reset_tip_content")._text(n.reset),e},_addEvent:function(){var e,t,s,n=this,o=n.$,r=n._status,i=n._captcha;n._logo_click=!1,a?(new f([o(".logo"),o(".success_logo")])._map((function(e){e._addEvent("click",(function(){n._logo_click=!0,o(".goto")._show(),setTimeout((function(){o(".goto")._opacity(1)}),300)}))})),new f([o(".goto_cancel"),o(".goto_ghost")])._map((function(e){e._addEvent("click",(function(){n._logo_click=!1,o(".goto")._opacity(0),setTimeout((function(){o(".goto")._hide()}),300)}))}))):(o(".logo")._addEvent("click",(function(e){n._logo_click=!0,setTimeout((function(){n._logo_click=!1}),10)})),o(".success_logo")._addEvent("click",(function(e){n._logo_click=!0,setTimeout((function(){n._logo_click=!1}),10)}))),n._css3&&(n._css3_move=(e=function(e){if(r._equal(x))r._set(y),setTimeout((function(){r._equal(y)&&r._set(T)}),500);else if(r._equal(A)&&a){if(n._logo_click)return;r._set(v),setTimeout((function(){r._equal(v)&&(r._set(C),n._fullpage())}),10)}r._equal([y,T])&&n._rotate(e)},t=null,(s=function(s){t=setTimeout((function(){e(s)}),10)}).cancel=function(){clearTimeout(t),t=null},s),n._doc._addEvent("move",n._css3_move));var _=function(){n._logo_click||("function"!=typeof n._captcha._validateCallback||n._captcha._validateCallback())&&(r._equal([A,y,T])?(r._set(v),setTimeout((function(){r._equal(v)&&(r._set(C),n._fullpage())}),10)):r._equal([x])&&(r._set(C),n._fullpage()))};return o(".holder")._addEvent("keydown",(function(e){13===e._e.keyCode&&(i._by=1,_())}))._addEvent("click",(function(e){i._by=0,_()}))._addEvent("enter",(function(){r._equal([x,y,T])&&r._set(A)}))._addEvent("leave",(function(){r._equal([x,y,T,A])&&r._set(T)})),o(".reset_tip_content")._addEvent("click",(function(){n._captcha._errObj&&"error_21"===n._captcha._errObj.code?n._refreshPage():n._reset()._then((function(){r._set(E)}))})),n},_rotate:function(e){var t=this.$,s=t(".dot"),n=t(".sector"),o=e._getX(),r=e._getY(),a=s._getBoundingClientRect(),i=o-(a.left+8),_=a.top+8-r,l=180*Math.atan(i/_)/Math.PI;_<0&&(l+=180),n._setStyles({transform:"rotate("+l+"deg)"})},_fullpage:function(){var e=this._status;e._equal(C)&&e._set(E)},_compute:function(){var e=this._config;this._captcha._fullpageHandler({result:"success",validate:e.challenge})},_reset:function(){var e=this._status,t=this.$,s=e._get();if(!e._equal([z,S,k]))return this;e._set(N),this._captcha._resetValidate(),s===z&&(this._clearForm(),t(".ghost_success")._hide(),this._css3&&setTimeout((function(){t(".ghost_success")._removeClass("success_animate")._show()}),10)),e._set(x)},_zoom:function(){var e=this._config;return this._dom._setStyles({width:e.width||toRem(this._WIDTH)}),this},_loadSkin:function(){var e=new u("style");e.type="text/css",e._style(d),e._appendTo(new u(w))},_onChangeStatus:function(e,t){var s=this.$;if(e===z)if(s(".holder")._replaceClass(e,t||null),this._css3)s(".ghost_success")._addClass("success_animate"),s(".panel_success")._addClass("success_animate"),s(".success_btn")._setStyles({width:s(".holder")._width()+"px"}),setTimeout((function(){s(".success_btn")._setStyles({width:"100%"})}),2e3);else{var n=this._config;"bind"===n.product&&n.pure||(s(".panel_success")._show()._addClass("success_animate"),s(".ghost_success")._show()._addClass("success_animate"))}else s(".holder")._replaceClass(e,t||null);return this},_appendTo:function(e){this._config;return this._box||this._button||(this._box=u.$(e),this._addEvent(),this._dom._appendTo(this._box)),this},_bindForm:function(e){var t=this.$;if(this._form=u.$(e),this._form)return t(".form")._moveTo(this._form),this},_bindButton:function(e){if(this._button||this._box)return this;var t=this._status;if(this._button=u.$(e),!this._button)return this;this._button._addEvent("click",(function(){t._equal([x])&&t._set(E)}))},_success:function(e){var t=this,s=t._config;"bind"===s.product&&(s.pure||(t._panelShowSuccess(),t._panelRemove())),t._setForm(e)},_setForm:function(e){var t=this.$;t(".challenge")._setAttrs({value:e.geetest_challenge}),t(".validate")._setAttrs({value:e.geetest_validate}),t(".seccode")._setAttrs({value:e.geetest_seccode})},_clearForm:function(){var e=this.$;return e(".challenge")._removeAttrs(["value"]),e(".validate")._removeAttrs(["value"]),e(".seccode")._removeAttrs(["value"]),this},_panelShow:function(){var e=this.$;e(".panel_loading")._hide(),e(".panel_success")._hide(),e(".panel_error")._hide(),e(".panel_footer")._hide(),e(".panel_next")._hide(),e(".panel")._show(),setTimeout((function(){e(".panel")._opacity(1)}),10),i&&e(".panel_box")._setStyles({marginLeft:"0",marginTop:"0"})},_panelRemove:function(){var e=this.$;e(".panel_box")._removeClass("panelshowclick"),e(".panel_box")._removeClass("ie6panelshowclick"),e(".panel_box")._removeClass("panelshowslide"),e(".panel_box")._removeClass("panelshowbeeline"),e(".panel_box")._setStyles({width:"",height:""})},_panelHide:function(){var e=this.$;e(".panel")._opacity(0),setTimeout((function(){e(".panel")._hide()}),300)},_destroy:function(){var e=this._config,t=this.$;switch(this._win._removeEvents(),this._doc._removeEvents(),this._css3_move&&this._css3_move.cancel(),e.product){case"bind":t(".panel")._remove();break;case"popup":case"float":t(".holder")._remove(),t(".fullpage_click")._remove();break;case"custom":t(".holder")._remove()}},_panelShowPanel:function(){var e=this.$;this._panelShow(),e(".panel_next")._hide()},_panelShowLoading:function(){var e=this.$;this._config.area&&this._panelBindLoading(),this._panelShowPanel(),e(".panel_loading")._show(),this._show_panel_footer()},_panelBindLoading:function(){var e=this._config,t=this.$,s=u.$(e.area);if(!s)return throwError(getError("api_appendTo",this._captcha));var n=s._getCoords(),o=t(".panel");o&&o._setStyles({position:"absolute",left:toRem(n.left),top:toRem(n.top),width:toRem(n.width),height:toRem(n.height)})},_panelShowSuccess:function(){var e=this.$;this._panelShowPanel(),e(".panel_success")._show(),this._show_panel_footer()},_show_panel_footer:function(){var e=this.$;this._config.logo?e(".panel_footer")._show():(e(".panel_box")._addClass("no_logo"),e(".panel_footer")._hide())},_refreshPage:function(){var e=this._lang.refresh_page||"";window.confirm(e)&&window.location.reload()}},e.exports=D},function(e,t,s){"use strict";var n=s(1)._Array;e.exports=function(e){var t,s=e.i18n_labels,o={"zh-cn":(t={ready:"点击按钮进行验证",fullpage:"智能检测中",success:"验证成功",error:"网络故障",reset:"请点击重试",next:"正在加载验证",next_ready:"请完成验证"},t.error="网络故障",t.goto_homepage="是否前往验证服务Geetest官网?",t.goto_confirm="前往",t.goto_cancel="取消",t.loading_content="智能验证检测中",t.success_title="通过验证",t.error_title="网络超时",t.error_content="请点击此处重试",t.copyright="由极验提供技术支持",t.refresh_page="页面出现错误啦!要继续操作,请刷新此页面。",t),en:{ready:"Click to pass",fullpage:"Detecting",success:"Succeeded",error:"Network failure",reset:"Click to retry",next:"Loading",next_ready:"Please finish it",goto_homepage:"Going to Geetest(verification service provider)?",goto_confirm:"Yes",goto_cancel:"Cancel",loading_content:"Detecting",success_title:"Success",error_title:"Network timeout",error_content:"Click to retry",copyright:"Provided by Geetest",refresh_page:"An error occured. Please refresh and try again!"},"zh-hk":{ready:"點擊按鈕進行驗證",fullpage:"智能檢測中",success:"驗證成功",error:"網絡故障",reset:"請點擊重試",next:"正在加載驗證",next_ready:"請完成驗證",goto_homepage:"是否前往驗證服務Geetest官網?",goto_confirm:"前往",goto_cancel:"取消",loading_content:"智能驗證檢測中",success_title:"通過驗證",error_title:"網絡超時",error_content:"請點擊此處重試",copyright:"由極驗提供技術支持",refresh_page:"頁面出現錯誤啦!要繼續操作,請刷新此頁面。"}};for(var r in s)if("object"==typeof s&&s.hasOwnProperty(r))return s;return e&&e.offline&&new n(["zh-cn","en","zh-hk"])._indexOf(e.lang)>-1?o[e.lang]:o["zh-cn"]}},function(e,t,s){"use strict";var n=s(0).PREFIX;e.exports={make_$:function(){var e={};return function(t,s){if(!s)return e[t.replace(n,"")];e[t]=s}}}},function(e,t,s){"use strict";var n=s(1),o=n._Array,r=n._Element,a=n._Object,i=s(3),_=i.isString,l=(i.isNumber,s(0).PREFIX);e.exports={compile:function g(e,t,s){var n=e.split("."),i=n[0]||"div",c=new o(n)._slice(1)._map((function(e){return l+e}))._join(" "),d=new r(i);return s("."+n[1],d),"input"==i?d._setAttrs({type:"hidden",name:c}):d._setProps({className:c}),_(t)?d._setAttrs({textContent:t}):new a(t)._each((function(e,t){d._appendChild(g(e,t,s))})),d},template:{".form":{"input.challenge":{},"input.validate":{},"input.seccode":{}},".btn":{".radar_btn":{".radar":{".ring":{".small":{}},".sector":{".small":{}},".cross":{".h":{},".v":{}},".dot":{},".scan":{".h":{}},".status":{".bg":{},".hook":{}}},".ie_radar":{},".radar_tip":{"span.radar_tip_content":{},"span.reset_tip_content":{},"span.radar_error_code":{}},"a.logo":{},".other_offline.offline":{}},".ghost_success":{".success_btn":{".success_box":{".success_show":{".success_pie":{},".success_filter":{},".success_mask":{}},".success_correct":{".success_icon":{}}},".success_radar_tip":{"span.success_radar_tip_content":{},"span.success_radar_tip_timeinfo":{}},"a.success_logo":{},".success_offline.offline":{}}},".slide_icon":{}},".wait":{"span.wait_dot.dot_1":{},"span.wait_dot.dot_2":{},"span.wait_dot.dot_3":{}},".fullpage_click":{".fullpage_ghost":{},".fullpage_click_wrap":{".fullpage_click_box":{},".fullpage_pointer":{".fullpage_pointer_out":{},".fullpage_pointer_in":{}}}},".goto":{".goto_ghost":{},".goto_wrap":{".goto_content":{".goto_content_tip":{}},".goto_cancel":{},"a.goto_confirm":{}}},".panel":{".panel_ghost":{},".panel_box":{".other_offline.panel_offline":{},".panel_loading":{".panel_loading_icon":{},".panel_loading_content":{}},".panel_success":{".panel_success_box":{".panel_success_show":{".panel_success_pie":{},".panel_success_filter":{},".panel_success_mask":{}},".panel_success_correct":{".panel_success_icon":{}}},".panel_success_title":{}},".panel_error":{".panel_error_icon":{},".panel_error_title":{},".panel_error_content":{},".panel_error_code":{".panel_error_code_text":{}}},".panel_footer":{".panel_footer_logo":{},".panel_footer_copyright":{}},".panel_next":{}}}}}},function(e,t,s){"use strict";var n=s(1)._Array;function o(e){this._onChange=e}o.prototype={_set:function(e){var t=this;return t._prevStatus=t._status,t._status=e,t._onChange(t._status,t._prevStatus),t},_get:function(){return this._status},_equal:function(e){for(var t=n._isArray(e)?e:[e],s=0,o=t.length;s - + @@ -15,20 +15,23 @@ + {% endblock %} {% block body %} -
-
+
+
-
- + } + var handler = function (captchaObj) { + $("#submit").click(function (e) { + var result = captchaObj.getValidate(); + if (!result) { + $("#notice").show(); + setTimeout(function () { + $("#notice").hide(); + }, 2000); + e.preventDefault(); + } + }); + // 将验证码加到id为captcha的元素里,同时会有三个input的值用于表单提交 + captchaObj.appendTo("#captcha"); + captchaObj.onReady(function () { + $("#wait").hide(); + }); + }; + + $.ajax({ + url: "register_check?t=" + (new Date()).getTime(), // 加随机数防止缓存 + type: "get", + dataType: "json", + success: function (data) { + // 调用 initGeetest 初始化参数 + // 参数1:配置参数 + // 参数2:回调,回调的第一个参数验证码对象,之后可以使用它调用相应的接口 + initGeetest({ + gt: data.gt, + challenge: data.challenge, + new_captcha: data.new_captcha, // 用于宕机时表示是新验证码的宕机 + offline: !data.success, // 表示用户后台检测极验服务器是否宕机,一般不需要关注 + product: "float", // 产品形式,包括:float,popup + width: "100%" + }, handler); + } + }); + {% endblock %} diff --git a/config.py b/config.py index 6535ca3..2bc5f51 100644 --- a/config.py +++ b/config.py @@ -22,6 +22,7 @@ class Config: FLASKY_FOLLOWERS_PER_PAGE = 50 FLASKY_COMMENTS_PER_PAGE = 30 FLASKY_LIKER_PER_PAGE = 50 + CACHE_TYPE = "simple" @staticmethod def init_app(app): diff --git a/data-dev.sqlite b/data-dev.sqlite index 5683ddb..dcce02e 100644 Binary files a/data-dev.sqlite and b/data-dev.sqlite differ diff --git a/flasky.py b/flasky.py index cf1ffe1..2c0b600 100644 --- a/flasky.py +++ b/flasky.py @@ -1,4 +1,10 @@ +import json import os +import threading +import time + +import requests +from flask import Response from flask_migrate import Migrate from app import create_app, db from app.models import User, Role, Students, Permission, Post, Comment, Like, Notification, Transaction, Activity @@ -7,7 +13,33 @@ from app.models import User, Role, Students, Permission, Post, Comment, Like, No # please run this file app = create_app(os.getenv('FLASK_CONFIG') or 'default') + migrate = Migrate(app, db, render_as_batch=True) +from geetest_config import GEETEST_ID, GEETEST_KEY, REDIS_HOST, REDIS_PORT, CYCLE_TIME, BYPASS_URL, \ + GEETEST_BYPASS_STATUS_KEY + +from sdk.geetest_lib import GeetestLib + + +# 发送bypass请求,获取bypass状态并进行缓存 +def check_bypass_status(): + while True: + response = "" + params = {"gt": GEETEST_ID} + try: + response = requests.get(url=BYPASS_URL, params=params) + except Exception as e: + print(e) + if response and response.status_code == 200: + print(response.content) + bypass_status_str = response.content.decode("utf-8") + bypass_status = json.loads(bypass_status_str).get("status") + geetest_dict[GEETEST_BYPASS_STATUS_KEY] = bypass_status + else: + bypass_status = "fail" + geetest_dict[GEETEST_BYPASS_STATUS_KEY] = bypass_status + print("bypass状态已经获取并存入redis,当前状态为-{}".format(bypass_status)) + time.sleep(CYCLE_TIME) @app.shell_context_processor @@ -16,5 +48,45 @@ def make_shell_context(): Comment=Comment, Like=Like, Notification=Notification, Transaction=Transaction, Activity=Activity) +geetest_dict = {} + + +# 从缓存中取出当前缓存的bypass状态(success/fail) +def get_bypass_cache(): + bypass_status_cache = geetest_dict[GEETEST_BYPASS_STATUS_KEY] + bypass_status = bypass_status_cache + return bypass_status + + +# 验证初始化接口,GET请求 +@app.route("/auth/register_check", methods=["GET"]) +def first_register(): + # 必传参数 + # digestmod 此版本sdk可支持md5、sha256、hmac-sha256,md5之外的算法需特殊配置的账号,联系极验客服 + # 自定义参数,可选择添加 + # user_id 客户端用户的唯一标识,确定用户的唯一性;作用于提供进阶数据分析服务,可在register和validate接口传入,不传入也不影响验证服务的使用;若担心用户信息风险,可作预处理(如哈希处理)再提供到极验 + # client_type 客户端类型,web:电脑上的浏览器;h5:手机上的浏览器,包括移动应用内完全内置的web_view;native:通过原生sdk植入app应用的方式;unknown:未知 + # ip_address 客户端请求sdk服务器的ip地址 + bypass_status = get_bypass_cache() + gt_lib = GeetestLib(GEETEST_ID, GEETEST_KEY) + digestmod = "md5" + user_id = "test" + param_dict = {"digestmod": digestmod, "user_id": user_id, "client_type": "web", "ip_address": "127.0.0.1"} + if bypass_status == "success": + result = gt_lib.register(digestmod, param_dict) + else: + result = gt_lib.local_init() + # 注意,不要更改返回的结构和值类型 + return Response(result.data, content_type='application/json;charset=UTF-8') + + +@app.route("/favicon.ico") +def favicon(): + return app.send_static_file('favicon.ico') + + +thread = threading.Thread(target=check_bypass_status) +thread.start() +app.secret_key = GeetestLib.VERSION if __name__ == '__main__': app.run(debug=True, host='0.0.0.0') diff --git a/geetest_config.py b/geetest_config.py new file mode 100644 index 0000000..7eb4a05 --- /dev/null +++ b/geetest_config.py @@ -0,0 +1,7 @@ +GEETEST_ID = "63840b116cd26b015c6e82d58b10515b" +GEETEST_KEY = "ed498dbf04feeb3337b2dc28536e09d4" +REDIS_HOST = "127.0.0.1" +REDIS_PORT = "6379" +CYCLE_TIME = 10 +GEETEST_BYPASS_STATUS_KEY = "gt_server_bypass_status" +BYPASS_URL = "http://bypass.geetest.com/v1/bypass_status.php" diff --git a/sdk/__init__.py b/sdk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sdk/geetest_lib.py b/sdk/geetest_lib.py new file mode 100644 index 0000000..b6ef232 --- /dev/null +++ b/sdk/geetest_lib.py @@ -0,0 +1,150 @@ +import string +import random +import json +import requests +import hmac +import hashlib + +from .geetest_lib_result import GeetestLibResult + + +# sdk lib包,核心逻辑。 +class GeetestLib: + IS_DEBUG = True # 调试开关,是否输出调试日志 + API_URL = "http://api.geetest.com" + REGISTER_URL = "/register.php" + VALIDATE_URL = "/validate.php" + JSON_FORMAT = "1" + NEW_CAPTCHA = True + HTTP_TIMEOUT_DEFAULT = 5 # 单位:秒 + VERSION = "python-flask:3.1.1" + GEETEST_CHALLENGE = "geetest_challenge" # 极验二次验证表单传参字段 chllenge + GEETEST_VALIDATE = "geetest_validate" # 极验二次验证表单传参字段 validate + GEETEST_SECCODE = "geetest_seccode" # 极验二次验证表单传参字段 seccode + + def __init__(self, geetest_id, geetest_key): + self.geetest_id = geetest_id + self.geetest_key = geetest_key + self.libResult = GeetestLibResult() + + def gtlog(self, message): + if self.IS_DEBUG: + print("gtlog: " + message) + + # 验证初始化 + def register(self, digestmod, param_dict): + self.gtlog("register(): 开始验证初始化, digestmod={0}.".format(digestmod)); + origin_challenge = self.request_register(param_dict) + self.build_register_result(origin_challenge, digestmod) + self.gtlog("register(): 验证初始化, lib包返回信息={0}.".format(self.libResult)); + return self.libResult + + def request_register(self, param_dict): + param_dict.update({"gt": self.geetest_id, "sdk": self.VERSION, "json_format": self.JSON_FORMAT}) + register_url = self.API_URL + self.REGISTER_URL + self.gtlog("requestRegister(): 验证初始化, 向极验发送请求, url={0}, params={1}.".format(register_url, param_dict)) + try: + res = requests.get(register_url, params=param_dict, timeout=self.HTTP_TIMEOUT_DEFAULT) + res_body = res.text if res.status_code == requests.codes.ok else "" + self.gtlog("requestRegister(): 验证初始化, 与极验网络交互正常, 返回码={0}, 返回body={1}.".format(res.status_code, res_body)) + res_dict = json.loads(res_body) + origin_challenge = res_dict["challenge"] + except Exception as e: + self.gtlog("requestRegister(): 验证初始化, 请求异常,后续流程走宕机模式, " + repr(e)) + origin_challenge = "" + return origin_challenge + + def local_init(self): + self.build_register_result("", "") + self.gtlog("local_init(): bypass当前状态为fail,后续流程将进入宕机模式, " + self.libResult.data) + return self.libResult + + # 构建验证初始化返回数据 + def build_register_result(self, origin_challenge, digestmod): + # origin_challenge为空或者值为0代表失败 + if not origin_challenge or origin_challenge == "0": + # 本地随机生成32位字符串 + challenge = "".join(random.sample('abcdefghijklmnopqrstuvwxyz0123456789', 32)) + data = json.dumps( + {"success": 0, "gt": self.geetest_id, "challenge": challenge, "new_captcha": self.NEW_CAPTCHA}) + self.libResult.set_all(0, data, "bypass当前状态为fail,后续流程走宕机模式") + else: + if digestmod == "md5": + challenge = self.md5_encode(origin_challenge + self.geetest_key) + elif digestmod == "sha256": + challenge = self.sha256_endode(origin_challenge + self.geetest_key) + elif digestmod == "hmac-sha256": + challenge = self.hmac_sha256_endode(origin_challenge, self.geetest_key) + else: + challenge = self.md5_encode(origin_challenge + self.geetest_key) + data = json.dumps( + {"success": 1, "gt": self.geetest_id, "challenge": challenge, "new_captcha": self.NEW_CAPTCHA}) + self.libResult.set_all(1, data, "") + + # 正常流程下(即验证初始化成功),二次验证 + def successValidate(self, challenge, validate, seccode, param_dict={}): + self.gtlog( + "successValidate(): 开始二次验证 正常模式, challenge={0}, validate={1}, seccode={2}.".format(challenge, validate, + seccode)) + if not self.check_param(challenge, validate, seccode): + self.libResult.set_all(0, "", "正常模式,本地校验,参数challenge、validate、seccode不可为空") + else: + response_seccode = self.requestValidate(challenge, validate, seccode, param_dict) + if not response_seccode: + self.libResult.set_all(0, "", "请求极验validate接口失败") + elif response_seccode == "false": + self.libResult.set_all(0, "", "极验二次验证不通过") + else: + self.libResult.set_all(1, "", "") + self.gtlog("successValidate(): 二次验证 正常模式, lib包返回信息={0}.".format(self.libResult)) + return self.libResult + + # 异常流程下(即验证初始化失败,宕机模式),二次验证 + # 注意:由于是宕机模式,初衷是保证验证业务不会中断正常业务,所以此处只作简单的参数校验,可自行设计逻辑。 + def failValidate(self, challenge, validate, seccode): + self.gtlog( + "failValidate(): 开始二次验证 宕机模式, challenge={0}, validate={1}, seccode={2}.".format(challenge, validate, + seccode)) + if not self.check_param(challenge, validate, seccode): + self.libResult.set_all(0, "", "宕机模式,本地校验,参数challenge、validate、seccode不可为空.") + else: + self.libResult.set_all(1, "", "") + self.gtlog("failValidate(): 二次验证 宕机模式, lib包返回信息={0}.".format(self.libResult)) + return self.libResult + + # 向极验发送二次验证的请求,POST方式 + def requestValidate(self, challenge, validate, seccode, param_dict): + param_dict.update( + {"seccode": seccode, "json_format": self.JSON_FORMAT, "challenge": challenge, "sdk": self.VERSION, + "captchaid": self.geetest_id}) + validate_url = self.API_URL + self.VALIDATE_URL + self.gtlog("requestValidate(): 二次验证 正常模式, 向极验发送请求, url={0}, params={1}.".format(validate_url, param_dict)) + try: + res = requests.post(validate_url, data=param_dict, timeout=self.HTTP_TIMEOUT_DEFAULT) + res_body = res.text if res.status_code == requests.codes.ok else "" + self.gtlog( + "requestValidate(): 二次验证 正常模式, 与极验网络交互正常, 返回码={0}, 返回body={1}.".format(res.status_code, res_body)) + res_dict = json.loads(res_body) + seccode = res_dict["seccode"] + except Exception as e: + self.gtlog("requestValidate(): 二次验证 正常模式, 请求异常, " + repr(e)) + seccode = "" + return seccode + + # 校验二次验证的三个参数,校验通过返回true,校验失败返回false + def check_param(self, challenge, validate, seccode): + return not ( + challenge is None or challenge.isspace() or validate is None or validate.isspace() or seccode is None or seccode.isspace()) + + def md5_encode(self, value): + md5 = hashlib.md5() + md5.update(value.encode("utf-8")) + return md5.hexdigest() + + def sha256_endode(self, value): + sha256 = hashlib.sha256() + sha256.update(value.encode("utf-8")) + return sha256.hexdigest() + + def hmac_sha256_endode(self, value, key): + return hmac.new(key.encode("utf-8"), value.encode("utf-8"), digestmod=hashlib.sha256).hexdigest() diff --git a/sdk/geetest_lib_result.py b/sdk/geetest_lib_result.py new file mode 100644 index 0000000..fd430a4 --- /dev/null +++ b/sdk/geetest_lib_result.py @@ -0,0 +1,15 @@ +# sdk lib包的返回结果信息。 +class GeetestLibResult: + + def __init__(self): + self.status = 0 # 成功失败的标识码,1表示成功,0表示失败 + self.data = '' # 返回数据,json格式 + self.msg = '' # 备注信息,如异常信息等 + + def set_all(self, status, data, msg): + self.status = status + self.data = data + self.msg = msg + + def __str__(self): + return "GeetestLibResult{{status={0}, data={1}, msg={2}}}".format(self.status, self.data, self.msg)