From 2786bc02e86a759912e33241a0fe5d54a77e74ec Mon Sep 17 00:00:00 2001 From: wistbean <354142480@qq.com> Date: Tue, 5 Jun 2018 20:45:36 +0800 Subject: [PATCH] wechatGroupRobot --- .idea/compiler.xml | 32 + .idea/copyright/profiles_settings.xml | 3 + .idea/inspectionProfiles/Project_Default.xml | 6 + .../inspectionProfiles/profiles_settings.xml | 7 + .idea/libraries/Maven__c3p0_c3p0_0_9_1_1.xml | 13 + ...n__com_bladejava_blade_kit_1_2_9_alpha.xml | 13 + ...Maven__com_google_code_gson_gson_2_8_2.xml | 13 + .../Maven__com_google_zxing_core_3_3_1.xml | 13 + ...Maven__commons_codec_commons_codec_1_6.xml | 13 + ..._commons_logging_commons_logging_1_1_3.xml | 13 + ...apache_httpcomponents_httpclient_4_3_5.xml | 13 + ...g_apache_httpcomponents_httpcore_4_3_2.xml | 13 + ...ven__org_quartz_scheduler_quartz_2_2_1.xml | 13 + ...org_quartz_scheduler_quartz_jobs_2_2_1.xml | 13 + .../Maven__org_slf4j_slf4j_api_1_7_25.xml | 13 + .../Maven__org_slf4j_slf4j_simple_1_7_25.xml | 13 + .../markdown-navigator/profiles_settings.xml | 3 + .idea/misc.xml | 95 + .idea/modules.xml | 8 + .idea/workspace.xml | 1668 +++++++++++++++++ assets/login.json | 1 + assets/qrcode.png | Bin 0 -> 38299 bytes pom.xml | 50 + qrcode.png | Bin 0 -> 41905 bytes src/main/java/MainClass.java | 81 + src/main/java/WechatGroupRobotImpl.java | 630 +++++++ src/main/java/WechatGroupRobotInterface.java | 61 + src/main/java/WechatRobotJob.java | 25 + src/main/java/WechatRobotJob2.java | 22 + .../util/BufferedImageLuminanceSource.java | 169 ++ src/main/java/util/CookieUtil.java | 37 + src/main/java/util/ExceptionUtil.java | 32 + src/main/java/util/FileUtil.java | 42 + src/main/java/util/HttpClientUtil.java | 184 ++ src/main/java/util/JSUtil.java | 37 + src/main/java/util/MatcherUtil.java | 17 + src/main/java/util/StringUtil.java | 1061 +++++++++++ src/main/java/vo/TuLin.java | 31 + src/main/java/vo/Weather.java | 420 +++++ target/classes/MainClass.class | Bin 0 -> 3757 bytes target/classes/WechatGroupRobotImpl$1.class | Bin 0 -> 1551 bytes target/classes/WechatGroupRobotImpl.class | Bin 0 -> 17738 bytes .../classes/WechatGroupRobotInterface.class | Bin 0 -> 413 bytes target/classes/WechatRobotJob.class | Bin 0 -> 2289 bytes target/classes/WechatRobotJob2.class | Bin 0 -> 1466 bytes .../util/BufferedImageLuminanceSource.class | Bin 0 -> 4098 bytes target/classes/util/CookieUtil.class | Bin 0 -> 2097 bytes target/classes/util/ExceptionUtil.class | Bin 0 -> 1431 bytes target/classes/util/FileUtil.class | Bin 0 -> 1519 bytes target/classes/util/HttpClientUtil.class | Bin 0 -> 6038 bytes target/classes/util/JSUtil.class | Bin 0 -> 2417 bytes target/classes/util/MatcherUtil.class | Bin 0 -> 835 bytes target/classes/util/StringUtil.class | Bin 0 -> 15704 bytes target/classes/vo/TuLin.class | Bin 0 -> 695 bytes ...$ResultBean$FutureBean$WeatherIdBean.class | Bin 0 -> 914 bytes .../vo/Weather$ResultBean$FutureBean.class | Bin 0 -> 1850 bytes .../vo/Weather$ResultBean$SkBean.class | Bin 0 -> 1439 bytes ...r$ResultBean$TodayBean$WeatherIdBean.class | Bin 0 -> 910 bytes .../vo/Weather$ResultBean$TodayBean.class | Bin 0 -> 3685 bytes target/classes/vo/Weather$ResultBean.class | Bin 0 -> 1582 bytes target/classes/vo/Weather.class | Bin 0 -> 1271 bytes wechat-group-robot.iml | 27 + 62 files changed, 4905 insertions(+) create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/libraries/Maven__c3p0_c3p0_0_9_1_1.xml create mode 100644 .idea/libraries/Maven__com_bladejava_blade_kit_1_2_9_alpha.xml create mode 100644 .idea/libraries/Maven__com_google_code_gson_gson_2_8_2.xml create mode 100644 .idea/libraries/Maven__com_google_zxing_core_3_3_1.xml create mode 100644 .idea/libraries/Maven__commons_codec_commons_codec_1_6.xml create mode 100644 .idea/libraries/Maven__commons_logging_commons_logging_1_1_3.xml create mode 100644 .idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_3_5.xml create mode 100644 .idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_3_2.xml create mode 100644 .idea/libraries/Maven__org_quartz_scheduler_quartz_2_2_1.xml create mode 100644 .idea/libraries/Maven__org_quartz_scheduler_quartz_jobs_2_2_1.xml create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_simple_1_7_25.xml create mode 100644 .idea/markdown-navigator/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/workspace.xml create mode 100644 assets/login.json create mode 100644 assets/qrcode.png create mode 100644 pom.xml create mode 100644 qrcode.png create mode 100644 src/main/java/MainClass.java create mode 100644 src/main/java/WechatGroupRobotImpl.java create mode 100644 src/main/java/WechatGroupRobotInterface.java create mode 100644 src/main/java/WechatRobotJob.java create mode 100644 src/main/java/WechatRobotJob2.java create mode 100644 src/main/java/util/BufferedImageLuminanceSource.java create mode 100644 src/main/java/util/CookieUtil.java create mode 100644 src/main/java/util/ExceptionUtil.java create mode 100644 src/main/java/util/FileUtil.java create mode 100644 src/main/java/util/HttpClientUtil.java create mode 100644 src/main/java/util/JSUtil.java create mode 100644 src/main/java/util/MatcherUtil.java create mode 100644 src/main/java/util/StringUtil.java create mode 100644 src/main/java/vo/TuLin.java create mode 100644 src/main/java/vo/Weather.java create mode 100644 target/classes/MainClass.class create mode 100644 target/classes/WechatGroupRobotImpl$1.class create mode 100644 target/classes/WechatGroupRobotImpl.class create mode 100644 target/classes/WechatGroupRobotInterface.class create mode 100644 target/classes/WechatRobotJob.class create mode 100644 target/classes/WechatRobotJob2.class create mode 100644 target/classes/util/BufferedImageLuminanceSource.class create mode 100644 target/classes/util/CookieUtil.class create mode 100644 target/classes/util/ExceptionUtil.class create mode 100644 target/classes/util/FileUtil.class create mode 100644 target/classes/util/HttpClientUtil.class create mode 100644 target/classes/util/JSUtil.class create mode 100644 target/classes/util/MatcherUtil.class create mode 100644 target/classes/util/StringUtil.class create mode 100644 target/classes/vo/TuLin.class create mode 100644 target/classes/vo/Weather$ResultBean$FutureBean$WeatherIdBean.class create mode 100644 target/classes/vo/Weather$ResultBean$FutureBean.class create mode 100644 target/classes/vo/Weather$ResultBean$SkBean.class create mode 100644 target/classes/vo/Weather$ResultBean$TodayBean$WeatherIdBean.class create mode 100644 target/classes/vo/Weather$ResultBean$TodayBean.class create mode 100644 target/classes/vo/Weather$ResultBean.class create mode 100644 target/classes/vo/Weather.class create mode 100644 wechat-group-robot.iml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..d23942b --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..7ea997a --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..3b31283 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__c3p0_c3p0_0_9_1_1.xml b/.idea/libraries/Maven__c3p0_c3p0_0_9_1_1.xml new file mode 100644 index 0000000..dde215b --- /dev/null +++ b/.idea/libraries/Maven__c3p0_c3p0_0_9_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_bladejava_blade_kit_1_2_9_alpha.xml b/.idea/libraries/Maven__com_bladejava_blade_kit_1_2_9_alpha.xml new file mode 100644 index 0000000..15660cc --- /dev/null +++ b/.idea/libraries/Maven__com_bladejava_blade_kit_1_2_9_alpha.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_gson_gson_2_8_2.xml b/.idea/libraries/Maven__com_google_code_gson_gson_2_8_2.xml new file mode 100644 index 0000000..49c91be --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_gson_gson_2_8_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_zxing_core_3_3_1.xml b/.idea/libraries/Maven__com_google_zxing_core_3_3_1.xml new file mode 100644 index 0000000..878fca2 --- /dev/null +++ b/.idea/libraries/Maven__com_google_zxing_core_3_3_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_codec_commons_codec_1_6.xml b/.idea/libraries/Maven__commons_codec_commons_codec_1_6.xml new file mode 100644 index 0000000..e8a6a9f --- /dev/null +++ b/.idea/libraries/Maven__commons_codec_commons_codec_1_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_logging_commons_logging_1_1_3.xml b/.idea/libraries/Maven__commons_logging_commons_logging_1_1_3.xml new file mode 100644 index 0000000..01c7b8e --- /dev/null +++ b/.idea/libraries/Maven__commons_logging_commons_logging_1_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_3_5.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_3_5.xml new file mode 100644 index 0000000..5601459 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_3_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_3_2.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_3_2.xml new file mode 100644 index 0000000..1c14963 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_3_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_quartz_scheduler_quartz_2_2_1.xml b/.idea/libraries/Maven__org_quartz_scheduler_quartz_2_2_1.xml new file mode 100644 index 0000000..4d3fd76 --- /dev/null +++ b/.idea/libraries/Maven__org_quartz_scheduler_quartz_2_2_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_quartz_scheduler_quartz_jobs_2_2_1.xml b/.idea/libraries/Maven__org_quartz_scheduler_quartz_jobs_2_2_1.xml new file mode 100644 index 0000000..56b5634 --- /dev/null +++ b/.idea/libraries/Maven__org_quartz_scheduler_quartz_jobs_2_2_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml new file mode 100644 index 0000000..20e8163 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_simple_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_slf4j_simple_1_7_25.xml new file mode 100644 index 0000000..8bc862b --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_slf4j_simple_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml new file mode 100644 index 0000000..57927c5 --- /dev/null +++ b/.idea/markdown-navigator/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..04ef22d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..21c89cc --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..f2ea457 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,1668 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1527588702401 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file://$PROJECT_DIR$/src/main/java/WechatGroupRobotImpl.java + 574 + + + + file://$PROJECT_DIR$/src/main/java/WechatGroupRobotImpl.java + 603 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No facets are configured + + + + + + + + + + + + + + + 1.8 + + + + + + + + wechat-group-robot + + + + + + + + 1.8 + + + + + + + + Maven: ch.qos.logback:logback-classic:1.2.3 + + + + + + + + \ No newline at end of file diff --git a/assets/login.json b/assets/login.json new file mode 100644 index 0000000..2a73cef --- /dev/null +++ b/assets/login.json @@ -0,0 +1 @@ +{"session":{"account":{"Uin":463215975,"UserName":"@4afd0a0dff0405b05b5c0636a1eb7aff","NickName":"wistbean","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq\u003d1709971795\u0026username\u003d@4afd0a0dff0405b05b5c0636a1eb7aff\u0026skey\u003d@crypt_b0f5e54e_2b0b7bf597829a83869626c0bf413f5b","RemarkName":"","PYInitial":"","PYQuanPin":"","RemarkPYInitial":"","RemarkPYQuanPin":"","HideInputBarFlag":0,"StarFriend":0,"Sex":1,"Signature":"答应自己的事,就要做到!","AppAccountFlag":0,"VerifyFlag":0,"ContactFlag":0,"WebWxPluginSwitch":0,"HeadImgFlag":1,"SnsFlag":177},"userName":"@4afd0a0dff0405b05b5c0636a1eb7aff","nickName":"wistbean","url":"https://wx2.qq.com/cgi-bin/mmwebwx-bin","fileUrl":"https://file.wx2.qq.com/cgi-bin/mmwebwx-bin","syncUrl":"https://wx2.qq.com/cgi-bin/mmwebwx-bin","deviceId":"e1527588995707","sKey":"@crypt_b0f5e54e_2b0b7bf597829a83869626c0bf413f5b","wxSid":"VSZSljKLWHicAMtn","wxUin":"463215975","passTicket":"YPJh5EDijg29%2BL8Jt3BEyvbZ3ymJdgcLeIy4yz06vcsBLe9BUNXZZMpz53rclbrp","syncKeyStr":"1_667292535|2_667293295|3_667293296|11_667293128|201_1527589090|1000_1527584282|1001_1527584354","inviteStartCount":40,"baseRequest":{"Skey":"@crypt_b0f5e54e_2b0b7bf597829a83869626c0bf413f5b","Sid":"VSZSljKLWHicAMtn","Uin":"463215975","DeviceID":"e1527588995707"},"syncKey":{"Count":7,"List":[{"Key":1,"Val":667292535},{"Key":2,"Val":667293295},{"Key":3,"Val":667293296},{"Key":11,"Val":667293128},{"Key":201,"Val":1527589090},{"Key":1000,"Val":1527584282},{"Key":1001,"Val":1527584354}]}},"cookieStore":{"web.wechat.com":[{"name":"wxpluginkey","value":"1527584282","expiresAt":1527632315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"wxuin","value":"463215975","expiresAt":1527848315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"wxsid","value":"VSZSljKLWHicAMtn","expiresAt":1527632315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"webwx_data_ticket","value":"gScPoo25dPQKgVDeUfgMzTMK","expiresAt":1527632315000,"domain":"qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false}],"wx2.qq.com":[{"name":"wxpluginkey","value":"1527584282","expiresAt":1527632315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"wxuin","value":"463215975","expiresAt":1527848315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"wxsid","value":"VSZSljKLWHicAMtn","expiresAt":1527632315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"webwx_data_ticket","value":"gScPoo25dPQKgVDeUfgMzTMK","expiresAt":1527632315000,"domain":"qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false}],"webpush.wx2.qq.com":[{"name":"wxpluginkey","value":"1527584282","expiresAt":1527632315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"wxuin","value":"463215975","expiresAt":1527848315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"wxsid","value":"VSZSljKLWHicAMtn","expiresAt":1527632315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"webwx_data_ticket","value":"gScPoo25dPQKgVDeUfgMzTMK","expiresAt":1527632315000,"domain":"qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false}],"file.web.wechat.com":[{"name":"wxpluginkey","value":"1527584282","expiresAt":1527632315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"wxuin","value":"463215975","expiresAt":1527848315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"wxsid","value":"VSZSljKLWHicAMtn","expiresAt":1527632315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"webwx_data_ticket","value":"gScPoo25dPQKgVDeUfgMzTMK","expiresAt":1527632315000,"domain":"qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false}],"webpush.web.wechat.com":[{"name":"wxpluginkey","value":"1527584282","expiresAt":1527632315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"wxuin","value":"463215975","expiresAt":1527848315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"wxsid","value":"VSZSljKLWHicAMtn","expiresAt":1527632315000,"domain":"wx2.qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false},{"name":"webwx_data_ticket","value":"gScPoo25dPQKgVDeUfgMzTMK","expiresAt":1527632315000,"domain":"qq.com","path":"/","secure":false,"httpOnly":false,"persistent":true,"hostOnly":false}]}} \ No newline at end of file diff --git a/assets/qrcode.png b/assets/qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b0932df53d63c91251f1a4a7e37d47c4a8504b GIT binary patch literal 38299 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7aadc2c --- /dev/null +++ b/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + kendinghui + wechat-group-robot + 1.0-SNAPSHOT + + + + com.bladejava + blade-kit + 1.2.9-alpha + + + org.apache.httpcomponents + httpclient + 4.3.5 + + + com.google.zxing + core + 3.3.1 + + + org.slf4j + slf4j-simple + 1.7.25 + + + org.quartz-scheduler + quartz + 2.2.1 + + + org.quartz-scheduler + quartz-jobs + 2.2.1 + + + com.google.code.gson + gson + 2.8.2 + + + + + \ No newline at end of file diff --git a/qrcode.png b/qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..35811abb5334dff4ee779e8465372e051f344921 GIT binary patch literal 41905 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%0D#RKDngaxjuBX_w5%E8?ockY(Kp?=GSn1^k~p$ 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 F{{jAUR^ SpecialUsers = Arrays.asList("newsapp", "fmessage", "filehelper", "weibo", "qqmail", "fmessage", "tmessage", "qmessage", "qqsync", "floatbottle", "lbsapp", "shakeapp", "medianote", "qqfriend", "readerapp", "blogapp", "facebookapp", "masssendapp", "meishiapp", "feedsapp", "voip", "blogappweixin", "weixin", "brandsessionholder", "weixinreminder", "wxid_novlwrv3lqwv11", "gh_22b87fa7cb3c", "officialaccounts", "notification_messages", "wxid_novlwrv3lqwv11", "gh_22b87fa7cb3c", "wxitil", "userexperience_alarm", "notification_messages"); + + /** + * 是否登录 + */ + private boolean isLogin; + private String uuid; + + private String cookie; + + private volatile static WechatGroupRobotImpl instance = null; + private WechatGroupRobotImpl(){} + + public static WechatGroupRobotImpl getInstance() + { + if(instance == null) + { + synchronized (WechatGroupRobotImpl.class) + { + if(instance==null) + { + instance = new WechatGroupRobotImpl(); + } + } + } + + return instance; + } + + + public boolean login() { + + if(isLogin){ + logger.info("已经登录"); + return true; + } + this.isLogin = true; + +// String res = HttpClientUtil.doGet(this.redirect_uri); + HttpRequest request = HttpRequest.get(this.redirect_uri); + String res = request.body(); + this.cookie = CookieUtil.getCookie(request); + + request.disconnect(); + if(StringUtil.isEmpty(res)){ + return false; + } + + this.skey = MatcherUtil.match("(\\S+)", res); + this.wxsid = MatcherUtil.match("(\\S+)", res); + this.wxuin = MatcherUtil.match("(\\S+)", res); + this.pass_ticket = MatcherUtil.match("(\\S+)", res); + + this.BaseRequest = new JSONObject(); + BaseRequest.put("Uin", this.wxuin); + BaseRequest.put("Sid", this.wxsid); + BaseRequest.put("Skey", this.skey); + BaseRequest.put("DeviceID", this.deviceId); + + return true; + } + + public boolean initWechat() { + + String url = this.base_uri + "/webwxinit?r=" + DateKit.getCurrentUnixTime() + "&pass_ticket=" + this.pass_ticket + + "&skey=" + this.skey; + + JSONObject body = new JSONObject(); + body.put("BaseRequest", this.BaseRequest); + + HttpRequest request = HttpRequest.post(url) + .header("Content-Type", "application/json;charset=utf-8") + .header("Cookie", this.cookie) + .send(body.toString()); + + logger.info("[*] " + request); + String res = request.body(); + request.disconnect(); + + if(StringKit.isBlank(res)){ + return false; + } + + try { + JSONObject jsonObject = JSON.parse(res).asObject(); + if(null != jsonObject){ + JSONObject BaseResponse = jsonObject.getJSONObject("BaseResponse"); + if(null != BaseResponse){ + int ret = BaseResponse.getInt("Ret", -1); + if(ret == 0){ + this.SyncKey = jsonObject.getJSONObject("SyncKey"); + this.User = jsonObject.getJSONObject("User"); + + StringBuffer synckey = new StringBuffer(); + + JSONArray list = SyncKey.getJSONArray("List"); + for(int i=0, len=list.size(); i(); + requestParam.put("appid","wx782c26e4c19acffb"); + requestParam.put("fun","new"); + requestParam.put("lang","zh_CN"); + + String result = HttpClientUtil.doGet(url, requestParam); + + logger.info("[获取UUID返回结果] " + result); + + if(!StringUtil.isEmpty(result)){ + String code = MatcherUtil.match("window.QRLogin.code = (\\d+);", result); + if(null != code){ + if(code.equals("200")){ + this.uuid = MatcherUtil.match("window.QRLogin.uuid = \"(.*)\";", result); + return this.uuid; + } else { + logger.info("[*] 获取UUID错误,错误码: %s", code); + } + } + } + return null; + } + + public void showQrImage(String uuid) { + String uid = null != uuid ? uuid : this.uuid; + String url = "https://login.weixin.qq.com/qrcode/" + uid + "?t=webwx"; + final File output = new File("temp.jpg"); + + //下载二维码 + File qrImage = HttpClientUtil.doGetImage(url); + + //控制台显示二维码 + Map hintMap = new EnumMap(EncodeHintType.class); + hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + hintMap.put(EncodeHintType.MARGIN, 1); + hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); + + String qrContent = readQRCode(qrImage, hintMap); + QRCodeWriter qrCodeWriter = new QRCodeWriter(); + BitMatrix bitMatrix; + try { + bitMatrix = qrCodeWriter.encode(qrContent, BarcodeFormat.QR_CODE, 10, 10, hintMap); + System.out.println(toAscii(bitMatrix)); + } catch (WriterException e) { + e.printStackTrace(); + } + } + + public String loginState() { + + String url = "https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login"; + Map requestParam = new HashMap(); + requestParam.put("tip","1"); + requestParam.put("uuid",this.uuid); + String res = HttpClientUtil.doGet(url, requestParam); + + if(null == res){ + logger.info("[*] 扫描二维码验证失败"); + return ""; + } + + String code = MatcherUtil.match("window.code=(\\d+);", res); + if(null == code){ + logger.info("[*] 扫描二维码验证失败"); + return ""; + } else { + if(code.equals("201")){ + logger.info("[*] 成功扫描,请在手机上点击确认以登录"); + } else if(code.equals("200")){ + logger.info("[*] 正在登录..."); + String pm = MatcherUtil.match("window.redirect_uri=\"(\\S+?)\";", res); + String redirectHost = "wx.qq.com"; + try { + URL pmURL = new URL(pm); + redirectHost = pmURL.getHost(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + String pushServer = JSUtil.getPushServer(redirectHost); + webpush_url = "https://" + pushServer + "/cgi-bin/mmwebwx-bin"; + + this.redirect_uri = pm + "&fun=new"; + logger.info("[*] redirect_uri=%s", this.redirect_uri); + this.base_uri = this.redirect_uri.substring(0, this.redirect_uri.lastIndexOf("/")); + logger.info("[*] base_uri=%s", this.base_uri); + } else if(code.equals("408")){ + logger.info("[*] 登录超时"); + } else { + logger.info("[*] 扫描code=%s", code); + } + } + return code; + + } + + /** + * 读取二维码信息 + * + * @param filePath 文件路径 + * @param hintMap hintMap + * @return 二维码内容 + */ + private static String readQRCode(File filePath, Map hintMap) { + try { + BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer( + new BufferedImageLuminanceSource(ImageIO.read(new FileInputStream(filePath))))); + Result qrCodeResult = new MultiFormatReader().decode(binaryBitmap, hintMap); + return qrCodeResult.getText(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 将二维码输出为 ASCII + * + * @param bitMatrix + * @return + */ + private static String toAscii(BitMatrix bitMatrix) { + StringBuilder sb = new StringBuilder(); + for (int rows = 0; rows < bitMatrix.getHeight(); rows++) { + for (int cols = 0; cols < bitMatrix.getWidth(); cols++) { + boolean x = bitMatrix.get(rows, cols); + if (!x) { + // white + sb.append("\033[47m \033[0m"); + } else { + sb.append("\033[30m \033[0;39m"); + } + } + sb.append("\n"); + } + return sb.toString(); + } + + + public boolean loadContact() { + String url = this.base_uri + "/webwxgetcontact?pass_ticket=" + this.pass_ticket + "&skey=" + this.skey + "&r=" + DateKit.getCurrentUnixTime(); + + JSONObject body = new JSONObject(); + body.put("BaseRequest", BaseRequest); + + HttpRequest request = HttpRequest.post(url) + .header("Content-Type", "application/json;charset=utf-8") + .header("Cookie", this.cookie) + .send(body.toString()); + + logger.info("[*] " + request); + String res = request.body(); + request.disconnect(); + + if(StringKit.isBlank(res)){ + return false; + } + + try { + JSONObject jsonObject = JSON.parse(res).asObject(); + JSONObject BaseResponse = jsonObject.getJSONObject("BaseResponse"); + if(null != BaseResponse){ + int ret = BaseResponse.getInt("Ret", -1); + if(ret == 0){ + this.MemberList = jsonObject.getJSONArray("MemberList"); + this.ContactList = new JSONArray(); + if(null != MemberList){ + for(int i=0, len=MemberList.size(); i"); + logger.info("|" + name + "| " + peopleContent[0] + ":\n" + peopleContent[1].replace("
", "\n")); + } else { +// logger.info(name + ": " + content + ": " ); + String[] peopleContent = content.split(":
"); + logger.info("|" + name + "| " + peopleContent[0] + ":\n" + peopleContent[1].replace("
", "\n")); + logger.info("发送者:" + msg.getString("FromUserName")); + if(name.equals("wistbean和他的朋友们")){ + if(this.sendToGroup==null) + this.sendToGroup = msg.getString("FromUserName"); + } + + if (content.contains("wistbean的小三")){ + String sendMsg = getMsg(peopleContent[1].replace("
", "\n")); + sendMsg(sendMsg + "对了,真的别随便@我,我比较娇贵~", msg.getString("FromUserName")); + } + } + } else if(msgType == 3){ + //收到图片信息 + } else if(msgType == 34){ + //收到语音信息 + } else if(msgType == 42){ + //名片信息 + } + } + } + + /** + * 图灵机器人获取消息回复 + * @param content + * @return + */ + private String getMsg(String content) { + Map requestParam = new HashMap(); + requestParam.put("key","80a7ba9246814892ad0836b6561be745"); + requestParam.put("info",content); + String res = HttpClientUtil.doPost("http://www.tuling123.com/openapi/api",requestParam); + TuLin tuLin = new Gson().fromJson(res, TuLin.class); + return tuLin.getText(); + + } + + private String getUserRemarkName(String id) { + String name = "这个人物名字未知"; + for(int i=0, len=MemberList.size(); i sourceWidth || top + height > sourceHeight) { + throw new IllegalArgumentException("Crop rectangle does not fit within image data."); + } + + this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY); + + WritableRaster raster = this.image.getRaster(); + int[] buffer = new int[width]; + for (int y = top; y < top + height; y++) { + image.getRGB(left, y, width, 1, buffer, 0, sourceWidth); + for (int x = 0; x < width; x++) { + int pixel = buffer[x]; + + // The color of fully-transparent pixels is irrelevant. They are often, technically, fully-transparent + // black (0 alpha, and then 0 RGB). They are often used, of course as the "white" area in a + // barcode image. Force any such pixel to be white: + if ((pixel & 0xFF000000) == 0) { + pixel = 0xFFFFFFFF; + } + + // .299R + 0.587G + 0.114B (YUV/YIQ for PAL and NTSC), + // (306*R) >> 10 is approximately equal to R*0.299, and so on. + // 0x200 >> 10 is 0.5, it implements rounding. + buffer[x] = + (306 * ((pixel >> 16) & 0xFF) + + 601 * ((pixel >> 8) & 0xFF) + + 117 * (pixel & 0xFF) + + 0x200) >> 10; + } + raster.setPixels(left, y, width, 1, buffer); + } + + } + this.left = left; + this.top = top; + } + + @Override + public byte[] getRow(int y, byte[] row) { + if (y < 0 || y >= getHeight()) { + throw new IllegalArgumentException("Requested row is outside the image: " + y); + } + int width = getWidth(); + if (row == null || row.length < width) { + row = new byte[width]; + } + // The underlying raster of image consists of bytes with the luminance values + image.getRaster().getDataElements(left, top + y, width, 1, row); + return row; + } + + @Override + public byte[] getMatrix() { + int width = getWidth(); + int height = getHeight(); + int area = width * height; + byte[] matrix = new byte[area]; + // The underlying raster of image consists of area bytes with the luminance values + image.getRaster().getDataElements(left, top, width, height, matrix); + return matrix; + } + + @Override + public boolean isCropSupported() { + return true; + } + + @Override + public LuminanceSource crop(int left, int top, int width, int height) { + return new BufferedImageLuminanceSource(image, this.left + left, this.top + top, width, height); + } + + /** + * This is always true, since the image is a gray-scale image. + * + * @return true + */ + @Override + public boolean isRotateSupported() { + return true; + } + + @Override + public LuminanceSource rotateCounterClockwise() { + int sourceWidth = image.getWidth(); + int sourceHeight = image.getHeight(); + + // Rotate 90 degrees counterclockwise. + AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth); + + // Note width/height are flipped since we are rotating 90 degrees. + BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY); + + // Draw the original image into rotated, via transformation + Graphics2D g = rotatedImage.createGraphics(); + g.drawImage(image, transform, null); + g.dispose(); + + // Maintain the cropped region, but rotate it too. + int width = getWidth(); + return new BufferedImageLuminanceSource(rotatedImage, top, sourceWidth - (left + width), getHeight(), width); + } + + @Override + public LuminanceSource rotateCounterClockwise45() { + int width = getWidth(); + int height = getHeight(); + + int oldCenterX = left + width / 2; + int oldCenterY = top + height / 2; + + // Rotate 45 degrees counterclockwise. + AffineTransform transform = AffineTransform.getRotateInstance(MINUS_45_IN_RADIANS, oldCenterX, oldCenterY); + + int sourceDimension = Math.max(image.getWidth(), image.getHeight()); + BufferedImage rotatedImage = new BufferedImage(sourceDimension, sourceDimension, BufferedImage.TYPE_BYTE_GRAY); + + // Draw the original image into rotated, via transformation + Graphics2D g = rotatedImage.createGraphics(); + g.drawImage(image, transform, null); + g.dispose(); + + int halfDimension = Math.max(width, height) / 2; + int newLeft = Math.max(0, oldCenterX - halfDimension); + int newTop = Math.max(0, oldCenterY - halfDimension); + int newRight = Math.min(sourceDimension - 1, oldCenterX + halfDimension); + int newBottom = Math.min(sourceDimension - 1, oldCenterY + halfDimension); + + return new BufferedImageLuminanceSource(rotatedImage, newLeft, newTop, newRight - newLeft, newBottom - newTop); + } + +} diff --git a/src/main/java/util/CookieUtil.java b/src/main/java/util/CookieUtil.java new file mode 100644 index 0000000..1f780b1 --- /dev/null +++ b/src/main/java/util/CookieUtil.java @@ -0,0 +1,37 @@ +package util; + +import blade.kit.http.HttpRequest; + +import java.net.HttpURLConnection; +import java.util.List; +import java.util.Map; + +/** + * Created by wistbean on 2018/6/4. + */ +public class CookieUtil { + public static String getCookie(HttpRequest request) { + HttpURLConnection conn = request.getConnection(); + Map> resHeaders = conn.getHeaderFields(); + StringBuffer sBuffer = new StringBuffer(); + for (Map.Entry> entry : resHeaders.entrySet()) { + String name = entry.getKey(); + if (name == null) + continue; // http/1.1 line + List values = entry.getValue(); + if (name.equalsIgnoreCase("Set-Cookie")) { + for (String value : values) { + if (value == null) { + continue; + } + String cookie = value.substring(0, value.indexOf(";") + 1); + sBuffer.append(cookie); + } + } + } + if(sBuffer.length() > 0){ + return sBuffer.toString(); + } + return sBuffer.toString(); + } +} diff --git a/src/main/java/util/ExceptionUtil.java b/src/main/java/util/ExceptionUtil.java new file mode 100644 index 0000000..bc6459f --- /dev/null +++ b/src/main/java/util/ExceptionUtil.java @@ -0,0 +1,32 @@ +package util; + + +import blade.kit.logging.Logger; + +public final class ExceptionUtil { + private ExceptionUtil() {} + + public static void logStackTrace(Logger logger, Exception e) { + logger.error(getStackTrace(e)); + } + + public static String getStackTrace(Exception e) { + String message = e.getMessage(); + StringBuilder sb = new StringBuilder(); + + sb.append(e.getClass().getCanonicalName()); + sb.append(": "); + + if (!StringUtil.isEmpty(message)) { + sb.append(message); + } + + for (StackTraceElement element : e.getStackTrace()) { + sb.append("\n"); + sb.append("at "); + sb.append(element.toString()); + } + + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/util/FileUtil.java b/src/main/java/util/FileUtil.java new file mode 100644 index 0000000..525427f --- /dev/null +++ b/src/main/java/util/FileUtil.java @@ -0,0 +1,42 @@ +package util; + +import java.io.*; + +/** + * Created by wistbean on 2018/6/2. + * 文件工具类 + */ +public class FileUtil { + + public static File saveFile(InputStream inputStream, String fileName) { + + OutputStream outputStream = null; + File output = new File(fileName); + + try { + outputStream = new FileOutputStream(output); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, len); + } + outputStream.flush(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return output; + } +} diff --git a/src/main/java/util/HttpClientUtil.java b/src/main/java/util/HttpClientUtil.java new file mode 100644 index 0000000..6a78228 --- /dev/null +++ b/src/main/java/util/HttpClientUtil.java @@ -0,0 +1,184 @@ +package util; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Created by wistbean on 2018/5/30. + */ +public class HttpClientUtil { + + + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + public static String doGet(String url) { + return doGet(url, null); + } + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList,"utf-8"); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + public static String doPost(String url) { + return doPost(url, null); + } + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return resultString; + } + + public static File doGetImage(String url) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + InputStream inputStream = null; + File file = null; + + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + //得到实体 + HttpEntity entity = response.getEntity(); + inputStream = entity.getContent(); + file = FileUtil.saveFile(inputStream, "qrcode.png"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return file; + } + +} diff --git a/src/main/java/util/JSUtil.java b/src/main/java/util/JSUtil.java new file mode 100644 index 0000000..e102ac2 --- /dev/null +++ b/src/main/java/util/JSUtil.java @@ -0,0 +1,37 @@ +package util; + +import blade.kit.logging.Logger; +import blade.kit.logging.LoggerFactory; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +public class JSUtil { + private static final Logger LOGGER = LoggerFactory.getLogger(JSUtil.class); + + private static String eval(String script) { + ScriptEngineManager sem = new ScriptEngineManager(); + ScriptEngine se = sem.getEngineByName("javascript"); + String res = ""; + + try { + res = String.valueOf(se.eval(script)); + } catch (ScriptException e) { + e.printStackTrace(); + } + + return res; + } + + public static String getPushServer(String host) { + String pushServer = JSUtil.eval(" var e = '" + host + "',\n" + + " t = 'weixin.qq.com',\n" + + " o = 'file.wx.qq.com',\n" + + " n = 'webpush.weixin.qq.com';\n" + + " e.indexOf('wx2.qq.com') > -1 ? (t = 'weixin.qq.com', o = 'file2.wx.qq.com', n = 'webpush2.weixin.qq.com') : e.indexOf('qq.com') > -1 ? (t = 'weixin.qq.com', o = 'file.wx.qq.com', n = 'webpush.weixin.qq.com') : e.indexOf('web1.wechat.com') > -1 ? (t = 'wechat.com', o = 'file1.wechat.com', n = 'webpush1.wechat.com') : e.indexOf('web2.wechat.com') > -1 ? (t = 'wechat.com', o = 'file2.wechat.com', n = 'webpush2.wechat.com') : e.indexOf('wechat.com') > -1 ? (t = 'wechat.com', o = 'file.wechat.com', n = 'webpush.wechat.com') : e.indexOf('web1.wechatapp.com') > -1 ? (t = 'wechatapp.com', o = 'file1.wechatapp.com', n = 'webpush1.wechatapp.com') : (t = 'wechatapp.com', o = 'file.wechatapp.com', n = 'webpush.wechatapp.com');"); + + + return pushServer; + } +} diff --git a/src/main/java/util/MatcherUtil.java b/src/main/java/util/MatcherUtil.java new file mode 100644 index 0000000..89e0537 --- /dev/null +++ b/src/main/java/util/MatcherUtil.java @@ -0,0 +1,17 @@ +package util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class MatcherUtil { + + public static String match(String regex, String input){ + Pattern pattern = Pattern.compile(regex); + Matcher m = pattern.matcher(input); + if(m.find()){ + return m.group(1); + } + return null; + } + +} diff --git a/src/main/java/util/StringUtil.java b/src/main/java/util/StringUtil.java new file mode 100644 index 0000000..ae43c06 --- /dev/null +++ b/src/main/java/util/StringUtil.java @@ -0,0 +1,1061 @@ +package util; + + +import blade.kit.logging.Logger; +import blade.kit.logging.LoggerFactory; + +import java.io.*; +import java.math.BigDecimal; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.security.MessageDigest; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author: wistbean + * email:wistbean.bb@gmail.com + * date: 2017/12/23 + * desc: String工具类 + */ + +public final class StringUtil { + private static final Logger logger = LoggerFactory.getLogger(StringUtil.class); + + /* 随机字符串生成的方式(由字母和数字组成) */ + public static final int RANDOM_TYPE_NORMAL = 1; + /* 随机字符串生成的方式(全部由数字组成) */ + public static final int RANDOM_TYPE_ALNUM = 2; + /* 随机字符串生成的方式(全部由字母组成) */ + public static final int RANDOM_TYPE_ALPHA = 3; + + private StringUtil() {} + + /** + * 检查字符串是否为 null 或者空字符串 + * + * @param str + * @return + */ + public static boolean isEmpty(String str) { + return (str == null || "".equals(str)); + } + + /** + * 检查字符串是否全部由数字组成 + * + * @param str + * @return + */ + public static boolean isNumeric(String str) { + if (isEmpty(str)) { + return false; + } + return str.matches("^\\d+$"); + } + + /** + * 检测字符串是否正确的浮点数格式 + * + * @param str + * @return + */ + public static boolean isDecimal(String str) { + if (isEmpty(str)) { + return false; + } + + if (isNumeric(str)) { + return true; + } + + return str.matches("^\\d+\\.\\d+$"); + } + + /** + * 检测字符串是否正确的电子邮箱格式 + * + * @param str + * @return + */ + public static boolean isEmail(String str) { + if (isEmpty(str)) { + return false; + } + + return str.matches("^(?:[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+\\.)*[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\\-](?!\\.)){0,61}[a-zA-Z0-9_-]?\\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\\[(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\]))$"); + } + + /** + * 检测字符串是否正确的日期格式(yyyy-MM-dd) + * + * @param str + * @return + */ + public static boolean isDate(String str) { + if (isEmpty(str)) { + return false; + } + + if (!str.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) { + return false; + } + + String[] temp1 = str.split("-"); + + int[] temp2 = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + + int year = Integer.valueOf(temp1[0]); + + int month = Integer.valueOf(temp1[1]); + + int day = Integer.valueOf(temp1[2]); + + if (year < 1900 || month < 1 || month > 12 || day < 1 || day > 31) { + return false; + } + + if (day > temp2[month]) { + return false; + } + + boolean isLeapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); + + if (month == 2 && !isLeapYear && day > 28) { + return false; + } + + return true; + } + + /** + * 检测字符串是否正确的日期时间格式(yyyy-MM-dd HH:mm:ss) + * + * @param str + * @return + */ + public static boolean isDateTime(String str) { + if (isEmpty(str)) { + return false; + } + + if (!str.matches("^\\d{4}-\\d{1,2}-\\d{1,2}[\\x20\\t]+\\d{1,2}:\\d{1,2}:\\d{1,2}$")) { + return false; + } + + String[] temp1 = str.split("[\\x20\\t]+"); + + if (!isDate(temp1[0])) { + return false; + } + + String[] temp2 = temp1[1].split(":"); + + int hh = Integer.valueOf(temp2[0]); + + int mm = Integer.valueOf(temp2[1]); + + int ss = Integer.valueOf(temp2[2]); + + if (hh > 23) { + return false; + } + + if (mm > 59) { + return false; + } + + if (ss > 59) { + return false; + } + + return true; + } + + /** + * 转换成 Byte 类型 + * + * @param str + * @return + */ + public static Byte parseByte(String str) { + return Byte.valueOf(str); + } + + /** + * 转换成 Short 类型 + * + * @param str + * @return + */ + public static Short parseShort(String str) { + return Short.valueOf(str); + } + + /** + * 转换成 Integer 类型 + * + * @param str + * @return + */ + public static Integer parseInteger(String str) { + return Integer.valueOf(str); + } + + /** + * 转换成 Long 类型 + * + * @param str + * @return + */ + public static Long parseLong(String str) { + return Long.valueOf(str); + } + + /** + * 转换成 Float 类型 + * + * @param str + * @return + */ + public static Float parseFloat(String str) { + return Float.valueOf(str); + } + + /** + * 转换成 Double 类型 + * + * @param str + * @return + */ + public static Double parseDouble(String str) { + return Double.valueOf(str); + } + + /** + * 去除开头的空格或 tab + * + * @param str + * @return + */ + public static String ltrim(String str) { + return ltrim(str, "[\\x20\\t]*"); + } + + /** + * 去除开头的指定的字符串 + * + * @param str + * @param regex + * @return + */ + public static String ltrim(String str, String regex) { + if (isEmpty(str)) { + return ""; + } + + if (isEmpty(regex)) { + return str; + } + + return str.replaceAll("^" + regex, ""); + } + + /** + * 去除结尾的空格或 tab + * + * @param str + * @return + */ + public static String rtrim(String str) { + return rtrim(str, "[\\x20\\t]*"); + } + + /** + * 去除结尾的指定的字符串 + * + * @param str + * @param regex + * @return + */ + public static String rtrim(String str, String regex) { + if (isEmpty(str)) { + return ""; + } + + if (isEmpty(regex)) { + return str; + } + + return str.replaceAll(regex + "$", ""); + } + + /** + * 去除首尾的空格或 tab + * + * @param str + * @return + */ + public static String trim(String str) { + return trim(str, "[\\x20\\t]*"); + } + + /** + * 去除首尾的指定的字符串 + * + * @param str + * @param regex + * @return + */ + public static String trim(String str, String regex) { + if (isEmpty(str)) { + return ""; + } + + if (isEmpty(regex)) { + return str; + } + + str = ltrim(str, regex); + str = rtrim(str, regex); + + return str; + } + + /** + * 转换成 int + * + * @param str + * @return + */ + public static int toInt(String str) { + try { + return (new BigDecimal(str)).intValue(); + } catch (Exception e) { + return 0; + } + } + + /** + * 转换成 int + * + * @param str + * @return + */ + public static long toLong(String str) { + try { + return (new BigDecimal(str)).longValue(); + } catch (Exception e) { + return 0; + } + } + + /** + * 转换成 float + * + * @param str + * @return + */ + public static float toFloat(String str) { + try { + return (new BigDecimal(str)).floatValue(); + } catch (Exception e) { + return 0f; + } + } + + /** + * 将字符串转换成 Date 对象 + * + * @param str + * @return + */ + public static Date parseDate(String str) { + return parseDate(str, "yyyy-MM-dd HH:mm:ss"); + } + + /** + * 将字符串转换成 Date 对象 + * + * @param str + * @param pattern + * @return + */ + public static Date parseDate(String str, String pattern) { + if (isEmpty(str) || isEmpty(pattern)) { + return null; + } + + SimpleDateFormat df = new SimpleDateFormat(pattern); + + try { + return df.parse(str); + } catch (Exception e) { + ExceptionUtil.logStackTrace(logger, e); + return null; + } + } + + /** + * MD5 加密 + * + * @param str + * @return + */ + public static String md5(String str) { + if (isEmpty(str)) { + return ""; + } + + MessageDigest messageDigest; + byte[] bytes; + + try { + messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.reset(); + messageDigest.update(str.getBytes("UTF-8")); + + bytes = messageDigest.digest(); + } catch (Exception e) { + ExceptionUtil.logStackTrace(logger, e); + return ""; + } + + StringBuffer sb = new StringBuffer(); + + for (int i = 0; i < bytes.length; i++) { + if (Integer.toHexString(0xFF & bytes[i]).length() == 1) { + sb.append("0").append(Integer.toHexString(0xFF & bytes[i])); + } + else { + sb.append(Integer.toHexString(0xFF & bytes[i])); + } + } + + return sb.toString(); + } + + /** + * MD5 加密(加上干扰码) + * + * @param str + * @param salt + * @return + */ + public static String md5(String str, String salt) { + if (isEmpty(str)) { + return ""; + } + + if (isEmpty(salt)) { + return md5(md5(str)); + } + else { + return md5(md5(str) + salt); + } + } + + /** + * 生成随机字符串 + * + * @param len + * @return + */ + public static String getRandomString(int len) { + return getRandomString(len, RANDOM_TYPE_NORMAL); + } + + /** + * 按指定的方式生成随机字符串 + * + * @param len + * @param randomType + * @return + */ + public static String getRandomString(int len, int randomType) { + if (len < 1) { + return ""; + } + + String str; + + if (randomType == RANDOM_TYPE_ALNUM) { + str = "3456789987654334567899876543"; + } + else if (randomType == RANDOM_TYPE_ALPHA) { + str = "abcdefghjkmnpqrstuvwxyYXWVUTSRQPNMKJHGFEDCBAyxwvutsrqpnmkjhgfedcbaABCDEFGHJKMNPQRSTUVWXY"; + } + else { + str = "yxwvutsrqpnmkjhgfedcba3456789ABCDEFGHJKMNPQRSTUVWXY99876543ABCDEFGHJKMNPQRSTUVWXYabcdefghjkmnpqrstuvwxy"; + } + + Random rnd = new Random(); + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < len; i++) { + int index = rnd.nextInt(str.length()); + sb.append(str.charAt(index)); + } + + return sb.toString(); + } + + /** + * 从文件中读取 + * + * @param filePath + * @return + */ + public static String readFromFile(String filePath) { + return readFromFile(filePath, null); + } + + /** + * 从文件中读取 + * + * @param filePath + * @param encoding + * @return + */ + public static String readFromFile(String filePath, String encoding) { + if (isEmpty(filePath)) { + return ""; + } + + return readFromFile(new File(filePath), encoding); + } + + /** + * 从文件中读取 + * + * @param file + * @return + */ + public static String readFromFile(File file) { + return readFromFile(file, null); + } + + /** + * 从文件中读取 + * + * @param file + * @param encoding + * @return + */ + public static String readFromFile(File file, String encoding) { + try { + return readFromInputStream(new FileInputStream(file), encoding); + } catch (Exception e) { + ExceptionUtil.logStackTrace(logger, e); + return ""; + } + } + + /** + * 从字节数组中读取 + * + * @param bytes + * @return + */ + public static String readFromByteArray(byte[] bytes) { + return readFromByteArray(bytes, null); + } + + /** + * 从字节数组中读取 + * + * @param bytes + * @param encoding + * @return + */ + public static String readFromByteArray(byte[] bytes, String encoding) { + if (bytes == null || bytes.length == 0) { + return ""; + } + + ByteArrayInputStream in = new ByteArrayInputStream(bytes); + + return readFromInputStream(in, encoding); + } + + /** + * 从 InputStream 读取 + * + * @param in + * @return + */ + public static String readFromInputStream(InputStream in) { + return readFromInputStream(in, null); + } + + /** + * 从 InputStream 读取 + * + * @param in + * @param encoding + * @return + */ + public static String readFromInputStream(InputStream in, String encoding) { + BufferedReader reader = null; + + try { + StringBuffer sb = new StringBuffer(); + + char[] buf = new char[1024]; + + int count = 0; + + if (isEmpty(encoding) || !Charset.isSupported(encoding)) { + reader = new BufferedReader(new InputStreamReader(in)); + } + else { + reader = new BufferedReader(new InputStreamReader(in, encoding)); + } + + while ((count = reader.read(buf)) > 0) { + sb.append(buf, 0, count); + } + + return sb.toString(); + } catch (Exception e) { + ExceptionUtil.logStackTrace(logger, e); + return ""; + } finally { + try { + reader.close(); + } catch (Exception ex) { + //code + } + } + } + + /** + * 写入到文件 + * + * @param filePath + * @param str + * @return + */ + public static boolean writeToFile(String filePath, String str) { + if (isEmpty(filePath)) { + return false; + } + + return writeToFile(new File(filePath), str); + } + + /** + * 写入到文件 + * + * @param file + * @param str + * @return + */ + public static boolean writeToFile(File file, String str) { + if (file == null) { + return false; + } + + if (str == null) { + str = ""; + } + + BufferedWriter writer = null; + + try { + writer = new BufferedWriter(new FileWriter(file)); + + writer.write(str); + + return true; + } catch (Exception e) { + ExceptionUtil.logStackTrace(logger, e); + return false; + } finally { + try { + writer.close(); + } catch (Exception ex) { + //code + } + } + } + + /** + * 追加写入文件 + * + * @param filePath + * @param str + * @return + */ + public static boolean appendToFile(String filePath, String str) { + if (isEmpty(filePath) || isEmpty(str)) { + return false; + } + + return appendToFile(new File(filePath), str); + } + + /** + * 追加写入到文件 + * + * @param file + * @param str + * @return + */ + public static boolean appendToFile(File file, String str) { + if (file == null || isEmpty(str)) { + return false; + } + + RandomAccessFile raf = null; + + try { + if (!file.isFile() && !file.createNewFile()) { + return false; + } + + raf = new RandomAccessFile(file, "rw"); + raf.seek(file.length()); + raf.writeBytes(str); + + return true; + } catch (Exception e) { + ExceptionUtil.logStackTrace(logger, e); + return false; + } finally { + try { + raf.close(); + } catch (Exception ex) { + //code + } + } + } + + /** + * 格式化显示浮点数 + * + * @param number + * @param format + * @return + */ + public static String numberFormat(String number, String format) { + return numberFormat(Double.valueOf(number), format); + } + + /** + * 格式化显示浮点数 + * + * @param number + * @param format + * @return + */ + public static String numberFormat(Double number, String format) { + if (number == null || isEmpty(format)) { + return ""; + } + + DecimalFormat df = new DecimalFormat(format); + + return df.format(number); + } + + /** + * 从 classpath 路径读取 + * + * @param pathname + * @return + */ + public static String readFromClassPathResource(String pathname) { + BufferedReader reader = null; + + try { + reader = new BufferedReader(new InputStreamReader(StringUtil.class.getClassLoader().getResourceAsStream(pathname), "utf-8")); + + StringBuffer sb = new StringBuffer(); + + char[] cbuf = new char[1024]; + + int len = 0; + + while ((len = reader.read(cbuf)) > 0) { + sb.append(cbuf, 0, len); + } + + return sb.toString(); + } catch (Exception e) { + ExceptionUtil.logStackTrace(logger, e); + return ""; + } finally { + try { + reader.close(); + } catch (Exception ex) {} + } + } + + /** + * 检查是否匹配正则表达式 + * + * @param input + * @param regex + * @return + */ + public static boolean isMatch(String input, String regex) { + return isMatch(input, regex, false); + } + + /** + * 检查是否匹配正则表达式 + * + * @param input + * @param regex + * @param ignoreCase + * @return + */ + public static boolean isMatch(String input, String regex, boolean ignoreCase) { + if (isEmpty(input)) { + return false; + } + + if (isEmpty(regex)) { + return true; + } + + Pattern pattern; + + if (ignoreCase) { + pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); + } + else { + pattern = Pattern.compile(regex); + } + + return pattern.matcher(input).matches(); + } + + /** + * 正则表达式分组捕获 + * + * @param input + * @param regex + * @param ignoreCase + * @return + */ + public static List getMatches(String input, String regex, boolean ignoreCase) { + List matches = new ArrayList(); + + if (isEmpty(input) || isEmpty(regex)) { + return matches; + } + + Pattern pattern; + + if (ignoreCase) { + pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); + } + else { + pattern = Pattern.compile(regex); + } + + Matcher matcher = pattern.matcher(input); + + while (matcher.find()) { + int count = matcher.groupCount() + 1; + + String[] groups = new String[count]; + + for (int i = 0; i < count; i++) { + groups[i] = matcher.group(i); + } + + matches.add(groups); + } + + return matches; + } + + /** + * 删除 mysql 特殊字符 + * + * @param str + * @return + */ + public static String removeMySqlSpecialChars(String str) { + if (isEmpty(str)) { + return ""; + } + + str = str.replace("'", ""); + str = str.replace("\\", "/"); + + return str; + } + + + /** + * 字符串转化为数组 + * @param content + * @param separator + * @return + */ + public static String[] Str2Array(String content,String separator) { + if (isEmpty(separator)) { + return null; + } + + return content.split(separator); + + } + + + /** + * 检查是否国内的手机号码 + * + * @param mobileNumber + * @return + */ + public static boolean isNationalMobileNumber(String mobileNumber) { + if (isEmpty(mobileNumber)) { + return false; + } + + if (!isMatch(mobileNumber, "^[1-9][0-9]+$")) { + return false; + } + + if (mobileNumber.length() < 11) { + return false; + } + + return true; + } + + /** + * 手机号码加掩码 + * + * @param mobileNumber + * @return + */ + public static String maskMobileNumber(String mobileNumber) { + if (isEmpty(mobileNumber)) { + return ""; + } + + mobileNumber = trim(mobileNumber); + char[] numbers = mobileNumber.toCharArray(); + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < numbers.length; i++) { + if (i < 3) { + sb.append(numbers[i]); + continue; + } + + if (i <= (numbers.length - 5)) { + sb.append("*"); + continue; + } + + sb.append(numbers[i]); + } + + return sb.toString(); + } + + public static String maskEmailAddress(String emailAddress) { + if (isEmpty(emailAddress)) { + return ""; + } + + if (!isEmail(emailAddress)) { + return emailAddress; + } + + int n1 = emailAddress.indexOf('@'); + + String p1 = emailAddress.substring(0, n1); + String p2 = emailAddress.substring(n1); + char[] a1 = p1.toCharArray(); + StringBuilder sb = new StringBuilder(); + + if (a1.length <= 3) { + for (int i = 1; i <= a1.length; i++) { + sb.append("*"); + } + } + else { + for (int i = 0; i < a1.length; i++) { + if (i < 3) { + sb.append(a1[i]); + } + else { + sb.append("*"); + } + } + } + + sb.append(p2); + + return sb.toString(); + } + + public static String fractionalFormat(String str) { + return fractionalFormat(str, 2); + } + + public static String fractionalFormat(String str, int len) { + NumberFormat nf = NumberFormat.getInstance(); + + nf.setMinimumFractionDigits(len); + nf.setGroupingUsed(false); + + return nf.format((new BigDecimal(str)).floatValue()); + } + + public static String urlencode(String str) { + return urlencode(str, "utf-8"); + } + + public static String urlencode(String str, String enc) { + if (isEmpty(str)) { + return ""; + } + + if (isEmpty(enc)) { + enc = "utf-8"; + } + + try { + return URLEncoder.encode(str, enc); + } catch (UnsupportedEncodingException e) { + return ""; + } + } + + public static String urldecode(String str) { + return urldecode(str, "utf-8"); + } + + public static String urldecode(String str, String enc) { + if (isEmpty(str)) { + return ""; + } + + if (isEmpty(enc)) { + enc = "utf-8"; + } + + try { + return URLDecoder.decode(str, enc); + } catch (UnsupportedEncodingException e) { + return ""; + } + } +} \ No newline at end of file diff --git a/src/main/java/vo/TuLin.java b/src/main/java/vo/TuLin.java new file mode 100644 index 0000000..843561a --- /dev/null +++ b/src/main/java/vo/TuLin.java @@ -0,0 +1,31 @@ +package vo; + +/** + * Created by wistbean on 2018/6/5. + */ +public class TuLin { + + /** + * code : 100000 + * text : 老铁你好呀。 + */ + + private int code; + private String text; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } +} diff --git a/src/main/java/vo/Weather.java b/src/main/java/vo/Weather.java new file mode 100644 index 0000000..bd74fa9 --- /dev/null +++ b/src/main/java/vo/Weather.java @@ -0,0 +1,420 @@ +package vo; + +import java.util.List; + +/** + * Created by wistbean on 2018/6/4. + */ +public class Weather { + + + /** + * resultcode : 200 + * reason : successed! + * result : {"sk":{"temp":"25","wind_direction":"西北风","wind_strength":"2级","humidity":"97%","time":"22:53"},"today":{"temperature":"26℃~33℃","weather":"雷阵雨转中雨","weather_id":{"fa":"04","fb":"08"},"wind":"持续无风向微风","week":"星期一","city":"广州","date_y":"2018年06月04日","dressing_index":"炎热","dressing_advice":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。","uv_index":"弱","comfort_index":"","wash_index":"不宜","travel_index":"较不宜","exercise_index":"较不宜","drying_index":""},"future":[{"temperature":"26℃~33℃","weather":"雷阵雨转中雨","weather_id":{"fa":"04","fb":"08"},"wind":"持续无风向微风","week":"星期一","date":"20180604"},{"temperature":"25℃~32℃","weather":"中雨","weather_id":{"fa":"08","fb":"08"},"wind":"东北风3-5级","week":"星期二","date":"20180605"},{"temperature":"24℃~31℃","weather":"中雨转大雨","weather_id":{"fa":"08","fb":"09"},"wind":"东风3-5级","week":"星期三","date":"20180606"},{"temperature":"24℃~30℃","weather":"大雨转大雨-暴雨","weather_id":{"fa":"09","fb":"23"},"wind":"东风4-5级","week":"星期四","date":"20180607"},{"temperature":"24℃~29℃","weather":"大雨-暴雨","weather_id":{"fa":"23","fb":"23"},"wind":"东风4-5级","week":"星期五","date":"20180608"},{"temperature":"24℃~30℃","weather":"大雨转大雨-暴雨","weather_id":{"fa":"09","fb":"23"},"wind":"东风4-5级","week":"星期六","date":"20180609"},{"temperature":"24℃~30℃","weather":"大雨转大雨-暴雨","weather_id":{"fa":"09","fb":"23"},"wind":"东风4-5级","week":"星期日","date":"20180610"}]} + * error_code : 0 + */ + + private String resultcode; + private String reason; + /** + * sk : {"temp":"25","wind_direction":"西北风","wind_strength":"2级","humidity":"97%","time":"22:53"} + * today : {"temperature":"26℃~33℃","weather":"雷阵雨转中雨","weather_id":{"fa":"04","fb":"08"},"wind":"持续无风向微风","week":"星期一","city":"广州","date_y":"2018年06月04日","dressing_index":"炎热","dressing_advice":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。","uv_index":"弱","comfort_index":"","wash_index":"不宜","travel_index":"较不宜","exercise_index":"较不宜","drying_index":""} + * future : [{"temperature":"26℃~33℃","weather":"雷阵雨转中雨","weather_id":{"fa":"04","fb":"08"},"wind":"持续无风向微风","week":"星期一","date":"20180604"},{"temperature":"25℃~32℃","weather":"中雨","weather_id":{"fa":"08","fb":"08"},"wind":"东北风3-5级","week":"星期二","date":"20180605"},{"temperature":"24℃~31℃","weather":"中雨转大雨","weather_id":{"fa":"08","fb":"09"},"wind":"东风3-5级","week":"星期三","date":"20180606"},{"temperature":"24℃~30℃","weather":"大雨转大雨-暴雨","weather_id":{"fa":"09","fb":"23"},"wind":"东风4-5级","week":"星期四","date":"20180607"},{"temperature":"24℃~29℃","weather":"大雨-暴雨","weather_id":{"fa":"23","fb":"23"},"wind":"东风4-5级","week":"星期五","date":"20180608"},{"temperature":"24℃~30℃","weather":"大雨转大雨-暴雨","weather_id":{"fa":"09","fb":"23"},"wind":"东风4-5级","week":"星期六","date":"20180609"},{"temperature":"24℃~30℃","weather":"大雨转大雨-暴雨","weather_id":{"fa":"09","fb":"23"},"wind":"东风4-5级","week":"星期日","date":"20180610"}] + */ + + private ResultBean result; + private int error_code; + + public String getResultcode() { + return resultcode; + } + + public void setResultcode(String resultcode) { + this.resultcode = resultcode; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public ResultBean getResult() { + return result; + } + + public void setResult(ResultBean result) { + this.result = result; + } + + public int getError_code() { + return error_code; + } + + public void setError_code(int error_code) { + this.error_code = error_code; + } + + public static class ResultBean { + /** + * temp : 25 + * wind_direction : 西北风 + * wind_strength : 2级 + * humidity : 97% + * time : 22:53 + */ + + private SkBean sk; + /** + * temperature : 26℃~33℃ + * weather : 雷阵雨转中雨 + * weather_id : {"fa":"04","fb":"08"} + * wind : 持续无风向微风 + * week : 星期一 + * city : 广州 + * date_y : 2018年06月04日 + * dressing_index : 炎热 + * dressing_advice : 天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。 + * uv_index : 弱 + * comfort_index : + * wash_index : 不宜 + * travel_index : 较不宜 + * exercise_index : 较不宜 + * drying_index : + */ + + private TodayBean today; + /** + * temperature : 26℃~33℃ + * weather : 雷阵雨转中雨 + * weather_id : {"fa":"04","fb":"08"} + * wind : 持续无风向微风 + * week : 星期一 + * date : 20180604 + */ + + private List future; + + public SkBean getSk() { + return sk; + } + + public void setSk(SkBean sk) { + this.sk = sk; + } + + public TodayBean getToday() { + return today; + } + + public void setToday(TodayBean today) { + this.today = today; + } + + public List getFuture() { + return future; + } + + public void setFuture(List future) { + this.future = future; + } + + public static class SkBean { + private String temp; + private String wind_direction; + private String wind_strength; + private String humidity; + private String time; + + public String getTemp() { + return temp; + } + + public void setTemp(String temp) { + this.temp = temp; + } + + public String getWind_direction() { + return wind_direction; + } + + public void setWind_direction(String wind_direction) { + this.wind_direction = wind_direction; + } + + public String getWind_strength() { + return wind_strength; + } + + public void setWind_strength(String wind_strength) { + this.wind_strength = wind_strength; + } + + public String getHumidity() { + return humidity; + } + + public void setHumidity(String humidity) { + this.humidity = humidity; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + } + + public static class TodayBean { + private String temperature; + private String weather; + /** + * fa : 04 + * fb : 08 + */ + + private WeatherIdBean weather_id; + private String wind; + private String week; + private String city; + private String date_y; + private String dressing_index; + private String dressing_advice; + private String uv_index; + private String comfort_index; + private String wash_index; + private String travel_index; + private String exercise_index; + private String drying_index; + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getWeather() { + return weather; + } + + public void setWeather(String weather) { + this.weather = weather; + } + + public WeatherIdBean getWeather_id() { + return weather_id; + } + + public void setWeather_id(WeatherIdBean weather_id) { + this.weather_id = weather_id; + } + + public String getWind() { + return wind; + } + + public void setWind(String wind) { + this.wind = wind; + } + + public String getWeek() { + return week; + } + + public void setWeek(String week) { + this.week = week; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getDate_y() { + return date_y; + } + + public void setDate_y(String date_y) { + this.date_y = date_y; + } + + public String getDressing_index() { + return dressing_index; + } + + public void setDressing_index(String dressing_index) { + this.dressing_index = dressing_index; + } + + public String getDressing_advice() { + return dressing_advice; + } + + public void setDressing_advice(String dressing_advice) { + this.dressing_advice = dressing_advice; + } + + public String getUv_index() { + return uv_index; + } + + public void setUv_index(String uv_index) { + this.uv_index = uv_index; + } + + public String getComfort_index() { + return comfort_index; + } + + public void setComfort_index(String comfort_index) { + this.comfort_index = comfort_index; + } + + public String getWash_index() { + return wash_index; + } + + public void setWash_index(String wash_index) { + this.wash_index = wash_index; + } + + public String getTravel_index() { + return travel_index; + } + + public void setTravel_index(String travel_index) { + this.travel_index = travel_index; + } + + public String getExercise_index() { + return exercise_index; + } + + public void setExercise_index(String exercise_index) { + this.exercise_index = exercise_index; + } + + public String getDrying_index() { + return drying_index; + } + + public void setDrying_index(String drying_index) { + this.drying_index = drying_index; + } + + public static class WeatherIdBean { + private String fa; + private String fb; + + public String getFa() { + return fa; + } + + public void setFa(String fa) { + this.fa = fa; + } + + public String getFb() { + return fb; + } + + public void setFb(String fb) { + this.fb = fb; + } + } + } + + public static class FutureBean { + private String temperature; + private String weather; + /** + * fa : 04 + * fb : 08 + */ + + private WeatherIdBean weather_id; + private String wind; + private String week; + private String date; + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getWeather() { + return weather; + } + + public void setWeather(String weather) { + this.weather = weather; + } + + public WeatherIdBean getWeather_id() { + return weather_id; + } + + public void setWeather_id(WeatherIdBean weather_id) { + this.weather_id = weather_id; + } + + public String getWind() { + return wind; + } + + public void setWind(String wind) { + this.wind = wind; + } + + public String getWeek() { + return week; + } + + public void setWeek(String week) { + this.week = week; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public static class WeatherIdBean { + private String fa; + private String fb; + + public String getFa() { + return fa; + } + + public void setFa(String fa) { + this.fa = fa; + } + + public String getFb() { + return fb; + } + + public void setFb(String fb) { + this.fb = fb; + } + } + } + } +} diff --git a/target/classes/MainClass.class b/target/classes/MainClass.class new file mode 100644 index 0000000000000000000000000000000000000000..31972eeee803b118ddbd060e92d6e3fa71368565 GIT binary patch literal 3757 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 literal 0 HcmV?d00001 diff --git a/target/classes/WechatGroupRobotImpl.class b/target/classes/WechatGroupRobotImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..01ba407176cb4486a16c7c71278cfc228cb9df8a GIT binary patch literal 17738 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 A6aWAK literal 0 HcmV?d00001 diff --git a/target/classes/WechatGroupRobotInterface.class b/target/classes/WechatGroupRobotInterface.class new file mode 100644 index 0000000000000000000000000000000000000000..231a662736a358a7a5f62175c8f88a1fc4d89040 GIT binary patch literal 413 zcmZ`#O-}+b5Pe0U0*a_`@Z#0oi^Q`>jb;-+q8l{vR!S))YioA9B7e<;KfoVloUJ4t z#LK+AnV0uw=JV_Q1HcIe9Qz!72CkJKjgoVQeiUEL#j6-*!s=n_b7S=>L#LRz#a*5} z3#}Li(O*scz|hW|Ha7Lblc*60!$uT8(a2ciAC;U5Pi~nLlQU<%ki>YgwDP*pK}s&X zP<9gd(VCp~$=$_U6a0}a^-^EVAUezbZU8*(g FeFFuGWGVmv literal 0 HcmV?d00001 diff --git a/target/classes/WechatRobotJob.class b/target/classes/WechatRobotJob.class new file mode 100644 index 0000000000000000000000000000000000000000..141a1cd14c5f36db0b5fb9d291966a4835c771de GIT binary patch literal 2289 zcmai0>r>QL6#qpQk_{1c0hQWTtQNr{u?V7zXe%OO*GB=Nwzl?e_Oct?P1YofV4n*1 zVc#>Iaq5Roo#{Ar+7GtltW@mdbN`Nle)B)*^xSM@*|JXa;hy}?J?Gr>yvbkx-2ENE z^Y~K57W9R22>l8Us~Er$6)z#C;HZjYI4zSS}Oi&M=Foi4%$021}1H#}qhVhP;&NN?08mT2{NDLM$RL}&CM~}N$Tfv%<(ShwA<(Jn6}kxTOObEy2ZJ*hMm!q zww+9KU9j|iT0}hOIrCE7k)XvUY<;wVXrt1z6KqOGT7o*r-CWu`z!_Q61}uv^y=msU z+?A1$5FQqih22d{jBF{YZCMl%-e%k+8SR@ic-EtIkrlG54%s=!;D=06l-km~w~4?s zG-0a@TSFG-By8LsJP&S7&)>cA_uSn4mFtgqL}fS{TzE2a8YXaF!s(RfWuv-2(Ken- z@ixQKgV=S`O7O}3W44oFUQc_IVR};*%kZB0U;miD^KH{vKGhRvi9HEp=Z>+?T|Cj1 z*we*2S$u4FM|>CSV7#+k#-xTRT#!&#F4GiWF}oVx!rL0&!MhsX!}}7}{kL!ja%MWg zDS(T(q+uE}l(qZUW;9&JB}(|h>`e;!;k|1bJ`fD8v9)pj`+^3SI^AG<+oV zKNeVCxPA4(Z#P;sTq(e-mltMd34S7Ac;TBL?$1p>ymwKWk4XX#=WSS$?rSXf#SqEe_RUyOcOEH064nda%OIksI}e2{3K_ z1hv0ML%>;vIecnlEsvYa z+MH*m^~2P5y=jwM-bsQqSqZzJlebOfPF?PZ1ZB*zGe`V6?kc0RM8zM=?v^E-LWL*? zVRE`KkP;fm<+6n!Ifdl>X%#ozW5kN}A_bWgMmeV|w~pkCy|H)&Rk3WATL}r<%Q(MW zBk29Waxcvy^_OspXR_R3Ue2MUtNx+E%@rYVkghVgPx0)6-&AFnoF2CQ;!~6Y9TgYX)-q8n54&Xqo3NQakP@Dy zujLA&bbZmFz=v^xa;5oDsqTHd4jF7T)5Eb+_1%CPk zDHSFx3MXYXNobl zp_+WJp$Jw{jH?mB8f>7o8MSCf9pb3R4A$a0*5OC2_j55=h&RXuMNSFaK{?Uz9sP#1 zQ(hvthMnl3%xu6{=)^9B$l?sTup5;maRGaAZDfX?38XB z(ylr^;<8a-=#G8QQ#BHGeB-%%mO%N_y5OUhozn%w=Ge4; zMb{((En!dqAFl0EY;&%Vk!`y{S>4QN31J&%MjkUVlj3LA9_o%s zTq_8kBL=M^9k#Z@pkZlei9SIjay>^R_PBNH-6Y$*49c367i^?n3bo2_y|x(IGF*(C z1)-ZM62XRG=yMwM>iIl3(+rVM6=^Fvek0&D2kL?0aero3Qsk=O>aR literal 0 HcmV?d00001 diff --git a/target/classes/util/BufferedImageLuminanceSource.class b/target/classes/util/BufferedImageLuminanceSource.class new file mode 100644 index 0000000000000000000000000000000000000000..6c0ac490203f14681d1d6ba4a637baca6bb4708a GIT binary patch literal 4098 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 Q8j!*zO2fw*MZXsP7n-*dC;$Ke literal 0 HcmV?d00001 diff --git a/target/classes/util/ExceptionUtil.class b/target/classes/util/ExceptionUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..4ec733a2dd120c452ca0b6d48ece2607c59d8d98 GIT binary patch literal 1431 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 HM62(=IUf|& literal 0 HcmV?d00001 diff --git a/target/classes/util/JSUtil.class b/target/classes/util/JSUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..936e317125c1636353640174c2506d12a9b84fe0 GIT binary patch literal 2417 zcmb7GYgZdp6x}xjGEAlorW8tB+X1yCJQ6^B5lR&Vw1%WM6s?aBli>nGLy}G=kp3D! z`n4|CqG;Fh2lyNOEiU)X5ST!sb+U3_=iI&bIWu$a{Q39qe*l=pk2*#$AHfGYLYUX^ zq3S=<@NpEMU_nO)ixJ${(T}AF9_WZFr%zS?nTBNzD;hr6u&QBAt*z@A!WR*IspBEO z>gOaI!G=IzHov~U`dHv*wpg;ZW%`-prAw9FU8lU8&a#(ohF*(K+3}VHdJ@Skf$&OY zTMERoPFd#a2Sw>_TE!Aq;@OIAm9{L`QS;Nqu(#*b1g>Q3o>NLcEIeUH%&F=O&$o0 zbp$ChV!2_JEkEK=jdZuVdy=cil`5=V={>5~_6pKHlrF>CtJFLJy&7247VXk$0`)?r z?%HzAQR#~M$w(=w25#eR0aJ}H1{l;vXyxL^X&{HZ03vu~;2nG&!D9mjYzo}&gwslt zfhUS=ceGJ(aK`W zs(4$^nTo5m9soR*d2R{fT`(py2EN5p_42;U*Dg>YBlyn1_xQoUP23U~IDc33#eHeB z#Kc&6R-2_^`9;n;U_D89t)(3+3TxO%r!vvR{O`)_>mW!#n_s{MBCPFoncum9a=N8s zeUDXH`@Mo^+0Qmz%Vs!zOrb1q3ru&7t3&moAkC|^gbXG+lHKig*sWQ%S8-nm^fSBu z`FDYTrDWA=JfgZGWH8Fpb%bX)4^?&ZI0|#j^3L`SXKD5<+UT8l1@Q|9A>3u#*Id+L za%}hxgc{>aSC0o*)aIY)-OE1t8lk7J(372vhmX;_5%0@QP5g#P2q(~TKSN&#kIbz^)nsquxx#H64}fd}8F%g_#Kck8%I{44$o zcqzsQe}F&AcxKxK;&zkXnS0LMGw0sUpTEC;19**=2NyLDkMP)rCmx<+!-i)rHeGB9 zl;7z{C+`J{^~Q;Svmc)-foexb>M$MklsS^UA(5p{9LnK|G}`7f&`AdRo8{6(4}$}l zgac)cxo-=UMm80ATko993mFV$)DOCe(NVvhM;dvE5=QmacdMUMAgQBqnh3aKnIy_Y z0_)RbnU}0G_&lZPMvUh1Gson;Zk(D>ebBbo#ao@cvRC`KgNlo7A3J#N;{{&2sQYN3 z>0=jrtoVNbgl;^4>Yb~QR#!79?~hG{@o1dg-I_D5*>LiOH11|&Rz~2>?aKXuG+p&I zRZ*zg`TCp2bDm}tpTe1rPP2FMh12evI2{YD)IZMotFVbOADaCN5O!FM94 zLtJI_0%JJ?%ka7Prw4Es_n1{s#Uc?~Y$)b%tu=q5aIm*KLGiFPf%5~EmNP-=Qe2WP yz$!jOiLt`yF<-zEb=Rn9Z)i?caG$9CYIwjMd%_Bq`LhaDDy*VNbd4tpSpNr&{=z8$ literal 0 HcmV?d00001 diff --git a/target/classes/util/StringUtil.class b/target/classes/util/StringUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..36061554db76aaaaf13fa069ab809d27905f8b41 GIT binary patch literal 15704 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 QbI!-^8N|F6V~W@P9}_naRsaA1 literal 0 HcmV?d00001 diff --git a/target/classes/vo/TuLin.class b/target/classes/vo/TuLin.class new file mode 100644 index 0000000000000000000000000000000000000000..c6e7b8a11c1a626c2c401877fb69944cfa47f1a0 GIT binary patch literal 695 zcmZ{gO;5r=5Qg7{(n6{7A)tu(aVwbEc-C++F(GO60O4M0gG;bY%0m269yF1dc<=}K zql~i)gb0`>voq6q-+6Ywe?GqeT;kM33bhP09LZ2OaBSd&LGz=BfPu9s6~VJ$D7r&$ z>Nz7X95@{j^Kfv*pkMQlixxxDZuDsMMyYZx4}-hOQ$L8iUVlVBMK|)jQO}FHtQSp9 zJn}Jv=}sf3J0T4j8iPR0O~{d!8{=iI*=@N(4s;bz$!=^zl8X62+1~swEzC|diT&V~ zOEOb!zL0mbU?OWlhhZU&3`2Se#*klK{=Pp9e1S81t`xmtf(mX2F~}n_jk@^9-r5DLwn zxD<6;IGy^j?^;f0M`c=s?5^cl{vIJ+T|Xsc4*F-3FwwLec@$i{ypjPKG5Y=2)0hhQE$j&u)f;dzqNE1Yfwe&EU|J@!KizboCtv&i3S zUiRyQSS3EE68BVIbuhZtk$!{cnyRiRO{RHKx>$XiRa1uTJbYNk+Boh9Zd*1iHK{qc ztfp3GA_v1n7P^TM=!DwGSPA)f^WR!M+4gm;5{ik(5SA0;FIK^@aS6)&(i%U1ia%xy zEyiT6ffPE+QTFPrNkupAK-XcJ$ug^g^b=!jn^6JAQDl!$!Zgd*%{NG04K@EtY@WgF zpm{H3Xi!a?d>%r0@U$ literal 0 HcmV?d00001 diff --git a/target/classes/vo/Weather$ResultBean$FutureBean.class b/target/classes/vo/Weather$ResultBean$FutureBean.class new file mode 100644 index 0000000000000000000000000000000000000000..96705dab3076ce283b1a55e264409c4a3586cbeb GIT binary patch literal 1850 zcmb7@TTc@~6vzM5+tRY-CdIn~R&9&6K)s7RfFU6v8in8^*|w9iP_|~fr4O3;potF} zKZ_jqt4@|lGtf$R(E1iR8-Z-nl{ zfjoFAeTSU{CN}n*L#NVmyk=!H@LjJ->8)NELdl}lj@uBJ-#BbnqHOs-LB3xwf20;= zO7vWhA`?9+_enLJfNG|eT+a=b1>%L`Hd$BO4YH1IxSo8{J*Y{4%c->#Tf6SGwjJN) zePm1oyDoJ(dn^l8A8E>9>)&oC3q@1EBOT2zSNPwJQ8Sb>r)pQu?aQl%45 zE8EYgl2i*P&B2fsqo}c4oG)A{JiY^EQ@6o>kJW{+EnHod^c~`hayw5lL+K!%At65D z0`2Y42^VpRb^@0%O_CE-NQVi&BKDaKF>rzu8^w+>cm}gk@G^N*A*4!k-w@Nw*O3$r zm0>FMipq0#?wJc;F@nT(kfsqNZw86$Ao~Q;8UVsWXOOG7MpB#(NH73|Z=FGk#)%|#ke(5wWS&S;2YE#xuLpqevty7sBS=aId1C~*VFpR*Aa4oe z-2f1N_Y88=2x93V?~Nd3Gl->wd?1jI13>uW33|d6^*!e4H-TPCoPOB@4AVCrqE(jk J2(3nu{sV_ZFr@$h literal 0 HcmV?d00001 diff --git a/target/classes/vo/Weather$ResultBean$SkBean.class b/target/classes/vo/Weather$ResultBean$SkBean.class new file mode 100644 index 0000000000000000000000000000000000000000..728786346aa96508798766c2ccdcf730da6a9332 GIT binary patch literal 1439 zcmaKqJ#Q015Qg9N*ZJd;*d`8NArLTNI}j5nK`DrYK(auJqohPZW8XP&>V3!U)|-K+-0oF@`3K7F-0dh&wgWYE1?IHi2cC4h zK~Esv8x2%P1rPZ@Y9Iwt*OaS*O@Vl&x=ZTTutVxXL%H(yXwZ`0j??OsQfv&{PJh?& z6yGOeBIqgK!iGS0Tl%AZa9ui7)xPDr(%b4gzAt?$(Y!a-R~iSy`kr)xp7hFLLV5h1 z_^qxCc657-m8z*h%by06D*t}x1`70xy~q>_loi$T)3|Ur`Ds`vh3J<& z7AP5$=ruwetF%06TCgNyT%Ara2GE`uv?mPhiG+L(v;fGHEzqq_UXV}LzCnD}VMVej zEk42_I@{v_EaE8L1dic2*}s#&AoeMe{MeYhj1!aOO(KnPsoL6C#KO{9tv;cSp6Wj= zjiV;z8IAj7>J=kMJPPv62y)U45|4sBCy*C2KzPs$a>@vjh=RN{f~=ZB5>b#>1oC6y&`T=^f+G0B z58#KAotp%MUG`!G&hxqVcg`gbk9YR~K4H~_jt_Ncm{;PXfdvDLgvzlXG@Mg$E^J=} z1A9M-ykM}cGA^O^*$cd6hfr;=9TK!o*q4L}#|z}o;h8I=1L67{X*gj|_=h6$l%EH+ zIQ*~I=+Zw$?0W6{UGd%i!3{SBt>!}qi#R*ZRb3+^H{4m zruEd)de*?;`amXoJk?Blt!yqm&eF~H-&r+d+Rme=b*#<(a2WOEo~P!t^2@f=!YtHb zTByOWFb0FL`Cq7n$ztul+*8?046G2ErKb?)OXI~N7`3Rt0>84(Pha7W2~&$9S?l19 z!({n_J)1SD==v?_DlM~E)>M$TG0wJ?72qYB>=9=1iskd>Yg8^rns-Z^U*k>Qypyu= zRqGo!s1#S590z@cPT$fKW|hxC+4ag&^C;@MQjqE>$oEo^x8)$!Q4ohge*6POEtLNh cyh}%ak15u3sA2+3nB*ll*qUaou{DGGAHPGOzW@LL literal 0 HcmV?d00001 diff --git a/target/classes/vo/Weather$ResultBean$TodayBean.class b/target/classes/vo/Weather$ResultBean$TodayBean.class new file mode 100644 index 0000000000000000000000000000000000000000..ec9b035e92be403165a791537e5b6b5f5b7ddd3a GIT binary patch literal 3685 zcmb7{&u?2r5XWZ||A_79Uuja>P)Gv-ob-pAwm?ftfI2M%LJLir@;kiP+vKH=jh>&K z=8r-G353)GCk}u(fW!eL4j^#=i33O+KthQ5uI<=f=BeuCJG=8{XFoe{yf69k-#ecY z(Hz}M(kNX|P@dKxHz2P;UWdE^c@y#$(#&S>4MC@LcvjB=^nuJ{(jQ~TXCYuu2G8JDp8ocE?N9o&&vilCV((=lTH_~i%AEwLoott$(=+2Y7Zey!E zaRT3M>1ubH(YLi<_8PkDa4P;@-$t7oLdBUsq zC+Xf3^Rni6r+a-}>0UyU<8R?Ieu0eY_=Q+ST0lWz7{ma>zije z%j!T^W;w~A2j{wEwJOeK`;cpKpo5WX(34!LH~q4{?4fa;PG6kFuiK$nI_A(}nsDfT z$Ps$Lp$9RVgdBxTK^}rU44H;J0(lhj7^DE1p$SEkcj+uex!$#Mbz@tXgE(y~8W-0o zIwAVQE*9?mUOa>6`JN@p(h!cwqamEqSU#w+d{$%mxW@8{jpaid%jY(hk8UiV-dHYx zv0MXVxeUf~C5+`_u$?4@3bP*P*%`KqZFKe%QXiVI6Rb(bB6^=9YMxH=$Y}>rkxubU z@%Q31D-smhwiA3rLm#kXh>##=oS%t{&(PV<;suVzMzPsrAJdS%{pS>=FHDAm?WoT7 z$d1}!nN!cKd z2=amqlCnW^43ZB4!6gomB@x82LB>Ro7iAE~206qaheJT{6#>XgB1qZ>IU<5A%OGhR z`1u I9vz~@f9nw_oB#j- literal 0 HcmV?d00001 diff --git a/target/classes/vo/Weather$ResultBean.class b/target/classes/vo/Weather$ResultBean.class new file mode 100644 index 0000000000000000000000000000000000000000..d885548a29cfe66d44bc6a10ac13b8f78b507c53 GIT binary patch literal 1582 zcma)5T~8B16g{(Tw`^SnL5m+K6soqMR0KfS(^Ya&gIXo-CM9o4D4`rB>;ZYt7c|2AqymP}& zD|+ENzJmSI_uXKv<%FRd=CR1_^-k0YT-nZJNx|A^?>I;L_lbhpIMA6!c%X2*e%P+P zcb#b84az;P_d+sdXZ+RjYep#67Fw?fH%fQ&>oB zuk_*WHL|=a^edk4MXL&#N_A5qyVl+z*+MQtAUH9ZH?e5*2 zm8NWr;+l;?4B5DhVH+d3lE+hptErcm_b|4i<@kHG*IP|@JL2)CLd(6YrZAokIWb*f zEFE$DvI@Ozl=yN@zUd4M5zd(*+T%$1p!j%RM4of@$MHH><{1@ZZu$q**BEkxV}a?w zb7a+9+~myGAdKM_|M;FU&QSf3Fxre4885;53!g`Na{K_vp=3W=kx6R`TOfPfL-iX;h^E7f+mL+hbJ7KI%qrSICv&d z{ix#cD0!n~DByL&Q0c>wjAIqkH*LNRqR&cTp?5AXWM?G9Vdp5(K{(tOsAwhQh$?Br zG6E~Ti>Py=WOAnT_C%X_n^SDh#6Gnmg$y0vlpQ{1ATYd6<>e;YC{m;336)N9;UEyAWgpn_2Odj@WsS=LE7h1B73hLAJ1608;*%dzu%8Adj$f j4P@;S + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file