From b7192be0ac5c91b627195c2a71a97b3a9ada65e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 3 Jun 2019 17:59:21 +0000 Subject: [PATCH 01/27] Bump concat-stream from 1.4.10 to 1.4.11 in /utils/google-slides Bumps [concat-stream](https://github.com/maxogden/concat-stream) from 1.4.10 to 1.4.11. - [Release notes](https://github.com/maxogden/concat-stream/releases) - [Commits](https://github.com/maxogden/concat-stream/compare/v1.4.10...v1.4.11) --- utils/google-slides/yarn.lock | 39 ++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/utils/google-slides/yarn.lock b/utils/google-slides/yarn.lock index 00309c3f..797b320b 100644 --- a/utils/google-slides/yarn.lock +++ b/utils/google-slides/yarn.lock @@ -1,5 +1,7 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 + + abbrev@1: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" @@ -83,7 +85,7 @@ babel-runtime@^6.9.1: core-js "^2.4.0" regenerator-runtime "^0.10.0" -base64url@^2.0.0, base64url@2.0.0: +base64url@2.0.0, base64url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" @@ -130,7 +132,7 @@ boom@2.x.x: dependencies: hoek "2.x.x" -buffer-equal-constant-time@^1.0.1, buffer-equal-constant-time@1.0.1: +buffer-equal-constant-time@1.0.1, buffer-equal-constant-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" @@ -180,8 +182,8 @@ commander@^2.9.0: graceful-readlink ">= 1.0.0" concat-stream@~1.4.7: - version "1.4.10" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.10.tgz#acc3bbf5602cb8cc980c6ac840fa7d8603e3ef36" + version "1.4.11" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.11.tgz#1dc9f666f2621da9c618b1e7f8f3b2ff70b5f76f" dependencies: inherits "~2.0.1" readable-stream "~1.1.9" @@ -216,7 +218,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@^2.2.0, debug@2: +debug@2, debug@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/debug/-/debug-2.5.1.tgz#9107bb4a506052ec2a02314bc606313ed2b921c1" dependencies: @@ -232,7 +234,7 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" -ecdsa-sig-formatter@^1.0.0, ecdsa-sig-formatter@1.0.9: +ecdsa-sig-formatter@1.0.9, ecdsa-sig-formatter@^1.0.0: version "1.0.9" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" dependencies: @@ -438,14 +440,14 @@ is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -668,14 +670,14 @@ mime@^1.2.11: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" -minimist@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" +minimist@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -947,10 +949,6 @@ stream-parser@~0.3.1: dependencies: debug "2" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - string-template@~0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -959,6 +957,10 @@ string-template@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/string-template/-/string-template-1.0.0.tgz#9e9f2233dc00f218718ec379a28a5673ecca8b96" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -1020,4 +1022,3 @@ verror@1.3.6: xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - From 0c7f42e3314a2000c2974f263a5eb5ef5be34a6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 4 Jun 2019 04:01:18 +0000 Subject: [PATCH 02/27] Bump sshpk from 1.10.1 to 1.16.1 in /utils/google-slides Bumps [sshpk](https://github.com/joyent/node-sshpk) from 1.10.1 to 1.16.1. - [Release notes](https://github.com/joyent/node-sshpk/releases) - [Commits](https://github.com/joyent/node-sshpk/commits/v1.16.1) --- utils/google-slides/yarn.lock | 44 +++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/utils/google-slides/yarn.lock b/utils/google-slides/yarn.lock index 797b320b..66a96e2c 100644 --- a/utils/google-slides/yarn.lock +++ b/utils/google-slides/yarn.lock @@ -33,8 +33,10 @@ asap@~2.0.3: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + dependencies: + safer-buffer "~2.1.0" assert-plus@^0.2.0: version "0.2.0" @@ -101,8 +103,8 @@ base64url@~1.0.4: meow "~2.0.0" bcrypt-pbkdf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" dependencies: tweetnacl "^0.14.3" @@ -229,10 +231,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" ecdsa-sig-formatter@1.0.9, ecdsa-sig-formatter@^1.0.0: version "1.0.9" @@ -309,8 +312,8 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" dependencies: assert-plus "^1.0.0" @@ -456,15 +459,9 @@ jju@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.3.0.tgz#dadd9ef01924bc728b03f2f7979bdbd62f7a2aaa" -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" - jsbn@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" json-parse-helpfulerror@^1.0.3: version "1.0.3" @@ -893,6 +890,10 @@ safe-buffer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -923,18 +924,17 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" steno@^0.4.1: From 44bb0c1741e0d7348061f4aa9f92fa7104f43e37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 4 Jun 2019 04:01:25 +0000 Subject: [PATCH 03/27] Bump sshpk from 1.10.2 to 1.16.1 in /FE/webpack/webpack_v1 Bumps [sshpk](https://github.com/joyent/node-sshpk) from 1.10.2 to 1.16.1. - [Release notes](https://github.com/joyent/node-sshpk/releases) - [Commits](https://github.com/joyent/node-sshpk/compare/v1.10.2...v1.16.1) --- FE/webpack/webpack_v1/yarn.lock | 137 ++++++++++++++++---------------- 1 file changed, 69 insertions(+), 68 deletions(-) diff --git a/FE/webpack/webpack_v1/yarn.lock b/FE/webpack/webpack_v1/yarn.lock index 64a5e6fa..61efec69 100644 --- a/FE/webpack/webpack_v1/yarn.lock +++ b/FE/webpack/webpack_v1/yarn.lock @@ -1,5 +1,7 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 + + abbrev@1: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" @@ -94,8 +96,10 @@ asap@~2.0.3: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + dependencies: + safer-buffer "~2.1.0" assert-plus@^0.2.0: version "0.2.0" @@ -689,8 +693,8 @@ batch@0.5.3: resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" bcrypt-pbkdf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" dependencies: tweetnacl "^0.14.3" @@ -1229,10 +1233,11 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" ee-first@1.1.1: version "1.1.1" @@ -1568,8 +1573,8 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" dependencies: assert-plus "^1.0.0" @@ -1767,7 +1772,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2, inherits@2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -1920,7 +1925,7 @@ is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" -isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -1945,12 +1950,6 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" - jquery: version "3.1.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.1.1.tgz#347c1c21c7e004115e0a4da32cece041fad3c8a3" @@ -1985,8 +1984,8 @@ js-yaml@~3.6.1: esprima "^2.6.0" jsbn@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" jsesc@^1.3.0: version "1.3.0" @@ -2050,7 +2049,7 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-utils@^0.2.11, loader-utils@^0.2.15, loader-utils@^0.2.16, loader-utils@^0.2.3, loader-utils@^0.2.7, loader-utils@~0.2.2, loader-utils@~0.2.5, loader-utils@0.2.x: +loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.15, loader-utils@^0.2.16, loader-utils@^0.2.3, loader-utils@^0.2.7, loader-utils@~0.2.2, loader-utils@~0.2.5: version "0.2.16" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" dependencies: @@ -2276,20 +2275,24 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: dependencies: mime-db "~1.26.0" -mime@^1.3.4, mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - mime@1.2.x: version "1.2.11" resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" +mime@1.3.4, mime@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: brace-expansion "^1.0.0" +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -2298,11 +2301,7 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -2414,7 +2413,7 @@ node-sass: sass-graph "^2.1.1" stdout-stream "^1.4.0" -nopt@~3.0.6, "nopt@2 || 3": +"nopt@2 || 3", nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -2446,7 +2445,7 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" -npmlog@^4.0.0, npmlog@^4.0.1, "npmlog@0 || 1 || 2 || 3 || 4": +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" dependencies: @@ -2932,26 +2931,26 @@ pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + q@^1.1.2: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" -qs@~6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" - qs@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" +qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + query-string@^4.1.0, query-string@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.1.tgz#54baada6713eafc92be75c47a731f2ebd09cd11d" @@ -3178,7 +3177,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@^2.61.0, request@^2.79.0, request@2: +request@2, request@^2.61.0, request@^2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -3257,7 +3256,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@~2.5.1, rimraf@~2.5.4, rimraf@2: +rimraf@2, rimraf@~2.5.1, rimraf@~2.5.4: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: @@ -3267,6 +3266,10 @@ ripemd160@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + sass-graph@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.1.2.tgz#965104be23e8103cb7e5f710df65935b317da57b" @@ -3287,7 +3290,7 @@ sax@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" -semver@^5.3.0, semver@~5.3.0, "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5": +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.3.0, semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -3419,7 +3422,7 @@ source-map-url@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" -source-map@^0.1.38, source-map@^0.1.43, source-map@0.1.x: +source-map@0.1.x, source-map@^0.1.38, source-map@^0.1.43: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" dependencies: @@ -3454,18 +3457,17 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.2.tgz#d5a804ce22695515638e798dbe23273de070a5fa" + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" "statuses@>= 1.3.1 < 2", statuses@~1.3.0: @@ -3503,10 +3505,6 @@ strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" -string_decoder@^0.10.25, string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -3515,6 +3513,10 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -3699,16 +3701,16 @@ url-loader: loader-utils "0.2.x" mime "1.2.x" -url-parse@^1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.7.tgz#025cff999653a459ab34232147d89514cc87d74a" +url-parse@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" dependencies: querystringify "0.0.x" requires-port "1.0.x" -url-parse@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" +url-parse@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.7.tgz#025cff999653a459ab34232147d89514cc87d74a" dependencies: querystringify "0.0.x" requires-port "1.0.x" @@ -3724,7 +3726,7 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -util@^0.10.3, util@0.10.3: +util@0.10.3, util@^0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" dependencies: @@ -3866,7 +3868,7 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@^1.2.9, which@1: +which@1, which@^1.2.9: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" dependencies: @@ -3878,22 +3880,22 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.1" -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -3951,4 +3953,3 @@ yargs@~3.10.0: cliui "^2.1.0" decamelize "^1.0.0" window-size "0.1.0" - From 4d4d5475b8f2fad4d7e0e65d9377c23aac3a6027 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 4 Jun 2019 05:43:54 +0000 Subject: [PATCH 04/27] Bump fstream from 1.0.10 to 1.0.12 in /FE/webpack/webpack_v1 Bumps [fstream](https://github.com/npm/fstream) from 1.0.10 to 1.0.12. - [Release notes](https://github.com/npm/fstream/releases) - [Commits](https://github.com/npm/fstream/compare/v1.0.10...v1.0.12) --- FE/webpack/webpack_v1/yarn.lock | 44 +++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/FE/webpack/webpack_v1/yarn.lock b/FE/webpack/webpack_v1/yarn.lock index 61efec69..b4c10265 100644 --- a/FE/webpack/webpack_v1/yarn.lock +++ b/FE/webpack/webpack_v1/yarn.lock @@ -684,6 +684,10 @@ balanced-match@^0.4.1, balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + base64-js@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" @@ -746,6 +750,13 @@ brace-expansion@^1.0.0: balanced-match "^0.4.1" concat-map "0.0.1" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" @@ -1522,8 +1533,8 @@ fstream-ignore@~1.0.5: minimatch "^3.0.0" fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -1602,6 +1613,17 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^9.0.0: version "9.14.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" @@ -1615,8 +1637,8 @@ globule@^1.0.0: minimatch "~3.0.2" graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -2289,6 +2311,12 @@ minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.2: dependencies: brace-expansion "^1.0.0" +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -3256,7 +3284,13 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@~2.5.1, rimraf@~2.5.4: +rimraf@2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + dependencies: + glob "^7.1.3" + +rimraf@~2.5.1, rimraf@~2.5.4: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: From a00937c4af37e2d7b1585aac0c2e98b10b61c85f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 4 Jun 2019 05:43:57 +0000 Subject: [PATCH 05/27] Bump jquery from 3.1.1 to 3.4.0 in /FE/webpack/webpack_v1 Bumps [jquery](https://github.com/jquery/jquery) from 3.1.1 to 3.4.0. - [Release notes](https://github.com/jquery/jquery/releases) - [Commits](https://github.com/jquery/jquery/compare/3.1.1...3.4.0) --- FE/webpack/webpack_v1/package.json | 2 +- FE/webpack/webpack_v1/yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/FE/webpack/webpack_v1/package.json b/FE/webpack/webpack_v1/package.json index 98c62dc2..d2297b5e 100644 --- a/FE/webpack/webpack_v1/package.json +++ b/FE/webpack/webpack_v1/package.json @@ -18,7 +18,7 @@ "extract-text-webpack-plugin": "^1.0.1", "file-loader": "^0.10.0", "imports-loader": "^0.7.0", - "jquery": "^3.1.1", + "jquery": "^3.4.0", "node-sass": "^4.3.0", "open-browser-webpack-plugin": "^0.0.3", "postcss-loader": "^1.2.2", diff --git a/FE/webpack/webpack_v1/yarn.lock b/FE/webpack/webpack_v1/yarn.lock index 61efec69..25b5bab2 100644 --- a/FE/webpack/webpack_v1/yarn.lock +++ b/FE/webpack/webpack_v1/yarn.lock @@ -1950,9 +1950,9 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -jquery: - version "3.1.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.1.1.tgz#347c1c21c7e004115e0a4da32cece041fad3c8a3" +jquery@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.0.tgz#8de513fa0fa4b2c7d2e48a530e26f0596936efdf" js-base64@^2.1.9: version "2.1.9" From f0718863f937b9ac5416110f43d46a18fdbd5982 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Wed, 12 Jun 2019 02:36:34 +0000 Subject: [PATCH 06/27] Bump tar from 2.2.1 to 2.2.2 in /FE/webpack/webpack_v1 Bumps [tar](https://github.com/npm/node-tar) from 2.2.1 to 2.2.2. - [Release notes](https://github.com/npm/node-tar/releases) - [Commits](https://github.com/npm/node-tar/compare/v2.2.1...v2.2.2) --- FE/webpack/webpack_v1/yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FE/webpack/webpack_v1/yarn.lock b/FE/webpack/webpack_v1/yarn.lock index b4c10265..d81fdea4 100644 --- a/FE/webpack/webpack_v1/yarn.lock +++ b/FE/webpack/webpack_v1/yarn.lock @@ -1532,7 +1532,7 @@ fstream-ignore@~1.0.5: inherits "2" minimatch "^3.0.0" -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: +fstream@^1.0.0, fstream@^1.0.12, fstream@~1.0.10: version "1.0.12" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" dependencies: @@ -3635,11 +3635,11 @@ tar-pack@~3.3.0: uid-number "~0.0.6" tar@^2.0.0, tar@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" dependencies: block-stream "*" - fstream "^1.0.2" + fstream "^1.0.12" inherits "2" timers-browserify@^2.0.2: From b395d23ec6f49fbfdb56387ed7976a7974e43ac2 Mon Sep 17 00:00:00 2001 From: Laisky Date: Fri, 21 Jun 2019 15:47:46 +0800 Subject: [PATCH 07/27] + twitter delete --- py36/twitter.ipynb | 257 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 py36/twitter.ipynb diff --git a/py36/twitter.ipynb b/py36/twitter.ipynb new file mode 100644 index 00000000..3dcece36 --- /dev/null +++ b/py36/twitter.ipynb @@ -0,0 +1,257 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "\n", + "# sys.path.append(r'/Users/laisky/repo/laisky/ramjet/ramjet/settings')\n", + "sys.path.append(r'/opt/configs/ramjet')\n", + "sys.path\n", + "import prd" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'profile_location': None, 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23799, 'lang': None, 'status': {'created_at': 'Fri Jun 21 05:22:38 +0000 2019', 'id': 1141939461363654656, 'id_str': '1141939461363654656', 'text': '你们有些人说话真脏,受过教育吗?mute 都 mute 不过来。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 1, 'favorite_count': 2, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular', 'suspended': False, 'needs_phone_verification': False}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', profile_location=None, description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23799, lang=None, status=Status(_api=, _json={'created_at': 'Fri Jun 21 05:22:38 +0000 2019', 'id': 1141939461363654656, 'id_str': '1141939461363654656', 'text': '你们有些人说话真脏,受过教育吗?mute 都 mute 不过来。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 1, 'favorite_count': 2, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 5, 22, 38), id=1141939461363654656, id_str='1141939461363654656', text='你们有些人说话真脏,受过教育吗?mute 都 mute 不过来。', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=1, favorite_count=2, favorited=False, retweeted=False, lang='zh'), contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular', suspended=False, needs_phone_verification=False)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from tweepy import API, OAuthHandler\n", + "\n", + "\n", + "auth = OAuthHandler(prd.CONSUMER_KEY, prd.CONSUMER_SECRET)\n", + "auth.set_access_token(prd.ACCESS_TOKEN, prd.ACCESS_TOKEN_SECRET)\n", + "api = API(auth, wait_on_rate_limit=True)\n", + "api.me()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Status(_api=, _json={'created_at': 'Fri Jun 21 06:23:44 +0000 2019', 'id': 1141954835958259712, 'id_str': '1141954835958259712', 'text': '市里是简单的粗暴的订了一个罚款和征信规则,然后把压力全部扔给街道,街道目前的做法是要求楼组长和党员起带头作用,主动轮班做志愿者(就是问你是什么垃圾的那些阿姨)。个别富裕区会提供一些现金奖励,但是哪一个看上去都不像是长久之策,比如已经有人去市长热线举报志愿者不作为,不帮他分捡垃圾了', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': 1141934448256008192, 'in_reply_to_status_id_str': '1141934448256008192', 'in_reply_to_user_id': 105351466, 'in_reply_to_user_id_str': '105351466', 'in_reply_to_screen_name': 'ppcelery', 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 0, 'favorite_count': 10, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 6, 23, 44), id=1141954835958259712, id_str='1141954835958259712', text='市里是简单的粗暴的订了一个罚款和征信规则,然后把压力全部扔给街道,街道目前的做法是要求楼组长和党员起带头作用,主动轮班做志愿者(就是问你是什么垃圾的那些阿姨)。个别富裕区会提供一些现金奖励,但是哪一个看上去都不像是长久之策,比如已经有人去市长热线举报志愿者不作为,不帮他分捡垃圾了', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=1141934448256008192, in_reply_to_status_id_str='1141934448256008192', in_reply_to_user_id=105351466, in_reply_to_user_id_str='105351466', in_reply_to_screen_name='ppcelery', author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=0, favorite_count=10, favorited=False, retweeted=False, lang='zh'),\n", + " Status(_api=, _json={'created_at': 'Fri Jun 21 05:22:38 +0000 2019', 'id': 1141939461363654656, 'id_str': '1141939461363654656', 'text': '你们有些人说话真脏,受过教育吗?mute 都 mute 不过来。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 1, 'favorite_count': 2, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 5, 22, 38), id=1141939461363654656, id_str='1141939461363654656', text='你们有些人说话真脏,受过教育吗?mute 都 mute 不过来。', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=1, favorite_count=2, favorited=False, retweeted=False, lang='zh'),\n", + " Status(_api=, _json={'created_at': 'Fri Jun 21 05:20:37 +0000 2019', 'id': 1141938954909831169, 'id_str': '1141938954909831169', 'text': '@libearal 那厢毕竟还有空气污染的大背景。而且你何必加最后这句话呢。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'libearal', 'name': '摸鱼熊', 'id': 48307320, 'id_str': '48307320', 'indices': [0, 9]}], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': 1141937658823708672, 'in_reply_to_status_id_str': '1141937658823708672', 'in_reply_to_user_id': 48307320, 'in_reply_to_user_id_str': '48307320', 'in_reply_to_screen_name': 'libearal', 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 0, 'favorite_count': 2, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 5, 20, 37), id=1141938954909831169, id_str='1141938954909831169', text='@libearal 那厢毕竟还有空气污染的大背景。而且你何必加最后这句话呢。', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'libearal', 'name': '摸鱼熊', 'id': 48307320, 'id_str': '48307320', 'indices': [0, 9]}], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=1141937658823708672, in_reply_to_status_id_str='1141937658823708672', in_reply_to_user_id=48307320, in_reply_to_user_id_str='48307320', in_reply_to_screen_name='libearal', author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=0, favorite_count=2, favorited=False, retweeted=False, lang='zh'),\n", + " Status(_api=, _json={'created_at': 'Fri Jun 21 05:02:43 +0000 2019', 'id': 1141934448256008192, 'id_str': '1141934448256008192', 'text': '垃圾分类这事我最震惊的是,如此巨大的一件会牵涉到上千万人生活的政策,经过短短 1-2 月的宣传后就立刻实施了,并且迅速地跟进了配套的惩罚方案,上千万的守法居民一夜之间就变成潜在违规人群,在罚款和征信的威逼下被迫改变。没有解释,没有探讨,让你们干嘛,就干嘛。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': 1141933091847491584, 'in_reply_to_status_id_str': '1141933091847491584', 'in_reply_to_user_id': 105351466, 'in_reply_to_user_id_str': '105351466', 'in_reply_to_screen_name': 'ppcelery', 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 30, 'favorite_count': 47, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 5, 2, 43), id=1141934448256008192, id_str='1141934448256008192', text='垃圾分类这事我最震惊的是,如此巨大的一件会牵涉到上千万人生活的政策,经过短短 1-2 月的宣传后就立刻实施了,并且迅速地跟进了配套的惩罚方案,上千万的守法居民一夜之间就变成潜在违规人群,在罚款和征信的威逼下被迫改变。没有解释,没有探讨,让你们干嘛,就干嘛。', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=1141933091847491584, in_reply_to_status_id_str='1141933091847491584', in_reply_to_user_id=105351466, in_reply_to_user_id_str='105351466', in_reply_to_screen_name='ppcelery', author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=30, favorite_count=47, favorited=False, retweeted=False, lang='zh'),\n", + " Status(_api=, _json={'created_at': 'Fri Jun 21 04:57:19 +0000 2019', 'id': 1141933091847491584, 'id_str': '1141933091847491584', 'text': '小区收垃圾时间到 20 点为止,这是我 23:30 拍到的,以前整洁的小区现在就变成了这样,更别提湿垃圾的异味。 https://t.co/xmb193rcNE', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [], 'media': [{'id': 1141933076546633729, 'id_str': '1141933076546633729', 'indices': [57, 80], 'media_url': 'http://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'url': 'https://t.co/xmb193rcNE', 'display_url': 'pic.twitter.com/xmb193rcNE', 'expanded_url': 'https://twitter.com/ppcelery/status/1141933091847491584/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'medium': {'w': 900, 'h': 1200, 'resize': 'fit'}, 'large': {'w': 1536, 'h': 2048, 'resize': 'fit'}, 'small': {'w': 510, 'h': 680, 'resize': 'fit'}}}]}, 'extended_entities': {'media': [{'id': 1141933076546633729, 'id_str': '1141933076546633729', 'indices': [57, 80], 'media_url': 'http://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'url': 'https://t.co/xmb193rcNE', 'display_url': 'pic.twitter.com/xmb193rcNE', 'expanded_url': 'https://twitter.com/ppcelery/status/1141933091847491584/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'medium': {'w': 900, 'h': 1200, 'resize': 'fit'}, 'large': {'w': 1536, 'h': 2048, 'resize': 'fit'}, 'small': {'w': 510, 'h': 680, 'resize': 'fit'}}}]}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 11, 'favorite_count': 15, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 4, 57, 19), id=1141933091847491584, id_str='1141933091847491584', text='小区收垃圾时间到 20 点为止,这是我 23:30 拍到的,以前整洁的小区现在就变成了这样,更别提湿垃圾的异味。 https://t.co/xmb193rcNE', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [], 'media': [{'id': 1141933076546633729, 'id_str': '1141933076546633729', 'indices': [57, 80], 'media_url': 'http://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'url': 'https://t.co/xmb193rcNE', 'display_url': 'pic.twitter.com/xmb193rcNE', 'expanded_url': 'https://twitter.com/ppcelery/status/1141933091847491584/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'medium': {'w': 900, 'h': 1200, 'resize': 'fit'}, 'large': {'w': 1536, 'h': 2048, 'resize': 'fit'}, 'small': {'w': 510, 'h': 680, 'resize': 'fit'}}}]}, extended_entities={'media': [{'id': 1141933076546633729, 'id_str': '1141933076546633729', 'indices': [57, 80], 'media_url': 'http://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'url': 'https://t.co/xmb193rcNE', 'display_url': 'pic.twitter.com/xmb193rcNE', 'expanded_url': 'https://twitter.com/ppcelery/status/1141933091847491584/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'medium': {'w': 900, 'h': 1200, 'resize': 'fit'}, 'large': {'w': 1536, 'h': 2048, 'resize': 'fit'}, 'small': {'w': 510, 'h': 680, 'resize': 'fit'}}}]}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=11, favorite_count=15, favorited=False, retweeted=False, possibly_sensitive=False, lang='zh'),\n", + " Status(_api=, _json={'created_at': 'Fri Jun 21 04:00:40 +0000 2019', 'id': 1141918835093585920, 'id_str': '1141918835093585920', 'text': 'RT @waylybaye: LeanCloud 真惨,域名直接被“行政命令”给停了,看起来短期内都恢复不了了… 「熊猫吃短信」用了 LC 的存储,受此影响近期将无法进行喂养,但不影响过滤。我之所以用 LC 而不是自己搭 API 是因为不用备案…(好像猜到为啥被搞了?不过国内各…', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'waylybaye', 'name': 'Baye', 'id': 24124203, 'id_str': '24124203', 'indices': [3, 13]}], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'retweeted_status': {'created_at': 'Fri Jun 21 03:58:22 +0000 2019', 'id': 1141918253851107329, 'id_str': '1141918253851107329', 'text': 'LeanCloud 真惨,域名直接被“行政命令”给停了,看起来短期内都恢复不了了… 「熊猫吃短信」用了 LC 的存储,受此影响近期将无法进行喂养,但不影响过滤。我之所以用 LC 而不是自己搭 API 是因为不用备案…(好像猜到为啥… https://t.co/wiXbFn6zLJ', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/wiXbFn6zLJ', 'expanded_url': 'https://twitter.com/i/web/status/1141918253851107329', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 24124203, 'id_str': '24124203', 'name': 'Baye', 'screen_name': 'waylybaye', 'location': '中华人民共和国', 'description': '全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', 'url': 'https://t.co/LdAwuSaz1e', 'entities': {'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 10828, 'friends_count': 245, 'listed_count': 121, 'created_at': 'Fri Mar 13 04:05:00 +0000 2009', 'favourites_count': 559, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 1198, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '1A1B1F', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_link_color': '2FC2EF', 'profile_sidebar_border_color': '181A1E', 'profile_sidebar_fill_color': '252429', 'profile_text_color': '666666', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': True, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 18, 'favorite_count': 34, 'favorited': False, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'zh'}, 'is_quote_status': False, 'retweet_count': 18, 'favorite_count': 0, 'favorited': False, 'retweeted': True, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 4, 0, 40), id=1141918835093585920, id_str='1141918835093585920', text='RT @waylybaye: LeanCloud 真惨,域名直接被“行政命令”给停了,看起来短期内都恢复不了了… 「熊猫吃短信」用了 LC 的存储,受此影响近期将无法进行喂养,但不影响过滤。我之所以用 LC 而不是自己搭 API 是因为不用备案…(好像猜到为啥被搞了?不过国内各…', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'waylybaye', 'name': 'Baye', 'id': 24124203, 'id_str': '24124203', 'indices': [3, 13]}], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, retweeted_status=Status(_api=, _json={'created_at': 'Fri Jun 21 03:58:22 +0000 2019', 'id': 1141918253851107329, 'id_str': '1141918253851107329', 'text': 'LeanCloud 真惨,域名直接被“行政命令”给停了,看起来短期内都恢复不了了… 「熊猫吃短信」用了 LC 的存储,受此影响近期将无法进行喂养,但不影响过滤。我之所以用 LC 而不是自己搭 API 是因为不用备案…(好像猜到为啥… https://t.co/wiXbFn6zLJ', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/wiXbFn6zLJ', 'expanded_url': 'https://twitter.com/i/web/status/1141918253851107329', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 24124203, 'id_str': '24124203', 'name': 'Baye', 'screen_name': 'waylybaye', 'location': '中华人民共和国', 'description': '全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', 'url': 'https://t.co/LdAwuSaz1e', 'entities': {'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 10828, 'friends_count': 245, 'listed_count': 121, 'created_at': 'Fri Mar 13 04:05:00 +0000 2009', 'favourites_count': 559, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 1198, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '1A1B1F', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_link_color': '2FC2EF', 'profile_sidebar_border_color': '181A1E', 'profile_sidebar_fill_color': '252429', 'profile_text_color': '666666', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': True, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 18, 'favorite_count': 34, 'favorited': False, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 3, 58, 22), id=1141918253851107329, id_str='1141918253851107329', text='LeanCloud 真惨,域名直接被“行政命令”给停了,看起来短期内都恢复不了了… 「熊猫吃短信」用了 LC 的存储,受此影响近期将无法进行喂养,但不影响过滤。我之所以用 LC 而不是自己搭 API 是因为不用备案…(好像猜到为啥… https://t.co/wiXbFn6zLJ', truncated=True, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/wiXbFn6zLJ', 'expanded_url': 'https://twitter.com/i/web/status/1141918253851107329', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, source='Twitter Web Client', source_url='http://twitter.com', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 24124203, 'id_str': '24124203', 'name': 'Baye', 'screen_name': 'waylybaye', 'location': '中华人民共和国', 'description': '全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', 'url': 'https://t.co/LdAwuSaz1e', 'entities': {'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 10828, 'friends_count': 245, 'listed_count': 121, 'created_at': 'Fri Mar 13 04:05:00 +0000 2009', 'favourites_count': 559, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 1198, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '1A1B1F', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_link_color': '2FC2EF', 'profile_sidebar_border_color': '181A1E', 'profile_sidebar_fill_color': '252429', 'profile_text_color': '666666', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': True, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=24124203, id_str='24124203', name='Baye', screen_name='waylybaye', location='中华人民共和国', description='全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', url='https://t.co/LdAwuSaz1e', entities={'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=10828, friends_count=245, listed_count=121, created_at=datetime.datetime(2009, 3, 13, 4, 5), favourites_count=559, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=1198, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='1A1B1F', profile_background_image_url='http://abs.twimg.com/images/themes/theme9/bg.gif', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme9/bg.gif', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', profile_link_color='2FC2EF', profile_sidebar_border_color='181A1E', profile_sidebar_fill_color='252429', profile_text_color='666666', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=True, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 24124203, 'id_str': '24124203', 'name': 'Baye', 'screen_name': 'waylybaye', 'location': '中华人民共和国', 'description': '全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', 'url': 'https://t.co/LdAwuSaz1e', 'entities': {'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 10828, 'friends_count': 245, 'listed_count': 121, 'created_at': 'Fri Mar 13 04:05:00 +0000 2009', 'favourites_count': 559, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 1198, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '1A1B1F', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_link_color': '2FC2EF', 'profile_sidebar_border_color': '181A1E', 'profile_sidebar_fill_color': '252429', 'profile_text_color': '666666', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': True, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=24124203, id_str='24124203', name='Baye', screen_name='waylybaye', location='中华人民共和国', description='全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', url='https://t.co/LdAwuSaz1e', entities={'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=10828, friends_count=245, listed_count=121, created_at=datetime.datetime(2009, 3, 13, 4, 5), favourites_count=559, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=1198, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='1A1B1F', profile_background_image_url='http://abs.twimg.com/images/themes/theme9/bg.gif', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme9/bg.gif', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', profile_link_color='2FC2EF', profile_sidebar_border_color='181A1E', profile_sidebar_fill_color='252429', profile_text_color='666666', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=True, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=18, favorite_count=34, favorited=False, retweeted=True, possibly_sensitive=False, lang='zh'), is_quote_status=False, retweet_count=18, favorite_count=0, favorited=False, retweeted=True, lang='zh'),\n", + " Status(_api=, _json={'created_at': 'Fri Jun 21 03:35:53 +0000 2019', 'id': 1141912596917784577, 'id_str': '1141912596917784577', 'text': 'RT @ABCPolitics: \"Your indifference cost these men and women their most valuable commodity: time.\"\\n\\nJon Stewart receives a standing ovation…', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'ABCPolitics', 'name': 'ABC News Politics', 'id': 16815644, 'id_str': '16815644', 'indices': [3, 15]}], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'retweeted_status': {'created_at': 'Tue Jun 11 15:51:45 +0000 2019', 'id': 1138473904954101761, 'id_str': '1138473904954101761', 'text': '\"Your indifference cost these men and women their most valuable commodity: time.\"\\n\\nJon Stewart receives a standing… https://t.co/Sztf47gepG', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/Sztf47gepG', 'expanded_url': 'https://twitter.com/i/web/status/1138473904954101761', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [116, 139]}]}, 'source': 'Twitter Media Studio', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 16815644, 'id_str': '16815644', 'name': 'ABC News Politics', 'screen_name': 'ABCPolitics', 'location': 'Washington, DC', 'description': \"Reports from @ABC News' political team.\", 'url': 'https://t.co/SO3M0qceOH', 'entities': {'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 751512, 'friends_count': 476, 'listed_count': 6336, 'created_at': 'Thu Oct 16 22:43:16 +0000 2008', 'favourites_count': 72, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 126565, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': 'FFFFFF', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16815644/1401371089', 'profile_link_color': '336699', 'profile_sidebar_border_color': 'B7CFDE', 'profile_sidebar_fill_color': '88A0B3', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 81625, 'favorite_count': 245515, 'favorited': False, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'en'}, 'is_quote_status': False, 'retweet_count': 81625, 'favorite_count': 0, 'favorited': False, 'retweeted': True, 'lang': 'en'}, created_at=datetime.datetime(2019, 6, 21, 3, 35, 53), id=1141912596917784577, id_str='1141912596917784577', text='RT @ABCPolitics: \"Your indifference cost these men and women their most valuable commodity: time.\"\\n\\nJon Stewart receives a standing ovation…', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'ABCPolitics', 'name': 'ABC News Politics', 'id': 16815644, 'id_str': '16815644', 'indices': [3, 15]}], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, retweeted_status=Status(_api=, _json={'created_at': 'Tue Jun 11 15:51:45 +0000 2019', 'id': 1138473904954101761, 'id_str': '1138473904954101761', 'text': '\"Your indifference cost these men and women their most valuable commodity: time.\"\\n\\nJon Stewart receives a standing… https://t.co/Sztf47gepG', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/Sztf47gepG', 'expanded_url': 'https://twitter.com/i/web/status/1138473904954101761', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [116, 139]}]}, 'source': 'Twitter Media Studio', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 16815644, 'id_str': '16815644', 'name': 'ABC News Politics', 'screen_name': 'ABCPolitics', 'location': 'Washington, DC', 'description': \"Reports from @ABC News' political team.\", 'url': 'https://t.co/SO3M0qceOH', 'entities': {'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 751512, 'friends_count': 476, 'listed_count': 6336, 'created_at': 'Thu Oct 16 22:43:16 +0000 2008', 'favourites_count': 72, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 126565, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': 'FFFFFF', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16815644/1401371089', 'profile_link_color': '336699', 'profile_sidebar_border_color': 'B7CFDE', 'profile_sidebar_fill_color': '88A0B3', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 81625, 'favorite_count': 245515, 'favorited': False, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'en'}, created_at=datetime.datetime(2019, 6, 11, 15, 51, 45), id=1138473904954101761, id_str='1138473904954101761', text='\"Your indifference cost these men and women their most valuable commodity: time.\"\\n\\nJon Stewart receives a standing… https://t.co/Sztf47gepG', truncated=True, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/Sztf47gepG', 'expanded_url': 'https://twitter.com/i/web/status/1138473904954101761', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [116, 139]}]}, source='Twitter Media Studio', source_url='https://studio.twitter.com', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 16815644, 'id_str': '16815644', 'name': 'ABC News Politics', 'screen_name': 'ABCPolitics', 'location': 'Washington, DC', 'description': \"Reports from @ABC News' political team.\", 'url': 'https://t.co/SO3M0qceOH', 'entities': {'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 751512, 'friends_count': 476, 'listed_count': 6336, 'created_at': 'Thu Oct 16 22:43:16 +0000 2008', 'favourites_count': 72, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 126565, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': 'FFFFFF', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16815644/1401371089', 'profile_link_color': '336699', 'profile_sidebar_border_color': 'B7CFDE', 'profile_sidebar_fill_color': '88A0B3', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, id=16815644, id_str='16815644', name='ABC News Politics', screen_name='ABCPolitics', location='Washington, DC', description=\"Reports from @ABC News' political team.\", url='https://t.co/SO3M0qceOH', entities={'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=751512, friends_count=476, listed_count=6336, created_at=datetime.datetime(2008, 10, 16, 22, 43, 16), favourites_count=72, utc_offset=None, time_zone=None, geo_enabled=False, verified=True, statuses_count=126565, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='FFFFFF', profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/16815644/1401371089', profile_link_color='336699', profile_sidebar_border_color='B7CFDE', profile_sidebar_fill_color='88A0B3', profile_text_color='000000', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='none'), user=User(_api=, _json={'id': 16815644, 'id_str': '16815644', 'name': 'ABC News Politics', 'screen_name': 'ABCPolitics', 'location': 'Washington, DC', 'description': \"Reports from @ABC News' political team.\", 'url': 'https://t.co/SO3M0qceOH', 'entities': {'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 751512, 'friends_count': 476, 'listed_count': 6336, 'created_at': 'Thu Oct 16 22:43:16 +0000 2008', 'favourites_count': 72, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 126565, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': 'FFFFFF', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16815644/1401371089', 'profile_link_color': '336699', 'profile_sidebar_border_color': 'B7CFDE', 'profile_sidebar_fill_color': '88A0B3', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, id=16815644, id_str='16815644', name='ABC News Politics', screen_name='ABCPolitics', location='Washington, DC', description=\"Reports from @ABC News' political team.\", url='https://t.co/SO3M0qceOH', entities={'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=751512, friends_count=476, listed_count=6336, created_at=datetime.datetime(2008, 10, 16, 22, 43, 16), favourites_count=72, utc_offset=None, time_zone=None, geo_enabled=False, verified=True, statuses_count=126565, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='FFFFFF', profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/16815644/1401371089', profile_link_color='336699', profile_sidebar_border_color='B7CFDE', profile_sidebar_fill_color='88A0B3', profile_text_color='000000', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='none'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=81625, favorite_count=245515, favorited=False, retweeted=True, possibly_sensitive=False, lang='en'), is_quote_status=False, retweet_count=81625, favorite_count=0, favorited=False, retweeted=True, lang='en'),\n", + " Status(_api=, _json={'created_at': 'Fri Jun 21 02:01:22 +0000 2019', 'id': 1141888812131295232, 'id_str': '1141888812131295232', 'text': '不太能理解这种设计,明明一个简单的 json 就可以解决问题,为什么要实现成这么复杂的方式,学习成本大不说,迁移成本也奇高,甚至还不如拿 httpclient 简单的写一个 post 请求… https://t.co/q9PsdQc8ic', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [], 'media': [{'id': 1141888805575639040, 'id_str': '1141888805575639040', 'indices': [96, 119], 'media_url': 'http://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'url': 'https://t.co/q9PsdQc8ic', 'display_url': 'pic.twitter.com/q9PsdQc8ic', 'expanded_url': 'https://twitter.com/ppcelery/status/1141888812131295232/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 576, 'h': 189, 'resize': 'fit'}, 'large': {'w': 576, 'h': 189, 'resize': 'fit'}, 'medium': {'w': 576, 'h': 189, 'resize': 'fit'}}}]}, 'extended_entities': {'media': [{'id': 1141888805575639040, 'id_str': '1141888805575639040', 'indices': [96, 119], 'media_url': 'http://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'url': 'https://t.co/q9PsdQc8ic', 'display_url': 'pic.twitter.com/q9PsdQc8ic', 'expanded_url': 'https://twitter.com/ppcelery/status/1141888812131295232/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 576, 'h': 189, 'resize': 'fit'}, 'large': {'w': 576, 'h': 189, 'resize': 'fit'}, 'medium': {'w': 576, 'h': 189, 'resize': 'fit'}}}]}, 'source': 'Twitter Web App', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 0, 'favorite_count': 6, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 2, 1, 22), id=1141888812131295232, id_str='1141888812131295232', text='不太能理解这种设计,明明一个简单的 json 就可以解决问题,为什么要实现成这么复杂的方式,学习成本大不说,迁移成本也奇高,甚至还不如拿 httpclient 简单的写一个 post 请求… https://t.co/q9PsdQc8ic', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [], 'media': [{'id': 1141888805575639040, 'id_str': '1141888805575639040', 'indices': [96, 119], 'media_url': 'http://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'url': 'https://t.co/q9PsdQc8ic', 'display_url': 'pic.twitter.com/q9PsdQc8ic', 'expanded_url': 'https://twitter.com/ppcelery/status/1141888812131295232/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 576, 'h': 189, 'resize': 'fit'}, 'large': {'w': 576, 'h': 189, 'resize': 'fit'}, 'medium': {'w': 576, 'h': 189, 'resize': 'fit'}}}]}, extended_entities={'media': [{'id': 1141888805575639040, 'id_str': '1141888805575639040', 'indices': [96, 119], 'media_url': 'http://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'url': 'https://t.co/q9PsdQc8ic', 'display_url': 'pic.twitter.com/q9PsdQc8ic', 'expanded_url': 'https://twitter.com/ppcelery/status/1141888812131295232/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 576, 'h': 189, 'resize': 'fit'}, 'large': {'w': 576, 'h': 189, 'resize': 'fit'}, 'medium': {'w': 576, 'h': 189, 'resize': 'fit'}}}]}, source='Twitter Web App', source_url='https://mobile.twitter.com', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=0, favorite_count=6, favorited=False, retweeted=False, possibly_sensitive=False, lang='zh'),\n", + " Status(_api=, _json={'created_at': 'Fri Jun 21 01:08:42 +0000 2019', 'id': 1141875556763328513, 'id_str': '1141875556763328513', 'text': 'RT @pickover: Mathematics, geometry, witchcraft, and the structure of reality. (A plug gets caught under a table.) https://t.co/us2zEHL1XV…', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'pickover', 'name': 'Cliff Pickover', 'id': 16176754, 'id_str': '16176754', 'indices': [3, 12]}], 'urls': [{'url': 'https://t.co/us2zEHL1XV', 'expanded_url': 'https://tinyurl.com/y32l8eaf', 'display_url': 'tinyurl.com/y32l8eaf', 'indices': [115, 138]}]}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'retweeted_status': {'created_at': 'Tue Jun 18 11:51:40 +0000 2019', 'id': 1140950202532151296, 'id_str': '1140950202532151296', 'text': 'Mathematics, geometry, witchcraft, and the structure of reality. (A plug gets caught under a table.)… https://t.co/5EeSVwCJsa', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/5EeSVwCJsa', 'expanded_url': 'https://twitter.com/i/web/status/1140950202532151296', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [102, 125]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 16176754, 'id_str': '16176754', 'name': 'Cliff Pickover', 'screen_name': 'pickover', 'location': 'New York', 'description': 'Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', 'url': 'http://t.co/t3Z2fp6vBu', 'entities': {'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 34157, 'friends_count': 50, 'listed_count': 1543, 'created_at': 'Mon Sep 08 01:27:56 +0000 2008', 'favourites_count': 1426, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': False, 'statuses_count': 51386, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '000000', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16176754/1398256311', 'profile_link_color': '0000FF', 'profile_sidebar_border_color': '87BC44', 'profile_sidebar_fill_color': '8EA8F5', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 4395, 'favorite_count': 10554, 'favorited': True, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'en'}, 'is_quote_status': False, 'retweet_count': 4395, 'favorite_count': 0, 'favorited': True, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'en'}, created_at=datetime.datetime(2019, 6, 21, 1, 8, 42), id=1141875556763328513, id_str='1141875556763328513', text='RT @pickover: Mathematics, geometry, witchcraft, and the structure of reality. (A plug gets caught under a table.) https://t.co/us2zEHL1XV…', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'pickover', 'name': 'Cliff Pickover', 'id': 16176754, 'id_str': '16176754', 'indices': [3, 12]}], 'urls': [{'url': 'https://t.co/us2zEHL1XV', 'expanded_url': 'https://tinyurl.com/y32l8eaf', 'display_url': 'tinyurl.com/y32l8eaf', 'indices': [115, 138]}]}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, retweeted_status=Status(_api=, _json={'created_at': 'Tue Jun 18 11:51:40 +0000 2019', 'id': 1140950202532151296, 'id_str': '1140950202532151296', 'text': 'Mathematics, geometry, witchcraft, and the structure of reality. (A plug gets caught under a table.)… https://t.co/5EeSVwCJsa', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/5EeSVwCJsa', 'expanded_url': 'https://twitter.com/i/web/status/1140950202532151296', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [102, 125]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 16176754, 'id_str': '16176754', 'name': 'Cliff Pickover', 'screen_name': 'pickover', 'location': 'New York', 'description': 'Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', 'url': 'http://t.co/t3Z2fp6vBu', 'entities': {'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 34157, 'friends_count': 50, 'listed_count': 1543, 'created_at': 'Mon Sep 08 01:27:56 +0000 2008', 'favourites_count': 1426, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': False, 'statuses_count': 51386, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '000000', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16176754/1398256311', 'profile_link_color': '0000FF', 'profile_sidebar_border_color': '87BC44', 'profile_sidebar_fill_color': '8EA8F5', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 4395, 'favorite_count': 10554, 'favorited': True, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'en'}, created_at=datetime.datetime(2019, 6, 18, 11, 51, 40), id=1140950202532151296, id_str='1140950202532151296', text='Mathematics, geometry, witchcraft, and the structure of reality. (A plug gets caught under a table.)… https://t.co/5EeSVwCJsa', truncated=True, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/5EeSVwCJsa', 'expanded_url': 'https://twitter.com/i/web/status/1140950202532151296', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [102, 125]}]}, source='Twitter Web Client', source_url='http://twitter.com', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 16176754, 'id_str': '16176754', 'name': 'Cliff Pickover', 'screen_name': 'pickover', 'location': 'New York', 'description': 'Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', 'url': 'http://t.co/t3Z2fp6vBu', 'entities': {'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 34157, 'friends_count': 50, 'listed_count': 1543, 'created_at': 'Mon Sep 08 01:27:56 +0000 2008', 'favourites_count': 1426, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': False, 'statuses_count': 51386, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '000000', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16176754/1398256311', 'profile_link_color': '0000FF', 'profile_sidebar_border_color': '87BC44', 'profile_sidebar_fill_color': '8EA8F5', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, id=16176754, id_str='16176754', name='Cliff Pickover', screen_name='pickover', location='New York', description='Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', url='http://t.co/t3Z2fp6vBu', entities={'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, protected=False, followers_count=34157, friends_count=50, listed_count=1543, created_at=datetime.datetime(2008, 9, 8, 1, 27, 56), favourites_count=1426, utc_offset=None, time_zone=None, geo_enabled=False, verified=False, statuses_count=51386, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='000000', profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/16176754/1398256311', profile_link_color='0000FF', profile_sidebar_border_color='87BC44', profile_sidebar_fill_color='8EA8F5', profile_text_color='000000', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='none'), user=User(_api=, _json={'id': 16176754, 'id_str': '16176754', 'name': 'Cliff Pickover', 'screen_name': 'pickover', 'location': 'New York', 'description': 'Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', 'url': 'http://t.co/t3Z2fp6vBu', 'entities': {'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 34157, 'friends_count': 50, 'listed_count': 1543, 'created_at': 'Mon Sep 08 01:27:56 +0000 2008', 'favourites_count': 1426, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': False, 'statuses_count': 51386, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '000000', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16176754/1398256311', 'profile_link_color': '0000FF', 'profile_sidebar_border_color': '87BC44', 'profile_sidebar_fill_color': '8EA8F5', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, id=16176754, id_str='16176754', name='Cliff Pickover', screen_name='pickover', location='New York', description='Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', url='http://t.co/t3Z2fp6vBu', entities={'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, protected=False, followers_count=34157, friends_count=50, listed_count=1543, created_at=datetime.datetime(2008, 9, 8, 1, 27, 56), favourites_count=1426, utc_offset=None, time_zone=None, geo_enabled=False, verified=False, statuses_count=51386, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='000000', profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/16176754/1398256311', profile_link_color='0000FF', profile_sidebar_border_color='87BC44', profile_sidebar_fill_color='8EA8F5', profile_text_color='000000', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='none'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=4395, favorite_count=10554, favorited=True, retweeted=True, possibly_sensitive=False, lang='en'), is_quote_status=False, retweet_count=4395, favorite_count=0, favorited=True, retweeted=True, possibly_sensitive=False, lang='en'),\n", + " Status(_api=, _json={'created_at': 'Thu Jun 20 15:27:12 +0000 2019', 'id': 1141729217580679171, 'id_str': '1141729217580679171', 'text': '@inspirehep23 所以为了应景买了个蛋糕来吃。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'inspirehep23', 'name': '秋色以晚', 'id': 3028250728, 'id_str': '3028250728', 'indices': [0, 13]}], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': 1141713855271227392, 'in_reply_to_status_id_str': '1141713855271227392', 'in_reply_to_user_id': 3028250728, 'in_reply_to_user_id_str': '3028250728', 'in_reply_to_screen_name': 'inspirehep23', 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 0, 'favorite_count': 0, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 20, 15, 27, 12), id=1141729217580679171, id_str='1141729217580679171', text='@inspirehep23 所以为了应景买了个蛋糕来吃。', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'inspirehep23', 'name': '秋色以晚', 'id': 3028250728, 'id_str': '3028250728', 'indices': [0, 13]}], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=1141713855271227392, in_reply_to_status_id_str='1141713855271227392', in_reply_to_user_id=3028250728, in_reply_to_user_id_str='3028250728', in_reply_to_screen_name='inspirehep23', author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=0, favorite_count=0, favorited=False, retweeted=False, lang='zh')]" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "api.user_timeline(count=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> scan 999 statuses\n", + ">> scan 1999 statuses\n", + ">> scan 2999 statuses\n", + ">> scan 3999 statuses\n", + ">> scan 4999 statuses\n", + ">> scan 5999 statuses\n", + ">> scan 6999 statuses\n", + ">> scan 7999 statuses\n", + ">> scan 8999 statuses\n", + ">> scan 9999 statuses\n", + ">> scan 10999 statuses\n", + ">> scan 11999 statuses\n", + ">> scan 12999 statuses\n", + ">> scan 13999 statuses\n", + ">> scan 14999 statuses\n", + ">> scan 15999 statuses\n", + ">> scan 16999 statuses\n", + ">> scan 17999 statuses\n", + ">> scan 18999 statuses\n", + ">> scan 19999 statuses\n", + ">> scan 20999 statuses\n", + ">> scan 21999 statuses\n", + ">> scan 22999 statuses\n", + ">> scan 23999 statuses\n", + ">> scan 24999 statuses\n", + ">> scan 25999 statuses\n", + ">> scan 26999 statuses\n", + ">> scan 27999 statuses\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 52\u001b[0;31m \u001b[0mdelete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mdelete\u001b[0;34m()\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[0;31m# tweets = api.user_timeline(max_id=current_id, count=1000)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 33\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mtweet\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtweets\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m'user.screen_name'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'ppcelery'\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"_id\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 34\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 35\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/cursor.py\u001b[0m in \u001b[0;36mnext\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1223\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__empty\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1224\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mStopIteration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1225\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__data\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_refresh\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1226\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__manipulate\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1227\u001b[0m \u001b[0m_db\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__collection\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatabase\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/cursor.py\u001b[0m in \u001b[0;36m_refresh\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1160\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__collection\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatabase\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclient\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1161\u001b[0m self.__max_await_time_ms)\n\u001b[0;32m-> 1162\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__send_message\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1163\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1164\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__data\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/cursor.py\u001b[0m in \u001b[0;36m__send_message\u001b[0;34m(self, operation)\u001b[0m\n\u001b[1;32m 1004\u001b[0m docs = self._unpack_response(\n\u001b[1;32m 1005\u001b[0m \u001b[0mreply\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__collection\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcodec_options\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1006\u001b[0;31m legacy_response=legacy_response, user_fields=user_fields)\n\u001b[0m\u001b[1;32m 1007\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfrom_command\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1008\u001b[0m \u001b[0mfirst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdocs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/cursor.py\u001b[0m in \u001b[0;36m_unpack_response\u001b[0;34m(self, response, cursor_id, codec_options, user_fields, legacy_response)\u001b[0m\n\u001b[1;32m 1095\u001b[0m user_fields=None, legacy_response=False):\n\u001b[1;32m 1096\u001b[0m return response.unpack_response(cursor_id, codec_options, user_fields,\n\u001b[0;32m-> 1097\u001b[0;31m legacy_response)\n\u001b[0m\u001b[1;32m 1098\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1099\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_read_preference\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/message.py\u001b[0m in \u001b[0;36munpack_response\u001b[0;34m(self, cursor_id, codec_options, user_fields, legacy_response)\u001b[0m\n\u001b[1;32m 1420\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mbson\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdocuments\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcodec_options\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1421\u001b[0m return bson._decode_all_selective(\n\u001b[0;32m-> 1422\u001b[0;31m self.documents, codec_options, user_fields)\n\u001b[0m\u001b[1;32m 1423\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1424\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcommand_response\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/bson/__init__.py\u001b[0m in \u001b[0;36m_decode_all_selective\u001b[0;34m(data, codec_options, fields)\u001b[0m\n\u001b[1;32m 991\u001b[0m \"\"\"\n\u001b[1;32m 992\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mcodec_options\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype_registry\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_decoder_map\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 993\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdecode_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcodec_options\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 994\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 995\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mfields\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/bson/objectid.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, oid)\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[0m_type_marker\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 63\u001b[0;31m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 64\u001b[0m \"\"\"Initialize a new ObjectId.\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "from datetime import datetime\n", + "import traceback\n", + "\n", + "from pymongo import MongoClient\n", + "\n", + "\n", + "mongo = MongoClient(\"localhost\", 27017)\n", + "tweets = mongo['twitter']['tweets']\n", + "\n", + "\n", + "def is_status_tobe_delete(tweet):\n", + " if len(tweet.get('entities', {}).get(\"hashtags\", [])) >= 1:\n", + " return False\n", + " \n", + " if tweet['created_at'] < datetime(2017,6,5):\n", + " return True\n", + "\n", + "def delete():\n", + "# last_tweets = api.user_timeline(count=1)\n", + "# if not last_tweets:\n", + "# return\n", + " \n", + "# print(last_tweets[0].created_at < datetime(2019,7,1))\n", + "# print(last_tweets[0])\n", + "# print(dir(last_tweets[0]))\n", + "# return\n", + "\n", + "# current_id = last_tweets[0].id\n", + " current_id = \"379207474345046017\"\n", + " n = n_del = 1\n", + "# tweets = api.user_timeline(max_id=current_id, count=1000)\n", + " for tweet in tweets.find({'user.screen_name': 'ppcelery'}).sort(\"_id\", -1):\n", + " n += 1\n", + "\n", + " if is_status_tobe_delete(tweet):\n", + " n_del += 1\n", + " print(\"delete\", tweet['id'],tweet['created_at'])\n", + " try:\n", + " api.destroy_status(tweet['id'])\n", + " except Exception:\n", + " traceback.print_exc()\n", + " else:\n", + " current_id = tweet['id']\n", + "\n", + " if n % 1000 == 0:\n", + " print(\">> scan {} statuses\".format(n-1))\n", + " if n_del % 100 == 0:\n", + " print(\">> delete {} statuses\".format(n_del-1))\n", + "\n", + "\n", + "delete()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "t = api.get_status(\"262556735972184064\")" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'hashtags': [{'text': '寰宇', 'indices': [36, 39]}],\n", + " 'symbols': [],\n", + " 'user_mentions': [],\n", + " 'urls': [{'url': 'http://t.co/Rvowsmsw',\n", + " 'expanded_url': 'http://goo.gl/Sau8J',\n", + " 'display_url': 'goo.gl/Sau8J',\n", + " 'indices': [1, 21]}],\n", + " 'media': [{'id': 262556735980572672,\n", + " 'id_str': '262556735980572672',\n", + " 'indices': [40, 60],\n", + " 'media_url': 'http://pbs.twimg.com/media/A6TJ9dWCEAAzq-2.jpg',\n", + " 'media_url_https': 'https://pbs.twimg.com/media/A6TJ9dWCEAAzq-2.jpg',\n", + " 'url': 'http://t.co/T2LJyf4e',\n", + " 'display_url': 'pic.twitter.com/T2LJyf4e',\n", + " 'expanded_url': 'https://twitter.com/ppcelery/status/262556735972184064/photo/1',\n", + " 'type': 'photo',\n", + " 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'},\n", + " 'medium': {'w': 1200, 'h': 675, 'resize': 'fit'},\n", + " 'small': {'w': 680, 'h': 383, 'resize': 'fit'},\n", + " 'large': {'w': 1280, 'h': 720, 'resize': 'fit'}}}]}" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t.entities" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 11f30bc0e5644aaefc0e78434872ce596362789e Mon Sep 17 00:00:00 2001 From: Laisky Date: Fri, 21 Jun 2019 17:51:53 +0800 Subject: [PATCH 08/27] + twitter img download --- py36/twitter.ipynb | 109 +++++++++++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 33 deletions(-) diff --git a/py36/twitter.ipynb b/py36/twitter.ipynb index 3dcece36..6892fb32 100644 --- a/py36/twitter.ipynb +++ b/py36/twitter.ipynb @@ -74,7 +74,9 @@ { "cell_type": "code", "execution_count": 57, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -131,6 +133,8 @@ } ], "source": [ + "# delete tweets\n", + "\n", "from datetime import datetime\n", "import traceback\n", "\n", @@ -186,50 +190,89 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 64, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/a/v/c'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'/a'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'v'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/a/v/c'" + ] + } + ], "source": [ - "t = api.get_status(\"262556735972184064\")" + "from pathlib import Path\n", + "\n", + "\n", + "p = Path('/a', 'v', 'c')\n", + "open(p)" ] }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 67, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'hashtags': [{'text': '寰宇', 'indices': [36, 39]}],\n", - " 'symbols': [],\n", - " 'user_mentions': [],\n", - " 'urls': [{'url': 'http://t.co/Rvowsmsw',\n", - " 'expanded_url': 'http://goo.gl/Sau8J',\n", - " 'display_url': 'goo.gl/Sau8J',\n", - " 'indices': [1, 21]}],\n", - " 'media': [{'id': 262556735980572672,\n", - " 'id_str': '262556735980572672',\n", - " 'indices': [40, 60],\n", - " 'media_url': 'http://pbs.twimg.com/media/A6TJ9dWCEAAzq-2.jpg',\n", - " 'media_url_https': 'https://pbs.twimg.com/media/A6TJ9dWCEAAzq-2.jpg',\n", - " 'url': 'http://t.co/T2LJyf4e',\n", - " 'display_url': 'pic.twitter.com/T2LJyf4e',\n", - " 'expanded_url': 'https://twitter.com/ppcelery/status/262556735972184064/photo/1',\n", - " 'type': 'photo',\n", - " 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'},\n", - " 'medium': {'w': 1200, 'h': 675, 'resize': 'fit'},\n", - " 'small': {'w': 680, 'h': 383, 'resize': 'fit'},\n", - " 'large': {'w': 1280, 'h': 720, 'resize': 'fit'}}}]}" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "tweet img ok 719103735004200961 /Users/laisky/Downloads/CfrFCRcUEAIFaEe.jpg\n", + "tweet img ok 719468584750096384 /Users/laisky/Downloads/CfwQ3VxVIAAj1Yv.jpg\n", + "got error \n" + ] + }, + { + "ename": "UnboundLocalError", + "evalue": "local variable 'fpath' referenced before assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 31\u001b[0;31m \u001b[0mdownload_images\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 32\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mdownload_images\u001b[0;34m()\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdownload_images\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtweet\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtweets\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"entities.media\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"$exists\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"_id\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 28\u001b[0;31m \u001b[0mdownload_images_for_tweet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtweet\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 29\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mdownload_images_for_tweet\u001b[0;34m(tweet)\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"tweet img ok\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtweet\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'id'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 24\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mUnboundLocalError\u001b[0m: local variable 'fpath' referenced before assignment" + ] } ], "source": [ - "t.entities" + "# download image\n", + "import requests\n", + "from pathlib import Path\n", + "\n", + "dirpath = r'/var/www/uploads/twitter'\n", + "# dirpath = r'/Users/laisky/Downloads'\n", + "\n", + "\n", + "def download_images_for_tweet(tweet):\n", + " for img in tweet['entities']['media']:\n", + " with requests.get(img['media_url_https']+\":orig\") as r:\n", + " if r.status_code != 200:\n", + " print(\"got error\", r.text)\n", + " continue\n", + " \n", + " fpath = Path(dirpath, img['media_url_https'].split(\"/\")[-1])\n", + " if fpath.is_file():\n", + " continue\n", + " \n", + " with open(fpath, 'wb') as f:\n", + " f.write(r.content) \n", + " print(\"tweet img ok\", tweet['id'], fpath)\n", + " \n", + "\n", + "def download_images():\n", + " for tweet in tweets.find({\"entities.media\": {\"$exists\": 1}}).sort(\"_id\", -1):\n", + " download_images_for_tweet(tweet)\n", + " \n", + " \n", + "download_images()\n", + " " ] } ], From 41d1225bdf9195f8faabf5d9aef9e0996290f241 Mon Sep 17 00:00:00 2001 From: Laisky Date: Mon, 24 Jun 2019 17:37:56 +0800 Subject: [PATCH 09/27] download twitter quoted --- py36/twitter.ipynb | 336 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 282 insertions(+), 54 deletions(-) diff --git a/py36/twitter.ipynb b/py36/twitter.ipynb index 6892fb32..918a79d7 100644 --- a/py36/twitter.ipynb +++ b/py36/twitter.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 9, "metadata": { "scrolled": true }, @@ -24,51 +24,204 @@ { "data": { "text/plain": [ - "User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'profile_location': None, 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23799, 'lang': None, 'status': {'created_at': 'Fri Jun 21 05:22:38 +0000 2019', 'id': 1141939461363654656, 'id_str': '1141939461363654656', 'text': '你们有些人说话真脏,受过教育吗?mute 都 mute 不过来。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 1, 'favorite_count': 2, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular', 'suspended': False, 'needs_phone_verification': False}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', profile_location=None, description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23799, lang=None, status=Status(_api=, _json={'created_at': 'Fri Jun 21 05:22:38 +0000 2019', 'id': 1141939461363654656, 'id_str': '1141939461363654656', 'text': '你们有些人说话真脏,受过教育吗?mute 都 mute 不过来。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 1, 'favorite_count': 2, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 5, 22, 38), id=1141939461363654656, id_str='1141939461363654656', text='你们有些人说话真脏,受过教育吗?mute 都 mute 不过来。', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=1, favorite_count=2, favorited=False, retweeted=False, lang='zh'), contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular', suspended=False, needs_phone_verification=False)" + "{'id': 105351466,\n", + " 'id_str': '105351466',\n", + " 'name': 'Laisky',\n", + " 'screen_name': 'ppcelery',\n", + " 'location': '♥ Shanghai',\n", + " 'profile_location': None,\n", + " 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。',\n", + " 'url': 'https://t.co/tmLO9n4B1E',\n", + " 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E',\n", + " 'expanded_url': 'https://about.me/laisky',\n", + " 'display_url': 'about.me/laisky',\n", + " 'indices': [0, 23]}]},\n", + " 'description': {'urls': []}},\n", + " 'protected': False,\n", + " 'followers_count': 7544,\n", + " 'friends_count': 228,\n", + " 'listed_count': 133,\n", + " 'created_at': 'Sat Jan 16 03:02:39 +0000 2010',\n", + " 'favourites_count': 849,\n", + " 'utc_offset': None,\n", + " 'time_zone': None,\n", + " 'geo_enabled': True,\n", + " 'verified': False,\n", + " 'statuses_count': 21894,\n", + " 'lang': None,\n", + " 'status': {'created_at': 'Sat Jun 22 14:23:42 +0000 2019',\n", + " 'id': 1142438015064629249,\n", + " 'id_str': '1142438015064629249',\n", + " 'text': '@Steverezero 云备份。\\nwinter is coming, it may delay, but never absent.',\n", + " 'truncated': False,\n", + " 'entities': {'hashtags': [],\n", + " 'symbols': [],\n", + " 'user_mentions': [{'screen_name': 'Steverezero',\n", + " 'name': 'D-NARUTO',\n", + " 'id': 2246680200,\n", + " 'id_str': '2246680200',\n", + " 'indices': [0, 12]}],\n", + " 'urls': []},\n", + " 'source': 'Twitter Web App',\n", + " 'in_reply_to_status_id': 1142437378176405504,\n", + " 'in_reply_to_status_id_str': '1142437378176405504',\n", + " 'in_reply_to_user_id': 2246680200,\n", + " 'in_reply_to_user_id_str': '2246680200',\n", + " 'in_reply_to_screen_name': 'Steverezero',\n", + " 'geo': None,\n", + " 'coordinates': None,\n", + " 'place': None,\n", + " 'contributors': None,\n", + " 'is_quote_status': False,\n", + " 'retweet_count': 0,\n", + " 'favorite_count': 2,\n", + " 'favorited': False,\n", + " 'retweeted': False,\n", + " 'lang': 'en'},\n", + " 'contributors_enabled': False,\n", + " 'is_translator': False,\n", + " 'is_translation_enabled': False,\n", + " 'profile_background_color': '022330',\n", + " 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png',\n", + " 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png',\n", + " 'profile_background_tile': False,\n", + " 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg',\n", + " 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg',\n", + " 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954',\n", + " 'profile_link_color': '0084B4',\n", + " 'profile_sidebar_border_color': 'FFFFFF',\n", + " 'profile_sidebar_fill_color': 'C0DFEC',\n", + " 'profile_text_color': '333333',\n", + " 'profile_use_background_image': True,\n", + " 'has_extended_profile': True,\n", + " 'default_profile': False,\n", + " 'default_profile_image': False,\n", + " 'following': False,\n", + " 'follow_request_sent': False,\n", + " 'notifications': False,\n", + " 'translator_type': 'regular',\n", + " 'suspended': False,\n", + " 'needs_phone_verification': False}" ] }, - "execution_count": 14, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "from datetime import datetime\n", + "import traceback\n", + "import re\n", + "\n", + "from pymongo import MongoClient\n", + "import tweepy\n", "from tweepy import API, OAuthHandler\n", "\n", "\n", + "mongo = MongoClient(\"localhost\", 27017)\n", + "tweets = mongo['twitter']['tweets']\n", + "\n", "auth = OAuthHandler(prd.CONSUMER_KEY, prd.CONSUMER_SECRET)\n", "auth.set_access_token(prd.ACCESS_TOKEN, prd.ACCESS_TOKEN_SECRET)\n", - "api = API(auth, wait_on_rate_limit=True)\n", + "api = API(auth, wait_on_rate_limit=True, parser=tweepy.parsers.JSONParser())\n", "api.me()" ] }, { "cell_type": "code", - "execution_count": 42, - "metadata": {}, + "execution_count": 4, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { "text/plain": [ - "[Status(_api=, _json={'created_at': 'Fri Jun 21 06:23:44 +0000 2019', 'id': 1141954835958259712, 'id_str': '1141954835958259712', 'text': '市里是简单的粗暴的订了一个罚款和征信规则,然后把压力全部扔给街道,街道目前的做法是要求楼组长和党员起带头作用,主动轮班做志愿者(就是问你是什么垃圾的那些阿姨)。个别富裕区会提供一些现金奖励,但是哪一个看上去都不像是长久之策,比如已经有人去市长热线举报志愿者不作为,不帮他分捡垃圾了', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': 1141934448256008192, 'in_reply_to_status_id_str': '1141934448256008192', 'in_reply_to_user_id': 105351466, 'in_reply_to_user_id_str': '105351466', 'in_reply_to_screen_name': 'ppcelery', 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 0, 'favorite_count': 10, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 6, 23, 44), id=1141954835958259712, id_str='1141954835958259712', text='市里是简单的粗暴的订了一个罚款和征信规则,然后把压力全部扔给街道,街道目前的做法是要求楼组长和党员起带头作用,主动轮班做志愿者(就是问你是什么垃圾的那些阿姨)。个别富裕区会提供一些现金奖励,但是哪一个看上去都不像是长久之策,比如已经有人去市长热线举报志愿者不作为,不帮他分捡垃圾了', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=1141934448256008192, in_reply_to_status_id_str='1141934448256008192', in_reply_to_user_id=105351466, in_reply_to_user_id_str='105351466', in_reply_to_screen_name='ppcelery', author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=0, favorite_count=10, favorited=False, retweeted=False, lang='zh'),\n", - " Status(_api=, _json={'created_at': 'Fri Jun 21 05:22:38 +0000 2019', 'id': 1141939461363654656, 'id_str': '1141939461363654656', 'text': '你们有些人说话真脏,受过教育吗?mute 都 mute 不过来。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 1, 'favorite_count': 2, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 5, 22, 38), id=1141939461363654656, id_str='1141939461363654656', text='你们有些人说话真脏,受过教育吗?mute 都 mute 不过来。', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=1, favorite_count=2, favorited=False, retweeted=False, lang='zh'),\n", - " Status(_api=, _json={'created_at': 'Fri Jun 21 05:20:37 +0000 2019', 'id': 1141938954909831169, 'id_str': '1141938954909831169', 'text': '@libearal 那厢毕竟还有空气污染的大背景。而且你何必加最后这句话呢。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'libearal', 'name': '摸鱼熊', 'id': 48307320, 'id_str': '48307320', 'indices': [0, 9]}], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': 1141937658823708672, 'in_reply_to_status_id_str': '1141937658823708672', 'in_reply_to_user_id': 48307320, 'in_reply_to_user_id_str': '48307320', 'in_reply_to_screen_name': 'libearal', 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 0, 'favorite_count': 2, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 5, 20, 37), id=1141938954909831169, id_str='1141938954909831169', text='@libearal 那厢毕竟还有空气污染的大背景。而且你何必加最后这句话呢。', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'libearal', 'name': '摸鱼熊', 'id': 48307320, 'id_str': '48307320', 'indices': [0, 9]}], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=1141937658823708672, in_reply_to_status_id_str='1141937658823708672', in_reply_to_user_id=48307320, in_reply_to_user_id_str='48307320', in_reply_to_screen_name='libearal', author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=0, favorite_count=2, favorited=False, retweeted=False, lang='zh'),\n", - " Status(_api=, _json={'created_at': 'Fri Jun 21 05:02:43 +0000 2019', 'id': 1141934448256008192, 'id_str': '1141934448256008192', 'text': '垃圾分类这事我最震惊的是,如此巨大的一件会牵涉到上千万人生活的政策,经过短短 1-2 月的宣传后就立刻实施了,并且迅速地跟进了配套的惩罚方案,上千万的守法居民一夜之间就变成潜在违规人群,在罚款和征信的威逼下被迫改变。没有解释,没有探讨,让你们干嘛,就干嘛。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': 1141933091847491584, 'in_reply_to_status_id_str': '1141933091847491584', 'in_reply_to_user_id': 105351466, 'in_reply_to_user_id_str': '105351466', 'in_reply_to_screen_name': 'ppcelery', 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 30, 'favorite_count': 47, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 5, 2, 43), id=1141934448256008192, id_str='1141934448256008192', text='垃圾分类这事我最震惊的是,如此巨大的一件会牵涉到上千万人生活的政策,经过短短 1-2 月的宣传后就立刻实施了,并且迅速地跟进了配套的惩罚方案,上千万的守法居民一夜之间就变成潜在违规人群,在罚款和征信的威逼下被迫改变。没有解释,没有探讨,让你们干嘛,就干嘛。', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=1141933091847491584, in_reply_to_status_id_str='1141933091847491584', in_reply_to_user_id=105351466, in_reply_to_user_id_str='105351466', in_reply_to_screen_name='ppcelery', author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=30, favorite_count=47, favorited=False, retweeted=False, lang='zh'),\n", - " Status(_api=, _json={'created_at': 'Fri Jun 21 04:57:19 +0000 2019', 'id': 1141933091847491584, 'id_str': '1141933091847491584', 'text': '小区收垃圾时间到 20 点为止,这是我 23:30 拍到的,以前整洁的小区现在就变成了这样,更别提湿垃圾的异味。 https://t.co/xmb193rcNE', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [], 'media': [{'id': 1141933076546633729, 'id_str': '1141933076546633729', 'indices': [57, 80], 'media_url': 'http://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'url': 'https://t.co/xmb193rcNE', 'display_url': 'pic.twitter.com/xmb193rcNE', 'expanded_url': 'https://twitter.com/ppcelery/status/1141933091847491584/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'medium': {'w': 900, 'h': 1200, 'resize': 'fit'}, 'large': {'w': 1536, 'h': 2048, 'resize': 'fit'}, 'small': {'w': 510, 'h': 680, 'resize': 'fit'}}}]}, 'extended_entities': {'media': [{'id': 1141933076546633729, 'id_str': '1141933076546633729', 'indices': [57, 80], 'media_url': 'http://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'url': 'https://t.co/xmb193rcNE', 'display_url': 'pic.twitter.com/xmb193rcNE', 'expanded_url': 'https://twitter.com/ppcelery/status/1141933091847491584/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'medium': {'w': 900, 'h': 1200, 'resize': 'fit'}, 'large': {'w': 1536, 'h': 2048, 'resize': 'fit'}, 'small': {'w': 510, 'h': 680, 'resize': 'fit'}}}]}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 11, 'favorite_count': 15, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 4, 57, 19), id=1141933091847491584, id_str='1141933091847491584', text='小区收垃圾时间到 20 点为止,这是我 23:30 拍到的,以前整洁的小区现在就变成了这样,更别提湿垃圾的异味。 https://t.co/xmb193rcNE', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [], 'media': [{'id': 1141933076546633729, 'id_str': '1141933076546633729', 'indices': [57, 80], 'media_url': 'http://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'url': 'https://t.co/xmb193rcNE', 'display_url': 'pic.twitter.com/xmb193rcNE', 'expanded_url': 'https://twitter.com/ppcelery/status/1141933091847491584/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'medium': {'w': 900, 'h': 1200, 'resize': 'fit'}, 'large': {'w': 1536, 'h': 2048, 'resize': 'fit'}, 'small': {'w': 510, 'h': 680, 'resize': 'fit'}}}]}, extended_entities={'media': [{'id': 1141933076546633729, 'id_str': '1141933076546633729', 'indices': [57, 80], 'media_url': 'http://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9j2FTjUwAE5go1.jpg', 'url': 'https://t.co/xmb193rcNE', 'display_url': 'pic.twitter.com/xmb193rcNE', 'expanded_url': 'https://twitter.com/ppcelery/status/1141933091847491584/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'medium': {'w': 900, 'h': 1200, 'resize': 'fit'}, 'large': {'w': 1536, 'h': 2048, 'resize': 'fit'}, 'small': {'w': 510, 'h': 680, 'resize': 'fit'}}}]}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=11, favorite_count=15, favorited=False, retweeted=False, possibly_sensitive=False, lang='zh'),\n", - " Status(_api=, _json={'created_at': 'Fri Jun 21 04:00:40 +0000 2019', 'id': 1141918835093585920, 'id_str': '1141918835093585920', 'text': 'RT @waylybaye: LeanCloud 真惨,域名直接被“行政命令”给停了,看起来短期内都恢复不了了… 「熊猫吃短信」用了 LC 的存储,受此影响近期将无法进行喂养,但不影响过滤。我之所以用 LC 而不是自己搭 API 是因为不用备案…(好像猜到为啥被搞了?不过国内各…', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'waylybaye', 'name': 'Baye', 'id': 24124203, 'id_str': '24124203', 'indices': [3, 13]}], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'retweeted_status': {'created_at': 'Fri Jun 21 03:58:22 +0000 2019', 'id': 1141918253851107329, 'id_str': '1141918253851107329', 'text': 'LeanCloud 真惨,域名直接被“行政命令”给停了,看起来短期内都恢复不了了… 「熊猫吃短信」用了 LC 的存储,受此影响近期将无法进行喂养,但不影响过滤。我之所以用 LC 而不是自己搭 API 是因为不用备案…(好像猜到为啥… https://t.co/wiXbFn6zLJ', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/wiXbFn6zLJ', 'expanded_url': 'https://twitter.com/i/web/status/1141918253851107329', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 24124203, 'id_str': '24124203', 'name': 'Baye', 'screen_name': 'waylybaye', 'location': '中华人民共和国', 'description': '全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', 'url': 'https://t.co/LdAwuSaz1e', 'entities': {'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 10828, 'friends_count': 245, 'listed_count': 121, 'created_at': 'Fri Mar 13 04:05:00 +0000 2009', 'favourites_count': 559, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 1198, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '1A1B1F', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_link_color': '2FC2EF', 'profile_sidebar_border_color': '181A1E', 'profile_sidebar_fill_color': '252429', 'profile_text_color': '666666', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': True, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 18, 'favorite_count': 34, 'favorited': False, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'zh'}, 'is_quote_status': False, 'retweet_count': 18, 'favorite_count': 0, 'favorited': False, 'retweeted': True, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 4, 0, 40), id=1141918835093585920, id_str='1141918835093585920', text='RT @waylybaye: LeanCloud 真惨,域名直接被“行政命令”给停了,看起来短期内都恢复不了了… 「熊猫吃短信」用了 LC 的存储,受此影响近期将无法进行喂养,但不影响过滤。我之所以用 LC 而不是自己搭 API 是因为不用备案…(好像猜到为啥被搞了?不过国内各…', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'waylybaye', 'name': 'Baye', 'id': 24124203, 'id_str': '24124203', 'indices': [3, 13]}], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, retweeted_status=Status(_api=, _json={'created_at': 'Fri Jun 21 03:58:22 +0000 2019', 'id': 1141918253851107329, 'id_str': '1141918253851107329', 'text': 'LeanCloud 真惨,域名直接被“行政命令”给停了,看起来短期内都恢复不了了… 「熊猫吃短信」用了 LC 的存储,受此影响近期将无法进行喂养,但不影响过滤。我之所以用 LC 而不是自己搭 API 是因为不用备案…(好像猜到为啥… https://t.co/wiXbFn6zLJ', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/wiXbFn6zLJ', 'expanded_url': 'https://twitter.com/i/web/status/1141918253851107329', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 24124203, 'id_str': '24124203', 'name': 'Baye', 'screen_name': 'waylybaye', 'location': '中华人民共和国', 'description': '全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', 'url': 'https://t.co/LdAwuSaz1e', 'entities': {'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 10828, 'friends_count': 245, 'listed_count': 121, 'created_at': 'Fri Mar 13 04:05:00 +0000 2009', 'favourites_count': 559, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 1198, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '1A1B1F', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_link_color': '2FC2EF', 'profile_sidebar_border_color': '181A1E', 'profile_sidebar_fill_color': '252429', 'profile_text_color': '666666', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': True, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 18, 'favorite_count': 34, 'favorited': False, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 3, 58, 22), id=1141918253851107329, id_str='1141918253851107329', text='LeanCloud 真惨,域名直接被“行政命令”给停了,看起来短期内都恢复不了了… 「熊猫吃短信」用了 LC 的存储,受此影响近期将无法进行喂养,但不影响过滤。我之所以用 LC 而不是自己搭 API 是因为不用备案…(好像猜到为啥… https://t.co/wiXbFn6zLJ', truncated=True, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/wiXbFn6zLJ', 'expanded_url': 'https://twitter.com/i/web/status/1141918253851107329', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}]}, source='Twitter Web Client', source_url='http://twitter.com', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 24124203, 'id_str': '24124203', 'name': 'Baye', 'screen_name': 'waylybaye', 'location': '中华人民共和国', 'description': '全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', 'url': 'https://t.co/LdAwuSaz1e', 'entities': {'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 10828, 'friends_count': 245, 'listed_count': 121, 'created_at': 'Fri Mar 13 04:05:00 +0000 2009', 'favourites_count': 559, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 1198, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '1A1B1F', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_link_color': '2FC2EF', 'profile_sidebar_border_color': '181A1E', 'profile_sidebar_fill_color': '252429', 'profile_text_color': '666666', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': True, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=24124203, id_str='24124203', name='Baye', screen_name='waylybaye', location='中华人民共和国', description='全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', url='https://t.co/LdAwuSaz1e', entities={'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=10828, friends_count=245, listed_count=121, created_at=datetime.datetime(2009, 3, 13, 4, 5), favourites_count=559, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=1198, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='1A1B1F', profile_background_image_url='http://abs.twimg.com/images/themes/theme9/bg.gif', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme9/bg.gif', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', profile_link_color='2FC2EF', profile_sidebar_border_color='181A1E', profile_sidebar_fill_color='252429', profile_text_color='666666', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=True, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 24124203, 'id_str': '24124203', 'name': 'Baye', 'screen_name': 'waylybaye', 'location': '中华人民共和国', 'description': '全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', 'url': 'https://t.co/LdAwuSaz1e', 'entities': {'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 10828, 'friends_count': 245, 'listed_count': 121, 'created_at': 'Fri Mar 13 04:05:00 +0000 2009', 'favourites_count': 559, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 1198, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '1A1B1F', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme9/bg.gif', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', 'profile_link_color': '2FC2EF', 'profile_sidebar_border_color': '181A1E', 'profile_sidebar_fill_color': '252429', 'profile_text_color': '666666', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': True, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=24124203, id_str='24124203', name='Baye', screen_name='waylybaye', location='中华人民共和国', description='全干工程师,独立开发者。HyperApp/Ping\\n---- ↓ 2009 年的----\\n程序员 | Pythoner | Vimer | Android | \\uf8ff Mac | Kindle | 互联网追梦人', url='https://t.co/LdAwuSaz1e', entities={'url': {'urls': [{'url': 'https://t.co/LdAwuSaz1e', 'expanded_url': 'http://baye.wayly.net', 'display_url': 'baye.wayly.net', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=10828, friends_count=245, listed_count=121, created_at=datetime.datetime(2009, 3, 13, 4, 5), favourites_count=559, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=1198, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='1A1B1F', profile_background_image_url='http://abs.twimg.com/images/themes/theme9/bg.gif', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme9/bg.gif', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/676003792966455296/MRkYhxo6_normal.jpg', profile_link_color='2FC2EF', profile_sidebar_border_color='181A1E', profile_sidebar_fill_color='252429', profile_text_color='666666', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=True, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=18, favorite_count=34, favorited=False, retweeted=True, possibly_sensitive=False, lang='zh'), is_quote_status=False, retweet_count=18, favorite_count=0, favorited=False, retweeted=True, lang='zh'),\n", - " Status(_api=, _json={'created_at': 'Fri Jun 21 03:35:53 +0000 2019', 'id': 1141912596917784577, 'id_str': '1141912596917784577', 'text': 'RT @ABCPolitics: \"Your indifference cost these men and women their most valuable commodity: time.\"\\n\\nJon Stewart receives a standing ovation…', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'ABCPolitics', 'name': 'ABC News Politics', 'id': 16815644, 'id_str': '16815644', 'indices': [3, 15]}], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'retweeted_status': {'created_at': 'Tue Jun 11 15:51:45 +0000 2019', 'id': 1138473904954101761, 'id_str': '1138473904954101761', 'text': '\"Your indifference cost these men and women their most valuable commodity: time.\"\\n\\nJon Stewart receives a standing… https://t.co/Sztf47gepG', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/Sztf47gepG', 'expanded_url': 'https://twitter.com/i/web/status/1138473904954101761', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [116, 139]}]}, 'source': 'Twitter Media Studio', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 16815644, 'id_str': '16815644', 'name': 'ABC News Politics', 'screen_name': 'ABCPolitics', 'location': 'Washington, DC', 'description': \"Reports from @ABC News' political team.\", 'url': 'https://t.co/SO3M0qceOH', 'entities': {'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 751512, 'friends_count': 476, 'listed_count': 6336, 'created_at': 'Thu Oct 16 22:43:16 +0000 2008', 'favourites_count': 72, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 126565, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': 'FFFFFF', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16815644/1401371089', 'profile_link_color': '336699', 'profile_sidebar_border_color': 'B7CFDE', 'profile_sidebar_fill_color': '88A0B3', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 81625, 'favorite_count': 245515, 'favorited': False, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'en'}, 'is_quote_status': False, 'retweet_count': 81625, 'favorite_count': 0, 'favorited': False, 'retweeted': True, 'lang': 'en'}, created_at=datetime.datetime(2019, 6, 21, 3, 35, 53), id=1141912596917784577, id_str='1141912596917784577', text='RT @ABCPolitics: \"Your indifference cost these men and women their most valuable commodity: time.\"\\n\\nJon Stewart receives a standing ovation…', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'ABCPolitics', 'name': 'ABC News Politics', 'id': 16815644, 'id_str': '16815644', 'indices': [3, 15]}], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, retweeted_status=Status(_api=, _json={'created_at': 'Tue Jun 11 15:51:45 +0000 2019', 'id': 1138473904954101761, 'id_str': '1138473904954101761', 'text': '\"Your indifference cost these men and women their most valuable commodity: time.\"\\n\\nJon Stewart receives a standing… https://t.co/Sztf47gepG', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/Sztf47gepG', 'expanded_url': 'https://twitter.com/i/web/status/1138473904954101761', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [116, 139]}]}, 'source': 'Twitter Media Studio', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 16815644, 'id_str': '16815644', 'name': 'ABC News Politics', 'screen_name': 'ABCPolitics', 'location': 'Washington, DC', 'description': \"Reports from @ABC News' political team.\", 'url': 'https://t.co/SO3M0qceOH', 'entities': {'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 751512, 'friends_count': 476, 'listed_count': 6336, 'created_at': 'Thu Oct 16 22:43:16 +0000 2008', 'favourites_count': 72, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 126565, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': 'FFFFFF', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16815644/1401371089', 'profile_link_color': '336699', 'profile_sidebar_border_color': 'B7CFDE', 'profile_sidebar_fill_color': '88A0B3', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 81625, 'favorite_count': 245515, 'favorited': False, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'en'}, created_at=datetime.datetime(2019, 6, 11, 15, 51, 45), id=1138473904954101761, id_str='1138473904954101761', text='\"Your indifference cost these men and women their most valuable commodity: time.\"\\n\\nJon Stewart receives a standing… https://t.co/Sztf47gepG', truncated=True, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/Sztf47gepG', 'expanded_url': 'https://twitter.com/i/web/status/1138473904954101761', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [116, 139]}]}, source='Twitter Media Studio', source_url='https://studio.twitter.com', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 16815644, 'id_str': '16815644', 'name': 'ABC News Politics', 'screen_name': 'ABCPolitics', 'location': 'Washington, DC', 'description': \"Reports from @ABC News' political team.\", 'url': 'https://t.co/SO3M0qceOH', 'entities': {'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 751512, 'friends_count': 476, 'listed_count': 6336, 'created_at': 'Thu Oct 16 22:43:16 +0000 2008', 'favourites_count': 72, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 126565, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': 'FFFFFF', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16815644/1401371089', 'profile_link_color': '336699', 'profile_sidebar_border_color': 'B7CFDE', 'profile_sidebar_fill_color': '88A0B3', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, id=16815644, id_str='16815644', name='ABC News Politics', screen_name='ABCPolitics', location='Washington, DC', description=\"Reports from @ABC News' political team.\", url='https://t.co/SO3M0qceOH', entities={'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=751512, friends_count=476, listed_count=6336, created_at=datetime.datetime(2008, 10, 16, 22, 43, 16), favourites_count=72, utc_offset=None, time_zone=None, geo_enabled=False, verified=True, statuses_count=126565, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='FFFFFF', profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/16815644/1401371089', profile_link_color='336699', profile_sidebar_border_color='B7CFDE', profile_sidebar_fill_color='88A0B3', profile_text_color='000000', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='none'), user=User(_api=, _json={'id': 16815644, 'id_str': '16815644', 'name': 'ABC News Politics', 'screen_name': 'ABCPolitics', 'location': 'Washington, DC', 'description': \"Reports from @ABC News' political team.\", 'url': 'https://t.co/SO3M0qceOH', 'entities': {'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 751512, 'friends_count': 476, 'listed_count': 6336, 'created_at': 'Thu Oct 16 22:43:16 +0000 2008', 'favourites_count': 72, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': True, 'statuses_count': 126565, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': 'FFFFFF', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16815644/1401371089', 'profile_link_color': '336699', 'profile_sidebar_border_color': 'B7CFDE', 'profile_sidebar_fill_color': '88A0B3', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, id=16815644, id_str='16815644', name='ABC News Politics', screen_name='ABCPolitics', location='Washington, DC', description=\"Reports from @ABC News' political team.\", url='https://t.co/SO3M0qceOH', entities={'url': {'urls': [{'url': 'https://t.co/SO3M0qceOH', 'expanded_url': 'http://abcnews.go.com/politics', 'display_url': 'abcnews.go.com/politics', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=751512, friends_count=476, listed_count=6336, created_at=datetime.datetime(2008, 10, 16, 22, 43, 16), favourites_count=72, utc_offset=None, time_zone=None, geo_enabled=False, verified=True, statuses_count=126565, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='FFFFFF', profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1083377873811984386/EONbRz3x_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/16815644/1401371089', profile_link_color='336699', profile_sidebar_border_color='B7CFDE', profile_sidebar_fill_color='88A0B3', profile_text_color='000000', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='none'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=81625, favorite_count=245515, favorited=False, retweeted=True, possibly_sensitive=False, lang='en'), is_quote_status=False, retweet_count=81625, favorite_count=0, favorited=False, retweeted=True, lang='en'),\n", - " Status(_api=, _json={'created_at': 'Fri Jun 21 02:01:22 +0000 2019', 'id': 1141888812131295232, 'id_str': '1141888812131295232', 'text': '不太能理解这种设计,明明一个简单的 json 就可以解决问题,为什么要实现成这么复杂的方式,学习成本大不说,迁移成本也奇高,甚至还不如拿 httpclient 简单的写一个 post 请求… https://t.co/q9PsdQc8ic', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [], 'media': [{'id': 1141888805575639040, 'id_str': '1141888805575639040', 'indices': [96, 119], 'media_url': 'http://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'url': 'https://t.co/q9PsdQc8ic', 'display_url': 'pic.twitter.com/q9PsdQc8ic', 'expanded_url': 'https://twitter.com/ppcelery/status/1141888812131295232/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 576, 'h': 189, 'resize': 'fit'}, 'large': {'w': 576, 'h': 189, 'resize': 'fit'}, 'medium': {'w': 576, 'h': 189, 'resize': 'fit'}}}]}, 'extended_entities': {'media': [{'id': 1141888805575639040, 'id_str': '1141888805575639040', 'indices': [96, 119], 'media_url': 'http://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'url': 'https://t.co/q9PsdQc8ic', 'display_url': 'pic.twitter.com/q9PsdQc8ic', 'expanded_url': 'https://twitter.com/ppcelery/status/1141888812131295232/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 576, 'h': 189, 'resize': 'fit'}, 'large': {'w': 576, 'h': 189, 'resize': 'fit'}, 'medium': {'w': 576, 'h': 189, 'resize': 'fit'}}}]}, 'source': 'Twitter Web App', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 0, 'favorite_count': 6, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 21, 2, 1, 22), id=1141888812131295232, id_str='1141888812131295232', text='不太能理解这种设计,明明一个简单的 json 就可以解决问题,为什么要实现成这么复杂的方式,学习成本大不说,迁移成本也奇高,甚至还不如拿 httpclient 简单的写一个 post 请求… https://t.co/q9PsdQc8ic', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [], 'media': [{'id': 1141888805575639040, 'id_str': '1141888805575639040', 'indices': [96, 119], 'media_url': 'http://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'url': 'https://t.co/q9PsdQc8ic', 'display_url': 'pic.twitter.com/q9PsdQc8ic', 'expanded_url': 'https://twitter.com/ppcelery/status/1141888812131295232/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 576, 'h': 189, 'resize': 'fit'}, 'large': {'w': 576, 'h': 189, 'resize': 'fit'}, 'medium': {'w': 576, 'h': 189, 'resize': 'fit'}}}]}, extended_entities={'media': [{'id': 1141888805575639040, 'id_str': '1141888805575639040', 'indices': [96, 119], 'media_url': 'http://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'media_url_https': 'https://pbs.twimg.com/media/D9jN0ZVUwAAA5C2.jpg', 'url': 'https://t.co/q9PsdQc8ic', 'display_url': 'pic.twitter.com/q9PsdQc8ic', 'expanded_url': 'https://twitter.com/ppcelery/status/1141888812131295232/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 576, 'h': 189, 'resize': 'fit'}, 'large': {'w': 576, 'h': 189, 'resize': 'fit'}, 'medium': {'w': 576, 'h': 189, 'resize': 'fit'}}}]}, source='Twitter Web App', source_url='https://mobile.twitter.com', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=0, favorite_count=6, favorited=False, retweeted=False, possibly_sensitive=False, lang='zh'),\n", - " Status(_api=, _json={'created_at': 'Fri Jun 21 01:08:42 +0000 2019', 'id': 1141875556763328513, 'id_str': '1141875556763328513', 'text': 'RT @pickover: Mathematics, geometry, witchcraft, and the structure of reality. (A plug gets caught under a table.) https://t.co/us2zEHL1XV…', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'pickover', 'name': 'Cliff Pickover', 'id': 16176754, 'id_str': '16176754', 'indices': [3, 12]}], 'urls': [{'url': 'https://t.co/us2zEHL1XV', 'expanded_url': 'https://tinyurl.com/y32l8eaf', 'display_url': 'tinyurl.com/y32l8eaf', 'indices': [115, 138]}]}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'retweeted_status': {'created_at': 'Tue Jun 18 11:51:40 +0000 2019', 'id': 1140950202532151296, 'id_str': '1140950202532151296', 'text': 'Mathematics, geometry, witchcraft, and the structure of reality. (A plug gets caught under a table.)… https://t.co/5EeSVwCJsa', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/5EeSVwCJsa', 'expanded_url': 'https://twitter.com/i/web/status/1140950202532151296', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [102, 125]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 16176754, 'id_str': '16176754', 'name': 'Cliff Pickover', 'screen_name': 'pickover', 'location': 'New York', 'description': 'Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', 'url': 'http://t.co/t3Z2fp6vBu', 'entities': {'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 34157, 'friends_count': 50, 'listed_count': 1543, 'created_at': 'Mon Sep 08 01:27:56 +0000 2008', 'favourites_count': 1426, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': False, 'statuses_count': 51386, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '000000', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16176754/1398256311', 'profile_link_color': '0000FF', 'profile_sidebar_border_color': '87BC44', 'profile_sidebar_fill_color': '8EA8F5', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 4395, 'favorite_count': 10554, 'favorited': True, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'en'}, 'is_quote_status': False, 'retweet_count': 4395, 'favorite_count': 0, 'favorited': True, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'en'}, created_at=datetime.datetime(2019, 6, 21, 1, 8, 42), id=1141875556763328513, id_str='1141875556763328513', text='RT @pickover: Mathematics, geometry, witchcraft, and the structure of reality. (A plug gets caught under a table.) https://t.co/us2zEHL1XV…', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'pickover', 'name': 'Cliff Pickover', 'id': 16176754, 'id_str': '16176754', 'indices': [3, 12]}], 'urls': [{'url': 'https://t.co/us2zEHL1XV', 'expanded_url': 'https://tinyurl.com/y32l8eaf', 'display_url': 'tinyurl.com/y32l8eaf', 'indices': [115, 138]}]}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, retweeted_status=Status(_api=, _json={'created_at': 'Tue Jun 18 11:51:40 +0000 2019', 'id': 1140950202532151296, 'id_str': '1140950202532151296', 'text': 'Mathematics, geometry, witchcraft, and the structure of reality. (A plug gets caught under a table.)… https://t.co/5EeSVwCJsa', 'truncated': True, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/5EeSVwCJsa', 'expanded_url': 'https://twitter.com/i/web/status/1140950202532151296', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [102, 125]}]}, 'source': 'Twitter Web Client', 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 'user': {'id': 16176754, 'id_str': '16176754', 'name': 'Cliff Pickover', 'screen_name': 'pickover', 'location': 'New York', 'description': 'Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', 'url': 'http://t.co/t3Z2fp6vBu', 'entities': {'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 34157, 'friends_count': 50, 'listed_count': 1543, 'created_at': 'Mon Sep 08 01:27:56 +0000 2008', 'favourites_count': 1426, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': False, 'statuses_count': 51386, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '000000', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16176754/1398256311', 'profile_link_color': '0000FF', 'profile_sidebar_border_color': '87BC44', 'profile_sidebar_fill_color': '8EA8F5', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 4395, 'favorite_count': 10554, 'favorited': True, 'retweeted': True, 'possibly_sensitive': False, 'lang': 'en'}, created_at=datetime.datetime(2019, 6, 18, 11, 51, 40), id=1140950202532151296, id_str='1140950202532151296', text='Mathematics, geometry, witchcraft, and the structure of reality. (A plug gets caught under a table.)… https://t.co/5EeSVwCJsa', truncated=True, entities={'hashtags': [], 'symbols': [], 'user_mentions': [], 'urls': [{'url': 'https://t.co/5EeSVwCJsa', 'expanded_url': 'https://twitter.com/i/web/status/1140950202532151296', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [102, 125]}]}, source='Twitter Web Client', source_url='http://twitter.com', in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=, _json={'id': 16176754, 'id_str': '16176754', 'name': 'Cliff Pickover', 'screen_name': 'pickover', 'location': 'New York', 'description': 'Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', 'url': 'http://t.co/t3Z2fp6vBu', 'entities': {'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 34157, 'friends_count': 50, 'listed_count': 1543, 'created_at': 'Mon Sep 08 01:27:56 +0000 2008', 'favourites_count': 1426, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': False, 'statuses_count': 51386, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '000000', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16176754/1398256311', 'profile_link_color': '0000FF', 'profile_sidebar_border_color': '87BC44', 'profile_sidebar_fill_color': '8EA8F5', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, id=16176754, id_str='16176754', name='Cliff Pickover', screen_name='pickover', location='New York', description='Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', url='http://t.co/t3Z2fp6vBu', entities={'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, protected=False, followers_count=34157, friends_count=50, listed_count=1543, created_at=datetime.datetime(2008, 9, 8, 1, 27, 56), favourites_count=1426, utc_offset=None, time_zone=None, geo_enabled=False, verified=False, statuses_count=51386, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='000000', profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/16176754/1398256311', profile_link_color='0000FF', profile_sidebar_border_color='87BC44', profile_sidebar_fill_color='8EA8F5', profile_text_color='000000', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='none'), user=User(_api=, _json={'id': 16176754, 'id_str': '16176754', 'name': 'Cliff Pickover', 'screen_name': 'pickover', 'location': 'New York', 'description': 'Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', 'url': 'http://t.co/t3Z2fp6vBu', 'entities': {'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 34157, 'friends_count': 50, 'listed_count': 1543, 'created_at': 'Mon Sep 08 01:27:56 +0000 2008', 'favourites_count': 1426, 'utc_offset': None, 'time_zone': None, 'geo_enabled': False, 'verified': False, 'statuses_count': 51386, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '000000', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/16176754/1398256311', 'profile_link_color': '0000FF', 'profile_sidebar_border_color': '87BC44', 'profile_sidebar_fill_color': '8EA8F5', 'profile_text_color': '000000', 'profile_use_background_image': True, 'has_extended_profile': False, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'none'}, id=16176754, id_str='16176754', name='Cliff Pickover', screen_name='pickover', location='New York', description='Increase your sense of wonder. Author of 50 books & 580 patents. Yale Ph.D. \"Pickover contemplates realms beyond our known reality.\" ~NY Times', url='http://t.co/t3Z2fp6vBu', entities={'url': {'urls': [{'url': 'http://t.co/t3Z2fp6vBu', 'expanded_url': 'http://www.pickover.com', 'display_url': 'pickover.com', 'indices': [0, 22]}]}, 'description': {'urls': []}}, protected=False, followers_count=34157, friends_count=50, listed_count=1543, created_at=datetime.datetime(2008, 9, 8, 1, 27, 56), favourites_count=1426, utc_offset=None, time_zone=None, geo_enabled=False, verified=False, statuses_count=51386, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='000000', profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/69072946/twitter3_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/16176754/1398256311', profile_link_color='0000FF', profile_sidebar_border_color='87BC44', profile_sidebar_fill_color='8EA8F5', profile_text_color='000000', profile_use_background_image=True, has_extended_profile=False, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='none'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=4395, favorite_count=10554, favorited=True, retweeted=True, possibly_sensitive=False, lang='en'), is_quote_status=False, retweet_count=4395, favorite_count=0, favorited=True, retweeted=True, possibly_sensitive=False, lang='en'),\n", - " Status(_api=, _json={'created_at': 'Thu Jun 20 15:27:12 +0000 2019', 'id': 1141729217580679171, 'id_str': '1141729217580679171', 'text': '@inspirehep23 所以为了应景买了个蛋糕来吃。', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'inspirehep23', 'name': '秋色以晚', 'id': 3028250728, 'id_str': '3028250728', 'indices': [0, 13]}], 'urls': []}, 'source': 'Twitter for iPhone', 'in_reply_to_status_id': 1141713855271227392, 'in_reply_to_status_id_str': '1141713855271227392', 'in_reply_to_user_id': 3028250728, 'in_reply_to_user_id_str': '3028250728', 'in_reply_to_screen_name': 'inspirehep23', 'user': {'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'retweet_count': 0, 'favorite_count': 0, 'favorited': False, 'retweeted': False, 'lang': 'zh'}, created_at=datetime.datetime(2019, 6, 20, 15, 27, 12), id=1141729217580679171, id_str='1141729217580679171', text='@inspirehep23 所以为了应景买了个蛋糕来吃。', truncated=False, entities={'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'inspirehep23', 'name': '秋色以晚', 'id': 3028250728, 'id_str': '3028250728', 'indices': [0, 13]}], 'urls': []}, source='Twitter for iPhone', source_url='http://twitter.com/download/iphone', in_reply_to_status_id=1141713855271227392, in_reply_to_status_id_str='1141713855271227392', in_reply_to_user_id=3028250728, in_reply_to_user_id_str='3028250728', in_reply_to_screen_name='inspirehep23', author=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), user=User(_api=, _json={'id': 105351466, 'id_str': '105351466', 'name': 'Laisky', 'screen_name': 'ppcelery', 'location': '♥ Shanghai', 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。', 'url': 'https://t.co/tmLO9n4B1E', 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, 'protected': False, 'followers_count': 7492, 'friends_count': 227, 'listed_count': 132, 'created_at': 'Sat Jan 16 03:02:39 +0000 2010', 'favourites_count': 838, 'utc_offset': None, 'time_zone': None, 'geo_enabled': True, 'verified': False, 'statuses_count': 23800, 'lang': None, 'contributors_enabled': False, 'is_translator': False, 'is_translation_enabled': False, 'profile_background_color': '022330', 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png', 'profile_background_tile': False, 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954', 'profile_link_color': '0084B4', 'profile_sidebar_border_color': 'FFFFFF', 'profile_sidebar_fill_color': 'C0DFEC', 'profile_text_color': '333333', 'profile_use_background_image': True, 'has_extended_profile': True, 'default_profile': False, 'default_profile_image': False, 'following': False, 'follow_request_sent': False, 'notifications': False, 'translator_type': 'regular'}, id=105351466, id_str='105351466', name='Laisky', screen_name='ppcelery', location='♥ Shanghai', description='热爱文学的理科生,本质是一台高语速大存储的复读机。', url='https://t.co/tmLO9n4B1E', entities={'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E', 'expanded_url': 'https://about.me/laisky', 'display_url': 'about.me/laisky', 'indices': [0, 23]}]}, 'description': {'urls': []}}, protected=False, followers_count=7492, friends_count=227, listed_count=132, created_at=datetime.datetime(2010, 1, 16, 3, 2, 39), favourites_count=838, utc_offset=None, time_zone=None, geo_enabled=True, verified=False, statuses_count=23800, lang=None, contributors_enabled=False, is_translator=False, is_translation_enabled=False, profile_background_color='022330', profile_background_image_url='http://abs.twimg.com/images/themes/theme15/bg.png', profile_background_image_url_https='https://abs.twimg.com/images/themes/theme15/bg.png', profile_background_tile=False, profile_image_url='http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_image_url_https='https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg', profile_banner_url='https://pbs.twimg.com/profile_banners/105351466/1560991954', profile_link_color='0084B4', profile_sidebar_border_color='FFFFFF', profile_sidebar_fill_color='C0DFEC', profile_text_color='333333', profile_use_background_image=True, has_extended_profile=True, default_profile=False, default_profile_image=False, following=False, follow_request_sent=False, notifications=False, translator_type='regular'), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, retweet_count=0, favorite_count=0, favorited=False, retweeted=False, lang='zh')]" + "[{'created_at': 'Sat Jun 22 14:23:42 +0000 2019',\n", + " 'id': 1142438015064629249,\n", + " 'id_str': '1142438015064629249',\n", + " 'text': '@Steverezero 云备份。\\nwinter is coming, it may delay, but never absent.',\n", + " 'truncated': False,\n", + " 'entities': {'hashtags': [],\n", + " 'symbols': [],\n", + " 'user_mentions': [{'screen_name': 'Steverezero',\n", + " 'name': 'D-NARUTO',\n", + " 'id': 2246680200,\n", + " 'id_str': '2246680200',\n", + " 'indices': [0, 12]}],\n", + " 'urls': []},\n", + " 'source': 'Twitter Web App',\n", + " 'in_reply_to_status_id': 1142437378176405504,\n", + " 'in_reply_to_status_id_str': '1142437378176405504',\n", + " 'in_reply_to_user_id': 2246680200,\n", + " 'in_reply_to_user_id_str': '2246680200',\n", + " 'in_reply_to_screen_name': 'Steverezero',\n", + " 'user': {'id': 105351466,\n", + " 'id_str': '105351466',\n", + " 'name': 'Laisky',\n", + " 'screen_name': 'ppcelery',\n", + " 'location': '♥ Shanghai',\n", + " 'description': '热爱文学的理科生,本质是一台高语速大存储的复读机。',\n", + " 'url': 'https://t.co/tmLO9n4B1E',\n", + " 'entities': {'url': {'urls': [{'url': 'https://t.co/tmLO9n4B1E',\n", + " 'expanded_url': 'https://about.me/laisky',\n", + " 'display_url': 'about.me/laisky',\n", + " 'indices': [0, 23]}]},\n", + " 'description': {'urls': []}},\n", + " 'protected': False,\n", + " 'followers_count': 7541,\n", + " 'friends_count': 228,\n", + " 'listed_count': 133,\n", + " 'created_at': 'Sat Jan 16 03:02:39 +0000 2010',\n", + " 'favourites_count': 848,\n", + " 'utc_offset': None,\n", + " 'time_zone': None,\n", + " 'geo_enabled': True,\n", + " 'verified': False,\n", + " 'statuses_count': 21894,\n", + " 'lang': None,\n", + " 'contributors_enabled': False,\n", + " 'is_translator': False,\n", + " 'is_translation_enabled': False,\n", + " 'profile_background_color': '022330',\n", + " 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme15/bg.png',\n", + " 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme15/bg.png',\n", + " 'profile_background_tile': False,\n", + " 'profile_image_url': 'http://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg',\n", + " 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1141508587920871424/Xv6jOLul_normal.jpg',\n", + " 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/105351466/1560991954',\n", + " 'profile_link_color': '0084B4',\n", + " 'profile_sidebar_border_color': 'FFFFFF',\n", + " 'profile_sidebar_fill_color': 'C0DFEC',\n", + " 'profile_text_color': '333333',\n", + " 'profile_use_background_image': True,\n", + " 'has_extended_profile': True,\n", + " 'default_profile': False,\n", + " 'default_profile_image': False,\n", + " 'following': False,\n", + " 'follow_request_sent': False,\n", + " 'notifications': False,\n", + " 'translator_type': 'regular'},\n", + " 'geo': None,\n", + " 'coordinates': None,\n", + " 'place': None,\n", + " 'contributors': None,\n", + " 'is_quote_status': False,\n", + " 'retweet_count': 0,\n", + " 'favorite_count': 2,\n", + " 'favorited': False,\n", + " 'retweeted': False,\n", + " 'lang': 'en'}]" ] }, - "execution_count": 42, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "api.user_timeline(count=10)" + "api.user_timeline(count=1)" ] }, { @@ -135,15 +288,6 @@ "source": [ "# delete tweets\n", "\n", - "from datetime import datetime\n", - "import traceback\n", - "\n", - "from pymongo import MongoClient\n", - "\n", - "\n", - "mongo = MongoClient(\"localhost\", 27017)\n", - "tweets = mongo['twitter']['tweets']\n", - "\n", "\n", "def is_status_tobe_delete(tweet):\n", " if len(tweet.get('entities', {}).get(\"hashtags\", [])) >= 1:\n", @@ -188,35 +332,12 @@ "delete()" ] }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: '/a/v/c'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'/a'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'v'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/a/v/c'" - ] - } - ], - "source": [ - "from pathlib import Path\n", - "\n", - "\n", - "p = Path('/a', 'v', 'c')\n", - "open(p)" - ] - }, { "cell_type": "code", "execution_count": 67, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -274,6 +395,113 @@ "download_images()\n", " " ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "save tweet 482450130839142400\n", + "save tweet 314018018000777216\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 51\u001b[0;31m \u001b[0mdownload_relate_tweets\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mdownload_relate_tweets\u001b[0;34m()\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0mrelated_ids\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mid_\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mtweets\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind_one\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"id\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mid_\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrelated_ids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0mrelated_ts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mtwitter_api_parser\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mapi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mid_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrelated_ids\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mdocu\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrelated_ts\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"save tweet\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdocu\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'id'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0mrelated_ids\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mid_\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mtweets\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind_one\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"id\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mid_\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrelated_ids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0mrelated_ts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mtwitter_api_parser\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mapi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mid_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrelated_ids\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mdocu\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrelated_ts\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"save tweet\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdocu\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'id'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m(id_)\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0mtweet\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"in_reply_to_status_id\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mrelated_ids\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtweet\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'in_reply_to_status_id'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0mtweet\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"retweeted\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mrelated_ids\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtweet\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'retweeted_status'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'id'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m \u001b[0mrelated_ids\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mid_\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mtweets\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind_one\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"id\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mid_\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrelated_ids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 40\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 41\u001b[0m \u001b[0mrelated_ts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mtwitter_api_parser\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mapi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid_\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mid_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrelated_ids\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/collection.py\u001b[0m in \u001b[0;36mfind_one\u001b[0;34m(self, filter, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1267\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1268\u001b[0m \u001b[0mcursor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilter\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1269\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcursor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlimit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1270\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1271\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/cursor.py\u001b[0m in \u001b[0;36mnext\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1223\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__empty\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1224\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mStopIteration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1225\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__data\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_refresh\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1226\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__manipulate\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1227\u001b[0m \u001b[0m_db\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__collection\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatabase\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/cursor.py\u001b[0m in \u001b[0;36m_refresh\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1138\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__session\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1139\u001b[0m self.__collection.database.client)\n\u001b[0;32m-> 1140\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__send_message\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1141\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__id\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# Get More\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1142\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__limit\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/cursor.py\u001b[0m in \u001b[0;36m__send_message\u001b[0;34m(self, operation)\u001b[0m\n\u001b[1;32m 952\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 953\u001b[0m response = client._send_message_with_response(\n\u001b[0;32m--> 954\u001b[0;31m operation, exhaust=self.__exhaust, address=self.__address)\n\u001b[0m\u001b[1;32m 955\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__address\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maddress\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 956\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__exhaust\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/mongo_client.py\u001b[0m in \u001b[0;36m_send_message_with_response\u001b[0;34m(self, operation, exhaust, address)\u001b[0m\n\u001b[1;32m 1175\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__all_credentials\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1176\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event_listeners\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1177\u001b[0;31m exhaust)\n\u001b[0m\u001b[1;32m 1178\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1179\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_reset_on_error\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mserver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/mongo_client.py\u001b[0m in \u001b[0;36m_reset_on_error\u001b[0;34m(self, server, func, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1186\u001b[0m \"\"\"\n\u001b[1;32m 1187\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1188\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1189\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mNetworkTimeout\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1190\u001b[0m \u001b[0;31m# The socket has been closed. Don't reset the server.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/server.py\u001b[0m in \u001b[0;36msend_message_with_response\u001b[0;34m(self, operation, set_slave_okay, all_credentials, listeners, exhaust)\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 105\u001b[0m \u001b[0msock_info\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend_message\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_doc_size\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 106\u001b[0;31m \u001b[0mreply\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msock_info\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreceive_message\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest_id\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 107\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mexc\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpublish\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/pool.py\u001b[0m in \u001b[0;36mreceive_message\u001b[0;34m(self, request_id)\u001b[0m\n\u001b[1;32m 615\u001b[0m self.max_message_size)\n\u001b[1;32m 616\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mBaseException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 617\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_raise_connection_failure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 618\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 619\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_raise_if_not_writable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0munacknowledged\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/pool.py\u001b[0m in \u001b[0;36m_raise_connection_failure\u001b[0;34m(self, error)\u001b[0m\n\u001b[1;32m 748\u001b[0m \u001b[0m_raise_connection_failure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maddress\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 749\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 750\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 751\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 752\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__eq__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/pool.py\u001b[0m in \u001b[0;36mreceive_message\u001b[0;34m(self, request_id)\u001b[0m\n\u001b[1;32m 613\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 614\u001b[0m return receive_message(self.sock, request_id,\n\u001b[0;32m--> 615\u001b[0;31m self.max_message_size)\n\u001b[0m\u001b[1;32m 616\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mBaseException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 617\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_raise_connection_failure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/network.py\u001b[0m in \u001b[0;36mreceive_message\u001b[0;34m(sock, request_id, max_message_size)\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0;31m# Ignore the response's request id.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m length, _, response_to, op_code = _UNPACK_HEADER(\n\u001b[0;32m--> 181\u001b[0;31m _receive_data_on_socket(sock, 16))\n\u001b[0m\u001b[1;32m 182\u001b[0m \u001b[0;31m# No request_id for exhaust cursor \"getMore\".\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrequest_id\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/36/lib/python3.6/site-packages/pymongo/network.py\u001b[0m in \u001b[0;36m_receive_data_on_socket\u001b[0;34m(sock, length)\u001b[0m\n\u001b[1;32m 238\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mbytes_read\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mlength\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 240\u001b[0;31m \u001b[0mchunk_length\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msock\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecv_into\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmv\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbytes_read\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 241\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mIOError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mOSError\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mexc\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 242\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0m_errno_from_exception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexc\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0merrno\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mEINTR\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "# download related tweets\n", + "\n", + "def twitter_api_parser(tweet):\n", + " reg_topic = re.compile(r\"[\\b|\\s]#(\\S+)\")\n", + " tweet['topics'] = reg_topic.findall(\n", + " tweet['text'].replace('.', '_')\n", + " )\n", + " tweet['created_at'] = datetime.strptime(\n", + " tweet['created_at'], '%a %b %d %H:%M:%S +0000 %Y'\n", + " )\n", + "\n", + " # replace url\n", + " t = tweet['text']\n", + " if 't.co' in t:\n", + " # parse entities media\n", + " if 'media' in tweet['entities']:\n", + " for media in tweet['entities']['media']:\n", + " surl = media['url']\n", + " eurl = media['media_url']\n", + " t = t.replace(surl, eurl)\n", + "\n", + " # parse entities urls\n", + " if 'urls' in tweet['entities']:\n", + " for d in tweet['entities']['urls']:\n", + " surl = d['url']\n", + " eurl = d['expanded_url']\n", + " t = t.replace(surl, eurl)\n", + "\n", + " tweet['text'] = t\n", + "\n", + " return tweet\n", + "\n", + "\n", + "def save_relate_tweets(status):\n", + " related_ids = []\n", + " status.get(\"in_reply_to_status_id\") and related_ids.append(status['in_reply_to_status_id'])\n", + " status.get(\"retweeted_status\") and related_ids.append(status['retweeted_status']['id'])\n", + " status.get(\"quoted_status\") and related_ids.append(status['quoted_status']['id'])\n", + " related_ids = filter(lambda id_: not tweets.find_one({\"id\": id_}), related_ids)\n", + " \n", + " for id_ in related_ids:\n", + " try:\n", + " docu = api.get_status(id_)\n", + " except Exception:\n", + " print(f\"load tweet {id_} got error\")\n", + " else:\n", + " print(f\"save tweet [{docu['user']['screen_name']}]{docu['id']}\")\n", + " save_tweet(docu)\n", + " save_relate_tweets(docu)\n", + " \n", + "def save_tweet(docu):\n", + " docu = twitter_api_parser(docu)\n", + " tweets.update_one(\n", + " {'id': docu['id']},\n", + " {'$set': docu},\n", + " upsert=True\n", + " )\n", + "\n", + "def download_relate_tweets():\n", + " for tweet in tweets.find(no_cursor_timeout=True):\n", + " save_relate_tweets(tweet)\n", + "\n", + " \n", + "download_relate_tweets()\n" + ] } ], "metadata": { From 032eb2f861c921fa46b4b864f4d629cff8b520c8 Mon Sep 17 00:00:00 2001 From: Laisky Date: Tue, 23 Jul 2019 11:33:40 +0800 Subject: [PATCH 10/27] + go-cache --- .gitignore | 3 + go.mod | 72 +++- go.sum | 459 +++++++++++++++++++++ golang/cpuprofile | Bin 2587 -> 0 bytes golang/memory.pprof | Bin 388 -> 0 bytes golang/src/demo/gocache-demo/main_test.go | 49 +++ golang/src/demo/test_regexp/regexp_test.go | 39 ++ 7 files changed, 620 insertions(+), 2 deletions(-) delete mode 100644 golang/cpuprofile delete mode 100644 golang/memory.pprof create mode 100644 golang/src/demo/gocache-demo/main_test.go create mode 100644 golang/src/demo/test_regexp/regexp_test.go diff --git a/.gitignore b/.gitignore index ec8d0c28..98761495 100644 --- a/.gitignore +++ b/.gitignore @@ -100,3 +100,6 @@ target # zookeeper /zookeeper/data + +cpuprofile +meory.pprof diff --git a/go.mod b/go.mod index f51bd667..56243048 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,78 @@ module github.com/Laisky/HelloWorld go 1.12 require ( + cloud.google.com/go v0.43.0 // indirect + github.com/DataDog/zstd v1.4.0 // indirect + github.com/Joker/hpp v1.0.0 // indirect + github.com/Laisky/go-chaining v0.0.0-20180507092046-43dcdc5a21be + github.com/Laisky/go-utils v1.5.2 + github.com/Shopify/sarama v1.23.1 // indirect + github.com/appleboy/gofight/v2 v2.1.1 // indirect + github.com/astaxie/beego v1.12.0 // indirect + github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 // indirect + github.com/casbin/casbin v1.9.1 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 + github.com/coreos/bbolt v1.3.3 // indirect + github.com/coreos/etcd v3.3.13+incompatible // indirect + github.com/coreos/go-semver v0.3.0 // indirect + github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f // indirect + github.com/couchbase/go-couchbase v0.0.0-20190708161019-23e7ca2ce2b7 // indirect + github.com/couchbase/gomemcached v0.0.0-20190515232915-c4b4ca0eb21d // indirect + github.com/couchbase/goutils v0.0.0-20190315194238-f9d42b11473b // indirect github.com/dvyukov/go-fuzz v0.0.0-20190516070045-5cc3605ccbb6 // indirect github.com/dvyukov/go-fuzz-corpus v0.0.0-20190304103735-86a5af9d6842 // indirect - github.com/elazarl/go-bindata-assetfs v1.0.0 // indirect + github.com/eapache/go-resiliency v1.2.0 // indirect + github.com/edsrzf/mmap-go v1.0.0 // indirect + github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31 // indirect + github.com/go-kit/kit v0.9.0 // indirect + github.com/go-redis/redis v6.15.2+incompatible // indirect + github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect github.com/gomarkdown/markdown v0.0.0-20190222000725-ee6a7931a1e4 + github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70 // indirect + github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect + github.com/gorilla/mux v1.7.3 // indirect + github.com/gorilla/pat v1.0.1 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.9.5 // indirect + github.com/jcmturner/gofork v1.0.0 // indirect + github.com/juju/errors v0.0.0-20190207033735-e65537c515d7 // indirect + github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 // indirect + github.com/juju/testing v0.0.0-20190613124551-e81189438503 // indirect + github.com/kataras/golog v0.0.0-20190624001437-99c81de45f40 // indirect + github.com/kisielk/errcheck v1.2.0 // indirect + github.com/klauspost/compress v1.7.4 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect + github.com/kr/pty v1.1.8 // indirect + github.com/lib/pq v1.2.0 // indirect + github.com/mattn/go-sqlite3 v1.11.0 // indirect + github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible + github.com/pelletier/go-toml v1.4.0 // indirect + github.com/pkg/profile v1.3.0 // indirect + github.com/prometheus/common v0.6.0 // indirect + github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962 // indirect + github.com/rogpeppe/fastuuid v1.2.0 // indirect + github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92 // indirect + github.com/sirupsen/logrus v1.4.2 // indirect + github.com/smartystreets/assertions v1.0.1 // indirect + github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 // indirect + github.com/spf13/afero v1.2.2 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/stephens2424/writerset v1.0.2 // indirect - golang.org/x/tools v0.0.0-20190525145741-7be61e1b0e51 // indirect + github.com/syndtr/goleveldb v1.0.0 // indirect + github.com/tidwall/gjson v1.3.2 // indirect + github.com/ugorji/go/codec v1.1.7 + github.com/wendal/errors v0.0.0-20181209125328-7f31f4b264ec // indirect + go.etcd.io/bbolt v1.3.3 // indirect + golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 // indirect + golang.org/x/exp v0.0.0-20190718202018-cfdd5522f6f6 // indirect + golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9 // indirect + golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 // indirect + golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect + golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect + golang.org/x/text v0.3.2 + golang.org/x/tools v0.0.0-20190723021737-8bb11ff117ca // indirect + google.golang.org/grpc v1.22.0 // indirect + gopkg.in/jcmturner/gokrb5.v7 v7.3.0 // indirect ) diff --git a/go.sum b/go.sum index 23d707eb..e2637961 100644 --- a/go.sum +++ b/go.sum @@ -1,23 +1,482 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/DataDog/zstd v1.3.8/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/DataDog/zstd v1.4.0/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Depado/ginprom v1.1.2/go.mod h1:OPTeCiC3QLr6QueEA0UNChKGWyxKOqmC4k4WUJUh5lg= +github.com/Joker/hpp v0.0.0-20180418125244-6893e659854a/go.mod h1:MzD2WMdSxvbHw5fM/OXOFily/lipJWRc9C1px0Mt0ZE= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.0.0/go.mod h1:efZIdO0py/LtcJRSa/j2WEklMSAw84WV0zZVMxNToB8= github.com/Julusian/godocdown v0.0.0-20170816220326-6d19f8ff2df8/go.mod h1:INZr5t32rG59/5xeltqoCJoNY7e5x/3xoY9WSWVWg74= +github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Laisky/go-chaining v0.0.0-20180507092046-43dcdc5a21be h1:7Rxhm6IjOtDAyj8eScOFntevwzkWhx94zi48lxo4m4w= +github.com/Laisky/go-chaining v0.0.0-20180507092046-43dcdc5a21be/go.mod h1:1mdzaETo0kjvCQICPSePsoaatJN4l7JvEA1200lyevo= +github.com/Laisky/go-utils v1.5.2 h1:hK/BEzR0jgTbUE+DF4J9dW7Zde+bQEx9RXfAyotBHJc= +github.com/Laisky/go-utils v1.5.2/go.mod h1:MpydOPP7RWH/cINQIgI1exzT8/9wumQ49iw91Y/lDOk= +github.com/Laisky/zap v1.9.2 h1:7dTtABboHk8DnT0d6Dc8A9Opu2cyIEaMlL9JO11zvag= +github.com/Laisky/zap v1.9.2/go.mod h1:CQdLb2wEfqBvoNLmfOp7wnKTOMvhc4DQRc3xfshL4EQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM= +github.com/RoaringBitmap/roaring v0.4.18/go.mod h1:D3qVegWTmfCaX4Bl5CrBE9hfrSrrXIr8KVNvRsDi1NI= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/Shopify/sarama v1.22.1/go.mod h1:FRzlvRpMFO/639zY1SDxUxkqH97Y0ndM5CbGj6oG3As= +github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/appleboy/gofight/v2 v2.0.0+incompatible/go.mod h1:6E7pthKhmwss84j/zEixBNim8Q6ahhHcYOtmW5ts5vA= +github.com/appleboy/gofight/v2 v2.1.1/go.mod h1:6E7pthKhmwss84j/zEixBNim8Q6ahhHcYOtmW5ts5vA= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/astaxie/beego v1.11.1/go.mod h1:i69hVzgauOPSw5qeyF4GVZhn7Od0yG5bbCGzmhbWxgQ= +github.com/astaxie/beego v1.12.0/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o= +github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= +github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= +github.com/belogik/goes v0.0.0-20151229125003-e54d722c3aff/go.mod h1:PhH1ZhyCzHKt4uAasyx+ljRCgoezetRNf59CUtwUkqY= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= +github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/bsm/sarama-cluster v2.1.15+incompatible/go.mod h1:r7ao+4tTNXvWm+VRpRJchr2kQhqxgmAp2iEX5W96gMM= +github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= +github.com/casbin/casbin v1.9.1/go.mod h1:z8uPsfBJGUsnkagrt3G8QvjgTKFMBJ32UP8HpZllfog= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= +github.com/couchbase/go-couchbase v0.0.0-20190708161019-23e7ca2ce2b7/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= +github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= +github.com/couchbase/gomemcached v0.0.0-20190515232915-c4b4ca0eb21d/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= +github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= +github.com/couchbase/goutils v0.0.0-20190315194238-f9d42b11473b/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dvyukov/go-fuzz v0.0.0-20190516070045-5cc3605ccbb6 h1:JQBgIQumUT/1PnZs9cWQzx/xH+djYh+oGDLO8H68SWE= github.com/dvyukov/go-fuzz v0.0.0-20190516070045-5cc3605ccbb6/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/dvyukov/go-fuzz-corpus v0.0.0-20190304103735-86a5af9d6842 h1:7ffpoBeHy8ml49lQ3VkaNmUW6I6+bp6CekgTpHgp8JM= github.com/dvyukov/go-fuzz-corpus v0.0.0-20190304103735-86a5af9d6842/go.mod h1:aSQy4yPbyjNrXv8ANgj9BQacfss3bbmXTon1mFcwc1k= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164/go.mod h1:tbAXHifHQWNSpWbiJHpJTZH5fi3XHhDMdP//vuz9WS4= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gavv/monotime v0.0.0-20190418164738-30dba4353424/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-check/check v1.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomarkdown/markdown v0.0.0-20190222000725-ee6a7931a1e4 h1:vELsocEzlhM4lk2nhxolEaQrMp25u7/i9IX8s9uLads= github.com/gomarkdown/markdown v0.0.0-20190222000725-ee6a7931a1e4/go.mod h1:gmFANS06wAVmF0B9yi65QKsRmPQ97tze7FRLswua+OY= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= +github.com/gorilla/pat v1.0.1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1/go.mod h1:i8kTYUOEstd/S8TG0ChTXQdf4ermA/e8vJX0+QruD9w= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce/go.mod h1:VER17o2JZqquOx41avolD/wMGQSFEFBKWmhag9/RQRY= +github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/errors v0.0.0-20190207033735-e65537c515d7/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/juju/testing v0.0.0-20190613124551-e81189438503/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.0-20180321173939-03be10146386/go.mod h1:PcaEvfvhGsqwXZ6S3CgCbmjcp+4UDUh2MIfF2ZEul8M= +github.com/kataras/golog v0.0.0-20190624001437-99c81de45f40/go.mod h1:PcaEvfvhGsqwXZ6S3CgCbmjcp+4UDUh2MIfF2ZEul8M= +github.com/kataras/iris v11.1.1+incompatible/go.mod h1:ki9XPua5SyAJbIxDdsssxevgGrbpBmmvoQmo/A0IodY= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.7.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.7.4/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= +github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4= +github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/profile v1.3.0/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v0.9.4/go.mod h1:oCXIBxdI62A4cR6aTRJCgetEjecSIYzOEaeAn4iYEpM= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181120120127-aeab699e26f4/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/prometheus/tsdb v0.9.1/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481/go.mod h1:C9WhFzY47SzYBIvzFqSvHIR6ROgDo4TtdTuRaOMjF/s= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= +github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= +github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= +github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff/go.mod h1:KSQcGKpxUMHk3nbYzs/tIBAM2iDooCn0BmttHOJEbLs= +github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= github.com/stephens2424/writerset v1.0.2 h1:znRLgU6g8RS5euYRcy004XeE4W+Tu44kALzy7ghPif8= github.com/stephens2424/writerset v1.0.2/go.mod h1:aS2JhsMn6eA7e82oNmW4rfsgAOp9COBTTl8mzkwADnc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA= +github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= +github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/tidwall/pretty v0.0.0-20190325153808-1166b9ac2b65/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= +github.com/wendal/errors v0.0.0-20181209125328-7f31f4b264ec/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= +github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190718202018-cfdd5522f6f6/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed h1:uPxWBzB3+mlnjy9W58qY1j/cjyFjutgw/Vhan2zLy/A= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 h1:LepdCS8Gf/MVejFIt8lsiexZATdoGVyp5bcyS+rYoUI= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190525145741-7be61e1b0e51 h1:RhYYBLDB5MoVkvoNGMNk+DSj7WoGhySvIvtEjTyiP74= golang.org/x/tools v0.0.0-20190525145741-7be61e1b0e51/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190716221150-e98af2309876 h1:XskQVJACjxHVCFlm4GsSEh6ZLclQPLobzuvB4DQYHtw= +golang.org/x/tools v0.0.0-20190716221150-e98af2309876/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190723021737-8bb11ff117ca/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/golang/cpuprofile b/golang/cpuprofile deleted file mode 100644 index 81632c92aae522dacae7fe2a88e32c388250b02a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2587 zcmV+$3gq=4iwFP!00004|CCl~a1__Ie%jz@ndWG;9W6l9Y?=nmFfAbjLVy5)SOgdu z<6UlAtY)W9(q;a>`Ul;*`sd<9JKrijDW+ik(yv zyW&bE-eNl;Nu8_d8IiKd=zoS;orBH;$6{S#urQ1F} z_t_JrSBn2%x96c>mnsqz(bwBiABgR0%;Dy&Yi9 z;YuvQJqPZWpaja45KN(GUp~x&rD&)CrC31~a-|}{R6702?VM>D{;Ws^D8nkMl0!-e zfFA#|2vvf0;Sf&bS5Z1;st_!vlTY5kf>Urv1(<>oN%Ax$1Qqm1kVRuY!*ZxlB&eik z9=n5sO~t=WQ30kR63W$z1XZ;6K7jzfU#0>8hAAwN5Z(KzK+5q|=9FU%)d)nQdwz5i zt5x9rj8tGP)yj2>1k>pKj}9|ZiMKOSiS<-35Tv)B_s6}vU>9bKvT_AOI_v-?w#;<`2P>nNahCu3R&jSJp<3pt?Kp1DzOo24e;fZ=`@Z}N}pax}< z1wwT9!*_CSwRn_~TAW3*WJQsnk$!$csMX>=F6>$1T*N3H$+m^xS#DjlU{x8Hg-`X_NV}j7@>%)Dj|^R;ot#O zhiig(71L*kFf-*+B?PnR^!~e;+=QD{fF@i(3*?201PcB1JrTbdKVdU9V;i-}QAL8; zbo$MGoLLLL%VTN57{%m8N(koAoiFZVvFUid3NRhx6c@l;`sK3%n1TPJ0?a^-G`U@o zU>?1AP7Hr0KFDpHi5=7-+Bl!S|DE@5bYb?f=a9z-ls#(hHIdkXH{MP1(sz|Va z9y@Y^>zj@L$4awtDJ_+kDH1HCr;Z9_4xVIW4t7(wK-%ccHw7{mpXO=J#pSeIUZ#W~ zN(X}tP!pDdm}LtVwnfVn31al!V|Q_|d3X;yY##PdkGw*WU=bZWevpy*_!~y%<4Rg7 zuTnw~rvvxy<$_yrjSA3;z0@nORwU5q!0&HmN(4`Fei2+lYvi>`2-@lFxm%f{;%XH@ z#Xjnj*D4Zp(7xA>Fl7Ng$CL%Qj@HTR6$uv8508nG7UEyIq=nc|{i38!dg<^97Hh-p zDnJ`fAeGgGv@ZwZcu&oZLn7TO|^mGsVo z!jF zHVr3I5-2rc%yM$4w2#5>86D6EQEzNw%fat~0`7wL)yWZVwNN zY_?}?)6>G)pi$E{oMF?=*rwK2SehAsq>F_c0|_scG=zfhcp`)rD@nm< z^Q>@g2;R8oo7O}P@xof6d)AO{4R>}#J+1BwgXFWcbWSE=6zZFa``nUTk8N|ev+H`( z@beF%RZSTDa3j%OdP=tq^FOc&`|1LHOCK}E3)7;7)h{lyL`zV-Wm-nc-Qx6{dU~6a zw0+a{w2s2mCb+qV=A6)~TBD|(jzmQV3(ZY%I5!G%YgH{n_&pVgCR}HCp;Hc6EH?d% z#0=dSH3!qWePJvN$qrc8I&8%~qzWjz3^2Tk04bx}) z?zk4Y_yqWJ%+f`>s`-y-t2)3PAM_p9)X38P(U_~-!_iii*Lx(o!S>tZ_P?tt$D1H0 z9IZZgG+D~#?@$n8gUx>jwPif9sk<&-K=yXb8~28Wb$55t&eC=$Jec3cBaYjr z8>8FuFE(Ke=rI|lyVa{qF_a`HO)4VExgCs>^~wdr2q1>N}XOwu*u zS_{u(@^G_=n5h;PXl}xr*@oc}%a69I>2xHTc9XW>>n1ey;z^HKeoWlulxy<*VP_jF xq-?E<57&u1DO;=LzXGUS{Ji6Tv?@1a`$@};T6)s{X8-^I|Nma=vh{cq000v(1$Y1e diff --git a/golang/memory.pprof b/golang/memory.pprof deleted file mode 100644 index cbd82f74c586d5df0eea5760e75176f2d3f9f3dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmV-~0ek)*iwFP!00004|2&MpZq+ap#);#UL()`kfXXTiQI^t3#F80#fi6g>6{^Gn zzOD(OzP4p2h-~)}Isszfk64iI&__VscnWmi02U-h)Lhi%=sV~4JKs|b5kb!vi!#L! z6P#j52ud+*O!+!N)fPnb=lMIR5{Ss>s0N4#P$+LyIUxG}>k=vqh}^9K5J_oTX2nhc z=bS>+JZ@1K^J4>8%U0b;UAH_NQb0n^`KmX`pLJH<|set7V0 zQBDJ5z`Ga_eSGlo*Pp+u^VQqi{2EV!6H@VHHufs;Txf0OGdp{wWFL4U?O=MIiRrpF z^Ue%GT`AdmU9;^l8rj^d9|^bL9QD>KzR!l>nYL1BW?j!(%XBwWZMs3)8aD&7D^Fo%8lZ i(^`IODmxVB Date: Tue, 6 Aug 2019 17:42:10 +0800 Subject: [PATCH 11/27] fix: py2 & py3 --- golang/src/demo/gocache-demo/main_test.go | 77 +++++++++++++++--- {py27 => py2}/README.md | 0 {py27 => py2}/builtins.ipynb | 0 {py27 => py2}/cython/Rectangle.cpp | 0 {py27 => py2}/cython/Rectangle.h | 0 {py27 => py2}/cython/helloworld.pyx | 0 {py27 => py2}/cython/rect.cpp | 0 {py27 => py2}/cython/rect.pyx | 0 {py27 => py2}/cython/setup.py | 0 {py27 => py2}/django/README.md | 0 {py27 => py2}/django/mysite/app/__init__.py | 0 {py27 => py2}/django/mysite/app/models.py | 0 .../mysite/app/templatetags/__init__.py | 0 .../mysite/app/templatetags/my_filter.py | 0 .../django/mysite/app/templatetags/my_tags.py | 0 {py27 => py2}/django/mysite/app/urls.py | 0 {py27 => py2}/django/mysite/app/views.py | 0 {py27 => py2}/django/mysite/db.sqlite3 | Bin {py27 => py2}/django/mysite/manage.py | 0 .../django/mysite/mysite/__init__.py | 0 {py27 => py2}/django/mysite/mysite/db.sqlite3 | Bin {py27 => py2}/django/mysite/mysite/routers.py | 0 .../django/mysite/mysite/settings.py | 0 {py27 => py2}/django/mysite/mysite/urls.py | 0 {py27 => py2}/django/mysite/mysite/views.py | 0 {py27 => py2}/django/mysite/mysite/wsgi.py | 0 {py27 => py2}/django/mysite/nosql/__init__.py | 0 {py27 => py2}/django/mysite/nosql/models.py | 0 {py27 => py2}/django/mysite/nosql/urls.py | 0 {py27 => py2}/django/mysite/nosql/views.py | 0 .../django/mysite/notebook/nosql.ipynb | 0 {py27 => py2}/django/mysite/requirements.txt | 0 {py27 => py2}/django/mysite/rest/__init__.py | 0 {py27 => py2}/django/mysite/rest/apis.py | 0 {py27 => py2}/django/mysite/rest/models.py | 0 {py27 => py2}/django/mysite/rest/urls.py | 0 {py27 => py2}/django/mysite/rest/views.py | 0 .../django/mysite/templates/demo.html | 0 .../mysite/templates/nosql/posts_list.html | 0 .../mysite/templates/user/authorized.html | 0 .../django/mysite/templates/user/login.html | 0 .../mysite/templates/user/register.html | 0 {py27 => py2}/django/mysite/user/__init__.py | 0 {py27 => py2}/django/mysite/user/forms.py | 0 {py27 => py2}/django/mysite/user/urls.py | 0 {py27 => py2}/django/mysite/user/views.py | 0 {py27 => py2}/django/rest/README.md | 0 {py27 => py2}/django/rest/apis/__init__.py | 0 .../django/rest/apis/models/__init__.py | 0 .../django/rest/apis/models/fields.py | 0 .../django/rest/apis/serializers/__init__.py | 0 .../django/rest/apis/serializers/fields.py | 0 {py27 => py2}/django/rest/apis/urls.py | 0 .../django/rest/apis/utils/__init__.py | 0 .../django/rest/apis/utils/encrypt.py | 0 {py27 => py2}/django/rest/apis/views.py | 0 {py27 => py2}/django/rest/manage.py | 0 .../django/rest/quickstart/__init__.py | 0 .../django/rest/quickstart/serializers.py | 0 {py27 => py2}/django/rest/quickstart/urls.py | 0 {py27 => py2}/django/rest/quickstart/views.py | 0 {py27 => py2}/django/rest/requirements.txt | 0 {py27 => py2}/django/rest/rest/__init__.py | 0 {py27 => py2}/django/rest/rest/settings.py | 0 {py27 => py2}/django/rest/rest/urls.py | 0 {py27 => py2}/django/rest/rest/wsgi.py | 0 {py27 => py2}/django/rest/simple/__init__.py | 0 {py27 => py2}/django/rest/simple/urls.py | 0 {py27 => py2}/ldap-demo/ldap.ipynb | 0 {py27 => py2}/pygraphviz/README.md | 0 {py27 => py2}/pygraphviz/circo.jpg | Bin {py27 => py2}/pygraphviz/demo.ipynb | 0 {py27 => py2}/pygraphviz/dot.jpg | Bin {py27 => py2}/pygraphviz/edge.jpg | Bin {py27 => py2}/pygraphviz/fdp.jpg | Bin {py27 => py2}/pygraphviz/g.jpg | Bin {py27 => py2}/pygraphviz/head.jpg | Bin {py27 => py2}/pygraphviz/html.jpg | Bin {py27 => py2}/pygraphviz/img/core-router.jpg | Bin {py27 => py2}/pygraphviz/img/firewall.jpg | Bin {py27 => py2}/pygraphviz/img/link_proof.jpg | Bin {py27 => py2}/pygraphviz/img/network.jpg | Bin {py27 => py2}/pygraphviz/img/router.jpg | Bin {py27 => py2}/pygraphviz/img/s5700.jpg | Bin {py27 => py2}/pygraphviz/img/server.jpg | Bin {py27 => py2}/pygraphviz/img/switch.jpg | Bin {py27 => py2}/pygraphviz/neato.jpg | Bin {py27 => py2}/pygraphviz/node.jpg | Bin .../pygraphviz-pygraphviz-1.3rc2/.gitignore | 0 .../pygraphviz-pygraphviz-1.3rc2/INSTALL.txt | 0 .../pygraphviz-pygraphviz-1.3rc2/MANIFEST.in | 0 .../pygraphviz-pygraphviz-1.3rc2/Makefile | 0 .../pygraphviz-pygraphviz-1.3rc2/README.txt | 0 .../pygraphviz-pygraphviz-1.3rc2/doc/Makefile | 0 .../doc/gh-pages.py | 0 .../doc/source/conf.py | 0 .../doc/source/download.rst | 0 .../doc/source/examples.rst | 0 .../doc/source/index.rst | 0 .../doc/source/install.rst | 0 .../doc/source/reference/agraph.rst | 0 .../doc/source/reference/api_notes.rst | 0 .../doc/source/reference/credits.rst | 0 .../doc/source/reference/faq.rst | 0 .../doc/source/reference/history.rst | 0 .../doc/source/reference/index.rst | 0 .../doc/source/reference/legal.rst | 0 .../doc/source/reference/news.rst | 0 .../doc/source/reference/related.rst | 0 .../doc/source/static/contents.png | Bin .../doc/source/static/empty.txt | 0 .../doc/source/static/navigation.png | Bin .../doc/source/static/sphinxdoc.css | 0 .../doc/source/templates/index.html | 0 .../doc/source/templates/indexsidebar.html | 0 .../doc/source/templates/layout.html | 0 .../doc/source/tutorial.rst | 0 .../doc/sphinxext/only_directives.py | 0 .../examples/attributes.py | 0 .../examples/django_simple.py | 0 .../examples/miles.py | 0 .../examples/miles_dat.txt.gz | Bin .../examples/simple.py | 0 .../examples/star.py | 0 .../examples/subgraph.py | 0 .../examples/utf8_encoding.py | 0 .../pygraphviz/__init__.py | 0 .../pygraphviz/agraph.py | 0 .../pygraphviz/graphviz.i | 0 .../pygraphviz/graphviz.py | 0 .../pygraphviz/graphviz_wrap.c | 0 .../pygraphviz/release.py | 0 .../pygraphviz/tests/__init__.py | 0 .../pygraphviz/tests/test.py | 0 .../tests/test_attribute_defaults.py | 0 .../pygraphviz/tests/test_attributes.py | 0 .../pygraphviz/tests/test_drawing.py | 0 .../pygraphviz/tests/test_edge_attributes.py | 0 .../pygraphviz/tests/test_graph.py | 0 .../pygraphviz/tests/test_html.py | 0 .../pygraphviz/tests/test_layout.py | 0 .../pygraphviz/tests/test_node_attributes.py | 0 .../pygraphviz/tests/test_readwrite.py | 0 .../pygraphviz/tests/test_string.py | 0 .../pygraphviz/tests/test_subgraph.py | 0 .../pygraphviz/tests/test_unicode.py | 0 .../pystrings.swg | 0 .../pygraphviz-pygraphviz-1.3rc2/setup.cfg | 0 .../pygraphviz-pygraphviz-1.3rc2/setup.py | 0 .../pygraphviz-pygraphviz-1.3rc2/setup_egg.py | 0 .../setup_extra.py | 0 .../pygraphviz-pygraphviz-1.3rc2/tox.ini | 0 {py27 => py2}/pygraphviz/pygraphviz.ipynb | 0 {py27 => py2}/pygraphviz/pytopo.ipynb | 0 {py27 => py2}/pygraphviz/pytopo.py | 0 {py27 => py2}/pygraphviz/simple.jpg | Bin {py27 => py2}/pygraphviz/subgraph.jpg | Bin {py27 => py2}/pygraphviz/topo.jpg | Bin {py27 => py2}/pygraphviz/twopi.jpg | Bin {py27 => py2}/queue.ipynb | 0 {py27 => py2}/requirements.txt | 0 {py27 => py2}/sqlite.ipynb | 0 {py36 => py3}/DFA.ipynb | 0 py3/README.md | 11 +++ {py36 => py3}/aio-boto.ipynb | 0 {py36 => py3}/aio_ping_demo.py | 0 {py36 => py3}/aiofiles.ipynb | 0 {py35 => py3}/aiohttp.ipynb | 0 {py36 => py3}/aioping.ipynb | 0 {py36 => py3}/aioping_demo.py | 0 {py35 => py3}/airflow/.env | 0 {py35 => py3}/airflow/airflow.cfg | 0 {py35 => py3}/airflow/airflow.db | Bin {py35 => py3}/airflow/unittests.cfg | 0 {py35 => py3}/arrow.ipynb | 0 {py34 => py3}/association-analysis/apriori.py | 0 .../notebook/apriori.ipynb | 0 .../notebook/gen_dataset.ipynb | 0 {py35 => py3}/async.ipynb | 0 {py36 => py3}/asyncio.ipynb | 0 {py36 => py3}/asyncio_locks.py | 0 {py34 => py3}/beauty/cpu usage .ipynb | 0 {py34 => py3}/beauty/cpu-usage.gif | Bin {py34 => py3}/blinker/README.md | 0 {py34 => py3}/blinker/blinker.html | 0 {py34 => py3}/blinker/notebook/blinker.ipynb | 0 {py35 => py3}/celery/app.ipynb | 0 {py35 => py3}/celery/tasks.py | 0 .../commandlineutils/argparse_demo.py | 0 {py34 => py3}/commandlineutils/click_demo.py | 0 {py34 => py3}/commandlineutils/tqdm_demo.py | 0 .../commandlineutils/xtermcolor_demo.py | 0 {py34 => py3}/cython/Cython.html | 0 {py34 => py3}/cython/README.md | 0 {py34 => py3}/cython/bench.ipy | 0 {py34 => py3}/cython/fast.pyx | 0 {py34 => py3}/cython/faster.pyx | 0 {py34 => py3}/cython/fastest.pyx | 0 {py34 => py3}/cython/notebook/Cython.ipynb | 0 {py34 => py3}/cython/origin.html | 0 {py34 => py3}/cython/origin.py | 0 {py34 => py3}/cython/setup.py | 0 {py34 => py3}/cython/startup/README | 0 {py36 => py3}/data/demo-2-over+previous.png | Bin {py36 => py3}/data/huawei.jpg | Bin {py35 => py3}/data/project.db | Bin {py35 => py3}/data/result.db | 0 {py35 => py3}/data/scheduler.1d | Bin {py35 => py3}/data/scheduler.1h | Bin {py35 => py3}/data/scheduler.all | Bin {py35 => py3}/data/task.db | 0 {py36 => py3}/data/test.gif | Bin {py36 => py3}/data/test.txt | 0 {py36 => py3}/data/test.webp | 0 {py36 => py3}/datetime.ipynb | 0 .../design-pattern/Adapter Pattern.ipynb | 0 .../design-pattern/Command Pattern.ipynb | 0 .../design-pattern/Decorator Pattern.ipynb | 0 .../Factory Method Pattern.ipynb | 0 .../design-pattern/Observer Pattern.ipynb | 0 {py34 => py3}/design-pattern/README.md | 0 .../design-pattern/Singleton Pattern.ipynb | 0 .../design-pattern/Strategy Pattern.ipynb | 0 .../design-pattern/Template Pattern.ipynb | 0 {py34 => py3}/encrypt/bcrypt.ipynb | 0 {py34 => py3}/flask/README.md | 0 {py34 => py3}/flask/meinheld/1 | 0 .../flask/meinheld/flask_meinheld.py | 0 {py34 => py3}/flask/meinheld/pure_meinheld.py | 0 {py34 => py3}/flask/rest/README.md | 0 {py34 => py3}/flask/rest/app.py | 0 {py34 => py3}/flask/tutorial/app.py | 0 .../flask/tutorial/appdemo/__init__.py | 0 {py34 => py3}/flask/tutorial/appdemo/urls.py | 0 {py34 => py3}/flask/tutorial/settings.py | 0 .../flask/tutorial/templates/base.html | 0 .../flask/tutorial/templates/demo.html | 0 .../flask/tutorial/templates/index.html | 0 {py36 => py3}/gc_demo.py | 0 {py36 => py3}/gql.ipynb | 0 {py35 => py3}/graphene/README.md | 0 {py35 => py3}/graphene/complex.py | 0 {py35 => py3}/graphene/simple.py | 0 {py36 => py3}/hypothesis/README.md | 0 {py36 => py3}/hypothesis/source.py | 0 {py36 => py3}/hypothesis/tests.py | 0 {py36 => py3}/japronto/async_demo.py | 0 {py35 => py3}/jieba/simple-demo.ipynb | 0 {py34 => py3}/ldap-demo/ldap.ipynb | 0 {py35 => py3}/lxml & xpath.ipynb | 0 {py36 => py3}/markdown/markdown.ipynb | 0 {py36 => py3}/markdown/simple.html | 0 {py35 => py3}/mock.ipynb | 0 {py35 => py3}/mock/demo.ipynb | 0 {py35 => py3}/mock/mock.ipynb | 0 {py35 => py3}/mock/settings/__init__.py | 0 {py35 => py3}/mock/settings/settings.py | 0 {py35 => py3}/mypy/README.md | 0 {py35 => py3}/mypy/class.py | 0 {py35 => py3}/mypy/simple.py | 0 {py34 => py3}/networkx/README.md | 0 {py34 => py3}/networkx/tutorial.ipynb | 0 {py36 => py3}/nlp/README.md | 0 {py36 => py3}/nlp/stopwords.ipynb | 0 {py34 => py3}/pandas/DataFrame.html | 0 {py34 => py3}/pandas/README.md | 0 {py34 => py3}/pandas/matplotlib.html | 0 {py34 => py3}/pandas/notebook/dict.ipynb | 0 .../pandas/notebook/matplotlib.ipynb | 0 {py34 => py3}/pandas/notebook/pandas.ipynb | 0 .../pandas/notebook/pivot_table.ipynb | 0 {py34 => py3}/pandas/notebook/test.ipynb | 0 {py34 => py3}/pandas/notebook/wordpress.ipynb | 0 {py34 => py3}/paramiko/paramiko.ipynb | 0 {py34 => py3}/parse-html/notebook/lxml.ipynb | 0 {py36 => py3}/pillow/README.md | 0 {py36 => py3}/pillow/data/huge.jpeg | Bin {py36 => py3}/pillow/pillow-simd.ipynb | 0 {py35 => py3}/profiling/README.md | 0 {py35 => py3}/profiling/base.py | 0 {py35 => py3}/profiling/simple_cprofile.py | 0 .../profiling/simple_lineprofiler.py | 0 .../profiling/simple_lineprofiler.py.lprof | Bin {py35 => py3}/profiling/test_objgraph.py | 0 {py35 => py3}/profiling/test_pprofile.py | 0 {py35 => py3}/profiling/test_pstats.py | 0 {py35 => py3}/profiling/timeit | Bin {py34 => py3}/purl/purl.ipynb | 0 {py35 => py3}/py35-new-syntax.ipynb | 0 .../pyinotify/notebook/Untitled.ipynb | 0 {py34 => py3}/pyjwt/notebook/pyjwt.ipynb | 0 .../pymining/notebook/pymining.ipynb | 0 {py35 => py3}/pyquery.ipynb | 0 {py34 => py3}/pysnmp/README.md | 0 {py34 => py3}/pysnmp/nmap.ipynb | 0 {py34 => py3}/pysnmp/pysnmp.ipynb | 0 {py35 => py3}/pyspider/data/project.db | Bin {py35 => py3}/pyspider/data/result.db | Bin {py35 => py3}/pyspider/data/scheduler.1d | Bin {py35 => py3}/pyspider/data/scheduler.1h | Bin {py35 => py3}/pyspider/data/scheduler.all | Bin {py35 => py3}/pyspider/data/task.db | Bin {py35 => py3}/pytest-benchmark/README.md | 0 {py35 => py3}/pytest-benchmark/test_simple.py | 0 {py34 => py3}/python-syntax/Coroutine.html | 0 {py34 => py3}/python-syntax/README.md | 0 .../python-syntax/concurrent.futures.html | 0 {py34 => py3}/python-syntax/descriptor.html | 0 .../python-syntax/notebook/Coroutine.ipynb | 0 .../python-syntax/notebook/asterisk.ipynb | 0 .../python-syntax/notebook/bisect.ipynb | 0 .../python-syntax/notebook/calendar.ipynb | 0 .../python-syntax/notebook/collections.ipynb | 0 .../notebook/concurrent.futures.ipynb | 0 .../python-syntax/notebook/copy.ipynb | 0 .../python-syntax/notebook/decimal.ipynb | 0 .../python-syntax/notebook/descriptor.ipynb | 0 .../python-syntax/notebook/email.ipynb | 0 .../python-syntax/notebook/enum.ipynb | 0 .../python-syntax/notebook/format.ipynb | 0 .../python-syntax/notebook/fractions.ipynb | 0 .../python-syntax/notebook/functools.ipynb | 0 .../python-syntax/notebook/headq.ipynb | 0 .../python-syntax/notebook/itertools.ipynb | 0 .../python-syntax/notebook/mock.ipynb | 0 .../python-syntax/notebook/pytz.ipynb | 0 .../python-syntax/notebook/sched.ipynb | 0 .../python-syntax/notebook/selectors.ipynb | 0 .../python-syntax/notebook/smtplib.ipynb | 0 .../python-syntax/notebook/statistics.ipynb | 0 .../python-syntax/notebook/textwrap.ipynb | 0 .../python-syntax/notebook/weakref.ipynb | 0 .../python-syntax/notebook/xml.ipynb | 0 .../notebook/yield & yield from.ipynb | 0 {py34 => py3}/requirements.txt | 52 ++++++++++++ {py35 => py3}/sanic/README.md | 0 {py35 => py3}/sanic/bench.py | 0 {py34 => py3}/scipy/README.md | 0 .../scipy/notebook/distance_by_cython.ipynb | 0 {py34 => py3}/scipy/notebook/sparse.ipynb | 0 {py34 => py3}/scipy/sparse.html | 0 {py35 => py3}/selenium.ipynb | 0 {py34 => py3}/setup.py | 0 {py36 => py3}/signal.ipynb | 0 {py34 => py3}/sklearn/KNN.html | 0 {py34 => py3}/sklearn/README.md | 0 {py34 => py3}/sklearn/notebook/KNN.ipynb | 0 {py35 => py3}/smtp.ipynb | 0 {py36 => py3}/syntax.ipynb | 0 {py35 => py3}/test_ipdb.py | 0 .../thrift/simple_example/__init__.py | 0 {py36 => py3}/thrift/simple_example/client.py | 0 .../thrift/simple_example/example.thrift | 0 .../thrift/simple_example/example/__init__.py | 0 .../simple_example/example/constants.py | 0 .../simple_example/example/format_data-remote | 0 .../simple_example/example/format_data.py | 0 .../thrift/simple_example/example/ttypes.py | 0 {py36 => py3}/thrift/simple_example/server.py | 0 {py34 => py3}/tornado/app.py | 0 {py34 => py3}/tornado/notebook/async.ipynb | 0 {py34 => py3}/tox/requirements.txt | 0 {py34 => py3}/tox/setup.py | 0 {py34 => py3}/tox/src/tox_test/__init__.py | 0 {py34 => py3}/tox/tests/test_tox.py | 0 {py34 => py3}/tox/tox.ini | 0 {py36 => py3}/tqdm.ipynb | 0 {py36 => py3}/twitter.ipynb | 0 {py35 => py3}/typing.ipynb | 0 {py34 => py3}/unittest/app.py | 0 {py34 => py3}/unittest/tests/test_fixtures.py | 0 {py34 => py3}/unittest/tests/test_simple.py | 0 {py36 => py3}/variables.ipynb | 0 {py35 => py3}/web_bench/test_aiohttp.py | 0 {py35 => py3}/web_bench/test_flask.py | 0 {py35 => py3}/web_bench/test_flaskmeinheld.py | 0 {py35 => py3}/web_bench/test_meinheld.py | 0 {py35 => py3}/web_bench/test_sanic.py | 0 {py35 => py3}/web_bench/test_tornado.py | 0 {py36 => py3}/webp.ipynb | 0 {py35 => py3}/zipapp.ipynb | 0 py34/README.md | 6 -- py35/README.md | 7 -- py35/requirements.txt | 35 -------- py36/README.md | 6 -- py36/requirements.txt | 17 ---- 386 files changed, 129 insertions(+), 82 deletions(-) rename {py27 => py2}/README.md (100%) rename {py27 => py2}/builtins.ipynb (100%) rename {py27 => py2}/cython/Rectangle.cpp (100%) rename {py27 => py2}/cython/Rectangle.h (100%) rename {py27 => py2}/cython/helloworld.pyx (100%) rename {py27 => py2}/cython/rect.cpp (100%) rename {py27 => py2}/cython/rect.pyx (100%) rename {py27 => py2}/cython/setup.py (100%) rename {py27 => py2}/django/README.md (100%) rename {py27 => py2}/django/mysite/app/__init__.py (100%) rename {py27 => py2}/django/mysite/app/models.py (100%) rename {py27 => py2}/django/mysite/app/templatetags/__init__.py (100%) rename {py27 => py2}/django/mysite/app/templatetags/my_filter.py (100%) rename {py27 => py2}/django/mysite/app/templatetags/my_tags.py (100%) rename {py27 => py2}/django/mysite/app/urls.py (100%) rename {py27 => py2}/django/mysite/app/views.py (100%) rename {py27 => py2}/django/mysite/db.sqlite3 (100%) rename {py27 => py2}/django/mysite/manage.py (100%) rename {py27 => py2}/django/mysite/mysite/__init__.py (100%) rename {py27 => py2}/django/mysite/mysite/db.sqlite3 (100%) rename {py27 => py2}/django/mysite/mysite/routers.py (100%) rename {py27 => py2}/django/mysite/mysite/settings.py (100%) rename {py27 => py2}/django/mysite/mysite/urls.py (100%) rename {py27 => py2}/django/mysite/mysite/views.py (100%) rename {py27 => py2}/django/mysite/mysite/wsgi.py (100%) rename {py27 => py2}/django/mysite/nosql/__init__.py (100%) rename {py27 => py2}/django/mysite/nosql/models.py (100%) rename {py27 => py2}/django/mysite/nosql/urls.py (100%) rename {py27 => py2}/django/mysite/nosql/views.py (100%) rename {py27 => py2}/django/mysite/notebook/nosql.ipynb (100%) rename {py27 => py2}/django/mysite/requirements.txt (100%) rename {py27 => py2}/django/mysite/rest/__init__.py (100%) rename {py27 => py2}/django/mysite/rest/apis.py (100%) rename {py27 => py2}/django/mysite/rest/models.py (100%) rename {py27 => py2}/django/mysite/rest/urls.py (100%) rename {py27 => py2}/django/mysite/rest/views.py (100%) rename {py27 => py2}/django/mysite/templates/demo.html (100%) rename {py27 => py2}/django/mysite/templates/nosql/posts_list.html (100%) rename {py27 => py2}/django/mysite/templates/user/authorized.html (100%) rename {py27 => py2}/django/mysite/templates/user/login.html (100%) rename {py27 => py2}/django/mysite/templates/user/register.html (100%) rename {py27 => py2}/django/mysite/user/__init__.py (100%) rename {py27 => py2}/django/mysite/user/forms.py (100%) rename {py27 => py2}/django/mysite/user/urls.py (100%) rename {py27 => py2}/django/mysite/user/views.py (100%) rename {py27 => py2}/django/rest/README.md (100%) rename {py27 => py2}/django/rest/apis/__init__.py (100%) rename {py27 => py2}/django/rest/apis/models/__init__.py (100%) rename {py27 => py2}/django/rest/apis/models/fields.py (100%) rename {py27 => py2}/django/rest/apis/serializers/__init__.py (100%) rename {py27 => py2}/django/rest/apis/serializers/fields.py (100%) rename {py27 => py2}/django/rest/apis/urls.py (100%) rename {py27 => py2}/django/rest/apis/utils/__init__.py (100%) rename {py27 => py2}/django/rest/apis/utils/encrypt.py (100%) rename {py27 => py2}/django/rest/apis/views.py (100%) rename {py27 => py2}/django/rest/manage.py (100%) rename {py27 => py2}/django/rest/quickstart/__init__.py (100%) rename {py27 => py2}/django/rest/quickstart/serializers.py (100%) rename {py27 => py2}/django/rest/quickstart/urls.py (100%) rename {py27 => py2}/django/rest/quickstart/views.py (100%) rename {py27 => py2}/django/rest/requirements.txt (100%) rename {py27 => py2}/django/rest/rest/__init__.py (100%) rename {py27 => py2}/django/rest/rest/settings.py (100%) rename {py27 => py2}/django/rest/rest/urls.py (100%) rename {py27 => py2}/django/rest/rest/wsgi.py (100%) rename {py27 => py2}/django/rest/simple/__init__.py (100%) rename {py27 => py2}/django/rest/simple/urls.py (100%) rename {py27 => py2}/ldap-demo/ldap.ipynb (100%) rename {py27 => py2}/pygraphviz/README.md (100%) rename {py27 => py2}/pygraphviz/circo.jpg (100%) rename {py27 => py2}/pygraphviz/demo.ipynb (100%) rename {py27 => py2}/pygraphviz/dot.jpg (100%) rename {py27 => py2}/pygraphviz/edge.jpg (100%) rename {py27 => py2}/pygraphviz/fdp.jpg (100%) rename {py27 => py2}/pygraphviz/g.jpg (100%) rename {py27 => py2}/pygraphviz/head.jpg (100%) rename {py27 => py2}/pygraphviz/html.jpg (100%) rename {py27 => py2}/pygraphviz/img/core-router.jpg (100%) rename {py27 => py2}/pygraphviz/img/firewall.jpg (100%) rename {py27 => py2}/pygraphviz/img/link_proof.jpg (100%) rename {py27 => py2}/pygraphviz/img/network.jpg (100%) rename {py27 => py2}/pygraphviz/img/router.jpg (100%) rename {py27 => py2}/pygraphviz/img/s5700.jpg (100%) rename {py27 => py2}/pygraphviz/img/server.jpg (100%) rename {py27 => py2}/pygraphviz/img/switch.jpg (100%) rename {py27 => py2}/pygraphviz/neato.jpg (100%) rename {py27 => py2}/pygraphviz/node.jpg (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/.gitignore (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/INSTALL.txt (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/MANIFEST.in (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/Makefile (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/README.txt (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/Makefile (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/gh-pages.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/conf.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/download.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/examples.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/index.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/install.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/agraph.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/api_notes.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/credits.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/faq.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/history.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/index.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/legal.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/news.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/related.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/contents.png (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/empty.txt (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/navigation.png (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/sphinxdoc.css (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/index.html (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/indexsidebar.html (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/layout.html (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/tutorial.rst (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/sphinxext/only_directives.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/attributes.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/django_simple.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/miles.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/miles_dat.txt.gz (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/simple.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/star.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/subgraph.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/utf8_encoding.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/__init__.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/agraph.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz.i (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz_wrap.c (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/release.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/__init__.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_attribute_defaults.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_attributes.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_drawing.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_edge_attributes.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_graph.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_html.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_layout.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_node_attributes.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_readwrite.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_string.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_subgraph.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_unicode.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pystrings.swg (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup.cfg (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup_egg.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup_extra.py (100%) rename {py27 => py2}/pygraphviz/pygraphviz-pygraphviz-1.3rc2/tox.ini (100%) rename {py27 => py2}/pygraphviz/pygraphviz.ipynb (100%) rename {py27 => py2}/pygraphviz/pytopo.ipynb (100%) rename {py27 => py2}/pygraphviz/pytopo.py (100%) rename {py27 => py2}/pygraphviz/simple.jpg (100%) rename {py27 => py2}/pygraphviz/subgraph.jpg (100%) rename {py27 => py2}/pygraphviz/topo.jpg (100%) rename {py27 => py2}/pygraphviz/twopi.jpg (100%) rename {py27 => py2}/queue.ipynb (100%) rename {py27 => py2}/requirements.txt (100%) rename {py27 => py2}/sqlite.ipynb (100%) rename {py36 => py3}/DFA.ipynb (100%) create mode 100644 py3/README.md rename {py36 => py3}/aio-boto.ipynb (100%) rename {py36 => py3}/aio_ping_demo.py (100%) rename {py36 => py3}/aiofiles.ipynb (100%) rename {py35 => py3}/aiohttp.ipynb (100%) rename {py36 => py3}/aioping.ipynb (100%) rename {py36 => py3}/aioping_demo.py (100%) rename {py35 => py3}/airflow/.env (100%) rename {py35 => py3}/airflow/airflow.cfg (100%) rename {py35 => py3}/airflow/airflow.db (100%) rename {py35 => py3}/airflow/unittests.cfg (100%) rename {py35 => py3}/arrow.ipynb (100%) rename {py34 => py3}/association-analysis/apriori.py (100%) rename {py34 => py3}/association-analysis/notebook/apriori.ipynb (100%) rename {py34 => py3}/association-analysis/notebook/gen_dataset.ipynb (100%) rename {py35 => py3}/async.ipynb (100%) rename {py36 => py3}/asyncio.ipynb (100%) rename {py36 => py3}/asyncio_locks.py (100%) rename {py34 => py3}/beauty/cpu usage .ipynb (100%) rename {py34 => py3}/beauty/cpu-usage.gif (100%) rename {py34 => py3}/blinker/README.md (100%) rename {py34 => py3}/blinker/blinker.html (100%) rename {py34 => py3}/blinker/notebook/blinker.ipynb (100%) rename {py35 => py3}/celery/app.ipynb (100%) rename {py35 => py3}/celery/tasks.py (100%) rename {py34 => py3}/commandlineutils/argparse_demo.py (100%) rename {py34 => py3}/commandlineutils/click_demo.py (100%) rename {py34 => py3}/commandlineutils/tqdm_demo.py (100%) rename {py34 => py3}/commandlineutils/xtermcolor_demo.py (100%) rename {py34 => py3}/cython/Cython.html (100%) rename {py34 => py3}/cython/README.md (100%) rename {py34 => py3}/cython/bench.ipy (100%) rename {py34 => py3}/cython/fast.pyx (100%) rename {py34 => py3}/cython/faster.pyx (100%) rename {py34 => py3}/cython/fastest.pyx (100%) rename {py34 => py3}/cython/notebook/Cython.ipynb (100%) rename {py34 => py3}/cython/origin.html (100%) rename {py34 => py3}/cython/origin.py (100%) rename {py34 => py3}/cython/setup.py (100%) rename {py34 => py3}/cython/startup/README (100%) rename {py36 => py3}/data/demo-2-over+previous.png (100%) rename {py36 => py3}/data/huawei.jpg (100%) rename {py35 => py3}/data/project.db (100%) rename {py35 => py3}/data/result.db (100%) rename {py35 => py3}/data/scheduler.1d (100%) rename {py35 => py3}/data/scheduler.1h (100%) rename {py35 => py3}/data/scheduler.all (100%) rename {py35 => py3}/data/task.db (100%) rename {py36 => py3}/data/test.gif (100%) rename {py36 => py3}/data/test.txt (100%) rename {py36 => py3}/data/test.webp (100%) rename {py36 => py3}/datetime.ipynb (100%) rename {py34 => py3}/design-pattern/Adapter Pattern.ipynb (100%) rename {py34 => py3}/design-pattern/Command Pattern.ipynb (100%) rename {py34 => py3}/design-pattern/Decorator Pattern.ipynb (100%) rename {py34 => py3}/design-pattern/Factory Method Pattern.ipynb (100%) rename {py34 => py3}/design-pattern/Observer Pattern.ipynb (100%) rename {py34 => py3}/design-pattern/README.md (100%) rename {py34 => py3}/design-pattern/Singleton Pattern.ipynb (100%) rename {py34 => py3}/design-pattern/Strategy Pattern.ipynb (100%) rename {py34 => py3}/design-pattern/Template Pattern.ipynb (100%) rename {py34 => py3}/encrypt/bcrypt.ipynb (100%) rename {py34 => py3}/flask/README.md (100%) rename {py34 => py3}/flask/meinheld/1 (100%) rename {py34 => py3}/flask/meinheld/flask_meinheld.py (100%) rename {py34 => py3}/flask/meinheld/pure_meinheld.py (100%) rename {py34 => py3}/flask/rest/README.md (100%) rename {py34 => py3}/flask/rest/app.py (100%) rename {py34 => py3}/flask/tutorial/app.py (100%) rename {py34 => py3}/flask/tutorial/appdemo/__init__.py (100%) rename {py34 => py3}/flask/tutorial/appdemo/urls.py (100%) rename {py34 => py3}/flask/tutorial/settings.py (100%) rename {py34 => py3}/flask/tutorial/templates/base.html (100%) rename {py34 => py3}/flask/tutorial/templates/demo.html (100%) rename {py34 => py3}/flask/tutorial/templates/index.html (100%) rename {py36 => py3}/gc_demo.py (100%) rename {py36 => py3}/gql.ipynb (100%) rename {py35 => py3}/graphene/README.md (100%) rename {py35 => py3}/graphene/complex.py (100%) rename {py35 => py3}/graphene/simple.py (100%) rename {py36 => py3}/hypothesis/README.md (100%) rename {py36 => py3}/hypothesis/source.py (100%) rename {py36 => py3}/hypothesis/tests.py (100%) rename {py36 => py3}/japronto/async_demo.py (100%) rename {py35 => py3}/jieba/simple-demo.ipynb (100%) rename {py34 => py3}/ldap-demo/ldap.ipynb (100%) rename {py35 => py3}/lxml & xpath.ipynb (100%) rename {py36 => py3}/markdown/markdown.ipynb (100%) rename {py36 => py3}/markdown/simple.html (100%) rename {py35 => py3}/mock.ipynb (100%) rename {py35 => py3}/mock/demo.ipynb (100%) rename {py35 => py3}/mock/mock.ipynb (100%) rename {py35 => py3}/mock/settings/__init__.py (100%) rename {py35 => py3}/mock/settings/settings.py (100%) rename {py35 => py3}/mypy/README.md (100%) rename {py35 => py3}/mypy/class.py (100%) rename {py35 => py3}/mypy/simple.py (100%) rename {py34 => py3}/networkx/README.md (100%) rename {py34 => py3}/networkx/tutorial.ipynb (100%) rename {py36 => py3}/nlp/README.md (100%) rename {py36 => py3}/nlp/stopwords.ipynb (100%) rename {py34 => py3}/pandas/DataFrame.html (100%) rename {py34 => py3}/pandas/README.md (100%) rename {py34 => py3}/pandas/matplotlib.html (100%) rename {py34 => py3}/pandas/notebook/dict.ipynb (100%) rename {py34 => py3}/pandas/notebook/matplotlib.ipynb (100%) rename {py34 => py3}/pandas/notebook/pandas.ipynb (100%) rename {py34 => py3}/pandas/notebook/pivot_table.ipynb (100%) rename {py34 => py3}/pandas/notebook/test.ipynb (100%) rename {py34 => py3}/pandas/notebook/wordpress.ipynb (100%) rename {py34 => py3}/paramiko/paramiko.ipynb (100%) rename {py34 => py3}/parse-html/notebook/lxml.ipynb (100%) rename {py36 => py3}/pillow/README.md (100%) rename {py36 => py3}/pillow/data/huge.jpeg (100%) rename {py36 => py3}/pillow/pillow-simd.ipynb (100%) rename {py35 => py3}/profiling/README.md (100%) rename {py35 => py3}/profiling/base.py (100%) rename {py35 => py3}/profiling/simple_cprofile.py (100%) rename {py35 => py3}/profiling/simple_lineprofiler.py (100%) rename {py35 => py3}/profiling/simple_lineprofiler.py.lprof (100%) rename {py35 => py3}/profiling/test_objgraph.py (100%) rename {py35 => py3}/profiling/test_pprofile.py (100%) rename {py35 => py3}/profiling/test_pstats.py (100%) rename {py35 => py3}/profiling/timeit (100%) rename {py34 => py3}/purl/purl.ipynb (100%) rename {py35 => py3}/py35-new-syntax.ipynb (100%) rename {py34 => py3}/pyinotify/notebook/Untitled.ipynb (100%) rename {py34 => py3}/pyjwt/notebook/pyjwt.ipynb (100%) rename {py34 => py3}/pymining/notebook/pymining.ipynb (100%) rename {py35 => py3}/pyquery.ipynb (100%) rename {py34 => py3}/pysnmp/README.md (100%) rename {py34 => py3}/pysnmp/nmap.ipynb (100%) rename {py34 => py3}/pysnmp/pysnmp.ipynb (100%) rename {py35 => py3}/pyspider/data/project.db (100%) rename {py35 => py3}/pyspider/data/result.db (100%) rename {py35 => py3}/pyspider/data/scheduler.1d (100%) rename {py35 => py3}/pyspider/data/scheduler.1h (100%) rename {py35 => py3}/pyspider/data/scheduler.all (100%) rename {py35 => py3}/pyspider/data/task.db (100%) rename {py35 => py3}/pytest-benchmark/README.md (100%) rename {py35 => py3}/pytest-benchmark/test_simple.py (100%) rename {py34 => py3}/python-syntax/Coroutine.html (100%) rename {py34 => py3}/python-syntax/README.md (100%) rename {py34 => py3}/python-syntax/concurrent.futures.html (100%) rename {py34 => py3}/python-syntax/descriptor.html (100%) rename {py34 => py3}/python-syntax/notebook/Coroutine.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/asterisk.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/bisect.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/calendar.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/collections.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/concurrent.futures.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/copy.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/decimal.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/descriptor.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/email.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/enum.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/format.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/fractions.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/functools.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/headq.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/itertools.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/mock.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/pytz.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/sched.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/selectors.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/smtplib.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/statistics.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/textwrap.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/weakref.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/xml.ipynb (100%) rename {py34 => py3}/python-syntax/notebook/yield & yield from.ipynb (100%) rename {py34 => py3}/requirements.txt (58%) rename {py35 => py3}/sanic/README.md (100%) rename {py35 => py3}/sanic/bench.py (100%) rename {py34 => py3}/scipy/README.md (100%) rename {py34 => py3}/scipy/notebook/distance_by_cython.ipynb (100%) rename {py34 => py3}/scipy/notebook/sparse.ipynb (100%) rename {py34 => py3}/scipy/sparse.html (100%) rename {py35 => py3}/selenium.ipynb (100%) rename {py34 => py3}/setup.py (100%) rename {py36 => py3}/signal.ipynb (100%) rename {py34 => py3}/sklearn/KNN.html (100%) rename {py34 => py3}/sklearn/README.md (100%) rename {py34 => py3}/sklearn/notebook/KNN.ipynb (100%) rename {py35 => py3}/smtp.ipynb (100%) rename {py36 => py3}/syntax.ipynb (100%) rename {py35 => py3}/test_ipdb.py (100%) rename {py36 => py3}/thrift/simple_example/__init__.py (100%) rename {py36 => py3}/thrift/simple_example/client.py (100%) rename {py36 => py3}/thrift/simple_example/example.thrift (100%) rename {py36 => py3}/thrift/simple_example/example/__init__.py (100%) rename {py36 => py3}/thrift/simple_example/example/constants.py (100%) rename {py36 => py3}/thrift/simple_example/example/format_data-remote (100%) rename {py36 => py3}/thrift/simple_example/example/format_data.py (100%) rename {py36 => py3}/thrift/simple_example/example/ttypes.py (100%) rename {py36 => py3}/thrift/simple_example/server.py (100%) rename {py34 => py3}/tornado/app.py (100%) rename {py34 => py3}/tornado/notebook/async.ipynb (100%) rename {py34 => py3}/tox/requirements.txt (100%) rename {py34 => py3}/tox/setup.py (100%) rename {py34 => py3}/tox/src/tox_test/__init__.py (100%) rename {py34 => py3}/tox/tests/test_tox.py (100%) rename {py34 => py3}/tox/tox.ini (100%) rename {py36 => py3}/tqdm.ipynb (100%) rename {py36 => py3}/twitter.ipynb (100%) rename {py35 => py3}/typing.ipynb (100%) rename {py34 => py3}/unittest/app.py (100%) rename {py34 => py3}/unittest/tests/test_fixtures.py (100%) rename {py34 => py3}/unittest/tests/test_simple.py (100%) rename {py36 => py3}/variables.ipynb (100%) rename {py35 => py3}/web_bench/test_aiohttp.py (100%) rename {py35 => py3}/web_bench/test_flask.py (100%) rename {py35 => py3}/web_bench/test_flaskmeinheld.py (100%) rename {py35 => py3}/web_bench/test_meinheld.py (100%) rename {py35 => py3}/web_bench/test_sanic.py (100%) rename {py35 => py3}/web_bench/test_tornado.py (100%) rename {py36 => py3}/webp.ipynb (100%) rename {py35 => py3}/zipapp.ipynb (100%) delete mode 100644 py34/README.md delete mode 100644 py35/README.md delete mode 100644 py35/requirements.txt delete mode 100644 py36/README.md delete mode 100644 py36/requirements.txt diff --git a/golang/src/demo/gocache-demo/main_test.go b/golang/src/demo/gocache-demo/main_test.go index 41a59bb8..38e1a343 100644 --- a/golang/src/demo/gocache-demo/main_test.go +++ b/golang/src/demo/gocache-demo/main_test.go @@ -1,6 +1,23 @@ +/* +BenchmarkKVS/go-cache_insert-4 1000000 25018 ns/op 343 B/op 5 allocs/op +BenchmarkKVS/go-cache_get-4 2000000 8069 ns/op 64 B/op 2 allocs/op +BenchmarkKVS/go-cache_count-4 50000000 302 ns/op 0 B/op 0 allocs/op +BenchmarkKVS/sync.map_insert-4 1000000 17755 ns/op 322 B/op 9 allocs/op +BenchmarkKVS/sync.map_get-4 2000000 9097 ns/op 64 B/op 2 allocs/op +BenchmarkKVS/sync.map_count-4 50 552671238 ns/op 172 B/op 5 allocs/op + +BenchmarkInt64KVS/go-cache_insert-4 1000000 19597 ns/op 84 B/op 4 allocs/op +BenchmarkInt64KVS/go-cache_get-4 10000000 1848 ns/op 0 B/op 0 allocs/op +BenchmarkInt64KVS/go-cache_count-4 30000000 384 ns/op 0 B/op 0 allocs/op +BenchmarkInt64KVS/sync.map_insert-4 1000000 14937 ns/op 250 B/op 7 allocs/op +BenchmarkInt64KVS/sync.map_get-4 10000000 1135 ns/op 0 B/op 0 allocs/op +BenchmarkInt64KVS/sync.map_count-4 50 330416714 ns/op 103 B/op 3 allocs/op +*/ + package main_test import ( + "math/rand" "sync" "testing" "time" @@ -10,17 +27,6 @@ import ( "github.com/patrickmn/go-cache" ) -/* -go test . -race -bench "K" -benchtime=10s -benchmem -goos: darwin -goarch: amd64 -pkg: github.com/Laisky/HelloWorld/golang/src/demo/gocache-demo - -BenchmarkKVS/go-cache_insert-4 500000 26164 ns/op 341 B/op 5 allocs/op -BenchmarkKVS/go-cache_get-4 1000000 12395 ns/op 64 B/op 2 allocs/op -BenchmarkKVS/sync.map_insert-4 500000 25238 ns/op 321 B/op 9 allocs/op -BenchmarkKVS/sync.map_get-4 1000000 12881 ns/op 64 B/op 2 allocs/op -*/ func BenchmarkKVS(b *testing.B) { goCache := cache.New(5*time.Minute, 10*time.Minute) b.Run("go-cache insert", func(b *testing.B) { @@ -33,6 +39,11 @@ func BenchmarkKVS(b *testing.B) { goCache.Get(utils.RandomStringWithLength(10)) } }) + b.Run("go-cache count", func(b *testing.B) { + for i := 0; i < b.N; i++ { + goCache.ItemCount() + } + }) syncMap := sync.Map{} b.Run("sync.map insert", func(b *testing.B) { @@ -45,5 +56,49 @@ func BenchmarkKVS(b *testing.B) { syncMap.Load(utils.RandomStringWithLength(10)) } }) + b.Run("sync.map count", func(b *testing.B) { + for i := 0; i < b.N; i++ { + syncMap.Range(func(k, v interface{}) bool { + return true + }) + } + }) +} + +func BenchmarkInt64KVS(b *testing.B) { + goCache := cache.New(5*time.Minute, 10*time.Minute) + b.Run("go-cache insert", func(b *testing.B) { + for i := 0; i < b.N; i++ { + goCache.Set(string(rand.Int63()), utils.RandomStringWithLength(10), cache.DefaultExpiration) + } + }) + b.Run("go-cache get", func(b *testing.B) { + for i := 0; i < b.N; i++ { + goCache.Get(string(rand.Int63())) + } + }) + b.Run("go-cache count", func(b *testing.B) { + for i := 0; i < b.N; i++ { + goCache.ItemCount() + } + }) + syncMap := sync.Map{} + b.Run("sync.map insert", func(b *testing.B) { + for i := 0; i < b.N; i++ { + syncMap.Store(rand.Int63(), utils.RandomStringWithLength(10)) + } + }) + b.Run("sync.map get", func(b *testing.B) { + for i := 0; i < b.N; i++ { + syncMap.Load(rand.Int63()) + } + }) + b.Run("sync.map count", func(b *testing.B) { + for i := 0; i < b.N; i++ { + syncMap.Range(func(k, v interface{}) bool { + return true + }) + } + }) } diff --git a/py27/README.md b/py2/README.md similarity index 100% rename from py27/README.md rename to py2/README.md diff --git a/py27/builtins.ipynb b/py2/builtins.ipynb similarity index 100% rename from py27/builtins.ipynb rename to py2/builtins.ipynb diff --git a/py27/cython/Rectangle.cpp b/py2/cython/Rectangle.cpp similarity index 100% rename from py27/cython/Rectangle.cpp rename to py2/cython/Rectangle.cpp diff --git a/py27/cython/Rectangle.h b/py2/cython/Rectangle.h similarity index 100% rename from py27/cython/Rectangle.h rename to py2/cython/Rectangle.h diff --git a/py27/cython/helloworld.pyx b/py2/cython/helloworld.pyx similarity index 100% rename from py27/cython/helloworld.pyx rename to py2/cython/helloworld.pyx diff --git a/py27/cython/rect.cpp b/py2/cython/rect.cpp similarity index 100% rename from py27/cython/rect.cpp rename to py2/cython/rect.cpp diff --git a/py27/cython/rect.pyx b/py2/cython/rect.pyx similarity index 100% rename from py27/cython/rect.pyx rename to py2/cython/rect.pyx diff --git a/py27/cython/setup.py b/py2/cython/setup.py similarity index 100% rename from py27/cython/setup.py rename to py2/cython/setup.py diff --git a/py27/django/README.md b/py2/django/README.md similarity index 100% rename from py27/django/README.md rename to py2/django/README.md diff --git a/py27/django/mysite/app/__init__.py b/py2/django/mysite/app/__init__.py similarity index 100% rename from py27/django/mysite/app/__init__.py rename to py2/django/mysite/app/__init__.py diff --git a/py27/django/mysite/app/models.py b/py2/django/mysite/app/models.py similarity index 100% rename from py27/django/mysite/app/models.py rename to py2/django/mysite/app/models.py diff --git a/py27/django/mysite/app/templatetags/__init__.py b/py2/django/mysite/app/templatetags/__init__.py similarity index 100% rename from py27/django/mysite/app/templatetags/__init__.py rename to py2/django/mysite/app/templatetags/__init__.py diff --git a/py27/django/mysite/app/templatetags/my_filter.py b/py2/django/mysite/app/templatetags/my_filter.py similarity index 100% rename from py27/django/mysite/app/templatetags/my_filter.py rename to py2/django/mysite/app/templatetags/my_filter.py diff --git a/py27/django/mysite/app/templatetags/my_tags.py b/py2/django/mysite/app/templatetags/my_tags.py similarity index 100% rename from py27/django/mysite/app/templatetags/my_tags.py rename to py2/django/mysite/app/templatetags/my_tags.py diff --git a/py27/django/mysite/app/urls.py b/py2/django/mysite/app/urls.py similarity index 100% rename from py27/django/mysite/app/urls.py rename to py2/django/mysite/app/urls.py diff --git a/py27/django/mysite/app/views.py b/py2/django/mysite/app/views.py similarity index 100% rename from py27/django/mysite/app/views.py rename to py2/django/mysite/app/views.py diff --git a/py27/django/mysite/db.sqlite3 b/py2/django/mysite/db.sqlite3 similarity index 100% rename from py27/django/mysite/db.sqlite3 rename to py2/django/mysite/db.sqlite3 diff --git a/py27/django/mysite/manage.py b/py2/django/mysite/manage.py similarity index 100% rename from py27/django/mysite/manage.py rename to py2/django/mysite/manage.py diff --git a/py27/django/mysite/mysite/__init__.py b/py2/django/mysite/mysite/__init__.py similarity index 100% rename from py27/django/mysite/mysite/__init__.py rename to py2/django/mysite/mysite/__init__.py diff --git a/py27/django/mysite/mysite/db.sqlite3 b/py2/django/mysite/mysite/db.sqlite3 similarity index 100% rename from py27/django/mysite/mysite/db.sqlite3 rename to py2/django/mysite/mysite/db.sqlite3 diff --git a/py27/django/mysite/mysite/routers.py b/py2/django/mysite/mysite/routers.py similarity index 100% rename from py27/django/mysite/mysite/routers.py rename to py2/django/mysite/mysite/routers.py diff --git a/py27/django/mysite/mysite/settings.py b/py2/django/mysite/mysite/settings.py similarity index 100% rename from py27/django/mysite/mysite/settings.py rename to py2/django/mysite/mysite/settings.py diff --git a/py27/django/mysite/mysite/urls.py b/py2/django/mysite/mysite/urls.py similarity index 100% rename from py27/django/mysite/mysite/urls.py rename to py2/django/mysite/mysite/urls.py diff --git a/py27/django/mysite/mysite/views.py b/py2/django/mysite/mysite/views.py similarity index 100% rename from py27/django/mysite/mysite/views.py rename to py2/django/mysite/mysite/views.py diff --git a/py27/django/mysite/mysite/wsgi.py b/py2/django/mysite/mysite/wsgi.py similarity index 100% rename from py27/django/mysite/mysite/wsgi.py rename to py2/django/mysite/mysite/wsgi.py diff --git a/py27/django/mysite/nosql/__init__.py b/py2/django/mysite/nosql/__init__.py similarity index 100% rename from py27/django/mysite/nosql/__init__.py rename to py2/django/mysite/nosql/__init__.py diff --git a/py27/django/mysite/nosql/models.py b/py2/django/mysite/nosql/models.py similarity index 100% rename from py27/django/mysite/nosql/models.py rename to py2/django/mysite/nosql/models.py diff --git a/py27/django/mysite/nosql/urls.py b/py2/django/mysite/nosql/urls.py similarity index 100% rename from py27/django/mysite/nosql/urls.py rename to py2/django/mysite/nosql/urls.py diff --git a/py27/django/mysite/nosql/views.py b/py2/django/mysite/nosql/views.py similarity index 100% rename from py27/django/mysite/nosql/views.py rename to py2/django/mysite/nosql/views.py diff --git a/py27/django/mysite/notebook/nosql.ipynb b/py2/django/mysite/notebook/nosql.ipynb similarity index 100% rename from py27/django/mysite/notebook/nosql.ipynb rename to py2/django/mysite/notebook/nosql.ipynb diff --git a/py27/django/mysite/requirements.txt b/py2/django/mysite/requirements.txt similarity index 100% rename from py27/django/mysite/requirements.txt rename to py2/django/mysite/requirements.txt diff --git a/py27/django/mysite/rest/__init__.py b/py2/django/mysite/rest/__init__.py similarity index 100% rename from py27/django/mysite/rest/__init__.py rename to py2/django/mysite/rest/__init__.py diff --git a/py27/django/mysite/rest/apis.py b/py2/django/mysite/rest/apis.py similarity index 100% rename from py27/django/mysite/rest/apis.py rename to py2/django/mysite/rest/apis.py diff --git a/py27/django/mysite/rest/models.py b/py2/django/mysite/rest/models.py similarity index 100% rename from py27/django/mysite/rest/models.py rename to py2/django/mysite/rest/models.py diff --git a/py27/django/mysite/rest/urls.py b/py2/django/mysite/rest/urls.py similarity index 100% rename from py27/django/mysite/rest/urls.py rename to py2/django/mysite/rest/urls.py diff --git a/py27/django/mysite/rest/views.py b/py2/django/mysite/rest/views.py similarity index 100% rename from py27/django/mysite/rest/views.py rename to py2/django/mysite/rest/views.py diff --git a/py27/django/mysite/templates/demo.html b/py2/django/mysite/templates/demo.html similarity index 100% rename from py27/django/mysite/templates/demo.html rename to py2/django/mysite/templates/demo.html diff --git a/py27/django/mysite/templates/nosql/posts_list.html b/py2/django/mysite/templates/nosql/posts_list.html similarity index 100% rename from py27/django/mysite/templates/nosql/posts_list.html rename to py2/django/mysite/templates/nosql/posts_list.html diff --git a/py27/django/mysite/templates/user/authorized.html b/py2/django/mysite/templates/user/authorized.html similarity index 100% rename from py27/django/mysite/templates/user/authorized.html rename to py2/django/mysite/templates/user/authorized.html diff --git a/py27/django/mysite/templates/user/login.html b/py2/django/mysite/templates/user/login.html similarity index 100% rename from py27/django/mysite/templates/user/login.html rename to py2/django/mysite/templates/user/login.html diff --git a/py27/django/mysite/templates/user/register.html b/py2/django/mysite/templates/user/register.html similarity index 100% rename from py27/django/mysite/templates/user/register.html rename to py2/django/mysite/templates/user/register.html diff --git a/py27/django/mysite/user/__init__.py b/py2/django/mysite/user/__init__.py similarity index 100% rename from py27/django/mysite/user/__init__.py rename to py2/django/mysite/user/__init__.py diff --git a/py27/django/mysite/user/forms.py b/py2/django/mysite/user/forms.py similarity index 100% rename from py27/django/mysite/user/forms.py rename to py2/django/mysite/user/forms.py diff --git a/py27/django/mysite/user/urls.py b/py2/django/mysite/user/urls.py similarity index 100% rename from py27/django/mysite/user/urls.py rename to py2/django/mysite/user/urls.py diff --git a/py27/django/mysite/user/views.py b/py2/django/mysite/user/views.py similarity index 100% rename from py27/django/mysite/user/views.py rename to py2/django/mysite/user/views.py diff --git a/py27/django/rest/README.md b/py2/django/rest/README.md similarity index 100% rename from py27/django/rest/README.md rename to py2/django/rest/README.md diff --git a/py27/django/rest/apis/__init__.py b/py2/django/rest/apis/__init__.py similarity index 100% rename from py27/django/rest/apis/__init__.py rename to py2/django/rest/apis/__init__.py diff --git a/py27/django/rest/apis/models/__init__.py b/py2/django/rest/apis/models/__init__.py similarity index 100% rename from py27/django/rest/apis/models/__init__.py rename to py2/django/rest/apis/models/__init__.py diff --git a/py27/django/rest/apis/models/fields.py b/py2/django/rest/apis/models/fields.py similarity index 100% rename from py27/django/rest/apis/models/fields.py rename to py2/django/rest/apis/models/fields.py diff --git a/py27/django/rest/apis/serializers/__init__.py b/py2/django/rest/apis/serializers/__init__.py similarity index 100% rename from py27/django/rest/apis/serializers/__init__.py rename to py2/django/rest/apis/serializers/__init__.py diff --git a/py27/django/rest/apis/serializers/fields.py b/py2/django/rest/apis/serializers/fields.py similarity index 100% rename from py27/django/rest/apis/serializers/fields.py rename to py2/django/rest/apis/serializers/fields.py diff --git a/py27/django/rest/apis/urls.py b/py2/django/rest/apis/urls.py similarity index 100% rename from py27/django/rest/apis/urls.py rename to py2/django/rest/apis/urls.py diff --git a/py27/django/rest/apis/utils/__init__.py b/py2/django/rest/apis/utils/__init__.py similarity index 100% rename from py27/django/rest/apis/utils/__init__.py rename to py2/django/rest/apis/utils/__init__.py diff --git a/py27/django/rest/apis/utils/encrypt.py b/py2/django/rest/apis/utils/encrypt.py similarity index 100% rename from py27/django/rest/apis/utils/encrypt.py rename to py2/django/rest/apis/utils/encrypt.py diff --git a/py27/django/rest/apis/views.py b/py2/django/rest/apis/views.py similarity index 100% rename from py27/django/rest/apis/views.py rename to py2/django/rest/apis/views.py diff --git a/py27/django/rest/manage.py b/py2/django/rest/manage.py similarity index 100% rename from py27/django/rest/manage.py rename to py2/django/rest/manage.py diff --git a/py27/django/rest/quickstart/__init__.py b/py2/django/rest/quickstart/__init__.py similarity index 100% rename from py27/django/rest/quickstart/__init__.py rename to py2/django/rest/quickstart/__init__.py diff --git a/py27/django/rest/quickstart/serializers.py b/py2/django/rest/quickstart/serializers.py similarity index 100% rename from py27/django/rest/quickstart/serializers.py rename to py2/django/rest/quickstart/serializers.py diff --git a/py27/django/rest/quickstart/urls.py b/py2/django/rest/quickstart/urls.py similarity index 100% rename from py27/django/rest/quickstart/urls.py rename to py2/django/rest/quickstart/urls.py diff --git a/py27/django/rest/quickstart/views.py b/py2/django/rest/quickstart/views.py similarity index 100% rename from py27/django/rest/quickstart/views.py rename to py2/django/rest/quickstart/views.py diff --git a/py27/django/rest/requirements.txt b/py2/django/rest/requirements.txt similarity index 100% rename from py27/django/rest/requirements.txt rename to py2/django/rest/requirements.txt diff --git a/py27/django/rest/rest/__init__.py b/py2/django/rest/rest/__init__.py similarity index 100% rename from py27/django/rest/rest/__init__.py rename to py2/django/rest/rest/__init__.py diff --git a/py27/django/rest/rest/settings.py b/py2/django/rest/rest/settings.py similarity index 100% rename from py27/django/rest/rest/settings.py rename to py2/django/rest/rest/settings.py diff --git a/py27/django/rest/rest/urls.py b/py2/django/rest/rest/urls.py similarity index 100% rename from py27/django/rest/rest/urls.py rename to py2/django/rest/rest/urls.py diff --git a/py27/django/rest/rest/wsgi.py b/py2/django/rest/rest/wsgi.py similarity index 100% rename from py27/django/rest/rest/wsgi.py rename to py2/django/rest/rest/wsgi.py diff --git a/py27/django/rest/simple/__init__.py b/py2/django/rest/simple/__init__.py similarity index 100% rename from py27/django/rest/simple/__init__.py rename to py2/django/rest/simple/__init__.py diff --git a/py27/django/rest/simple/urls.py b/py2/django/rest/simple/urls.py similarity index 100% rename from py27/django/rest/simple/urls.py rename to py2/django/rest/simple/urls.py diff --git a/py27/ldap-demo/ldap.ipynb b/py2/ldap-demo/ldap.ipynb similarity index 100% rename from py27/ldap-demo/ldap.ipynb rename to py2/ldap-demo/ldap.ipynb diff --git a/py27/pygraphviz/README.md b/py2/pygraphviz/README.md similarity index 100% rename from py27/pygraphviz/README.md rename to py2/pygraphviz/README.md diff --git a/py27/pygraphviz/circo.jpg b/py2/pygraphviz/circo.jpg similarity index 100% rename from py27/pygraphviz/circo.jpg rename to py2/pygraphviz/circo.jpg diff --git a/py27/pygraphviz/demo.ipynb b/py2/pygraphviz/demo.ipynb similarity index 100% rename from py27/pygraphviz/demo.ipynb rename to py2/pygraphviz/demo.ipynb diff --git a/py27/pygraphviz/dot.jpg b/py2/pygraphviz/dot.jpg similarity index 100% rename from py27/pygraphviz/dot.jpg rename to py2/pygraphviz/dot.jpg diff --git a/py27/pygraphviz/edge.jpg b/py2/pygraphviz/edge.jpg similarity index 100% rename from py27/pygraphviz/edge.jpg rename to py2/pygraphviz/edge.jpg diff --git a/py27/pygraphviz/fdp.jpg b/py2/pygraphviz/fdp.jpg similarity index 100% rename from py27/pygraphviz/fdp.jpg rename to py2/pygraphviz/fdp.jpg diff --git a/py27/pygraphviz/g.jpg b/py2/pygraphviz/g.jpg similarity index 100% rename from py27/pygraphviz/g.jpg rename to py2/pygraphviz/g.jpg diff --git a/py27/pygraphviz/head.jpg b/py2/pygraphviz/head.jpg similarity index 100% rename from py27/pygraphviz/head.jpg rename to py2/pygraphviz/head.jpg diff --git a/py27/pygraphviz/html.jpg b/py2/pygraphviz/html.jpg similarity index 100% rename from py27/pygraphviz/html.jpg rename to py2/pygraphviz/html.jpg diff --git a/py27/pygraphviz/img/core-router.jpg b/py2/pygraphviz/img/core-router.jpg similarity index 100% rename from py27/pygraphviz/img/core-router.jpg rename to py2/pygraphviz/img/core-router.jpg diff --git a/py27/pygraphviz/img/firewall.jpg b/py2/pygraphviz/img/firewall.jpg similarity index 100% rename from py27/pygraphviz/img/firewall.jpg rename to py2/pygraphviz/img/firewall.jpg diff --git a/py27/pygraphviz/img/link_proof.jpg b/py2/pygraphviz/img/link_proof.jpg similarity index 100% rename from py27/pygraphviz/img/link_proof.jpg rename to py2/pygraphviz/img/link_proof.jpg diff --git a/py27/pygraphviz/img/network.jpg b/py2/pygraphviz/img/network.jpg similarity index 100% rename from py27/pygraphviz/img/network.jpg rename to py2/pygraphviz/img/network.jpg diff --git a/py27/pygraphviz/img/router.jpg b/py2/pygraphviz/img/router.jpg similarity index 100% rename from py27/pygraphviz/img/router.jpg rename to py2/pygraphviz/img/router.jpg diff --git a/py27/pygraphviz/img/s5700.jpg b/py2/pygraphviz/img/s5700.jpg similarity index 100% rename from py27/pygraphviz/img/s5700.jpg rename to py2/pygraphviz/img/s5700.jpg diff --git a/py27/pygraphviz/img/server.jpg b/py2/pygraphviz/img/server.jpg similarity index 100% rename from py27/pygraphviz/img/server.jpg rename to py2/pygraphviz/img/server.jpg diff --git a/py27/pygraphviz/img/switch.jpg b/py2/pygraphviz/img/switch.jpg similarity index 100% rename from py27/pygraphviz/img/switch.jpg rename to py2/pygraphviz/img/switch.jpg diff --git a/py27/pygraphviz/neato.jpg b/py2/pygraphviz/neato.jpg similarity index 100% rename from py27/pygraphviz/neato.jpg rename to py2/pygraphviz/neato.jpg diff --git a/py27/pygraphviz/node.jpg b/py2/pygraphviz/node.jpg similarity index 100% rename from py27/pygraphviz/node.jpg rename to py2/pygraphviz/node.jpg diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/.gitignore b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/.gitignore similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/.gitignore rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/.gitignore diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/INSTALL.txt b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/INSTALL.txt similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/INSTALL.txt rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/INSTALL.txt diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/MANIFEST.in b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/MANIFEST.in similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/MANIFEST.in rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/MANIFEST.in diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/Makefile b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/Makefile similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/Makefile rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/Makefile diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/README.txt b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/README.txt similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/README.txt rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/README.txt diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/Makefile b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/Makefile similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/Makefile rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/Makefile diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/gh-pages.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/gh-pages.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/gh-pages.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/gh-pages.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/conf.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/conf.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/conf.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/conf.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/download.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/download.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/download.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/download.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/examples.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/examples.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/examples.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/examples.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/index.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/index.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/index.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/index.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/install.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/install.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/install.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/install.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/agraph.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/agraph.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/agraph.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/agraph.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/api_notes.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/api_notes.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/api_notes.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/api_notes.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/credits.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/credits.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/credits.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/credits.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/faq.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/faq.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/faq.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/faq.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/history.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/history.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/history.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/history.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/index.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/index.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/index.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/index.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/legal.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/legal.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/legal.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/legal.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/news.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/news.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/news.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/news.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/related.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/related.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/related.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/reference/related.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/contents.png b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/contents.png similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/contents.png rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/contents.png diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/empty.txt b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/empty.txt similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/empty.txt rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/empty.txt diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/navigation.png b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/navigation.png similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/navigation.png rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/navigation.png diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/sphinxdoc.css b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/sphinxdoc.css similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/sphinxdoc.css rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/static/sphinxdoc.css diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/index.html b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/index.html similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/index.html rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/index.html diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/indexsidebar.html b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/indexsidebar.html similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/indexsidebar.html rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/indexsidebar.html diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/layout.html b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/layout.html similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/layout.html rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/templates/layout.html diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/tutorial.rst b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/tutorial.rst similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/tutorial.rst rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/source/tutorial.rst diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/sphinxext/only_directives.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/sphinxext/only_directives.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/sphinxext/only_directives.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/doc/sphinxext/only_directives.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/attributes.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/attributes.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/attributes.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/attributes.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/django_simple.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/django_simple.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/django_simple.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/django_simple.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/miles.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/miles.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/miles.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/miles.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/miles_dat.txt.gz b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/miles_dat.txt.gz similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/miles_dat.txt.gz rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/miles_dat.txt.gz diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/simple.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/simple.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/simple.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/simple.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/star.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/star.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/star.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/star.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/subgraph.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/subgraph.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/subgraph.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/subgraph.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/utf8_encoding.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/utf8_encoding.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/utf8_encoding.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/examples/utf8_encoding.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/__init__.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/__init__.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/__init__.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/__init__.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/agraph.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/agraph.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/agraph.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/agraph.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz.i b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz.i similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz.i rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz.i diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz_wrap.c b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz_wrap.c similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz_wrap.c rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/graphviz_wrap.c diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/release.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/release.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/release.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/release.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/__init__.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/__init__.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/__init__.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/__init__.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_attribute_defaults.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_attribute_defaults.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_attribute_defaults.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_attribute_defaults.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_attributes.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_attributes.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_attributes.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_attributes.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_drawing.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_drawing.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_drawing.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_drawing.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_edge_attributes.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_edge_attributes.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_edge_attributes.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_edge_attributes.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_graph.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_graph.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_graph.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_graph.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_html.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_html.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_html.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_html.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_layout.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_layout.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_layout.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_layout.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_node_attributes.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_node_attributes.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_node_attributes.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_node_attributes.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_readwrite.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_readwrite.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_readwrite.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_readwrite.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_string.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_string.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_string.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_string.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_subgraph.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_subgraph.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_subgraph.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_subgraph.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_unicode.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_unicode.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_unicode.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pygraphviz/tests/test_unicode.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pystrings.swg b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pystrings.swg similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pystrings.swg rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/pystrings.swg diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup.cfg b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup.cfg similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup.cfg rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup.cfg diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup_egg.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup_egg.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup_egg.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup_egg.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup_extra.py b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup_extra.py similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup_extra.py rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/setup_extra.py diff --git a/py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/tox.ini b/py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/tox.ini similarity index 100% rename from py27/pygraphviz/pygraphviz-pygraphviz-1.3rc2/tox.ini rename to py2/pygraphviz/pygraphviz-pygraphviz-1.3rc2/tox.ini diff --git a/py27/pygraphviz/pygraphviz.ipynb b/py2/pygraphviz/pygraphviz.ipynb similarity index 100% rename from py27/pygraphviz/pygraphviz.ipynb rename to py2/pygraphviz/pygraphviz.ipynb diff --git a/py27/pygraphviz/pytopo.ipynb b/py2/pygraphviz/pytopo.ipynb similarity index 100% rename from py27/pygraphviz/pytopo.ipynb rename to py2/pygraphviz/pytopo.ipynb diff --git a/py27/pygraphviz/pytopo.py b/py2/pygraphviz/pytopo.py similarity index 100% rename from py27/pygraphviz/pytopo.py rename to py2/pygraphviz/pytopo.py diff --git a/py27/pygraphviz/simple.jpg b/py2/pygraphviz/simple.jpg similarity index 100% rename from py27/pygraphviz/simple.jpg rename to py2/pygraphviz/simple.jpg diff --git a/py27/pygraphviz/subgraph.jpg b/py2/pygraphviz/subgraph.jpg similarity index 100% rename from py27/pygraphviz/subgraph.jpg rename to py2/pygraphviz/subgraph.jpg diff --git a/py27/pygraphviz/topo.jpg b/py2/pygraphviz/topo.jpg similarity index 100% rename from py27/pygraphviz/topo.jpg rename to py2/pygraphviz/topo.jpg diff --git a/py27/pygraphviz/twopi.jpg b/py2/pygraphviz/twopi.jpg similarity index 100% rename from py27/pygraphviz/twopi.jpg rename to py2/pygraphviz/twopi.jpg diff --git a/py27/queue.ipynb b/py2/queue.ipynb similarity index 100% rename from py27/queue.ipynb rename to py2/queue.ipynb diff --git a/py27/requirements.txt b/py2/requirements.txt similarity index 100% rename from py27/requirements.txt rename to py2/requirements.txt diff --git a/py27/sqlite.ipynb b/py2/sqlite.ipynb similarity index 100% rename from py27/sqlite.ipynb rename to py2/sqlite.ipynb diff --git a/py36/DFA.ipynb b/py3/DFA.ipynb similarity index 100% rename from py36/DFA.ipynb rename to py3/DFA.ipynb diff --git a/py3/README.md b/py3/README.md new file mode 100644 index 00000000..8cda8f8a --- /dev/null +++ b/py3/README.md @@ -0,0 +1,11 @@ +# Fun in Python3.x + + +Python 是门好语言 + +写过几篇介绍文: + +* +* +* + diff --git a/py36/aio-boto.ipynb b/py3/aio-boto.ipynb similarity index 100% rename from py36/aio-boto.ipynb rename to py3/aio-boto.ipynb diff --git a/py36/aio_ping_demo.py b/py3/aio_ping_demo.py similarity index 100% rename from py36/aio_ping_demo.py rename to py3/aio_ping_demo.py diff --git a/py36/aiofiles.ipynb b/py3/aiofiles.ipynb similarity index 100% rename from py36/aiofiles.ipynb rename to py3/aiofiles.ipynb diff --git a/py35/aiohttp.ipynb b/py3/aiohttp.ipynb similarity index 100% rename from py35/aiohttp.ipynb rename to py3/aiohttp.ipynb diff --git a/py36/aioping.ipynb b/py3/aioping.ipynb similarity index 100% rename from py36/aioping.ipynb rename to py3/aioping.ipynb diff --git a/py36/aioping_demo.py b/py3/aioping_demo.py similarity index 100% rename from py36/aioping_demo.py rename to py3/aioping_demo.py diff --git a/py35/airflow/.env b/py3/airflow/.env similarity index 100% rename from py35/airflow/.env rename to py3/airflow/.env diff --git a/py35/airflow/airflow.cfg b/py3/airflow/airflow.cfg similarity index 100% rename from py35/airflow/airflow.cfg rename to py3/airflow/airflow.cfg diff --git a/py35/airflow/airflow.db b/py3/airflow/airflow.db similarity index 100% rename from py35/airflow/airflow.db rename to py3/airflow/airflow.db diff --git a/py35/airflow/unittests.cfg b/py3/airflow/unittests.cfg similarity index 100% rename from py35/airflow/unittests.cfg rename to py3/airflow/unittests.cfg diff --git a/py35/arrow.ipynb b/py3/arrow.ipynb similarity index 100% rename from py35/arrow.ipynb rename to py3/arrow.ipynb diff --git a/py34/association-analysis/apriori.py b/py3/association-analysis/apriori.py similarity index 100% rename from py34/association-analysis/apriori.py rename to py3/association-analysis/apriori.py diff --git a/py34/association-analysis/notebook/apriori.ipynb b/py3/association-analysis/notebook/apriori.ipynb similarity index 100% rename from py34/association-analysis/notebook/apriori.ipynb rename to py3/association-analysis/notebook/apriori.ipynb diff --git a/py34/association-analysis/notebook/gen_dataset.ipynb b/py3/association-analysis/notebook/gen_dataset.ipynb similarity index 100% rename from py34/association-analysis/notebook/gen_dataset.ipynb rename to py3/association-analysis/notebook/gen_dataset.ipynb diff --git a/py35/async.ipynb b/py3/async.ipynb similarity index 100% rename from py35/async.ipynb rename to py3/async.ipynb diff --git a/py36/asyncio.ipynb b/py3/asyncio.ipynb similarity index 100% rename from py36/asyncio.ipynb rename to py3/asyncio.ipynb diff --git a/py36/asyncio_locks.py b/py3/asyncio_locks.py similarity index 100% rename from py36/asyncio_locks.py rename to py3/asyncio_locks.py diff --git a/py34/beauty/cpu usage .ipynb b/py3/beauty/cpu usage .ipynb similarity index 100% rename from py34/beauty/cpu usage .ipynb rename to py3/beauty/cpu usage .ipynb diff --git a/py34/beauty/cpu-usage.gif b/py3/beauty/cpu-usage.gif similarity index 100% rename from py34/beauty/cpu-usage.gif rename to py3/beauty/cpu-usage.gif diff --git a/py34/blinker/README.md b/py3/blinker/README.md similarity index 100% rename from py34/blinker/README.md rename to py3/blinker/README.md diff --git a/py34/blinker/blinker.html b/py3/blinker/blinker.html similarity index 100% rename from py34/blinker/blinker.html rename to py3/blinker/blinker.html diff --git a/py34/blinker/notebook/blinker.ipynb b/py3/blinker/notebook/blinker.ipynb similarity index 100% rename from py34/blinker/notebook/blinker.ipynb rename to py3/blinker/notebook/blinker.ipynb diff --git a/py35/celery/app.ipynb b/py3/celery/app.ipynb similarity index 100% rename from py35/celery/app.ipynb rename to py3/celery/app.ipynb diff --git a/py35/celery/tasks.py b/py3/celery/tasks.py similarity index 100% rename from py35/celery/tasks.py rename to py3/celery/tasks.py diff --git a/py34/commandlineutils/argparse_demo.py b/py3/commandlineutils/argparse_demo.py similarity index 100% rename from py34/commandlineutils/argparse_demo.py rename to py3/commandlineutils/argparse_demo.py diff --git a/py34/commandlineutils/click_demo.py b/py3/commandlineutils/click_demo.py similarity index 100% rename from py34/commandlineutils/click_demo.py rename to py3/commandlineutils/click_demo.py diff --git a/py34/commandlineutils/tqdm_demo.py b/py3/commandlineutils/tqdm_demo.py similarity index 100% rename from py34/commandlineutils/tqdm_demo.py rename to py3/commandlineutils/tqdm_demo.py diff --git a/py34/commandlineutils/xtermcolor_demo.py b/py3/commandlineutils/xtermcolor_demo.py similarity index 100% rename from py34/commandlineutils/xtermcolor_demo.py rename to py3/commandlineutils/xtermcolor_demo.py diff --git a/py34/cython/Cython.html b/py3/cython/Cython.html similarity index 100% rename from py34/cython/Cython.html rename to py3/cython/Cython.html diff --git a/py34/cython/README.md b/py3/cython/README.md similarity index 100% rename from py34/cython/README.md rename to py3/cython/README.md diff --git a/py34/cython/bench.ipy b/py3/cython/bench.ipy similarity index 100% rename from py34/cython/bench.ipy rename to py3/cython/bench.ipy diff --git a/py34/cython/fast.pyx b/py3/cython/fast.pyx similarity index 100% rename from py34/cython/fast.pyx rename to py3/cython/fast.pyx diff --git a/py34/cython/faster.pyx b/py3/cython/faster.pyx similarity index 100% rename from py34/cython/faster.pyx rename to py3/cython/faster.pyx diff --git a/py34/cython/fastest.pyx b/py3/cython/fastest.pyx similarity index 100% rename from py34/cython/fastest.pyx rename to py3/cython/fastest.pyx diff --git a/py34/cython/notebook/Cython.ipynb b/py3/cython/notebook/Cython.ipynb similarity index 100% rename from py34/cython/notebook/Cython.ipynb rename to py3/cython/notebook/Cython.ipynb diff --git a/py34/cython/origin.html b/py3/cython/origin.html similarity index 100% rename from py34/cython/origin.html rename to py3/cython/origin.html diff --git a/py34/cython/origin.py b/py3/cython/origin.py similarity index 100% rename from py34/cython/origin.py rename to py3/cython/origin.py diff --git a/py34/cython/setup.py b/py3/cython/setup.py similarity index 100% rename from py34/cython/setup.py rename to py3/cython/setup.py diff --git a/py34/cython/startup/README b/py3/cython/startup/README similarity index 100% rename from py34/cython/startup/README rename to py3/cython/startup/README diff --git a/py36/data/demo-2-over+previous.png b/py3/data/demo-2-over+previous.png similarity index 100% rename from py36/data/demo-2-over+previous.png rename to py3/data/demo-2-over+previous.png diff --git a/py36/data/huawei.jpg b/py3/data/huawei.jpg similarity index 100% rename from py36/data/huawei.jpg rename to py3/data/huawei.jpg diff --git a/py35/data/project.db b/py3/data/project.db similarity index 100% rename from py35/data/project.db rename to py3/data/project.db diff --git a/py35/data/result.db b/py3/data/result.db similarity index 100% rename from py35/data/result.db rename to py3/data/result.db diff --git a/py35/data/scheduler.1d b/py3/data/scheduler.1d similarity index 100% rename from py35/data/scheduler.1d rename to py3/data/scheduler.1d diff --git a/py35/data/scheduler.1h b/py3/data/scheduler.1h similarity index 100% rename from py35/data/scheduler.1h rename to py3/data/scheduler.1h diff --git a/py35/data/scheduler.all b/py3/data/scheduler.all similarity index 100% rename from py35/data/scheduler.all rename to py3/data/scheduler.all diff --git a/py35/data/task.db b/py3/data/task.db similarity index 100% rename from py35/data/task.db rename to py3/data/task.db diff --git a/py36/data/test.gif b/py3/data/test.gif similarity index 100% rename from py36/data/test.gif rename to py3/data/test.gif diff --git a/py36/data/test.txt b/py3/data/test.txt similarity index 100% rename from py36/data/test.txt rename to py3/data/test.txt diff --git a/py36/data/test.webp b/py3/data/test.webp similarity index 100% rename from py36/data/test.webp rename to py3/data/test.webp diff --git a/py36/datetime.ipynb b/py3/datetime.ipynb similarity index 100% rename from py36/datetime.ipynb rename to py3/datetime.ipynb diff --git a/py34/design-pattern/Adapter Pattern.ipynb b/py3/design-pattern/Adapter Pattern.ipynb similarity index 100% rename from py34/design-pattern/Adapter Pattern.ipynb rename to py3/design-pattern/Adapter Pattern.ipynb diff --git a/py34/design-pattern/Command Pattern.ipynb b/py3/design-pattern/Command Pattern.ipynb similarity index 100% rename from py34/design-pattern/Command Pattern.ipynb rename to py3/design-pattern/Command Pattern.ipynb diff --git a/py34/design-pattern/Decorator Pattern.ipynb b/py3/design-pattern/Decorator Pattern.ipynb similarity index 100% rename from py34/design-pattern/Decorator Pattern.ipynb rename to py3/design-pattern/Decorator Pattern.ipynb diff --git a/py34/design-pattern/Factory Method Pattern.ipynb b/py3/design-pattern/Factory Method Pattern.ipynb similarity index 100% rename from py34/design-pattern/Factory Method Pattern.ipynb rename to py3/design-pattern/Factory Method Pattern.ipynb diff --git a/py34/design-pattern/Observer Pattern.ipynb b/py3/design-pattern/Observer Pattern.ipynb similarity index 100% rename from py34/design-pattern/Observer Pattern.ipynb rename to py3/design-pattern/Observer Pattern.ipynb diff --git a/py34/design-pattern/README.md b/py3/design-pattern/README.md similarity index 100% rename from py34/design-pattern/README.md rename to py3/design-pattern/README.md diff --git a/py34/design-pattern/Singleton Pattern.ipynb b/py3/design-pattern/Singleton Pattern.ipynb similarity index 100% rename from py34/design-pattern/Singleton Pattern.ipynb rename to py3/design-pattern/Singleton Pattern.ipynb diff --git a/py34/design-pattern/Strategy Pattern.ipynb b/py3/design-pattern/Strategy Pattern.ipynb similarity index 100% rename from py34/design-pattern/Strategy Pattern.ipynb rename to py3/design-pattern/Strategy Pattern.ipynb diff --git a/py34/design-pattern/Template Pattern.ipynb b/py3/design-pattern/Template Pattern.ipynb similarity index 100% rename from py34/design-pattern/Template Pattern.ipynb rename to py3/design-pattern/Template Pattern.ipynb diff --git a/py34/encrypt/bcrypt.ipynb b/py3/encrypt/bcrypt.ipynb similarity index 100% rename from py34/encrypt/bcrypt.ipynb rename to py3/encrypt/bcrypt.ipynb diff --git a/py34/flask/README.md b/py3/flask/README.md similarity index 100% rename from py34/flask/README.md rename to py3/flask/README.md diff --git a/py34/flask/meinheld/1 b/py3/flask/meinheld/1 similarity index 100% rename from py34/flask/meinheld/1 rename to py3/flask/meinheld/1 diff --git a/py34/flask/meinheld/flask_meinheld.py b/py3/flask/meinheld/flask_meinheld.py similarity index 100% rename from py34/flask/meinheld/flask_meinheld.py rename to py3/flask/meinheld/flask_meinheld.py diff --git a/py34/flask/meinheld/pure_meinheld.py b/py3/flask/meinheld/pure_meinheld.py similarity index 100% rename from py34/flask/meinheld/pure_meinheld.py rename to py3/flask/meinheld/pure_meinheld.py diff --git a/py34/flask/rest/README.md b/py3/flask/rest/README.md similarity index 100% rename from py34/flask/rest/README.md rename to py3/flask/rest/README.md diff --git a/py34/flask/rest/app.py b/py3/flask/rest/app.py similarity index 100% rename from py34/flask/rest/app.py rename to py3/flask/rest/app.py diff --git a/py34/flask/tutorial/app.py b/py3/flask/tutorial/app.py similarity index 100% rename from py34/flask/tutorial/app.py rename to py3/flask/tutorial/app.py diff --git a/py34/flask/tutorial/appdemo/__init__.py b/py3/flask/tutorial/appdemo/__init__.py similarity index 100% rename from py34/flask/tutorial/appdemo/__init__.py rename to py3/flask/tutorial/appdemo/__init__.py diff --git a/py34/flask/tutorial/appdemo/urls.py b/py3/flask/tutorial/appdemo/urls.py similarity index 100% rename from py34/flask/tutorial/appdemo/urls.py rename to py3/flask/tutorial/appdemo/urls.py diff --git a/py34/flask/tutorial/settings.py b/py3/flask/tutorial/settings.py similarity index 100% rename from py34/flask/tutorial/settings.py rename to py3/flask/tutorial/settings.py diff --git a/py34/flask/tutorial/templates/base.html b/py3/flask/tutorial/templates/base.html similarity index 100% rename from py34/flask/tutorial/templates/base.html rename to py3/flask/tutorial/templates/base.html diff --git a/py34/flask/tutorial/templates/demo.html b/py3/flask/tutorial/templates/demo.html similarity index 100% rename from py34/flask/tutorial/templates/demo.html rename to py3/flask/tutorial/templates/demo.html diff --git a/py34/flask/tutorial/templates/index.html b/py3/flask/tutorial/templates/index.html similarity index 100% rename from py34/flask/tutorial/templates/index.html rename to py3/flask/tutorial/templates/index.html diff --git a/py36/gc_demo.py b/py3/gc_demo.py similarity index 100% rename from py36/gc_demo.py rename to py3/gc_demo.py diff --git a/py36/gql.ipynb b/py3/gql.ipynb similarity index 100% rename from py36/gql.ipynb rename to py3/gql.ipynb diff --git a/py35/graphene/README.md b/py3/graphene/README.md similarity index 100% rename from py35/graphene/README.md rename to py3/graphene/README.md diff --git a/py35/graphene/complex.py b/py3/graphene/complex.py similarity index 100% rename from py35/graphene/complex.py rename to py3/graphene/complex.py diff --git a/py35/graphene/simple.py b/py3/graphene/simple.py similarity index 100% rename from py35/graphene/simple.py rename to py3/graphene/simple.py diff --git a/py36/hypothesis/README.md b/py3/hypothesis/README.md similarity index 100% rename from py36/hypothesis/README.md rename to py3/hypothesis/README.md diff --git a/py36/hypothesis/source.py b/py3/hypothesis/source.py similarity index 100% rename from py36/hypothesis/source.py rename to py3/hypothesis/source.py diff --git a/py36/hypothesis/tests.py b/py3/hypothesis/tests.py similarity index 100% rename from py36/hypothesis/tests.py rename to py3/hypothesis/tests.py diff --git a/py36/japronto/async_demo.py b/py3/japronto/async_demo.py similarity index 100% rename from py36/japronto/async_demo.py rename to py3/japronto/async_demo.py diff --git a/py35/jieba/simple-demo.ipynb b/py3/jieba/simple-demo.ipynb similarity index 100% rename from py35/jieba/simple-demo.ipynb rename to py3/jieba/simple-demo.ipynb diff --git a/py34/ldap-demo/ldap.ipynb b/py3/ldap-demo/ldap.ipynb similarity index 100% rename from py34/ldap-demo/ldap.ipynb rename to py3/ldap-demo/ldap.ipynb diff --git a/py35/lxml & xpath.ipynb b/py3/lxml & xpath.ipynb similarity index 100% rename from py35/lxml & xpath.ipynb rename to py3/lxml & xpath.ipynb diff --git a/py36/markdown/markdown.ipynb b/py3/markdown/markdown.ipynb similarity index 100% rename from py36/markdown/markdown.ipynb rename to py3/markdown/markdown.ipynb diff --git a/py36/markdown/simple.html b/py3/markdown/simple.html similarity index 100% rename from py36/markdown/simple.html rename to py3/markdown/simple.html diff --git a/py35/mock.ipynb b/py3/mock.ipynb similarity index 100% rename from py35/mock.ipynb rename to py3/mock.ipynb diff --git a/py35/mock/demo.ipynb b/py3/mock/demo.ipynb similarity index 100% rename from py35/mock/demo.ipynb rename to py3/mock/demo.ipynb diff --git a/py35/mock/mock.ipynb b/py3/mock/mock.ipynb similarity index 100% rename from py35/mock/mock.ipynb rename to py3/mock/mock.ipynb diff --git a/py35/mock/settings/__init__.py b/py3/mock/settings/__init__.py similarity index 100% rename from py35/mock/settings/__init__.py rename to py3/mock/settings/__init__.py diff --git a/py35/mock/settings/settings.py b/py3/mock/settings/settings.py similarity index 100% rename from py35/mock/settings/settings.py rename to py3/mock/settings/settings.py diff --git a/py35/mypy/README.md b/py3/mypy/README.md similarity index 100% rename from py35/mypy/README.md rename to py3/mypy/README.md diff --git a/py35/mypy/class.py b/py3/mypy/class.py similarity index 100% rename from py35/mypy/class.py rename to py3/mypy/class.py diff --git a/py35/mypy/simple.py b/py3/mypy/simple.py similarity index 100% rename from py35/mypy/simple.py rename to py3/mypy/simple.py diff --git a/py34/networkx/README.md b/py3/networkx/README.md similarity index 100% rename from py34/networkx/README.md rename to py3/networkx/README.md diff --git a/py34/networkx/tutorial.ipynb b/py3/networkx/tutorial.ipynb similarity index 100% rename from py34/networkx/tutorial.ipynb rename to py3/networkx/tutorial.ipynb diff --git a/py36/nlp/README.md b/py3/nlp/README.md similarity index 100% rename from py36/nlp/README.md rename to py3/nlp/README.md diff --git a/py36/nlp/stopwords.ipynb b/py3/nlp/stopwords.ipynb similarity index 100% rename from py36/nlp/stopwords.ipynb rename to py3/nlp/stopwords.ipynb diff --git a/py34/pandas/DataFrame.html b/py3/pandas/DataFrame.html similarity index 100% rename from py34/pandas/DataFrame.html rename to py3/pandas/DataFrame.html diff --git a/py34/pandas/README.md b/py3/pandas/README.md similarity index 100% rename from py34/pandas/README.md rename to py3/pandas/README.md diff --git a/py34/pandas/matplotlib.html b/py3/pandas/matplotlib.html similarity index 100% rename from py34/pandas/matplotlib.html rename to py3/pandas/matplotlib.html diff --git a/py34/pandas/notebook/dict.ipynb b/py3/pandas/notebook/dict.ipynb similarity index 100% rename from py34/pandas/notebook/dict.ipynb rename to py3/pandas/notebook/dict.ipynb diff --git a/py34/pandas/notebook/matplotlib.ipynb b/py3/pandas/notebook/matplotlib.ipynb similarity index 100% rename from py34/pandas/notebook/matplotlib.ipynb rename to py3/pandas/notebook/matplotlib.ipynb diff --git a/py34/pandas/notebook/pandas.ipynb b/py3/pandas/notebook/pandas.ipynb similarity index 100% rename from py34/pandas/notebook/pandas.ipynb rename to py3/pandas/notebook/pandas.ipynb diff --git a/py34/pandas/notebook/pivot_table.ipynb b/py3/pandas/notebook/pivot_table.ipynb similarity index 100% rename from py34/pandas/notebook/pivot_table.ipynb rename to py3/pandas/notebook/pivot_table.ipynb diff --git a/py34/pandas/notebook/test.ipynb b/py3/pandas/notebook/test.ipynb similarity index 100% rename from py34/pandas/notebook/test.ipynb rename to py3/pandas/notebook/test.ipynb diff --git a/py34/pandas/notebook/wordpress.ipynb b/py3/pandas/notebook/wordpress.ipynb similarity index 100% rename from py34/pandas/notebook/wordpress.ipynb rename to py3/pandas/notebook/wordpress.ipynb diff --git a/py34/paramiko/paramiko.ipynb b/py3/paramiko/paramiko.ipynb similarity index 100% rename from py34/paramiko/paramiko.ipynb rename to py3/paramiko/paramiko.ipynb diff --git a/py34/parse-html/notebook/lxml.ipynb b/py3/parse-html/notebook/lxml.ipynb similarity index 100% rename from py34/parse-html/notebook/lxml.ipynb rename to py3/parse-html/notebook/lxml.ipynb diff --git a/py36/pillow/README.md b/py3/pillow/README.md similarity index 100% rename from py36/pillow/README.md rename to py3/pillow/README.md diff --git a/py36/pillow/data/huge.jpeg b/py3/pillow/data/huge.jpeg similarity index 100% rename from py36/pillow/data/huge.jpeg rename to py3/pillow/data/huge.jpeg diff --git a/py36/pillow/pillow-simd.ipynb b/py3/pillow/pillow-simd.ipynb similarity index 100% rename from py36/pillow/pillow-simd.ipynb rename to py3/pillow/pillow-simd.ipynb diff --git a/py35/profiling/README.md b/py3/profiling/README.md similarity index 100% rename from py35/profiling/README.md rename to py3/profiling/README.md diff --git a/py35/profiling/base.py b/py3/profiling/base.py similarity index 100% rename from py35/profiling/base.py rename to py3/profiling/base.py diff --git a/py35/profiling/simple_cprofile.py b/py3/profiling/simple_cprofile.py similarity index 100% rename from py35/profiling/simple_cprofile.py rename to py3/profiling/simple_cprofile.py diff --git a/py35/profiling/simple_lineprofiler.py b/py3/profiling/simple_lineprofiler.py similarity index 100% rename from py35/profiling/simple_lineprofiler.py rename to py3/profiling/simple_lineprofiler.py diff --git a/py35/profiling/simple_lineprofiler.py.lprof b/py3/profiling/simple_lineprofiler.py.lprof similarity index 100% rename from py35/profiling/simple_lineprofiler.py.lprof rename to py3/profiling/simple_lineprofiler.py.lprof diff --git a/py35/profiling/test_objgraph.py b/py3/profiling/test_objgraph.py similarity index 100% rename from py35/profiling/test_objgraph.py rename to py3/profiling/test_objgraph.py diff --git a/py35/profiling/test_pprofile.py b/py3/profiling/test_pprofile.py similarity index 100% rename from py35/profiling/test_pprofile.py rename to py3/profiling/test_pprofile.py diff --git a/py35/profiling/test_pstats.py b/py3/profiling/test_pstats.py similarity index 100% rename from py35/profiling/test_pstats.py rename to py3/profiling/test_pstats.py diff --git a/py35/profiling/timeit b/py3/profiling/timeit similarity index 100% rename from py35/profiling/timeit rename to py3/profiling/timeit diff --git a/py34/purl/purl.ipynb b/py3/purl/purl.ipynb similarity index 100% rename from py34/purl/purl.ipynb rename to py3/purl/purl.ipynb diff --git a/py35/py35-new-syntax.ipynb b/py3/py35-new-syntax.ipynb similarity index 100% rename from py35/py35-new-syntax.ipynb rename to py3/py35-new-syntax.ipynb diff --git a/py34/pyinotify/notebook/Untitled.ipynb b/py3/pyinotify/notebook/Untitled.ipynb similarity index 100% rename from py34/pyinotify/notebook/Untitled.ipynb rename to py3/pyinotify/notebook/Untitled.ipynb diff --git a/py34/pyjwt/notebook/pyjwt.ipynb b/py3/pyjwt/notebook/pyjwt.ipynb similarity index 100% rename from py34/pyjwt/notebook/pyjwt.ipynb rename to py3/pyjwt/notebook/pyjwt.ipynb diff --git a/py34/pymining/notebook/pymining.ipynb b/py3/pymining/notebook/pymining.ipynb similarity index 100% rename from py34/pymining/notebook/pymining.ipynb rename to py3/pymining/notebook/pymining.ipynb diff --git a/py35/pyquery.ipynb b/py3/pyquery.ipynb similarity index 100% rename from py35/pyquery.ipynb rename to py3/pyquery.ipynb diff --git a/py34/pysnmp/README.md b/py3/pysnmp/README.md similarity index 100% rename from py34/pysnmp/README.md rename to py3/pysnmp/README.md diff --git a/py34/pysnmp/nmap.ipynb b/py3/pysnmp/nmap.ipynb similarity index 100% rename from py34/pysnmp/nmap.ipynb rename to py3/pysnmp/nmap.ipynb diff --git a/py34/pysnmp/pysnmp.ipynb b/py3/pysnmp/pysnmp.ipynb similarity index 100% rename from py34/pysnmp/pysnmp.ipynb rename to py3/pysnmp/pysnmp.ipynb diff --git a/py35/pyspider/data/project.db b/py3/pyspider/data/project.db similarity index 100% rename from py35/pyspider/data/project.db rename to py3/pyspider/data/project.db diff --git a/py35/pyspider/data/result.db b/py3/pyspider/data/result.db similarity index 100% rename from py35/pyspider/data/result.db rename to py3/pyspider/data/result.db diff --git a/py35/pyspider/data/scheduler.1d b/py3/pyspider/data/scheduler.1d similarity index 100% rename from py35/pyspider/data/scheduler.1d rename to py3/pyspider/data/scheduler.1d diff --git a/py35/pyspider/data/scheduler.1h b/py3/pyspider/data/scheduler.1h similarity index 100% rename from py35/pyspider/data/scheduler.1h rename to py3/pyspider/data/scheduler.1h diff --git a/py35/pyspider/data/scheduler.all b/py3/pyspider/data/scheduler.all similarity index 100% rename from py35/pyspider/data/scheduler.all rename to py3/pyspider/data/scheduler.all diff --git a/py35/pyspider/data/task.db b/py3/pyspider/data/task.db similarity index 100% rename from py35/pyspider/data/task.db rename to py3/pyspider/data/task.db diff --git a/py35/pytest-benchmark/README.md b/py3/pytest-benchmark/README.md similarity index 100% rename from py35/pytest-benchmark/README.md rename to py3/pytest-benchmark/README.md diff --git a/py35/pytest-benchmark/test_simple.py b/py3/pytest-benchmark/test_simple.py similarity index 100% rename from py35/pytest-benchmark/test_simple.py rename to py3/pytest-benchmark/test_simple.py diff --git a/py34/python-syntax/Coroutine.html b/py3/python-syntax/Coroutine.html similarity index 100% rename from py34/python-syntax/Coroutine.html rename to py3/python-syntax/Coroutine.html diff --git a/py34/python-syntax/README.md b/py3/python-syntax/README.md similarity index 100% rename from py34/python-syntax/README.md rename to py3/python-syntax/README.md diff --git a/py34/python-syntax/concurrent.futures.html b/py3/python-syntax/concurrent.futures.html similarity index 100% rename from py34/python-syntax/concurrent.futures.html rename to py3/python-syntax/concurrent.futures.html diff --git a/py34/python-syntax/descriptor.html b/py3/python-syntax/descriptor.html similarity index 100% rename from py34/python-syntax/descriptor.html rename to py3/python-syntax/descriptor.html diff --git a/py34/python-syntax/notebook/Coroutine.ipynb b/py3/python-syntax/notebook/Coroutine.ipynb similarity index 100% rename from py34/python-syntax/notebook/Coroutine.ipynb rename to py3/python-syntax/notebook/Coroutine.ipynb diff --git a/py34/python-syntax/notebook/asterisk.ipynb b/py3/python-syntax/notebook/asterisk.ipynb similarity index 100% rename from py34/python-syntax/notebook/asterisk.ipynb rename to py3/python-syntax/notebook/asterisk.ipynb diff --git a/py34/python-syntax/notebook/bisect.ipynb b/py3/python-syntax/notebook/bisect.ipynb similarity index 100% rename from py34/python-syntax/notebook/bisect.ipynb rename to py3/python-syntax/notebook/bisect.ipynb diff --git a/py34/python-syntax/notebook/calendar.ipynb b/py3/python-syntax/notebook/calendar.ipynb similarity index 100% rename from py34/python-syntax/notebook/calendar.ipynb rename to py3/python-syntax/notebook/calendar.ipynb diff --git a/py34/python-syntax/notebook/collections.ipynb b/py3/python-syntax/notebook/collections.ipynb similarity index 100% rename from py34/python-syntax/notebook/collections.ipynb rename to py3/python-syntax/notebook/collections.ipynb diff --git a/py34/python-syntax/notebook/concurrent.futures.ipynb b/py3/python-syntax/notebook/concurrent.futures.ipynb similarity index 100% rename from py34/python-syntax/notebook/concurrent.futures.ipynb rename to py3/python-syntax/notebook/concurrent.futures.ipynb diff --git a/py34/python-syntax/notebook/copy.ipynb b/py3/python-syntax/notebook/copy.ipynb similarity index 100% rename from py34/python-syntax/notebook/copy.ipynb rename to py3/python-syntax/notebook/copy.ipynb diff --git a/py34/python-syntax/notebook/decimal.ipynb b/py3/python-syntax/notebook/decimal.ipynb similarity index 100% rename from py34/python-syntax/notebook/decimal.ipynb rename to py3/python-syntax/notebook/decimal.ipynb diff --git a/py34/python-syntax/notebook/descriptor.ipynb b/py3/python-syntax/notebook/descriptor.ipynb similarity index 100% rename from py34/python-syntax/notebook/descriptor.ipynb rename to py3/python-syntax/notebook/descriptor.ipynb diff --git a/py34/python-syntax/notebook/email.ipynb b/py3/python-syntax/notebook/email.ipynb similarity index 100% rename from py34/python-syntax/notebook/email.ipynb rename to py3/python-syntax/notebook/email.ipynb diff --git a/py34/python-syntax/notebook/enum.ipynb b/py3/python-syntax/notebook/enum.ipynb similarity index 100% rename from py34/python-syntax/notebook/enum.ipynb rename to py3/python-syntax/notebook/enum.ipynb diff --git a/py34/python-syntax/notebook/format.ipynb b/py3/python-syntax/notebook/format.ipynb similarity index 100% rename from py34/python-syntax/notebook/format.ipynb rename to py3/python-syntax/notebook/format.ipynb diff --git a/py34/python-syntax/notebook/fractions.ipynb b/py3/python-syntax/notebook/fractions.ipynb similarity index 100% rename from py34/python-syntax/notebook/fractions.ipynb rename to py3/python-syntax/notebook/fractions.ipynb diff --git a/py34/python-syntax/notebook/functools.ipynb b/py3/python-syntax/notebook/functools.ipynb similarity index 100% rename from py34/python-syntax/notebook/functools.ipynb rename to py3/python-syntax/notebook/functools.ipynb diff --git a/py34/python-syntax/notebook/headq.ipynb b/py3/python-syntax/notebook/headq.ipynb similarity index 100% rename from py34/python-syntax/notebook/headq.ipynb rename to py3/python-syntax/notebook/headq.ipynb diff --git a/py34/python-syntax/notebook/itertools.ipynb b/py3/python-syntax/notebook/itertools.ipynb similarity index 100% rename from py34/python-syntax/notebook/itertools.ipynb rename to py3/python-syntax/notebook/itertools.ipynb diff --git a/py34/python-syntax/notebook/mock.ipynb b/py3/python-syntax/notebook/mock.ipynb similarity index 100% rename from py34/python-syntax/notebook/mock.ipynb rename to py3/python-syntax/notebook/mock.ipynb diff --git a/py34/python-syntax/notebook/pytz.ipynb b/py3/python-syntax/notebook/pytz.ipynb similarity index 100% rename from py34/python-syntax/notebook/pytz.ipynb rename to py3/python-syntax/notebook/pytz.ipynb diff --git a/py34/python-syntax/notebook/sched.ipynb b/py3/python-syntax/notebook/sched.ipynb similarity index 100% rename from py34/python-syntax/notebook/sched.ipynb rename to py3/python-syntax/notebook/sched.ipynb diff --git a/py34/python-syntax/notebook/selectors.ipynb b/py3/python-syntax/notebook/selectors.ipynb similarity index 100% rename from py34/python-syntax/notebook/selectors.ipynb rename to py3/python-syntax/notebook/selectors.ipynb diff --git a/py34/python-syntax/notebook/smtplib.ipynb b/py3/python-syntax/notebook/smtplib.ipynb similarity index 100% rename from py34/python-syntax/notebook/smtplib.ipynb rename to py3/python-syntax/notebook/smtplib.ipynb diff --git a/py34/python-syntax/notebook/statistics.ipynb b/py3/python-syntax/notebook/statistics.ipynb similarity index 100% rename from py34/python-syntax/notebook/statistics.ipynb rename to py3/python-syntax/notebook/statistics.ipynb diff --git a/py34/python-syntax/notebook/textwrap.ipynb b/py3/python-syntax/notebook/textwrap.ipynb similarity index 100% rename from py34/python-syntax/notebook/textwrap.ipynb rename to py3/python-syntax/notebook/textwrap.ipynb diff --git a/py34/python-syntax/notebook/weakref.ipynb b/py3/python-syntax/notebook/weakref.ipynb similarity index 100% rename from py34/python-syntax/notebook/weakref.ipynb rename to py3/python-syntax/notebook/weakref.ipynb diff --git a/py34/python-syntax/notebook/xml.ipynb b/py3/python-syntax/notebook/xml.ipynb similarity index 100% rename from py34/python-syntax/notebook/xml.ipynb rename to py3/python-syntax/notebook/xml.ipynb diff --git a/py34/python-syntax/notebook/yield & yield from.ipynb b/py3/python-syntax/notebook/yield & yield from.ipynb similarity index 100% rename from py34/python-syntax/notebook/yield & yield from.ipynb rename to py3/python-syntax/notebook/yield & yield from.ipynb diff --git a/py34/requirements.txt b/py3/requirements.txt similarity index 58% rename from py34/requirements.txt rename to py3/requirements.txt index 4af48f38..4dfedc41 100644 --- a/py34/requirements.txt +++ b/py3/requirements.txt @@ -1,3 +1,55 @@ +ipython[all] + +# time +maya +pytz + +# image +pillow + +# framework +japronto + +# aws +aiobotocore + +# markdown +markdown2 + +# crawler +selenium +lxml +pyquery +pyspider + +# profile +vprof +line_profiler +memory_profiler +pytest-benchmark +pprofile + +celery + +jieba +pymongo + +# web +gunicorn +aiohttp +meinheld +tornado +sanic + +# syntax +mypy-lang + +# test +ipdb + +# time +arrow + # profiler psutil line_profiler diff --git a/py35/sanic/README.md b/py3/sanic/README.md similarity index 100% rename from py35/sanic/README.md rename to py3/sanic/README.md diff --git a/py35/sanic/bench.py b/py3/sanic/bench.py similarity index 100% rename from py35/sanic/bench.py rename to py3/sanic/bench.py diff --git a/py34/scipy/README.md b/py3/scipy/README.md similarity index 100% rename from py34/scipy/README.md rename to py3/scipy/README.md diff --git a/py34/scipy/notebook/distance_by_cython.ipynb b/py3/scipy/notebook/distance_by_cython.ipynb similarity index 100% rename from py34/scipy/notebook/distance_by_cython.ipynb rename to py3/scipy/notebook/distance_by_cython.ipynb diff --git a/py34/scipy/notebook/sparse.ipynb b/py3/scipy/notebook/sparse.ipynb similarity index 100% rename from py34/scipy/notebook/sparse.ipynb rename to py3/scipy/notebook/sparse.ipynb diff --git a/py34/scipy/sparse.html b/py3/scipy/sparse.html similarity index 100% rename from py34/scipy/sparse.html rename to py3/scipy/sparse.html diff --git a/py35/selenium.ipynb b/py3/selenium.ipynb similarity index 100% rename from py35/selenium.ipynb rename to py3/selenium.ipynb diff --git a/py34/setup.py b/py3/setup.py similarity index 100% rename from py34/setup.py rename to py3/setup.py diff --git a/py36/signal.ipynb b/py3/signal.ipynb similarity index 100% rename from py36/signal.ipynb rename to py3/signal.ipynb diff --git a/py34/sklearn/KNN.html b/py3/sklearn/KNN.html similarity index 100% rename from py34/sklearn/KNN.html rename to py3/sklearn/KNN.html diff --git a/py34/sklearn/README.md b/py3/sklearn/README.md similarity index 100% rename from py34/sklearn/README.md rename to py3/sklearn/README.md diff --git a/py34/sklearn/notebook/KNN.ipynb b/py3/sklearn/notebook/KNN.ipynb similarity index 100% rename from py34/sklearn/notebook/KNN.ipynb rename to py3/sklearn/notebook/KNN.ipynb diff --git a/py35/smtp.ipynb b/py3/smtp.ipynb similarity index 100% rename from py35/smtp.ipynb rename to py3/smtp.ipynb diff --git a/py36/syntax.ipynb b/py3/syntax.ipynb similarity index 100% rename from py36/syntax.ipynb rename to py3/syntax.ipynb diff --git a/py35/test_ipdb.py b/py3/test_ipdb.py similarity index 100% rename from py35/test_ipdb.py rename to py3/test_ipdb.py diff --git a/py36/thrift/simple_example/__init__.py b/py3/thrift/simple_example/__init__.py similarity index 100% rename from py36/thrift/simple_example/__init__.py rename to py3/thrift/simple_example/__init__.py diff --git a/py36/thrift/simple_example/client.py b/py3/thrift/simple_example/client.py similarity index 100% rename from py36/thrift/simple_example/client.py rename to py3/thrift/simple_example/client.py diff --git a/py36/thrift/simple_example/example.thrift b/py3/thrift/simple_example/example.thrift similarity index 100% rename from py36/thrift/simple_example/example.thrift rename to py3/thrift/simple_example/example.thrift diff --git a/py36/thrift/simple_example/example/__init__.py b/py3/thrift/simple_example/example/__init__.py similarity index 100% rename from py36/thrift/simple_example/example/__init__.py rename to py3/thrift/simple_example/example/__init__.py diff --git a/py36/thrift/simple_example/example/constants.py b/py3/thrift/simple_example/example/constants.py similarity index 100% rename from py36/thrift/simple_example/example/constants.py rename to py3/thrift/simple_example/example/constants.py diff --git a/py36/thrift/simple_example/example/format_data-remote b/py3/thrift/simple_example/example/format_data-remote similarity index 100% rename from py36/thrift/simple_example/example/format_data-remote rename to py3/thrift/simple_example/example/format_data-remote diff --git a/py36/thrift/simple_example/example/format_data.py b/py3/thrift/simple_example/example/format_data.py similarity index 100% rename from py36/thrift/simple_example/example/format_data.py rename to py3/thrift/simple_example/example/format_data.py diff --git a/py36/thrift/simple_example/example/ttypes.py b/py3/thrift/simple_example/example/ttypes.py similarity index 100% rename from py36/thrift/simple_example/example/ttypes.py rename to py3/thrift/simple_example/example/ttypes.py diff --git a/py36/thrift/simple_example/server.py b/py3/thrift/simple_example/server.py similarity index 100% rename from py36/thrift/simple_example/server.py rename to py3/thrift/simple_example/server.py diff --git a/py34/tornado/app.py b/py3/tornado/app.py similarity index 100% rename from py34/tornado/app.py rename to py3/tornado/app.py diff --git a/py34/tornado/notebook/async.ipynb b/py3/tornado/notebook/async.ipynb similarity index 100% rename from py34/tornado/notebook/async.ipynb rename to py3/tornado/notebook/async.ipynb diff --git a/py34/tox/requirements.txt b/py3/tox/requirements.txt similarity index 100% rename from py34/tox/requirements.txt rename to py3/tox/requirements.txt diff --git a/py34/tox/setup.py b/py3/tox/setup.py similarity index 100% rename from py34/tox/setup.py rename to py3/tox/setup.py diff --git a/py34/tox/src/tox_test/__init__.py b/py3/tox/src/tox_test/__init__.py similarity index 100% rename from py34/tox/src/tox_test/__init__.py rename to py3/tox/src/tox_test/__init__.py diff --git a/py34/tox/tests/test_tox.py b/py3/tox/tests/test_tox.py similarity index 100% rename from py34/tox/tests/test_tox.py rename to py3/tox/tests/test_tox.py diff --git a/py34/tox/tox.ini b/py3/tox/tox.ini similarity index 100% rename from py34/tox/tox.ini rename to py3/tox/tox.ini diff --git a/py36/tqdm.ipynb b/py3/tqdm.ipynb similarity index 100% rename from py36/tqdm.ipynb rename to py3/tqdm.ipynb diff --git a/py36/twitter.ipynb b/py3/twitter.ipynb similarity index 100% rename from py36/twitter.ipynb rename to py3/twitter.ipynb diff --git a/py35/typing.ipynb b/py3/typing.ipynb similarity index 100% rename from py35/typing.ipynb rename to py3/typing.ipynb diff --git a/py34/unittest/app.py b/py3/unittest/app.py similarity index 100% rename from py34/unittest/app.py rename to py3/unittest/app.py diff --git a/py34/unittest/tests/test_fixtures.py b/py3/unittest/tests/test_fixtures.py similarity index 100% rename from py34/unittest/tests/test_fixtures.py rename to py3/unittest/tests/test_fixtures.py diff --git a/py34/unittest/tests/test_simple.py b/py3/unittest/tests/test_simple.py similarity index 100% rename from py34/unittest/tests/test_simple.py rename to py3/unittest/tests/test_simple.py diff --git a/py36/variables.ipynb b/py3/variables.ipynb similarity index 100% rename from py36/variables.ipynb rename to py3/variables.ipynb diff --git a/py35/web_bench/test_aiohttp.py b/py3/web_bench/test_aiohttp.py similarity index 100% rename from py35/web_bench/test_aiohttp.py rename to py3/web_bench/test_aiohttp.py diff --git a/py35/web_bench/test_flask.py b/py3/web_bench/test_flask.py similarity index 100% rename from py35/web_bench/test_flask.py rename to py3/web_bench/test_flask.py diff --git a/py35/web_bench/test_flaskmeinheld.py b/py3/web_bench/test_flaskmeinheld.py similarity index 100% rename from py35/web_bench/test_flaskmeinheld.py rename to py3/web_bench/test_flaskmeinheld.py diff --git a/py35/web_bench/test_meinheld.py b/py3/web_bench/test_meinheld.py similarity index 100% rename from py35/web_bench/test_meinheld.py rename to py3/web_bench/test_meinheld.py diff --git a/py35/web_bench/test_sanic.py b/py3/web_bench/test_sanic.py similarity index 100% rename from py35/web_bench/test_sanic.py rename to py3/web_bench/test_sanic.py diff --git a/py35/web_bench/test_tornado.py b/py3/web_bench/test_tornado.py similarity index 100% rename from py35/web_bench/test_tornado.py rename to py3/web_bench/test_tornado.py diff --git a/py36/webp.ipynb b/py3/webp.ipynb similarity index 100% rename from py36/webp.ipynb rename to py3/webp.ipynb diff --git a/py35/zipapp.ipynb b/py3/zipapp.ipynb similarity index 100% rename from py35/zipapp.ipynb rename to py3/zipapp.ipynb diff --git a/py34/README.md b/py34/README.md deleted file mode 100644 index 577d2ab9..00000000 --- a/py34/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Fun in Python3.x ---- - -Python 是门好语言 - -写过篇介绍文:https://blog.laisky.com/p/whats-new-in-python3-4/ diff --git a/py35/README.md b/py35/README.md deleted file mode 100644 index b04ef6f2..00000000 --- a/py35/README.md +++ /dev/null @@ -1,7 +0,0 @@ -与时俱进 Python 3.5 -=== - -## Reference - - - [What’s New In Python 3.5](https://docs.python.org/3.5/whatsnew/3.5.html) - - 写过篇介绍:https://blog.laisky.com/p/whats-new-in-python3-5/ diff --git a/py35/requirements.txt b/py35/requirements.txt deleted file mode 100644 index 6ff4269b..00000000 --- a/py35/requirements.txt +++ /dev/null @@ -1,35 +0,0 @@ -ipython - -# crawler -selenium -lxml -pyquery -pyspider - -# profile -vprof -line_profiler -memory_profiler -pytest-benchmark -pprofile - -celery - -jieba -pymongo - -# web -gunicorn -aiohttp -meinheld -tornado -sanic - -# syntax -mypy-lang - -# test -ipdb - -# time -arrow diff --git a/py36/README.md b/py36/README.md deleted file mode 100644 index 03424b65..00000000 --- a/py36/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Python 3.6 -=== - -Embrace Asynchronous - -写过篇博文:https://blog.laisky.com/p/whats-new-in-python3-6/ diff --git a/py36/requirements.txt b/py36/requirements.txt deleted file mode 100644 index e853d5d2..00000000 --- a/py36/requirements.txt +++ /dev/null @@ -1,17 +0,0 @@ -ipython[all] - -# time -maya -pytz - -# image -pillow - -# framework -japronto - -# aws -aiobotocore - -# markdown -markdown2 From 3ffdf24dea0e7e9669c45c286bc1dc5b98086e3d Mon Sep 17 00:00:00 2001 From: Laisky Date: Thu, 15 Aug 2019 14:39:15 +0800 Subject: [PATCH 12/27] +py3 --- py3/charset.ipynb | 75 + py3/concurrent.ipynb | 278 + py3/demo.ipynb | 52 + py3/gbk-fp.txt | 1 + py3/pyquery.ipynb | 8 +- py3/pyquery/README.md | 1 + py3/pyquery/tuhu.ipynb | 5842 ++++++++++++++++++++++ py3/tutorial/process_thread_coroutine.py | 109 + py3/utf-fp.txt | 1 + 9 files changed, 6362 insertions(+), 5 deletions(-) create mode 100644 py3/charset.ipynb create mode 100644 py3/concurrent.ipynb create mode 100644 py3/demo.ipynb create mode 100644 py3/gbk-fp.txt create mode 100644 py3/pyquery/README.md create mode 100644 py3/pyquery/tuhu.ipynb create mode 100644 py3/tutorial/process_thread_coroutine.py create mode 100644 py3/utf-fp.txt diff --git a/py3/charset.ipynb b/py3/charset.ipynb new file mode 100644 index 00000000..00e1aabc --- /dev/null +++ b/py3/charset.ipynb @@ -0,0 +1,75 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "unicode_data = '123'\n", + "utf8_bytes = unicode_data.encode('utf8')\n", + "gbk_bytes = unicode_data.encode('gbk')\n", + "\n", + "print(type(unicode_data))\n", + "print(type(utf8_bytes))\n", + "print(type(gbk_bytes))\n", + "\n", + "# \n", + "# \n", + "# \n", + "\n", + "import tempfile\n", + "\n", + "with tempfile.TemporaryFile(mode='wb+') as utf_fp, \\\n", + " tempfile.TemporaryFile(mode='wb+') as gbk_fp:\n", + "\n", + " utf_fp.write(utf8_bytes)\n", + " gbk_fp.write(gbk_bytes)\n", + "\n", + " utf_fp.seek(0, 0)\n", + " gbk_fp.seek(0, 0)\n", + "\n", + "\n", + " utf8_bytes_2 = utf_fp.read()\n", + " gbk_bytes_2 = gbk_fp.read()\n", + "\n", + " assert utf8_bytes_2 == utf8_bytes\n", + " assert gbk_bytes_2 == gbk_bytes\n", + "\n", + " assert utf8_bytes_2.decode('utf8') == gbk_bytes_2.decode('gbk')\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/py3/concurrent.ipynb b/py3/concurrent.ipynb new file mode 100644 index 00000000..45deead7 --- /dev/null +++ b/py3/concurrent.ipynb @@ -0,0 +1,278 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "worker 1 start\n", + "worker 0 start\n", + "worker 2 start\n", + "worker 3 start\n", + "worker 4 start\n", + "dealing with data 0...\n", + "dealing with data 1...\n", + "dealing with data 2...\n", + "dealing with data 3...\n", + "dealing with data 4...\n", + "all tas data submitted\n", + "dealing with data 5...\n", + "dealing with data 6...\n", + "dealing with data 7...\n", + "dealing with data 8...\n", + "dealing with data 9...\n", + "dealing with data 10...\n", + "dealing with data 11...\n", + "dealing with data 12...\n", + "dealing with data 13...\n", + "dealing with data 14...\n", + "dealing with data 15...\n", + "dealing with data 16...\n", + "dealing with data 17...\n", + "dealing with data 18...\n", + "dealing with data 19...\n", + "dealing with data 21...\n", + "dealing with data 20...\n", + "dealing with data 22...\n", + "dealing with data 23...\n", + "dealing with data 24...\n", + "dealing with data 26...\n", + "dealing with data 25...\n", + "dealing with data 27...\n", + "dealing with data 28...\n", + "dealing with data 29...\n", + "dealing with data 30...\n", + "dealing with data 31...\n", + "dealing with data 32...\n", + "dealing with data 33...\n", + "dealing with data 34...\n", + "dealing with data 35...\n", + "dealing with data 36...\n", + "dealing with data 37...\n", + "dealing with data 38...\n", + "dealing with data 39...\n", + "dealing with data 41...\n", + "dealing with data 40...\n", + "dealing with data 42...\n", + "dealing with data 43...\n", + "dealing with data 44...\n", + "dealing with data 46...\n", + "dealing with data 45...\n", + "dealing with data 47...\n", + "dealing with data 48...\n", + "dealing with data 49...\n", + "worker 2 exit\n", + "worker 4 exit\n", + "worker 3 exit\n", + "worker 1 exit\n", + "worker 0 exit\n", + "all done\n" + ] + } + ], + "source": [ + "from time import sleep\n", + "from concurrent.futures import ProcessPoolExecutor, wait\n", + "from multiprocessing import Manager, Queue\n", + "\n", + "\n", + "N_PARALLEL = 5\n", + "\n", + "\n", + "def worker(i: int, q: Queue) -> None:\n", + " print(f'worker {i} start')\n", + " while 1:\n", + " data = q.get()\n", + " if data is None: # 采用毒丸(poison pill)方式来结束进程池\n", + " q.put(data)\n", + " print(f'worker {i} exit')\n", + " return\n", + " \n", + " print(f'dealing with data {data}...')\n", + " sleep(1)\n", + " \n", + "\n", + " \n", + " \n", + "def main():\n", + " executor = ProcessPoolExecutor(max_workers=N_PARALLEL) # 控制并发量\n", + " with Manager() as manager:\n", + " queue = manager.Queue(maxsize=50) # 控制缓存量\n", + "\n", + " workers = [executor.submit(worker, i, queue) for i in range(N_PARALLEL)]\n", + " for i in range(50):\n", + " queue.put(i)\n", + " \n", + " print('all task data submitted')\n", + "\n", + " queue.put(None)\n", + " wait(workers)\n", + " print('all done')\n", + " \n", + "\n", + "main()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "worker[0] got normal_v 1, shared_v 1\n", + "worker[1] got normal_v 1, shared_v 2\n", + "all done\n" + ] + } + ], + "source": [ + "from time import sleep\n", + "from concurrent.futures import ProcessPoolExecutor, wait\n", + "from multiprocessing import Manager, Queue\n", + "from ctypes import c_int64\n", + "\n", + "\n", + "def worker(i, normal_v, shared_v):\n", + " normal_v += 1 # 因为进程间内存隔离,所以每个进程都会得到 1\n", + " shared_v.value += 1 # 因为使用了共享内存,所以会分别得到 1 和 2\n", + " \n", + " print(f'worker[{i}] got normal_v {normal_v}, shared_v {shared_v.value}')\n", + " \n", + " \n", + "def main():\n", + " executor = ProcessPoolExecutor(max_workers=2)\n", + " with Manager() as manager:\n", + " lock = manager.Lock()\n", + " shared_v = manager.Value(c_int64, 0, lock=lock)\n", + " normal_v = 0\n", + "\n", + " workers = [executor.submit(worker, i, normal_v, shared_v) for i in range(2)]\n", + " wait(workers)\n", + " print('all done')\n", + " \n", + "\n", + "main()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "ename": "RuntimeError", + "evalue": "This event loop is already running", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 53\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 55\u001b[0;31m \u001b[0mmain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 56\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mmain\u001b[0;34m()\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 51\u001b[0;31m \u001b[0mioloop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_until_complete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcoroutine_main\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 52\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'all done'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 53\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/3.7.4/lib/python3.7/asyncio/base_events.py\u001b[0m in \u001b[0;36mrun_until_complete\u001b[0;34m(self, future)\u001b[0m\n\u001b[1;32m 564\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_done_callback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_run_until_complete_cb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 565\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 566\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_forever\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 567\u001b[0m \u001b[0;32mexcept\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 568\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_task\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdone\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcancelled\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/3.7.4/lib/python3.7/asyncio/base_events.py\u001b[0m in \u001b[0;36mrun_forever\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 519\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_closed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 520\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_running\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 521\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'This event loop is already running'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 522\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mevents\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_running_loop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 523\u001b[0m raise RuntimeError(\n", + "\u001b[0;31mRuntimeError\u001b[0m: This event loop is already running" + ] + } + ], + "source": [ + "from time import sleep\n", + "from asyncio import get_event_loop, sleep as asleep, gather, ensure_future\n", + "from concurrent.futures import ThreadPoolExecutor, wait, Future\n", + "from functools import wraps\n", + "\n", + "\n", + "executor = ThreadPoolExecutor(max_workers=10)\n", + "ioloop = get_event_loop()\n", + "\n", + "\n", + "def nonblocking(func) -> Future:\n", + " @wraps(func)\n", + " def wrapper(*args):\n", + " return ioloop.run_in_executor(executor, func, *args)\n", + " return wrapper\n", + "\n", + "\n", + "@nonblocking # 用线程池封装没法协程化的普通阻塞程序\n", + "def foo(n: int):\n", + " \"\"\"假装我是个很耗时的阻塞调用\"\"\"\n", + " print('start blocking task...')\n", + " sleep(n)\n", + " print('end blocking task')\n", + "\n", + "\n", + "async def coroutine_demo(n: int):\n", + " \"\"\"我就是个普通的协程\"\"\"\n", + "\n", + " # 协程内不能出现任何的阻塞调用,所谓一朝协程,永世协程\n", + " # 那我偏要调一个普通的阻塞函数怎么办?\n", + " # 最简单的办法,套一个线程池…\n", + " await foo(n)\n", + "\n", + "\n", + "async def coroutine_demo_2():\n", + " print('start coroutine task...')\n", + " await asleep(1)\n", + " print('end coroutine task')\n", + "\n", + "\n", + "async def coroutine_main():\n", + " \"\"\"一般我们会写一个 coroutine 的 main 函数,专门负责管理协程\"\"\"\n", + " await gather(\n", + " coroutine_demo(1),\n", + " coroutine_demo_2()\n", + " )\n", + "\n", + "\n", + "def main():\n", + " ioloop.run_until_complete(coroutine_main())\n", + " print('all done')\n", + "\n", + "\n", + "main()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# kipp\n", + "\n", + "from kipp.aio import run_until_complete, " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/py3/demo.ipynb b/py3/demo.ipynb new file mode 100644 index 00000000..c1304415 --- /dev/null +++ b/py3/demo.ipynb @@ -0,0 +1,52 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 4, 3]\n", + "[1, 4, 3]\n" + ] + } + ], + "source": [ + "l = [1, 2, 3]\n", + "\n", + "\n", + "def foo(v):\n", + " v[1] = 4\n", + " return v\n", + "\n", + "\n", + "print(foo(l))\n", + "print(l)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/py3/gbk-fp.txt b/py3/gbk-fp.txt new file mode 100644 index 00000000..d800886d --- /dev/null +++ b/py3/gbk-fp.txt @@ -0,0 +1 @@ +123 \ No newline at end of file diff --git a/py3/pyquery.ipynb b/py3/pyquery.ipynb index cfbc9597..25db6250 100644 --- a/py3/pyquery.ipynb +++ b/py3/pyquery.ipynb @@ -40,9 +40,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -76,9 +74,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.7.4" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/py3/pyquery/README.md b/py3/pyquery/README.md new file mode 100644 index 00000000..85fbf09d --- /dev/null +++ b/py3/pyquery/README.md @@ -0,0 +1 @@ +车系-车标数据: diff --git a/py3/pyquery/tuhu.ipynb b/py3/pyquery/tuhu.ipynb new file mode 100644 index 00000000..93e63b45 --- /dev/null +++ b/py3/pyquery/tuhu.ipynb @@ -0,0 +1,5842 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "import codecs\n", + "import json\n", + "import traceback\n", + "from urllib.parse import quote, unquote\n", + "from collections import defaultdict\n", + "from operator import itemgetter\n", + "\n", + "from pyquery import PyQuery as pq\n", + "import requests\n", + "\n", + "\n", + "index_regex = re.compile(r'[^{]+(.*)\\)')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# get brand image\n", + "\n", + "resp = requests.get('https://item.tuhu.cn/Car/GetCarBrands2?callback=__GetCarBrands__&_=1565141557927')\n", + "index = json.loads(index_regex.findall(resp.text)[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# download logo image\n", + "for _, l1 in index.items():\n", + " for brand_dict in l1:\n", + " bname = brand_dict['Brand']\n", + " bimg = requests.get(f\"https://img3.tuhu.org/{brand_dict['Url']}\").content\n", + " with open(f'{bname}.png', 'wb') as f:\n", + " f.write(bimg)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# get child tier\n", + "\n", + "def get_child_brand_url(brand):\n", + " return f\"https://item.tuhu.cn/Car/SelOneBrand?callback=__GetCarBrands__&Brand={quote(brand)}&_=1565143202617\"\n", + "\n", + "\n", + "result = defaultdict(list)\n", + "for _, l1 in index.items():\n", + " for brand_dict in l1:\n", + " bname = brand_dict['Brand']\n", + " for cbrand_d in json.loads(index_regex.findall(requests.get(get_child_brand_url(bname)).text)[0])['OneBrand']:\n", + " result[bname].append(cbrand_d)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "# write result\n", + "\n", + "with open('./车胎/child-tires-utf8.txt', 'rb') as f:\n", + " f.write(json.dumps(result, indent=4, sort_keys=True, ensure_ascii=False).encode('utf8'))\n", + " \n", + "with open('./车胎/child-tires-gbk.txt', 'rb') as f:\n", + " f.write(json.dumps(result, indent=4, sort_keys=True, ensure_ascii=False).encode('gbk')) " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# load result\n", + "with open('./车胎/child-tires-utf8.txt', 'rb') as f:\n", + " result = json.loads(f.read().decode('utf8'))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'A': [{'Brand': 'A - 阿尔法·罗米欧',\n", + " 'Url': '/Images/Logo/aerfa%C2%B7luomiou.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'A - 安驰', 'Url': '/Images/Logo/anchi.png', 'ImageUrl': None},\n", + " {'Brand': 'A - ARCFOX', 'Url': '/Images/Logo/arcfox.png', 'ImageUrl': None},\n", + " {'Brand': 'A - 阿斯顿·马丁',\n", + " 'Url': '/Images/Logo/asidun%C2%B7mading.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'A - 奥迪', 'Url': '/Images/Logo/aodi.png', 'ImageUrl': None}],\n", + " 'B': [{'Brand': 'B - 别克', 'Url': '/Images/Logo/bieke.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 奔驰', 'Url': '/Images/Logo/benchi.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 保时捷', 'Url': '/Images/Logo/baoshijie.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 宝龙', 'Url': '/Images/Logo/baolong.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 比亚迪', 'Url': '/Images/Logo/biyadi.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 宝马', 'Url': '/Images/Logo/baoma.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 标致', 'Url': '/Images/Logo/biaozhi.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 宾利', 'Url': '/Images/Logo/binli.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 北汽制造',\n", + " 'Url': '/Images/Logo/beiqizhizao.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'B - 北京汽车',\n", + " 'Url': '/Images/Logo/beijingqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'B - 宝骏', 'Url': '/Images/Logo/baojun.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 巴博斯', 'Url': '/Images/Logo/babosi.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 宝沃', 'Url': '/Images/Logo/baowo.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 比速汽车', 'Url': '/Images/Logo/bisuqiche.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 北汽瑞丽',\n", + " 'Url': '/Images/Logo/beiqiruili.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'B - 本田', 'Url': '/Images/Logo/bentian.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 北汽新能源',\n", + " 'Url': '/Images/Logo/beiqixinnengyuan.png',\n", + " 'ImageUrl': None}],\n", + " 'C': [{'Brand': 'C - 成功',\n", + " 'Url': '/Images/Logo/chenggong.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'C - 长安', 'Url': '/Images/Logo/changan.png', 'ImageUrl': None},\n", + " {'Brand': 'C - 昌河', 'Url': '/Images/Logo/changhe.png', 'ImageUrl': None},\n", + " {'Brand': 'C - 长安商用',\n", + " 'Url': '/Images/Logo/changanshangyong.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'C - 长城', 'Url': '/Images/Logo/changcheng.png', 'ImageUrl': None},\n", + " {'Brand': 'C - 传祺', 'Url': '/Images/Logo/chuanzuo.png', 'ImageUrl': None}],\n", + " 'D': [{'Brand': 'D - 大众',\n", + " 'Url': '/Images/Logo/dazhong.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'D - 大迪', 'Url': '/Images/Logo/dadi.png', 'ImageUrl': None},\n", + " {'Brand': 'D - 大发', 'Url': '/Images/Logo/dafa.png', 'ImageUrl': None},\n", + " {'Brand': 'D - 大宇', 'Url': '/Images/Logo/dayu.png', 'ImageUrl': None},\n", + " {'Brand': 'D - 道奇', 'Url': '/Images/Logo/daoqi.png', 'ImageUrl': None},\n", + " {'Brand': 'D - 东风汽车',\n", + " 'Url': '/Images/Logo/dongfengqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'D - 东风风神',\n", + " 'Url': '/Images/Logo/dongfengfengshen.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'D - DS', 'Url': '/Images/Logo/ds.png', 'ImageUrl': None},\n", + " {'Brand': 'D - 电咖', 'Url': '/Images/Logo/dianka.png', 'ImageUrl': None},\n", + " {'Brand': 'D - 大乘汽车',\n", + " 'Url': '/Images/Logo/dachengqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'D - 东南', 'Url': '/Images/Logo/dongnan.png', 'ImageUrl': None},\n", + " {'Brand': 'D - 东风风度',\n", + " 'Url': '/Images/Logo/dongfengfengdu.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'D - 大通', 'Url': '/Images/Logo/datong.png', 'ImageUrl': None},\n", + " {'Brand': 'D - 东风小康',\n", + " 'Url': '/Images/Logo/dongfengxiaokang.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'D - 东风富康',\n", + " 'Url': '/Images/Logo/dongfengfukang.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'D - 东风风行',\n", + " 'Url': '/Images/Logo/dongfengfengxing.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'D - 东风俊风',\n", + " 'Url': '/Images/Logo/dongfengjunfeng.png',\n", + " 'ImageUrl': None}],\n", + " 'F': [{'Brand': 'F - 菲亚特',\n", + " 'Url': '/Images/Logo/feiyate.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'ImageUrl': None},\n", + " {'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'ImageUrl': None},\n", + " {'Brand': 'F - 富奇', 'Url': '/Images/Logo/fuqi.png', 'ImageUrl': None},\n", + " {'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'ImageUrl': None},\n", + " {'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'ImageUrl': None},\n", + " {'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'ImageUrl': None}],\n", + " 'G': [{'Brand': 'G - 观致',\n", + " 'Url': '/Images/Logo/guanzhi.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'G - GMC', 'Url': '/Images/Logo/gmc.png', 'ImageUrl': None},\n", + " {'Brand': 'G - 光冈', 'Url': '/Images/Logo/guanggang.png', 'ImageUrl': None},\n", + " {'Brand': 'G - 国金', 'Url': '/Images/Logo/guojin.png', 'ImageUrl': None},\n", + " {'Brand': 'G - 广汽新能源',\n", + " 'Url': '/Images/Logo/guangqixinnengyuan.png',\n", + " 'ImageUrl': None}],\n", + " 'H': [{'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 华普', 'Url': '/Images/Logo/huapu.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 华泰', 'Url': '/Images/Logo/huatai.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 黄海', 'Url': '/Images/Logo/huanghai.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 汇众', 'Url': '/Images/Logo/huizhong.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 海格', 'Url': '/Images/Logo/haige.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 黑豹', 'Url': '/Images/Logo/heibao.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 恒天', 'Url': '/Images/Logo/hengtian.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 华北', 'Url': '/Images/Logo/huabei.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 幻速', 'Url': '/Images/Logo/huansu.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 华颂', 'Url': '/Images/Logo/huasong.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 汉腾汽车',\n", + " 'Url': '/Images/Logo/hantengqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'H - 华骐', 'Url': '/Images/Logo/huazuo.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 红星汽车',\n", + " 'Url': '/Images/Logo/hongxingqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'H - 海马', 'Url': '/Images/Logo/haima.png', 'ImageUrl': None},\n", + " {'Brand': 'H - 哈弗', 'Url': '/Images/Logo/hafu.png', 'ImageUrl': None}],\n", + " 'J': [{'Brand': 'J - 吉奥', 'Url': '/Images/Logo/jiao.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 吉普', 'Url': '/Images/Logo/jipu.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 江南', 'Url': '/Images/Logo/jiangnan.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 江苏南亚',\n", + " 'Url': '/Images/Logo/jiangsunanya.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'J - 捷豹', 'Url': '/Images/Logo/jiebao.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 金程', 'Url': '/Images/Logo/jincheng.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 江铃', 'Url': '/Images/Logo/jiangling.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 九龙', 'Url': '/Images/Logo/jiulong.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 解放', 'Url': '/Images/Logo/jiefang.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 金旅', 'Url': '/Images/Logo/jinlv.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 君马', 'Url': '/Images/Logo/junma.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 吉利', 'Url': '/Images/Logo/jili.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 几何汽车', 'Url': '/Images/Logo/jiheqiche.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 江淮', 'Url': '/Images/Logo/jianghuai.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 金杯', 'Url': '/Images/Logo/jinbei.png', 'ImageUrl': None},\n", + " {'Brand': 'J - 江铃新能源',\n", + " 'Url': '/Images/Logo/jianglingxinnengyuan.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'J - 捷途', 'Url': '/Images/Logo/jietu.png', 'ImageUrl': None}],\n", + " 'K': [{'Brand': 'K - 开瑞', 'Url': '/Images/Logo/kairui.png', 'ImageUrl': None},\n", + " {'Brand': 'K - 凯迪拉克', 'Url': '/Images/Logo/kaidilake.png', 'ImageUrl': None},\n", + " {'Brand': 'K - 克莱斯勒', 'Url': '/Images/Logo/kelaisile.png', 'ImageUrl': None},\n", + " {'Brand': 'K - 卡尔森', 'Url': '/Images/Logo/kaersen.png', 'ImageUrl': None},\n", + " {'Brand': 'K - 科尼赛克', 'Url': '/Images/Logo/kenisaike.png', 'ImageUrl': None},\n", + " {'Brand': 'K - 凯翼', 'Url': '/Images/Logo/kaiyi.png', 'ImageUrl': None},\n", + " {'Brand': 'K - 卡威', 'Url': '/Images/Logo/kawei.png', 'ImageUrl': None}],\n", + " 'L': [{'Brand': 'L - 铃木', 'Url': '/Images/Logo/lingmu.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 路虎', 'Url': '/Images/Logo/luhu.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 猎豹', 'Url': '/Images/Logo/liebao.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 兰博基尼', 'Url': '/Images/Logo/lanbojini.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 雷诺', 'Url': '/Images/Logo/leinuo.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 路特斯', 'Url': '/Images/Logo/lutesi.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 莲花', 'Url': '/Images/Logo/lianhua.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 陆风', 'Url': '/Images/Logo/lufeng.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 罗孚', 'Url': '/Images/Logo/luozuo.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 劳伦士', 'Url': '/Images/Logo/laolunshi.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 陆地方舟',\n", + " 'Url': '/Images/Logo/ludifangzhou.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'L - 理念', 'Url': '/Images/Logo/linian.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 领克', 'Url': '/Images/Logo/lingke.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 罗夫哈特', 'Url': '/Images/Logo/luofuhate.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 力帆', 'Url': '/Images/Logo/lifan.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 领途汽车',\n", + " 'Url': '/Images/Logo/lingtuqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'L - 劳斯莱斯',\n", + " 'Url': '/Images/Logo/laosilaisi.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'L - 雷克萨斯', 'Url': '/Images/Logo/leikesasi.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 林肯', 'Url': '/Images/Logo/linken.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 零跑汽车',\n", + " 'Url': '/Images/Logo/lingpaoqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'L - 洛克汽车',\n", + " 'Url': '/Images/Logo/luokeqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'L - 理想', 'Url': '/Images/Logo/lixiang.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 雷丁', 'Url': '/Images/Logo/leiding.png', 'ImageUrl': None}],\n", + " 'M': [{'Brand': 'M - MINI', 'Url': '/Images/Logo/mini.png', 'ImageUrl': None},\n", + " {'Brand': 'M - MG', 'Url': '/Images/Logo/mg.png', 'ImageUrl': None},\n", + " {'Brand': 'M - 玛莎拉蒂', 'Url': '/Images/Logo/mashaladi.png', 'ImageUrl': None},\n", + " {'Brand': 'M - 迈巴赫', 'Url': '/Images/Logo/maibahe.png', 'ImageUrl': None},\n", + " {'Brand': 'M - 美亚', 'Url': '/Images/Logo/meiya.png', 'ImageUrl': None},\n", + " {'Brand': 'M - 马自达', 'Url': '/Images/Logo/mazida.png', 'ImageUrl': None},\n", + " {'Brand': 'M - 迈凯伦', 'Url': '/Images/Logo/maikailun.png', 'ImageUrl': None}],\n", + " 'N': [{'Brand': 'N - 纳智捷',\n", + " 'Url': '/Images/Logo/nazhijie.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'N - 哪吒汽车',\n", + " 'Url': '/Images/Logo/nazuoqiche.png',\n", + " 'ImageUrl': None}],\n", + " 'O': [{'Brand': 'O - 欧宝', 'Url': '/Images/Logo/oubao.png', 'ImageUrl': None},\n", + " {'Brand': 'O - 欧朗', 'Url': '/Images/Logo/oulang.png', 'ImageUrl': None},\n", + " {'Brand': 'O - 讴歌', 'Url': '/Images/Logo/zuoge.png', 'ImageUrl': None},\n", + " {'Brand': 'O - 欧拉', 'Url': '/Images/Logo/oula.png', 'ImageUrl': None},\n", + " {'Brand': 'O - 欧尚汽车',\n", + " 'Url': '/Images/Logo/oushangqiche.png',\n", + " 'ImageUrl': None}],\n", + " 'P': [{'Brand': 'P - Polestar',\n", + " 'Url': '/Images/Logo/polestar.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'P - 帕加尼', 'Url': '/Images/Logo/pajiani.png', 'ImageUrl': None}],\n", + " 'Q': [{'Brand': 'Q - 奇瑞', 'Url': '/Images/Logo/qirui.png', 'ImageUrl': None},\n", + " {'Brand': 'Q - 起亚', 'Url': '/Images/Logo/qiya.png', 'ImageUrl': None},\n", + " {'Brand': 'Q - 庆铃', 'Url': '/Images/Logo/qingling.png', 'ImageUrl': None},\n", + " {'Brand': 'Q - 启腾', 'Url': '/Images/Logo/qiteng.png', 'ImageUrl': None},\n", + " {'Brand': 'Q - 乔治·巴顿',\n", + " 'Url': '/Images/Logo/qiaozhi%C2%B7badun.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'Q - 前途汽车',\n", + " 'Url': '/Images/Logo/qiantuqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'Q - 启辰', 'Url': '/Images/Logo/qichen.png', 'ImageUrl': None}],\n", + " 'R': [{'Brand': 'R - 日产', 'Url': '/Images/Logo/richan.png', 'ImageUrl': None},\n", + " {'Brand': 'R - 瑞麒', 'Url': '/Images/Logo/ruizuo.png', 'ImageUrl': None},\n", + " {'Brand': 'R - RUF', 'Url': '/Images/Logo/ruf.png', 'ImageUrl': None},\n", + " {'Brand': 'R - 荣威', 'Url': '/Images/Logo/rongwei.png', 'ImageUrl': None}],\n", + " 'S': [{'Brand': 'S - Smart',\n", + " 'Url': '/Images/Logo/smart.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'S - 思铭', 'Url': '/Images/Logo/siming.png', 'ImageUrl': None},\n", + " {'Brand': 'S - 斯巴鲁', 'Url': '/Images/Logo/sibalu.png', 'ImageUrl': None},\n", + " {'Brand': 'S - 萨博', 'Url': '/Images/Logo/sabo.png', 'ImageUrl': None},\n", + " {'Brand': 'S - 赛宝', 'Url': '/Images/Logo/saibao.png', 'ImageUrl': None},\n", + " {'Brand': 'S - 双环', 'Url': '/Images/Logo/shuanghuan.png', 'ImageUrl': None},\n", + " {'Brand': 'S - 双龙', 'Url': '/Images/Logo/shuanglong.png', 'ImageUrl': None},\n", + " {'Brand': 'S - 世爵', 'Url': '/Images/Logo/shijue.png', 'ImageUrl': None},\n", + " {'Brand': 'S - 陕汽通家',\n", + " 'Url': '/Images/Logo/shanqitongjia.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'S - 斯威汽车',\n", + " 'Url': '/Images/Logo/siweiqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'S - 三菱', 'Url': '/Images/Logo/sanling.png', 'ImageUrl': None},\n", + " {'Brand': 'S - 斯柯达', 'Url': '/Images/Logo/sikeda.png', 'ImageUrl': None},\n", + " {'Brand': 'S - 绅宝', 'Url': '/Images/Logo/shenbao.png', 'ImageUrl': None}],\n", + " 'T': [{'Brand': 'T - 天马', 'Url': '/Images/Logo/tianma.png', 'ImageUrl': None},\n", + " {'Brand': 'T - 通田', 'Url': '/Images/Logo/tongtian.png', 'ImageUrl': None},\n", + " {'Brand': 'T - 腾势', 'Url': '/Images/Logo/tengshi.png', 'ImageUrl': None},\n", + " {'Brand': 'T - 天津一汽',\n", + " 'Url': '/Images/Logo/tianjinyiqi.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'T - 特斯拉', 'Url': '/Images/Logo/tesila.png', 'ImageUrl': None}],\n", + " 'W': [{'Brand': 'W - 万丰',\n", + " 'Url': '/Images/Logo/wanfeng.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'W - 威麟', 'Url': '/Images/Logo/weizuo.png', 'ImageUrl': None},\n", + " {'Brand': 'W - 沃尔沃', 'Url': '/Images/Logo/woerwo.png', 'ImageUrl': None},\n", + " {'Brand': 'W - 五菱', 'Url': '/Images/Logo/wuling.png', 'ImageUrl': None},\n", + " {'Brand': 'W - 威旺', 'Url': '/Images/Logo/weiwang.png', 'ImageUrl': None},\n", + " {'Brand': 'W - 威兹曼', 'Url': '/Images/Logo/weiziman.png', 'ImageUrl': None},\n", + " {'Brand': 'W - 五十铃', 'Url': '/Images/Logo/wushiling.png', 'ImageUrl': None},\n", + " {'Brand': 'W - WEY', 'Url': '/Images/Logo/wey.png', 'ImageUrl': None},\n", + " {'Brand': 'W - 威马', 'Url': '/Images/Logo/weima.png', 'ImageUrl': None},\n", + " {'Brand': 'W - 蔚来', 'Url': '/Images/Logo/weilai.png', 'ImageUrl': None}],\n", + " 'X': [{'Brand': 'X - 新雅途',\n", + " 'Url': '/Images/Logo/xinyatu.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'X - 厦门金龙',\n", + " 'Url': '/Images/Logo/xiamenjinlong.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'X - 雪佛兰', 'Url': '/Images/Logo/xuefolan.png', 'ImageUrl': None},\n", + " {'Brand': 'X - 雪铁龙', 'Url': '/Images/Logo/xuetielong.png', 'ImageUrl': None},\n", + " {'Brand': 'X - 西雅特', 'Url': '/Images/Logo/xiyate.png', 'ImageUrl': None},\n", + " {'Brand': 'X - 新凯', 'Url': '/Images/Logo/xinkai.png', 'ImageUrl': None},\n", + " {'Brand': 'X - 新特汽车',\n", + " 'Url': '/Images/Logo/xinteqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'X - 现代', 'Url': '/Images/Logo/xiandai.png', 'ImageUrl': None},\n", + " {'Brand': 'X - 小鹏汽车',\n", + " 'Url': '/Images/Logo/xiaopengqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'X - 星途', 'Url': '/Images/Logo/xingtu.png', 'ImageUrl': None}],\n", + " 'Y': [{'Brand': 'Y - 英菲尼迪',\n", + " 'Url': '/Images/Logo/yingfeinidi.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'Y - 永源', 'Url': '/Images/Logo/yongyuan.png', 'ImageUrl': None},\n", + " {'Brand': 'Y - 云雀', 'Url': '/Images/Logo/yunque.png', 'ImageUrl': None},\n", + " {'Brand': 'Y - 一汽吉林', 'Url': '/Images/Logo/yiqijilin.png', 'ImageUrl': None},\n", + " {'Brand': 'Y - 一汽华利', 'Url': '/Images/Logo/yiqihuali.png', 'ImageUrl': None},\n", + " {'Brand': 'Y - 依维柯', 'Url': '/Images/Logo/yiweike.png', 'ImageUrl': None},\n", + " {'Brand': 'Y - 一汽通用',\n", + " 'Url': '/Images/Logo/yiqitongyong.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'Y - 云度汽车',\n", + " 'Url': '/Images/Logo/yunduqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'Y - 裕路', 'Url': '/Images/Logo/yulu.png', 'ImageUrl': None},\n", + " {'Brand': 'Y - 御捷新能源',\n", + " 'Url': '/Images/Logo/yujiexinnengyuan.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'Y - 一汽奔腾',\n", + " 'Url': '/Images/Logo/yiqibenteng.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'Y - 野马', 'Url': '/Images/Logo/yema.png', 'ImageUrl': None},\n", + " {'Brand': 'Y - 英致', 'Url': '/Images/Logo/yingzhi.png', 'ImageUrl': None},\n", + " {'Brand': 'Y - 易至汽车',\n", + " 'Url': '/Images/Logo/yizhiqiche.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'Y - 银隆新能源',\n", + " 'Url': '/Images/Logo/yinlongxinnengyuan.png',\n", + " 'ImageUrl': None}],\n", + " 'Z': [{'Brand': 'Z - 中华',\n", + " 'Url': '/Images/Logo/zhonghua.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'Z - 中顺', 'Url': '/Images/Logo/zhongshun.png', 'ImageUrl': None},\n", + " {'Brand': 'Z - 中兴', 'Url': '/Images/Logo/zhongxing.png', 'ImageUrl': None},\n", + " {'Brand': 'Z - 众泰', 'Url': '/Images/Logo/zhongtai.png', 'ImageUrl': None},\n", + " {'Brand': 'Z - 中欧', 'Url': '/Images/Logo/zhongou.png', 'ImageUrl': None},\n", + " {'Brand': 'Z - 知豆', 'Url': '/Images/Logo/zhidou.png', 'ImageUrl': None},\n", + " {'Brand': 'Z - 浙江卡尔森',\n", + " 'Url': '/Images/Logo/zhejiangkaersen.png',\n", + " 'ImageUrl': None},\n", + " {'Brand': 'Z - 之诺', 'Url': '/Images/Logo/zhinuo.png', 'ImageUrl': None}],\n", + " 'hot': [{'Brand': 'A - 奥迪', 'Url': '/Images/Logo/aodi.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 别克', 'Url': '/Images/Logo/bieke.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 奔驰', 'Url': '/Images/Logo/benchi.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 宝马', 'Url': '/Images/Logo/baoma.png', 'ImageUrl': None},\n", + " {'Brand': 'D - 大众', 'Url': '/Images/Logo/dazhong.png', 'ImageUrl': None},\n", + " {'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'ImageUrl': None},\n", + " {'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 本田', 'Url': '/Images/Logo/bentian.png', 'ImageUrl': None},\n", + " {'Brand': 'R - 日产', 'Url': '/Images/Logo/richan.png', 'ImageUrl': None},\n", + " {'Brand': 'S - 斯柯达', 'Url': '/Images/Logo/sikeda.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 标致', 'Url': '/Images/Logo/biaozhi.png', 'ImageUrl': None},\n", + " {'Brand': 'M - 马自达', 'Url': '/Images/Logo/mazida.png', 'ImageUrl': None},\n", + " {'Brand': 'X - 现代', 'Url': '/Images/Logo/xiandai.png', 'ImageUrl': None},\n", + " {'Brand': 'B - 比亚迪', 'Url': '/Images/Logo/biyadi.png', 'ImageUrl': None},\n", + " {'Brand': 'X - 雪铁龙', 'Url': '/Images/Logo/xuetielong.png', 'ImageUrl': None},\n", + " {'Brand': 'X - 雪佛兰', 'Url': '/Images/Logo/xuefolan.png', 'ImageUrl': None},\n", + " {'Brand': 'Q - 起亚', 'Url': '/Images/Logo/qiya.png', 'ImageUrl': None},\n", + " {'Brand': 'L - 铃木', 'Url': '/Images/Logo/lingmu.png', 'ImageUrl': None},\n", + " {'Brand': 'M - MG', 'Url': '/Images/Logo/mg.png', 'ImageUrl': None},\n", + " {'Brand': 'R - 荣威', 'Url': '/Images/Logo/rongwei.png', 'ImageUrl': None}]}" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A - 阿尔法·罗米欧 done\n", + "A - 安驰 done\n", + "A - ARCFOX done\n", + "A - 阿斯顿·马丁 done\n", + "A - 奥迪 done\n", + "B - 别克 done\n", + "B - 奔驰 done\n", + "B - 保时捷 done\n", + "B - 宝龙 done\n", + "B - 比亚迪 done\n", + "B - 宝马 done\n", + "B - 标致 done\n", + ">> B - 标致 - VE-GPEUG505 - {'Vehicle': '505-广州标致', 'ProductID': 'VE-GPEUG505', 'BrandType': '广州标致', 'Brand': 'B - 标致', 'Url': '/Images/Logo/biaozhi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GPEUG505.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '505', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GPEUG505.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/BiaoZhi.png', 'Tires': '185/80R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 1, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "B - 宾利 done\n", + ">> B - 宾利 - VE-BENT07AB - {'Vehicle': '雅骏-宾利汽车', 'ProductID': 'VE-BENT07AB', 'BrandType': '宾利汽车', 'Brand': 'B - 宾利', 'Url': '/Images/Logo/binli.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-BENT07AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '雅骏', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-BENT07AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/BinLi.png', 'Tires': '255/55R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "B - 北汽制造 done\n", + ">> B - 北汽制造 - VE-LNB-LULING - {'Vehicle': '陆铃-北汽制造', 'ProductID': 'VE-LNB-LULING', 'BrandType': '北汽制造', 'Brand': 'B - 北汽制造', 'Url': '/Images/Logo/beiqizhizao.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LNB-LULING.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '陆铃', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LNB-LULING.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/BeiQiZhiZao.png', 'Tires': '225/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> B - 北汽制造 - VE-LNB-LEICHI - {'Vehicle': '雷驰-北汽制造', 'ProductID': 'VE-LNB-LEICHI', 'BrandType': '北汽制造', 'Brand': 'B - 北汽制造', 'Url': '/Images/Logo/beiqizhizao.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LNB-LEICHI.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '雷驰', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LNB-LEICHI.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/BeiQiZhiZao.png', 'Tires': '225/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "B - 北京汽车 done\n", + "B - 宝骏 done\n", + "B - 巴博斯 done\n", + "B - 宝沃 done\n", + "B - 比速汽车 done\n", + "B - 北汽瑞丽 done\n", + "B - 本田 done\n", + "B - 北汽新能源 done\n", + "C - 成功 done\n", + "C - 长安 done\n", + ">> C - 长安 - VE-CACS35 - {'Vehicle': 'CS35-乘用车', 'ProductID': 'VE-CACS35', 'BrandType': '乘用车', 'Brand': 'C - 长安', 'Url': '/Images/Logo/changan.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CACS35.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'CS35', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CACS35.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/ChangAn.png', 'Tires': '215/50R17;205/60R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 27, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 65, in \n", + " gbk_fp.write(ij.encode('gbk'))\n", + "UnicodeEncodeError: 'gbk' codec can't encode character '\\xa0' in position 55: illegal multibyte sequence\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "C - 昌河 done\n", + "C - 长安商用 done\n", + ">> C - 长安商用 - VE-CHAN05AU - {'Vehicle': '长安星韵-商用车', 'ProductID': 'VE-CHAN05AU', 'BrandType': '商用车', 'Brand': 'C - 长安商用', 'Url': '/Images/Logo/changanshangyong.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-CHAN05AU.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '长安星韵', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-CHAN05AU.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/ChangAnShangYong.png', 'Tires': '165/70R13', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 5, 'Priority3': 15, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "C - 长城 done\n", + ">> C - 长城 - VE-GREA04BD - {'Vehicle': '迪尔-长城汽车', 'ProductID': 'VE-GREA04BD', 'BrandType': '长城汽车', 'Brand': 'C - 长城', 'Url': '/Images/Logo/changcheng.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GREA04BD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '迪尔', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GREA04BD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/ChangCheng.png', 'Tires': '205/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 25, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "C - 传祺 done\n", + "D - 大众 done\n", + "D - 大迪 done\n", + "D - 大发 done\n", + "D - 大宇 done\n", + ">> D - 大宇 - VE-DAEW05AB - {'Vehicle': '典雅-大宇汽车', 'ProductID': 'VE-DAEW05AB', 'BrandType': '大宇汽车', 'Brand': 'D - 大宇', 'Url': '/Images/Logo/dayu.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-DAEW05AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '典雅', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-DAEW05AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/DaYu.png', 'Tires': '205/60R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> D - 大宇 - VE-DAEW99AB - {'Vehicle': '蓝天-大宇汽车', 'ProductID': 'VE-DAEW99AB', 'BrandType': '大宇汽车', 'Brand': 'D - 大宇', 'Url': '/Images/Logo/dayu.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-DAEW99AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '蓝天', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-DAEW99AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/DaYu.png', 'Tires': '155/80R13', 'SpecialTireSize': '155R13', 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> D - 大宇 - VE-DAEW05AC - {'Vehicle': '旅行家-大宇汽车', 'ProductID': 'VE-DAEW05AC', 'BrandType': '大宇汽车', 'Brand': 'D - 大宇', 'Url': '/Images/Logo/dayu.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-DAEW05AC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '旅行家', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-DAEW05AC.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/DaYu.png', 'Tires': '185/65R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "D - 道奇 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "D - 东风汽车 done\n", + ">> D - 东风汽车 - VE-DDJJL - {'Vehicle': '汗马-东风汽车', 'ProductID': 'VE-DDJJL', 'BrandType': '东风汽车', 'Brand': 'D - 东风汽车', 'Url': '/Images/Logo/dongfengqiche.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-DDJJL.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '汗马', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-DDJJL.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/DongFengQiChe.png', 'Tires': '37/12.5R16.5', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 10, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> D - 东风汽车 - VE-DF-MENSHI - {'Vehicle': '猛士-东风汽车', 'ProductID': 'VE-DF-MENSHI', 'BrandType': '东风汽车', 'Brand': 'D - 东风汽车', 'Url': '/Images/Logo/dongfengqiche.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-DF-MENSHI.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '猛士', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-DF-MENSHI.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/DongFengQiChe.png', 'Tires': '315/70R17LT;215/75R16', 'SpecialTireSize': '37.5X12.5R16.5', 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 9, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> D - 东风汽车 - VE-LGG-A10 - {'Vehicle': '御风A100-东风汽车', 'ProductID': 'VE-LGG-A10', 'BrandType': '东风汽车', 'Brand': 'D - 东风汽车', 'Url': '/Images/Logo/dongfengqiche.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LGG-A10.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '御风A100', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LGG-A10.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/DongFengQiChe.png', 'Tires': '215/75R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> D - 东风汽车 - VE-LGG-AE100 - {'Vehicle': '御风EA100-东风汽车', 'ProductID': 'VE-LGG-AE100', 'BrandType': '东风汽车', 'Brand': 'D - 东风汽车', 'Url': '/Images/Logo/dongfengqiche.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LGG-AE100.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '御风EA100', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LGG-AE100.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/DongFengQiChe.png', 'Tires': '215/75R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "D - 东风风神 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "D - DS done\n", + "D - 电咖 done\n", + "D - 大乘汽车 done\n", + "D - 东南 done\n", + "D - 东风风度 done\n", + "D - 大通 done\n", + ">> D - 大通 - VE-SQDTYSTN - {'Vehicle': '伊思坦纳-上海汽车', 'ProductID': 'VE-SQDTYSTN', 'BrandType': '上海汽车', 'Brand': 'D - 大通', 'Url': '/Images/Logo/datong.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-SQDTYSTN.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '伊思坦纳', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-SQDTYSTN.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/DaTong.png', 'Tires': '195/75R16;195/75R16C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 65, in \n", + " gbk_fp.write(ij.encode('gbk'))\n", + "UnicodeEncodeError: 'gbk' codec can't encode character '\\xa0' in position 60: illegal multibyte sequence\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "D - 东风小康 done\n", + "D - 东风富康 done\n", + "D - 东风风行 done\n", + "D - 东风俊风 done\n", + "F - 菲亚特 done\n", + ">> F - 菲亚特 - VE-FIAT05AA - {'Vehicle': '多宝-菲亚特进口', 'ProductID': 'VE-FIAT05AA', 'BrandType': '菲亚特进口', 'Brand': 'F - 菲亚特', 'Url': '/Images/Logo/feiyate.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FIAT05AA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '多宝', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FIAT05AA.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FeiYaTe.png', 'Tires': '175/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 7, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 菲亚特 - VE-FIATMULTIPLA - {'Vehicle': '多能-菲亚特进口', 'ProductID': 'VE-FIATMULTIPLA', 'BrandType': '菲亚特进口', 'Brand': 'F - 菲亚特', 'Url': '/Images/Logo/feiyate.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FIATMULTIPLA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '多能', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FIATMULTIPLA.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FeiYaTe.png', 'Tires': '185/65R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 菲亚特 - VE-FIATSTILO - {'Vehicle': '短剑-菲亚特进口', 'ProductID': 'VE-FIATSTILO', 'BrandType': '菲亚特进口', 'Brand': 'F - 菲亚特', 'Url': '/Images/Logo/feiyate.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FIATSTILO.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '短剑', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FIATSTILO.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FeiYaTe.png', 'Tires': '215/75R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "F - 丰田 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-JCRAV4YSJT - {'Vehicle': 'RAV4-一汽丰田', 'ProductID': 'VE-JCRAV4YSJT', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JCRAV4YSJT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'RAV4', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JCRAV4YSJT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '225/65R17;235/55R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 15, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-JCRONGFANGYSJT - {'Vehicle': 'RAV4荣放-一汽丰田', 'ProductID': 'VE-JCRONGFANGYSJT', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-JCRONGFANGYSJT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'RAV4荣放', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-JCRONGFANGYSJT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '225/65R17;235/55R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 14, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 62, in \n", + " for b in load_child_brands(vid, pailiang, nian):\n", + " File \"\", line 38, in load_child_brands\n", + " return json.loads(index_regex.findall(requests.get(url).text)[0])['SalesName']\n", + "IndexError: list index out of range\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYT07BD - {'Vehicle': '花冠-一汽丰田', 'ProductID': 'VE-TOYT07BD', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYT07BD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '花冠', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYT07BD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '195/60R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 13, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-FJTKLLYSJT - {'Vehicle': '卡罗拉-一汽丰田', 'ProductID': 'VE-FJTKLLYSJT', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FJTKLLYSJT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '卡罗拉', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FJTKLLYSJT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '195/65R15;205/55R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 12, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOSC07AF - {'Vehicle': '普拉多-一汽丰田', 'ProductID': 'VE-TOSC07AF', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOSC07AF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '普拉多', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOSC07AF.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '265/65R17;265/70R16;265/60R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 11, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-TOYT07BE - {'Vehicle': '锐志-一汽丰田', 'ProductID': 'VE-TOYT07BE', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYT07BE.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '锐志', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYT07BE.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '215/60R16;215/55R17;235/45R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 10, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYT07AL - {'Vehicle': '皇冠-一汽丰田', 'ProductID': 'VE-TOYT07AL', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYT07AL.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '皇冠', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYT07AL.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '215/60R16;215/55R17;235/50R17;225/50R17;235/45R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 9, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-LDKLZYSJT - {'Vehicle': '兰德酷路泽-一汽丰田', 'ProductID': 'VE-LDKLZYSJT', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LDKLZYSJT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '兰德酷路泽', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LDKLZYSJT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '285/65R17;285/60R18;275/65R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 8, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-FACC07AG - {'Vehicle': '陆地巡洋舰-一汽丰田', 'ProductID': 'VE-FACC07AG', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FACC07AG.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '陆地巡洋舰', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FACC07AG.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '275/65R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 7, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-FACC07AB - {'Vehicle': '普锐斯-一汽丰田', 'ProductID': 'VE-FACC07AB', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FACC07AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '普锐斯', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FACC07AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '195/60R15;195/65R15;195/55R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 6, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYT07AF - {'Vehicle': '威驰-一汽丰田', 'ProductID': 'VE-TOYT07AF', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYT07AF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '威驰', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYT07AF.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '175/65R14;185/60R15;155/80R13', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 5, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-LMF-VIOSFS - {'Vehicle': '威驰FS-一汽丰田', 'ProductID': 'VE-LMF-VIOSFS', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LMF-VIOSFS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '威驰FS', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LMF-VIOSFS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '185/60R15;175/65R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYOTR - {'Vehicle': '特锐-一汽丰田', 'ProductID': 'VE-TOYOTR', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYOTR.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '特锐', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYOTR.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '205/70R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 3, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-LVG-IZOA - {'Vehicle': '奕泽-一汽丰田', 'ProductID': 'VE-LVG-IZOA', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LVG-IZOA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '奕泽', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LVG-IZOA.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '215/60R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-LFM-AVALON - {'Vehicle': '亚洲龙-一汽丰田', 'ProductID': 'VE-LFM-AVALON', 'BrandType': '一汽丰田', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LFM-AVALON.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '亚洲龙', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LFM-AVALON.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '215/55R17;235/45R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 1, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYLFIOFBL - {'Vehicle': '86-丰田进口', 'ProductID': 'VE-TOYLFIOFBL', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYLFIOFBL.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '86', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYLFIOFBL.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '205/55R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 15, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-FJLZJTJK - {'Vehicle': 'FJ酷路泽-丰田进口', 'ProductID': 'VE-FJLZJTJK', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FJLZJTJK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'FJ酷路泽', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FJLZJTJK.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '265/70R17;265/75R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 14, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYO07AB - {'Vehicle': 'RAV4-丰田进口', 'ProductID': 'VE-TOYO07AB', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYO07AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'RAV4', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYO07AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '235/60R16;225/65R17;215/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 13, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-TOYO07AF - {'Vehicle': '海狮-丰田进口', 'ProductID': 'VE-TOYO07AF', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-TOYO07AF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '海狮', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-TOYO07AF.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': None, 'SpecialTireSize': '195R15C', 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 12, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYO06AB - {'Vehicle': '佳美-丰田进口', 'ProductID': 'VE-TOYO06AB', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYO06AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '佳美', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYO06AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '215/60R16;205/65R15;215/55R17;215/65R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 11, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-FJTSLDJTJK - {'Vehicle': '普拉多-丰田进口', 'ProductID': 'VE-FJTSLDJTJK', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FJTSLDJTJK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '普拉多', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FJTSLDJTJK.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '265/65R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 10, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYO07AD - {'Vehicle': '普瑞维亚(大霸王)-丰田进口', 'ProductID': 'VE-TOYO07AD', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-TOYO07AD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '普瑞维亚(大霸王)', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-TOYO07AD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '215/55R17;215/60R16;205/65R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 9, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-TOYLFIRXWS - {'Vehicle': '威飒-丰田进口', 'ProductID': 'VE-TOYLFIRXWS', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-TOYLFIRXWS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '威飒', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-TOYLFIRXWS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '245/55R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 8, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYLFIRAEF - {'Vehicle': '埃尔法-丰田进口', 'ProductID': 'VE-TOYLFIRAEF', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-TOYLFIRAEF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '埃尔法', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-TOYLFIRAEF.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '235/50R18;215/65R16;225/60R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 7, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-TOYLFIRJLC - {'Vehicle': '杰路驰-丰田进口', 'ProductID': 'VE-TOYLFIRJLC', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYLFIRJLC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '杰路驰', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYLFIRJLC.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '205/55R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 6, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYLFIRXBW - {'Vehicle': '小霸王-丰田进口', 'ProductID': 'VE-TOYLFIRXBW', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYLFIRXBW.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '小霸王', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYLFIRXBW.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '195/60R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-TOYOHLANDER - {'Vehicle': '汉兰达-丰田进口', 'ProductID': 'VE-TOYOHLANDER', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYOHLANDER.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '汉兰达', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYOHLANDER.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '245/55R19;225/70R16;245/65R17;245/60R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-TOYOLCRUSER - {'Vehicle': '兰德酷路泽-丰田进口', 'ProductID': 'VE-TOYOLCRUSER', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-TOYOLCRUSER.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '兰德酷路泽', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-TOYOLCRUSER.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '285/65R17;285/60R18;275/65R17;245/75R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n", + ">> F - 丰田 - VE-vellfire - {'Vehicle': '威尔法-丰田进口', 'ProductID': 'VE-vellfire', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-vellfire.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '威尔法', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-vellfire.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '225/60R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 丰田 - VE-5TD-Sienna - {'Vehicle': '塞纳-丰田进口', 'ProductID': 'VE-5TD-Sienna', 'BrandType': '丰田进口', 'Brand': 'F - 丰田', 'Url': '/Images/Logo/fengtian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-5TD-Sienna.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '塞纳', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-5TD-Sienna.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FengTian.png', 'Tires': '225/60R17;235/60R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "F - 福迪 done\n", + ">> F - 福迪 - VE-FUDI05AC - {'Vehicle': '探索者I-福迪汽车', 'ProductID': 'VE-FUDI05AC', 'BrandType': '福迪汽车', 'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUDI05AC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '探索者I', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUDI05AC.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuDi.png', 'Tires': '235/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 10, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福迪 - VE-FUDI06AC - {'Vehicle': '探索者Ⅱ-福迪汽车', 'ProductID': 'VE-FUDI06AC', 'BrandType': '福迪汽车', 'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUDI06AC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '探索者Ⅱ', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUDI06AC.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuDi.png', 'Tires': '235/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 9, 'VehicleSeries': None}\n", + ">> F - 福迪 - VE-FUDI07AH - {'Vehicle': '探索者Ⅲ-福迪汽车', 'ProductID': 'VE-FUDI07AH', 'BrandType': '福迪汽车', 'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUDI07AH.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '探索者Ⅲ', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUDI07AH.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuDi.png', 'Tires': '235/75R15;215/75R15;235/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 8, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福迪 - VE-FUDLFIRXCT - {'Vehicle': '探索者6-福迪汽车', 'ProductID': 'VE-FUDLFIRXCT', 'BrandType': '福迪汽车', 'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FUDLFIRXCT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '探索者6', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FUDLFIRXCT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuDi.png', 'Tires': '235/75R16;245/70R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 7, 'VehicleSeries': None}\n", + ">> F - 福迪 - VE-FUDLFIRXXS - {'Vehicle': '雄狮-福迪汽车', 'ProductID': 'VE-FUDLFIRXXS', 'BrandType': '福迪汽车', 'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUDLFIRXXS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '雄狮', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUDLFIRXXS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuDi.png', 'Tires': '215/75R15;235/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 6, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福迪 - VE-FUDLFIRXXF - {'Vehicle': '雄狮F16-福迪汽车', 'ProductID': 'VE-FUDLFIRXXF', 'BrandType': '福迪汽车', 'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUDLFIRXXF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '雄狮F16', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUDLFIRXXF.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuDi.png', 'Tires': '235/70R16;215/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n", + ">> F - 福迪 - VE-FUDIXSHIF22 - {'Vehicle': '雄狮F22-福迪汽车', 'ProductID': 'VE-FUDIXSHIF22', 'BrandType': '福迪汽车', 'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUDIXSHIF22.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '雄狮F22', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUDIXSHIF22.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuDi.png', 'Tires': '235/70R17;235/70R16;245/70R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福迪 - VE-FUDI07AD - {'Vehicle': '飞越-福迪汽车', 'ProductID': 'VE-FUDI07AD', 'BrandType': '福迪汽车', 'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUDI07AD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '飞越', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUDI07AD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuDi.png', 'Tires': '235/75R15;215/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n", + ">> F - 福迪 - VE-FUDLFIRXCR - {'Vehicle': '小超人-福迪汽车', 'ProductID': 'VE-FUDLFIRXCR', 'BrandType': '福迪汽车', 'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FUDLFIRXCR.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '小超人', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FUDLFIRXCR.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuDi.png', 'Tires': '235/70R16;215/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福迪 - VE-FUDILANFU - {'Vehicle': '揽福-福迪汽车', 'ProductID': 'VE-FUDILANFU', 'BrandType': '福迪汽车', 'Brand': 'F - 福迪', 'Url': '/Images/Logo/fudi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUDILANFU.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '揽福', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUDILANFU.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuDi.png', 'Tires': '245/70R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "F - 富奇 done\n", + ">> F - 富奇 - VE-FUQI06AB - {'Vehicle': '富奇-华翔汽车', 'ProductID': 'VE-FUQI06AB', 'BrandType': '华翔汽车', 'Brand': 'F - 富奇', 'Url': '/Images/Logo/fuqi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUQI06AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '富奇', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUQI06AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuQi.png', 'Tires': '275/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 富奇 - VE-FUQI07AF - {'Vehicle': '驭虎-华翔汽车', 'ProductID': 'VE-FUQI07AF', 'BrandType': '华翔汽车', 'Brand': 'F - 富奇', 'Url': '/Images/Logo/fuqi.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FUQI07AF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '驭虎', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FUQI07AF.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuQi.png', 'Tires': '275/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "F - 福田 done\n", + ">> F - 福田 - VE-FUTDFIYMMD - {'Vehicle': '迷迪-福田汽车', 'ProductID': 'VE-FUTDFIYMMD', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMMD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '迷迪', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMMD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '185/70R14;185/65R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 25, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTDFIYMSP - {'Vehicle': '萨普-福田汽车', 'ProductID': 'VE-FUTDFIYMSP', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FUTDFIYMSP.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '萨普', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FUTDFIYMSP.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '205/70R14;215/75R15;245/70R16;225/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 24, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTDFIYTLZ - {'Vehicle': '拓路者-福田汽车', 'ProductID': 'VE-FUTDFIYTLZ', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYTLZ.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '拓路者', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYTLZ.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '245/70R16;265/70R16;235/70R15;235/75R15;245/70R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 23, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-LVC-CQC - {'Vehicle': '传奇C-福田汽车', 'ProductID': 'VE-LVC-CQC', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LVC-CQC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '传奇C', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LVC-CQC.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '225/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 22, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTIANCHQI - {'Vehicle': '传奇X-福田汽车', 'ProductID': 'VE-FUTIANCHQI', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTIANCHQI.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '传奇X', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTIANCHQI.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '235/70R16;225/75R15;235/75R15;245/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 21, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTTYNUO - {'Vehicle': '图雅诺-福田汽车', 'ProductID': 'VE-FUTTYNUO', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTTYNUO.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '图雅诺', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTTYNUO.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '215/75R16;215/75R16C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 20, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FTSAWANA - {'Vehicle': '萨瓦纳-福田汽车', 'ProductID': 'VE-FTSAWANA', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FTSAWANA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '萨瓦纳', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FTSAWANA.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '265/65R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 19, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTIANQIETUV3 - {'Vehicle': '伽途V3-福田汽车', 'ProductID': 'VE-FUTIANQIETUV3', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUV3.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '伽途V3', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUV3.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '165/70R13C;165/70R13;175/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 18, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTIANQIETUV5 - {'Vehicle': '伽途V5-福田汽车', 'ProductID': 'VE-FUTIANQIETUV5', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUV5.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '伽途V5', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUV5.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '175/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 17, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTIANQIETUix5 - {'Vehicle': '伽途ix5-福田汽车', 'ProductID': 'VE-FUTIANQIETUix5', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUix5.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '伽途ix5', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUix5.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '185/70R14;195/60R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 16, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTIANQIETUix7 - {'Vehicle': '伽途ix7-福田汽车', 'ProductID': 'VE-FUTIANQIETUix7', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUix7.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '伽途ix7', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUix7.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '205/60R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 15, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTIANQIETUim6 - {'Vehicle': '伽途im6-福田汽车', 'ProductID': 'VE-FUTIANQIETUim6', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FUTIANQIETUim6.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '伽途im6', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FUTIANQIETUim6.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '195/65R15;195/60R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 14, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTIANQIETUim8 - {'Vehicle': '伽途im8-福田汽车', 'ProductID': 'VE-FUTIANQIETUim8', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUim8.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '伽途im8', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUim8.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '215/55R16;195/R15C;195/60R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 13, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTIANQIETUGT - {'Vehicle': '伽途GT-福田汽车', 'ProductID': 'VE-FUTIANQIETUGT', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUGT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '伽途GT', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTIANQIETUGT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '215/55R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 12, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTDFIYMPKE - {'Vehicle': '蒙派克E-福田汽车', 'ProductID': 'VE-FUTDFIYMPKE', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMPKE.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '蒙派克E', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMPKE.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '195/70R15;195/70R15C;205/70R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 11, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTDFIYMPK - {'Vehicle': '蒙派克-福田汽车', 'ProductID': 'VE-FUTDFIYMPK', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMPK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '蒙派克', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMPK.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '205/70R15;195/70R15;195/R15C;205/55R16;195/70R15C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 10, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTDFIYMPKS - {'Vehicle': '蒙派克S-福田汽车', 'ProductID': 'VE-FUTDFIYMPKS', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMPKS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '蒙派克S', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMPKS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '195/R15C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 9, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTDFIYMFJ - {'Vehicle': '风景-福田汽车', 'ProductID': 'VE-FUTDFIYMFJ', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMFJ.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '风景', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMFJ.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '185/R14C;195/70R15;195/R15C;225/75R15;185/R14LT;205/70R14', 'SpecialTireSize': '185 R14 C', 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 8, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTDFIYMFJCL - {'Vehicle': '风景·冲浪-福田汽车', 'ProductID': 'VE-FUTDFIYMFJCL', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMFJCL.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '风景·冲浪', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMFJCL.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '235/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 7, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTDFIYMFJAL - {'Vehicle': '风景·爱尔法-福田汽车', 'ProductID': 'VE-FUTDFIYMFJAL', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FUTDFIYMFJAL.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '风景·爱尔法', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FUTDFIYMFJAL.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '195/70R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 6, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTDFIYMFJHS - {'Vehicle': '风景·海狮-福田汽车', 'ProductID': 'VE-FUTDFIYMFJHS', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMFJHS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '风景·海狮', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMFJHS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '205/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTDFIYMFJG7 - {'Vehicle': '风景G7-福田汽车', 'ProductID': 'VE-FUTDFIYMFJG7', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMFJG7.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '风景G7', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FUTDFIYMFJG7.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '195/70R15;195/R15C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTDFIYMFJG8 - {'Vehicle': '风景G9-福田汽车', 'ProductID': 'VE-FUTDFIYMFJG8', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FUTDFIYMFJG8.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '风景G9', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FUTDFIYMFJG8.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '195/R15C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n", + ">> F - 福田 - VE-FUTDFIYMFJV3 - {'Vehicle': '风景V3-福田汽车', 'ProductID': 'VE-FUTDFIYMFJV3', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FUTDFIYMFJV3.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '风景V3', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FUTDFIYMFJV3.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '165/70R13;175/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福田 - VE-FUTDFIYMFJV5 - {'Vehicle': '风景V5-福田汽车', 'ProductID': 'VE-FUTDFIYMFJV5', 'BrandType': '福田汽车', 'Brand': 'F - 福田', 'Url': '/Images/Logo/futian.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FUTDFIYMFJV5.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '风景V5', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FUTDFIYMFJV5.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTian.png', 'Tires': '175/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "F - 法拉利 done\n", + ">> F - 法拉利 - VE-FERR06AC - {'Vehicle': '360-法拉利汽车', 'ProductID': 'VE-FERR06AC', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FERR06AC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '360', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FERR06AC.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '215/45R18;275/40R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 17, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 法拉利 - VE-FJLLF430 - {'Vehicle': 'F430-法拉利汽车', 'ProductID': 'VE-FJLLF430', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FJLLF430.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'F430', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FJLLF430.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '225/35R19;285/35R19;235/35R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 16, 'VehicleSeries': None}\n", + ">> F - 法拉利 - VE-FERR456M - {'Vehicle': '456M-法拉利汽车', 'ProductID': 'VE-FERR456M', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FERR456M.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '456M', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FERR456M.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '285/40R17;305/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 15, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 法拉利 - VE-458Italia - {'Vehicle': '458 Italia-法拉利汽车', 'ProductID': 'VE-458Italia', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-458Italia.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '458 Italia', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-458Italia.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '235/35R20;295/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 14, 'VehicleSeries': None}\n", + ">> F - 法拉利 - VE-458Special - {'Vehicle': '458 Speciale-法拉利汽车', 'ProductID': 'VE-458Special', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-458Special.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '458 Speciale', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-458Special.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '245/35R20;305/30R20;235/35R20;295/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 13, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 法拉利 - VE-FERR488GTB - {'Vehicle': '488-法拉利汽车', 'ProductID': 'VE-FERR488GTB', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FERR488GTB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '488', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FERR488GTB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '245/35R20;305/30R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 12, 'VehicleSeries': None}\n", + ">> F - 法拉利 - VE-FERR06AD - {'Vehicle': '575-法拉利汽车', 'ProductID': 'VE-FERR06AD', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FERR06AD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '575', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FERR06AD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '245/40R19;305/35R20;295/35R18;255/40R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 11, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 法拉利 - VE-FJLL599 - {'Vehicle': '599-法拉利汽车', 'ProductID': 'VE-FJLL599', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FJLL599.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '599', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FJLL599.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '245/40R19;305/35R19;305/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 10, 'VehicleSeries': None}\n", + ">> F - 法拉利 - VE-FJLL612 - {'Vehicle': '612-法拉利汽车', 'ProductID': 'VE-FJLL612', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FJLL612.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '612', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FJLL612.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '245/45R18;245/40R19;285/40R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 9, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 法拉利 - VE-California - {'Vehicle': 'California-法拉利汽车', 'ProductID': 'VE-California', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-California.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'California', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-California.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '245/40R19;285/40R19;245/35R20;285/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 8, 'VehicleSeries': None}\n", + ">> F - 法拉利 - VE-FERLFIOFFF - {'Vehicle': 'FF-法拉利汽车', 'ProductID': 'VE-FERLFIOFFF', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FERLFIOFFF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'FF', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FERLFIOFFF.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '245/35R20;295/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 7, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 法拉利 - VE-FERLFIOFBL - {'Vehicle': 'F12 Berlinetta-法拉利汽车', 'ProductID': 'VE-FERLFIOFBL', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FERLFIOFBL.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'F12 Berlinetta', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FERLFIOFBL.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '255/35R20;315/35R20;275/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 6, 'VehicleSeries': None}\n", + ">> F - 法拉利 - VE-LaFerrari - {'Vehicle': 'LaFerrari-法拉利汽车', 'ProductID': 'VE-LaFerrari', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LaFerrari.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'LaFerrari', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LaFerrari.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '265/30R19;345/30R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 法拉利 - VE-GTC4Lusso - {'Vehicle': 'GTC4Lusso-法拉利汽车', 'ProductID': 'VE-GTC4Lusso', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GTC4Lusso.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'GTC4Lusso', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GTC4Lusso.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '245/35R20;295/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n", + ">> F - 法拉利 - VE-Portofino - {'Vehicle': 'Portofino-法拉利汽车', 'ProductID': 'VE-Portofino', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-Portofino.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Portofino', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-Portofino.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '245/35R20;285/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 法拉利 - VE-FER-812 - {'Vehicle': '812 Superfast-法拉利汽车', 'ProductID': 'VE-FER-812', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FER-812.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '812 Superfast', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FER-812.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '275/35R20;315/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n", + ">> F - 法拉利 - VE-FERRF8 - {'Vehicle': 'F8-法拉利汽车', 'ProductID': 'VE-FERRF8', 'BrandType': '法拉利汽车', 'Brand': 'F - 法拉利', 'Url': '/Images/Logo/falali.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FERRF8.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'F8', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FERRF8.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FaLaLi.png', 'Tires': '245/35R20;305/30R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "F - 福特 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-FRDC07AYCLS - {'Vehicle': '经典福克斯-长安福特', 'ProductID': 'VE-FRDC07AYCLS', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FRDC07AYCLS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '经典福克斯', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FRDC07AYCLS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '195/65R15;205/55R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 13, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-FRDC07AY - {'Vehicle': '新福克斯-长安福特', 'ProductID': 'VE-FRDC07AY', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FRDC07AY.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '新福克斯', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FRDC07AY.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '195/65R15;205/55R16;205/60R16;215/50R17;235/40R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 12, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-CHFORDFURS - {'Vehicle': '福睿斯-长安福特', 'ProductID': 'VE-CHFORDFURS', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CHFORDFURS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '福睿斯', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CHFORDFURS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '195/65R15;205/55R16;205/50R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 11, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-FRDC07AD - {'Vehicle': '嘉年华-长安福特', 'ProductID': 'VE-FRDC07AD', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FRDC07AD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '嘉年华', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FRDC07AD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '185/55R15;195/50R16;175/65R14;185/60R14;165/70R13', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 10, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-CAFORDYIHU - {'Vehicle': '翼虎-长安福特', 'ProductID': 'VE-CAFORDYIHU', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CAFORDYIHU.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '翼虎', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CAFORDYIHU.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '235/50R18;235/45R19;235/55R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 9, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-FORDYB - {'Vehicle': '翼搏-长安福特', 'ProductID': 'VE-FORDYB', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FORDYB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '翼搏', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FORDYB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '205/60R16;195/65R15;205/50R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 8, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-CHANFORDZSHENG - {'Vehicle': '致胜-长安福特', 'ProductID': 'VE-CHANFORDZSHENG', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CHANFORDZSHENG.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '致胜', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CHANFORDZSHENG.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '215/55R16;225/50R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 7, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-FRDC07AP - {'Vehicle': '蒙迪欧-长安福特', 'ProductID': 'VE-FRDC07AP', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FRDC07AP.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '蒙迪欧', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FRDC07AP.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '205/55R16;215/60R16;235/50R17;235/45R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 6, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-FRDenergi - {'Vehicle': '蒙迪欧Energi-长安福特 ', 'ProductID': 'VE-FRDenergi', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FRDenergi.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '蒙迪欧Energi', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FRDenergi.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '235/50R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 5, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-LDSZSZAJT - {'Vehicle': '蒙迪欧致胜-长安福特', 'ProductID': 'VE-LDSZSZAJT', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LDSZSZAJT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '蒙迪欧致胜', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LDSZSZAJT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '225/50R17;235/45R17;215/55R16;215/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-FRDC07BD - {'Vehicle': '麦柯斯S—MAX-长安福特', 'ProductID': 'VE-FRDC07BD', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FRDC07BD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '麦柯斯S—MAX', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FRDC07BD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '215/60R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 3, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-CHANFOREdge - {'Vehicle': '锐界-长安福特', 'ProductID': 'VE-CHANFOREdge', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CHANFOREdge.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '锐界', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CHANFOREdge.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '245/60R18;245/55R19;245/50R20;265/40R21', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-CHFORGJNZ - {'Vehicle': '金牛座-长安福特', 'ProductID': 'VE-CHFORGJNZ', 'BrandType': '长安福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CHFORGJNZ.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '金牛座', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CHFORGJNZ.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '235/55R17;235/50R18;245/45R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 1, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-EdgeSJJTJK - {'Vehicle': '锐界-福特进口', 'ProductID': 'VE-EdgeSJJTJK', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-EdgeSJJTJK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '锐界', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-EdgeSJJTJK.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '245/60R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 11, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-FORD05AB - {'Vehicle': '稳达-福特进口', 'ProductID': 'VE-FORD05AB', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FORD05AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '稳达', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FORD05AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '215/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 10, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-FORD07AB - {'Vehicle': '翼虎-福特进口', 'ProductID': 'VE-FORD07AB', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FORD07AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '翼虎', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FORD07AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '215/70R16;235/70R16;235/50R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 9, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-FURDFIRXEE - {'Vehicle': 'E350-福特进口', 'ProductID': 'VE-FURDFIRXEE', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FURDFIRXEE.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'E350', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FURDFIRXEE.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '275/45R20;285/50R20;295/30R22', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 8, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-FURDFIRFFF - {'Vehicle': 'F—150-福特进口', 'ProductID': 'VE-FURDFIRFFF', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FURDFIRFFF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'F—150', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FURDFIRFFF.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '315/70R17;275/45R22;275/55R20;265/70R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 7, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-FURDFIRFCS - {'Vehicle': '福克斯ST-福特进口', 'ProductID': 'VE-FURDFIRFCS', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FURDFIRFCS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '福克斯ST', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FURDFIRFCS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '235/40R18;235/35R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 6, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-FURDFIYMST - {'Vehicle': '嘉年华ST-福特进口', 'ProductID': 'VE-FURDFIYMST', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FURDFIYMST.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '嘉年华ST', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FURDFIYMST.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '205/40R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 5, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-FURDFIYMGT - {'Vehicle': '野马-福特进口', 'ProductID': 'VE-FURDFIYMGT', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FURDFIYMGT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '野马', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FURDFIYMGT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '255/40R19;275/40R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-FURDFIYTXZ - {'Vehicle': '探险者-福特进口', 'ProductID': 'VE-FURDFIYTXZ', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FURDFIYTXZ.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '探险者', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FURDFIYTXZ.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '245/60R18;255/50R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 3, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-FORDEXPDIT - {'Vehicle': '征服者-福特进口', 'ProductID': 'VE-FORDEXPDIT', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-FORDEXPDIT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '征服者', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-FORDEXPDIT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '255/70R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-FORD-RANGER - {'Vehicle': 'Ranger-福特进口', 'ProductID': 'VE-FORD-RANGER', 'BrandType': '福特进口', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FORD-RANGER.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Ranger', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FORD-RANGER.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '265/60R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 1, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-LJX-2017QUANSHUN - {'Vehicle': '全顺-江铃福特', 'ProductID': 'VE-LJX-2017QUANSHUN', 'BrandType': '江铃福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LJX-2017QUANSHUN.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '全顺', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LJX-2017QUANSHUN.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '215/65R16;215/65R16C;215/75R16LT;215/70R15;225/70R15', 'SpecialTireSize': '185R15LT', 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 6, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-JFORDQSHCLS - {'Vehicle': '经典全顺-江铃福特', 'ProductID': 'VE-JFORDQSHCLS', 'BrandType': '江铃福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JFORDQSHCLS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '经典全顺', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JFORDQSHCLS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '215/70R15C;225/70R15C;215/70R16;215/75R16C;225/70R15;185/R15LT;215/70R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-JFORDQSHNEW - {'Vehicle': '新世代全顺-江铃福特', 'ProductID': 'VE-JFORDQSHNEW', 'BrandType': '江铃福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JFORDQSHNEW.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '新世代全顺', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JFORDQSHNEW.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '185/75R16;215/70R15;215/75R16LT;215/70R16;205/75R16C;185/75R16C;215/70R15C;215/75R16C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-JFORDTitanium - {'Vehicle': '撼路者-江铃福特', 'ProductID': 'VE-JFORDTitanium', 'BrandType': '江铃福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JFORDTitanium.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '撼路者', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JFORDTitanium.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '265/65R17;265/60R18;265/50R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n", + ">> F - 福特 - VE-JFORDTURUIOU - {'Vehicle': '途睿欧-江铃福特', 'ProductID': 'VE-JFORDTURUIOU', 'BrandType': '江铃福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JFORDTURUIOU.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '途睿欧', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JFORDTURUIOU.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '215/65R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> F - 福特 - VE-LJX-LINJIE - {'Vehicle': '领界-江铃福特', 'ProductID': 'VE-LJX-LINJIE', 'BrandType': '江铃福特', 'Brand': 'F - 福特', 'Url': '/Images/Logo/fute.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LJX-LINJIE.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '领界', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LJX-LINJIE.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/FuTe.png', 'Tires': '215/65R16;235/55R17;235/50R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "G - 观致 done\n", + ">> G - 观致 - VE-GZHIGZHI3SUV - {'Vehicle': '都市SUV-观致汽车', 'ProductID': 'VE-GZHIGZHI3SUV', 'BrandType': '观致汽车', 'Brand': 'G - 观致', 'Url': '/Images/Logo/guanzhi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GZHIGZHI3SUV.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '都市SUV', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GZHIGZHI3SUV.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuanZhi.png', 'Tires': '215/60R17;215/55R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> G - 观致 - VE-GZHIGZHI5SUV - {'Vehicle': '观致5-观致汽车', 'ProductID': 'VE-GZHIGZHI5SUV', 'BrandType': '观致汽车', 'Brand': 'G - 观致', 'Url': '/Images/Logo/guanzhi.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-GZHIGZHI5SUV.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '观致5', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-GZHIGZHI5SUV.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuanZhi.png', 'Tires': '225/65R17;235/55R18;235/50R19;215/60R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n", + ">> G - 观致 - VE-LLN-3SANXIANG - {'Vehicle': '观致3 三厢-观致汽车', 'ProductID': 'VE-LLN-3SANXIANG', 'BrandType': '观致汽车', 'Brand': 'G - 观致', 'Url': '/Images/Logo/guanzhi.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LLN-3SANXIANG.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '观致3 三厢', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LLN-3SANXIANG.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuanZhi.png', 'Tires': '205/60R16;215/50R17;225/45R18;225/60R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> G - 观致 - VE-LLN-3LIANGXIANG - {'Vehicle': '观致3 两厢-观致汽车', 'ProductID': 'VE-LLN-3LIANGXIANG', 'BrandType': '观致汽车', 'Brand': 'G - 观致', 'Url': '/Images/Logo/guanzhi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LLN-3LIANGXIANG.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '观致3 两厢', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LLN-3LIANGXIANG.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuanZhi.png', 'Tires': '205/60R16;215/50R17;225/45R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n", + ">> G - 观致 - VE-LLN-3GT - {'Vehicle': '观致3 GT-观致汽车', 'ProductID': 'VE-LLN-3GT', 'BrandType': '观致汽车', 'Brand': 'G - 观致', 'Url': '/Images/Logo/guanzhi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LLN-3GT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '观致3 GT', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LLN-3GT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuanZhi.png', 'Tires': '215/55R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "G - GMC done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> G - GMC - VE-GMCSAVANA - {'Vehicle': '赛威-通用汽车', 'ProductID': 'VE-GMCSAVANA', 'BrandType': '通用汽车', 'Brand': 'G - GMC', 'Url': '/Images/Logo/gmc.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-GMCSAVANA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '赛威', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-GMCSAVANA.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GMC.png', 'Tires': '265/50R20;275/45R20;295/45R20;265/60R18;245/75R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n", + ">> G - GMC - VE-GMCSIERRA - {'Vehicle': '西拉-通用汽车', 'ProductID': 'VE-GMCSIERRA', 'BrandType': '通用汽车', 'Brand': 'G - GMC', 'Url': '/Images/Logo/gmc.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-GMCSIERRA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '西拉', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-GMCSIERRA.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GMC.png', 'Tires': '245/75R16;265/60R20;275/55R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> G - GMC - VE-GMCYUKON - {'Vehicle': 'YUKON-通用汽车', 'ProductID': 'VE-GMCYUKON', 'BrandType': '通用汽车', 'Brand': 'G - GMC', 'Url': '/Images/Logo/gmc.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GMCYUKON.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'YUKON', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GMCYUKON.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GMC.png', 'Tires': '275/60R18;275/60R20;245/75R16;285/45R22', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "G - 光冈 done\n", + ">> G - 光冈 - VE-GGANGGC - {'Vehicle': '嘉路-光冈汽车', 'ProductID': 'VE-GGANGGC', 'BrandType': '光冈汽车', 'Brand': 'G - 光冈', 'Url': '/Images/Logo/guanggang.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GGANGGC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '嘉路', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GGANGGC.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuangGang.png', 'Tires': '235/50R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> G - 光冈 - VE-GGANGORO - {'Vehicle': '大蛇-光冈汽车', 'ProductID': 'VE-GGANGORO', 'BrandType': '光冈汽车', 'Brand': 'G - 光冈', 'Url': '/Images/Logo/guanggang.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GGANGORO.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '大蛇', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GGANGORO.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuangGang.png', 'Tires': '245/45R18;285/40R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "G - 国金 done\n", + ">> G - 国金 - VE-LKJ-GM3 - {'Vehicle': '国金GM3-陕汽通家', 'ProductID': 'VE-LKJ-GM3', 'BrandType': '陕汽通家', 'Brand': 'G - 国金', 'Url': '/Images/Logo/guojin.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LKJ-GM3.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '国金GM3', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LKJ-GM3.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuoJin.png', 'Tires': '215/60R16;215/55R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "G - 广汽新能源 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> G - 广汽新能源 - VE-LDNPHEV - {'Vehicle': '祺智-广汽三菱', 'ProductID': 'VE-LDNPHEV', 'BrandType': '广汽三菱', 'Brand': 'G - 广汽新能源', 'Url': '/Images/Logo/guangqixinnengyuan.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LDNPHEV.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '祺智', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LDNPHEV.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuangQiXinNengYuan.png', 'Tires': '215/55R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 4, 'Priority3': 1, 'VehicleSeries': None}\n", + ">> G - 广汽新能源 - VE-LVG-ix4 - {'Vehicle': '广汽ix4-广汽丰田', 'ProductID': 'VE-LVG-ix4', 'BrandType': '广汽丰田', 'Brand': 'G - 广汽新能源', 'Url': '/Images/Logo/guangqixinnengyuan.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LVG-ix4.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '广汽ix4', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LVG-ix4.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuangQiXinNengYuan.png', 'Tires': '215/60R17;215/55R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 1, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> G - 广汽新能源 - VE-LMG-EG3 - {'Vehicle': '传祺GE3-广汽乘用车', 'ProductID': 'VE-LMG-EG3', 'BrandType': '广汽乘用车', 'Brand': 'G - 广汽新能源', 'Url': '/Images/Logo/guangqixinnengyuan.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LMG-EG3.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '传祺GE3', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LMG-EG3.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuangQiXinNengYuan.png', 'Tires': '215/55R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 2, 'VehicleSeries': None}\n", + ">> G - 广汽新能源 - VE-LMG-AIONS - {'Vehicle': 'AION S-广汽乘用车', 'ProductID': 'VE-LMG-AIONS', 'BrandType': '广汽乘用车', 'Brand': 'G - 广汽新能源', 'Url': '/Images/Logo/guangqixinnengyuan.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LMG-AIONS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'AION S', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LMG-AIONS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuangQiXinNengYuan.png', 'Tires': '215/55R17;235/45R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 1, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> G - 广汽新能源 - VE-LHG-SR - {'Vehicle': '世锐-广汽本田', 'ProductID': 'VE-LHG-SR', 'BrandType': '广汽本田', 'Brand': 'G - 广汽新能源', 'Url': '/Images/Logo/guangqixinnengyuan.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LHG-SR.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '世锐', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LHG-SR.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/GuangQiXinNengYuan.png', 'Tires': '215/55R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "H - 哈飞 done\n", + ">> H - 哈飞 - VE-HAFE07BC - {'Vehicle': '路宝-哈飞汽车', 'ProductID': 'VE-HAFE07BC', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HAFE07BC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '路宝', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HAFE07BC.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '165/65R13;155/65R13;165/70R13;165/65R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 11, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 哈飞 - VE-HJJLZXBW - {'Vehicle': '路尊小霸王-哈飞汽车', 'ProductID': 'VE-HJJLZXBW', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-HJJLZXBW.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '路尊小霸王', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-HJJLZXBW.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '175/65R14;165/70R13', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 10, 'VehicleSeries': None}\n", + ">> H - 哈飞 - VE-HJJLZDBW - {'Vehicle': '路尊大霸王-哈飞汽车', 'ProductID': 'VE-HJJLZDBW', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-HJJLZDBW.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '路尊大霸王', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-HJJLZDBW.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '195/65R15;185/80R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 9, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 哈飞 - VE-HAFE99AA - {'Vehicle': '百利-哈飞汽车', 'ProductID': 'VE-HAFE99AA', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HAFE99AA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '百利', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HAFE99AA.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '155/R12C;135/R12', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 8, 'VehicleSeries': None}\n", + ">> H - 哈飞 - VE-HAFE06BJ - {'Vehicle': '中意-哈飞汽车', 'ProductID': 'VE-HAFE06BJ', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HAFE06BJ.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '中意', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HAFE06BJ.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '165/70R13', 'SpecialTireSize': '165R13LT', 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 7, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 哈飞 - VE-HAFE07BD - {'Vehicle': '民意-哈飞汽车', 'ProductID': 'VE-HAFE07BD', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-HAFE07BD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '民意', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-HAFE07BD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '165/70R13', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 6, 'VehicleSeries': None}\n", + ">> H - 哈飞 - VE-HAFE07AS - {'Vehicle': '赛豹-哈飞汽车', 'ProductID': 'VE-HAFE07AS', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HAFE07AS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '赛豹', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HAFE07AS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '195/55R15;185/65R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 哈飞 - VE-HAFE06BJV5 - {'Vehicle': '中意V5-哈飞汽车', 'ProductID': 'VE-HAFE06BJV5', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-HAFE06BJV5.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '中意V5', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-HAFE06BJV5.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '165/R13LT', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n", + ">> H - 哈飞 - VE-HAFE07AK - {'Vehicle': '赛马-哈飞汽车', 'ProductID': 'VE-HAFE07AK', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-HAFE07AK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '赛马', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-HAFE07AK.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '185/65R14;195/55R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 哈飞 - VE-HAFEJUNYI - {'Vehicle': '骏意-哈飞汽车', 'ProductID': 'VE-HAFEJUNYI', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-HAFEJUNYI.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '骏意', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-HAFEJUNYI.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '165/R13LT', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n", + ">> H - 哈飞 - VE-HAFESHJIANG - {'Vehicle': '松花江-哈飞汽车', 'ProductID': 'VE-HAFESHJIANG', 'BrandType': '哈飞汽车', 'Brand': 'H - 哈飞', 'Url': '/Images/Logo/hafei.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HAFESHJIANG.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '松花江', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HAFESHJIANG.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaFei.png', 'Tires': '165/70R13;155/R12C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "H - 华普 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "H - 华泰 done\n", + ">> H - 华泰 - VE-LRH-SDFDY - {'Vehicle': '圣达菲2-华泰汽车', 'ProductID': 'VE-LRH-SDFDY', 'BrandType': '华泰汽车', 'Brand': 'H - 华泰', 'Url': '/Images/Logo/huatai.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LRH-SDFDY.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '圣达菲2', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LRH-SDFDY.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HuaTai.png', 'Tires': '185/65R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "H - 黄海 done\n", + ">> H - 黄海 - VE-SHUG06AD - {'Vehicle': '傲龙-曙光汽车', 'ProductID': 'VE-SHUG06AD', 'BrandType': '曙光汽车', 'Brand': 'H - 黄海', 'Url': '/Images/Logo/huanghai.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-SHUG06AD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '傲龙', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-SHUG06AD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HuangHai.png', 'Tires': '235/65R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 10, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 黄海 - VE-HUANGHAIAOJUN - {'Vehicle': '傲骏-曙光汽车', 'ProductID': 'VE-HUANGHAIAOJUN', 'BrandType': '曙光汽车', 'Brand': 'H - 黄海', 'Url': '/Images/Logo/huanghai.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HUANGHAIAOJUN.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '傲骏', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HUANGHAIAOJUN.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HuangHai.png', 'Tires': '215/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n", + ">> H - 黄海 - VE-SHUG07AK - {'Vehicle': '傲羚-曙光汽车', 'ProductID': 'VE-SHUG07AK', 'BrandType': '曙光汽车', 'Brand': 'H - 黄海', 'Url': '/Images/Logo/huanghai.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-SHUG07AK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '傲羚', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-SHUG07AK.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HuangHai.png', 'Tires': '215/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 62, in \n", + " for b in load_child_brands(vid, pailiang, nian):\n", + " File \"\", line 38, in load_child_brands\n", + " return json.loads(index_regex.findall(requests.get(url).text)[0])['SalesName']\n", + "IndexError: list index out of range\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 黄海 - VE-HUANGHAIXCS - {'Vehicle': '小柴神-曙光汽车', 'ProductID': 'VE-HUANGHAIXCS', 'BrandType': '曙光汽车', 'Brand': 'H - 黄海', 'Url': '/Images/Logo/huanghai.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HUANGHAIXCS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '小柴神', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HUANGHAIXCS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HuangHai.png', 'Tires': '215/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n", + ">> H - 黄海 - VE-SHUG07AM - {'Vehicle': '大柴神-曙光汽车', 'ProductID': 'VE-SHUG07AM', 'BrandType': '曙光汽车', 'Brand': 'H - 黄海', 'Url': '/Images/Logo/huanghai.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-SHUG07AM.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '大柴神', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-SHUG07AM.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HuangHai.png', 'Tires': '235/65R17;215/75R15;225/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 黄海 - VE-LDD-RUNTU - {'Vehicle': '瑞途-曙光汽车', 'ProductID': 'VE-LDD-RUNTU', 'BrandType': '曙光汽车', 'Brand': 'H - 黄海', 'Url': '/Images/Logo/huanghai.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LDD-RUNTU.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '瑞途', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LDD-RUNTU.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HuangHai.png', 'Tires': '245/75R16;195/65R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "H - 红旗 done\n", + ">> H - 红旗 - VE-HONGQL5 - {'Vehicle': 'L5-一汽轿车', 'ProductID': 'VE-HONGQL5', 'BrandType': '一汽轿车', 'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HONGQL5.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'L5', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HONGQL5.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HongQi.png', 'Tires': '275/40R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 11, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 红旗 - VE-HONG07AH - {'Vehicle': 'HQ3-一汽轿车', 'ProductID': 'VE-HONG07AH', 'BrandType': '一汽轿车', 'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HONG07AH.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'HQ3', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HONG07AH.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HongQi.png', 'Tires': '225/60R16;215/55R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 10, 'VehicleSeries': None}\n", + ">> H - 红旗 - VE-HONG0H5 - {'Vehicle': 'H5-一汽轿车', 'ProductID': 'VE-HONG0H5', 'BrandType': '一汽轿车', 'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HONG0H5.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'H5', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HONG0H5.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HongQi.png', 'Tires': '215/55R17;225/45R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 9, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 红旗 - VE-HONG0H7 - {'Vehicle': 'H7-一汽轿车', 'ProductID': 'VE-HONG0H7', 'BrandType': '一汽轿车', 'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-HONG0H7.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'H7', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-HONG0H7.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HongQi.png', 'Tires': '225/55R17;235/45R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 8, 'VehicleSeries': None}\n", + ">> H - 红旗 - VE-HONG99AT - {'Vehicle': '红旗-一汽轿车', 'ProductID': 'VE-HONG99AT', 'BrandType': '一汽轿车', 'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HONG99AT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '红旗', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HONG99AT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HongQi.png', 'Tires': '205/60R15;185/80R14;185/R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 7, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 红旗 - VE-HONG07AG - {'Vehicle': '明仕-一汽轿车', 'ProductID': 'VE-HONG07AG', 'BrandType': '一汽轿车', 'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HONG07AG.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '明仕', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HONG07AG.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HongQi.png', 'Tires': '205/60R15;185/80R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 6, 'VehicleSeries': None}\n", + ">> H - 红旗 - VE-HONG99AB - {'Vehicle': '旗舰-一汽轿车', 'ProductID': 'VE-HONG99AB', 'BrandType': '一汽轿车', 'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HONG99AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '旗舰', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HONG99AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HongQi.png', 'Tires': '225/60R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 红旗 - VE-HONG07AJ - {'Vehicle': '世纪星-一汽轿车', 'ProductID': 'VE-HONG07AJ', 'BrandType': '一汽轿车', 'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HONG07AJ.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '世纪星', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HONG07AJ.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HongQi.png', 'Tires': '205/60R15;185/80R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n", + ">> H - 红旗 - VE-HONGQSSHI - {'Vehicle': '盛世-一汽轿车', 'ProductID': 'VE-HONGQSSHI', 'BrandType': '一汽轿车', 'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HONGQSSHI.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '盛世', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HONGQSSHI.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HongQi.png', 'Tires': '215/55R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 红旗 - VE-HONG07AJZYZ - {'Vehicle': '卓越者-一汽轿车', 'ProductID': 'VE-HONG07AJZYZ', 'BrandType': '一汽轿车', 'Brand': 'H - 红旗', 'Url': '/Images/Logo/hongqi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HONG07AJZYZ.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '卓越者', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HONG07AJZYZ.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HongQi.png', 'Tires': '205/60R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/models.py\", line 897, in json\n", + " return complexjson.loads(self.text, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/__init__.py\", line 518, in loads\n", + " return _default_decoder.decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 370, in decode\n", + " obj, end = self.raw_decode(s)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode\n", + " return self.scan_once(s, idx=_w(s, idx).end())\n", + "simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "H - 汇众 done\n", + "H - 海格 done\n", + ">> H - 海格 - VE-HAIGEH4E - {'Vehicle': 'H4E-苏州金龙', 'ProductID': 'VE-HAIGEH4E', 'BrandType': '苏州金龙', 'Brand': 'H - 海格', 'Url': '/Images/Logo/haige.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HAIGEH4E.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'H4E', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HAIGEH4E.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaiGe.png', 'Tires': None, 'SpecialTireSize': '175R14LT', 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 9, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> H - 海格 - VE-HAIGEH7V - {'Vehicle': 'H7V-苏州金龙', 'ProductID': 'VE-HAIGEH7V', 'BrandType': '苏州金龙', 'Brand': 'H - 海格', 'Url': '/Images/Logo/haige.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-HAIGEH7V.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'H7V', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-HAIGEH7V.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/HaiGe.png', 'Tires': None, 'SpecialTireSize': '6.50R16', 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "H - 黑豹 done\n", + "H - 恒天 done\n", + "H - 华北 done\n", + "H - 幻速 done\n", + "H - 华颂 done\n", + "H - 汉腾汽车 done\n", + "H - 华骐 done\n", + "H - 红星汽车 done\n", + "H - 海马 done\n", + "H - 哈弗 done\n", + "J - 吉奥 done\n", + ">> J - 吉奥 - VE-GONO07AR - {'Vehicle': 'GS50-广汽吉奥', 'ProductID': 'VE-GONO07AR', 'BrandType': '广汽吉奥', 'Brand': 'J - 吉奥', 'Url': '/Images/Logo/jiao.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-GONO07AR.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'GS50', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-GONO07AR.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JiAo.png', 'Tires': '215/75R15;235/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 22, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> J - 吉奥 - VE-GONO05AJ - {'Vehicle': '帅驰-广汽吉奥', 'ProductID': 'VE-GONO05AJ', 'BrandType': '广汽吉奥', 'Brand': 'J - 吉奥', 'Url': '/Images/Logo/jiao.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GONO05AJ.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '帅驰', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GONO05AJ.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JiAo.png', 'Tires': '215/75R15;235/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 17, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> J - 吉奥 - VE-GONO07AC - {'Vehicle': '伊美-广汽吉奥', 'ProductID': 'VE-GONO07AC', 'BrandType': '广汽吉奥', 'Brand': 'J - 吉奥', 'Url': '/Images/Logo/jiao.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GONO07AC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '伊美', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GONO07AC.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JiAo.png', 'Tires': '165/70R14;195/65R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 14, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> J - 吉奥 - VE-GQJAXWL - {'Vehicle': '星旺L-广汽吉奥', 'ProductID': 'VE-GQJAXWL', 'BrandType': '广汽吉奥', 'Brand': 'J - 吉奥', 'Url': '/Images/Logo/jiao.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GQJAXWL.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '星旺L', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GQJAXWL.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JiAo.png', 'Tires': '165/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> J - 吉奥 - VE-GQJAXWM1 - {'Vehicle': '星旺M1-广汽吉奥', 'ProductID': 'VE-GQJAXWM1', 'BrandType': '广汽吉奥', 'Brand': 'J - 吉奥', 'Url': '/Images/Logo/jiao.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GQJAXWM1.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '星旺M1', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GQJAXWM1.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JiAo.png', 'Tires': '165/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> J - 吉奥 - VE-GQJAXWM2 - {'Vehicle': '星旺M2-广汽吉奥', 'ProductID': 'VE-GQJAXWM2', 'BrandType': '广汽吉奥', 'Brand': 'J - 吉奥', 'Url': '/Images/Logo/jiao.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-GQJAXWM2.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '星旺M2', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-GQJAXWM2.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JiAo.png', 'Tires': '165/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "J - 吉普 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> J - 吉普 - VE-JEEPLiberty - {'Vehicle': '自由人-吉普进口', 'ProductID': 'VE-JEEPLiberty', 'BrandType': '吉普进口', 'Brand': 'J - 吉普', 'Url': '/Images/Logo/jipu.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JEEPLiberty.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '自由人', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JEEPLiberty.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JiPu.png', 'Tires': '235/70R16;235/65R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J - 江南 done\n", + ">> J - 江南 - VE-JNQC07AD - {'Vehicle': '传奇-江南汽车', 'ProductID': 'VE-JNQC07AD', 'BrandType': '江南汽车', 'Brand': 'J - 江南', 'Url': '/Images/Logo/jiangnan.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JNQC07AD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '传奇', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JNQC07AD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JiangNan.png', 'Tires': '165/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/connectionpool.py\", line 603, in urlopen\n", + " chunked=chunked)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/connectionpool.py\", line 344, in _make_request\n", + " self._validate_conn(conn)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/connectionpool.py\", line 843, in _validate_conn\n", + " conn.connect()\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/connection.py\", line 370, in connect\n", + " ssl_context=context)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/util/ssl_.py\", line 355, in ssl_wrap_socket\n", + " return context.wrap_socket(sock, server_hostname=server_hostname)\n", + " File \"/Users/laisky/.pyenv/versions/3.7.4/lib/python3.7/ssl.py\", line 423, in wrap_socket\n", + " session=session\n", + " File \"/Users/laisky/.pyenv/versions/3.7.4/lib/python3.7/ssl.py\", line 870, in _create\n", + " self.do_handshake()\n", + " File \"/Users/laisky/.pyenv/versions/3.7.4/lib/python3.7/ssl.py\", line 1139, in do_handshake\n", + " self._sslobj.do_handshake()\n", + "TimeoutError: [Errno 60] Operation timed out\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/adapters.py\", line 449, in send\n", + " timeout=timeout\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/connectionpool.py\", line 641, in urlopen\n", + " _stacktrace=sys.exc_info()[2])\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/util/retry.py\", line 368, in increment\n", + " raise six.reraise(type(error), error, _stacktrace)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/packages/six.py\", line 685, in reraise\n", + " raise value.with_traceback(tb)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/connectionpool.py\", line 603, in urlopen\n", + " chunked=chunked)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/connectionpool.py\", line 344, in _make_request\n", + " self._validate_conn(conn)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/connectionpool.py\", line 843, in _validate_conn\n", + " conn.connect()\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/connection.py\", line 370, in connect\n", + " ssl_context=context)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/urllib3/util/ssl_.py\", line 355, in ssl_wrap_socket\n", + " return context.wrap_socket(sock, server_hostname=server_hostname)\n", + " File \"/Users/laisky/.pyenv/versions/3.7.4/lib/python3.7/ssl.py\", line 423, in wrap_socket\n", + " session=session\n", + " File \"/Users/laisky/.pyenv/versions/3.7.4/lib/python3.7/ssl.py\", line 870, in _create\n", + " self.do_handshake()\n", + " File \"/Users/laisky/.pyenv/versions/3.7.4/lib/python3.7/ssl.py\", line 1139, in do_handshake\n", + " self._sslobj.do_handshake()\n", + "urllib3.exceptions.ProtocolError: ('Connection aborted.', TimeoutError(60, 'Operation timed out'))\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"\", line 62, in \n", + " for b in load_child_brands(vid, pailiang, nian):\n", + " File \"\", line 38, in load_child_brands\n", + " return json.loads(index_regex.findall(requests.get(url).text)[0])['SalesName']\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/api.py\", line 75, in get\n", + " return request('get', url, params=params, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/api.py\", line 60, in request\n", + " return session.request(method=method, url=url, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/sessions.py\", line 533, in request\n", + " resp = self.send(prep, **send_kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/sessions.py\", line 646, in send\n", + " r = adapter.send(request, **kwargs)\n", + " File \"/Users/laisky/.virtualenvs/37/lib/python3.7/site-packages/requests/adapters.py\", line 498, in send\n", + " raise ConnectionError(err, request=request)\n", + "requests.exceptions.ConnectionError: ('Connection aborted.', TimeoutError(60, 'Operation timed out'))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J - 江苏南亚 done\n", + ">> J - 江苏南亚 - VE-NANY04AD - {'Vehicle': '英格尔-江苏南亚', 'ProductID': 'VE-NANY04AD', 'BrandType': '江苏南亚', 'Brand': 'J - 江苏南亚', 'Url': '/Images/Logo/jiangsunanya.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-NANY04AD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '英格尔', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-NANY04AD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JiangSuNanYa.png', 'Tires': '175/70R13', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "J - 捷豹 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J - 金程 done\n", + ">> J - 金程 - VE-JINC05AF - {'Vehicle': '海狮-金程汽车', 'ProductID': 'VE-JINC05AF', 'BrandType': '金程汽车', 'Brand': 'J - 金程', 'Url': '/Images/Logo/jincheng.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JINC05AF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '海狮', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JINC05AF.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JinCheng.png', 'Tires': '185/R14C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J - 江铃 done\n", + "J - 九龙 done\n", + ">> J - 九龙 - VE-JLONGTIANMA - {'Vehicle': '九龙天马-九龙汽车', 'ProductID': 'VE-JLONGTIANMA', 'BrandType': '九龙汽车', 'Brand': 'J - 九龙', 'Url': '/Images/Logo/jiulong.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JLONGTIANMA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '九龙天马', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JLONGTIANMA.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JiuLong.png', 'Tires': '195/75R16;195/70R15;215/70R16;205/75R16C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J - 解放 done\n", + "J - 金旅 done\n", + "J - 君马 done\n", + "J - 吉利 done\n", + "J - 几何汽车 done\n", + "J - 江淮 done\n", + "J - 金杯 done\n", + ">> J - 金杯 - VE-JINB07BR - {'Vehicle': '勤务兵-华晨金杯', 'ProductID': 'VE-JINB07BR', 'BrandType': '华晨金杯', 'Brand': 'J - 金杯', 'Url': '/Images/Logo/jinbei.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JINB07BR.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '勤务兵', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JINB07BR.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/JinBei.png', 'Tires': '185/R14C', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 11, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J - 江铃新能源 done\n", + "J - 捷途 done\n", + "K - 开瑞 done\n", + "K - 凯迪拉克 done\n", + ">> K - 凯迪拉克 - VE-CADI04AB - {'Vehicle': '赛威-凯迪拉克进口', 'ProductID': 'VE-CADI04AB', 'BrandType': '凯迪拉克进口', 'Brand': 'K - 凯迪拉克', 'Url': '/Images/Logo/kaidilake.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CADI04AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '赛威', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CADI04AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/KaiDiLaKe.png', 'Tires': '235/50R18;255/45R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K - 克莱斯勒 done\n", + ">> K - 克莱斯勒 - VE-CHRYSCFIRE - {'Vehicle': '交叉火力-克莱斯勒进口', 'ProductID': 'VE-CHRYSCFIRE', 'BrandType': '克莱斯勒进口', 'Brand': 'K - 克莱斯勒', 'Url': '/Images/Logo/kelaisile.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CHRYSCFIRE.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '交叉火力', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CHRYSCFIRE.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/KeLaiSiLe.png', 'Tires': '255/40R18;235/35R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> K - 克莱斯勒 - VE-CHRYSSEB - {'Vehicle': '赛百灵-克莱斯勒进口', 'ProductID': 'VE-CHRYSSEB', 'BrandType': '克莱斯勒进口', 'Brand': 'K - 克莱斯勒', 'Url': '/Images/Logo/kelaisile.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CHRYSSEB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '赛百灵', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CHRYSSEB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/KeLaiSiLe.png', 'Tires': '205/65R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "K - 卡尔森 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K - 科尼赛克 done\n", + ">> K - 科尼赛克 - VE-KEONAgera - {'Vehicle': 'Agera-科尼塞克', 'ProductID': 'VE-KEONAgera', 'BrandType': '科尼塞克', 'Brand': 'K - 科尼赛克', 'Url': '/Images/Logo/kenisaike.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-KEONAgera.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Agera', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-KEONAgera.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/KeNiSaiKe.png', 'Tires': '265/35R19;345/30R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> K - 科尼赛克 - VE-KEONCCXR - {'Vehicle': 'CCXR-科尼塞克', 'ProductID': 'VE-KEONCCXR', 'BrandType': '科尼塞克', 'Brand': 'K - 科尼赛克', 'Url': '/Images/Logo/kenisaike.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-KEONCCXR.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'CCXR', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-KEONCCXR.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/KeNiSaiKe.png', 'Tires': '255/35R19;335/30R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "K - 凯翼 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K - 卡威 done\n", + "L - 铃木 done\n", + "L - 路虎 done\n", + "L - 猎豹 done\n", + ">> L - 猎豹 - VE-CZJJLSK - {'Vehicle': '飞铃皮卡-长丰扬子', 'ProductID': 'VE-CZJJLSK', 'BrandType': '长丰扬子', 'Brand': 'L - 猎豹', 'Url': '/Images/Logo/liebao.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-CZJJLSK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '飞铃皮卡', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-CZJJLSK.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LieBao.png', 'Tires': '215/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 5, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 猎豹 - VE-CZJJYSK - {'Vehicle': '飞扬皮卡-长丰扬子', 'ProductID': 'VE-CZJJYSK', 'BrandType': '长丰扬子', 'Brand': 'L - 猎豹', 'Url': '/Images/Logo/liebao.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-CZJJYSK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '飞扬皮卡', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-CZJJYSK.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LieBao.png', 'Tires': 'P215/75R15;235/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 猎豹 - VE-LIEBAOFYSUV - {'Vehicle': '飞扬SUV-长丰扬子', 'ProductID': 'VE-LIEBAOFYSUV', 'BrandType': '长丰扬子', 'Brand': 'L - 猎豹', 'Url': '/Images/Logo/liebao.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LIEBAOFYSUV.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '飞扬SUV', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LIEBAOFYSUV.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LieBao.png', 'Tires': '215/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "L - 兰博基尼 done\n", + "L - 雷诺 done\n", + ">> L - 雷诺 - VE-RENTrafic - {'Vehicle': 'Trafic(塔菲克)-三江雷诺', 'ProductID': 'VE-RENTrafic', 'BrandType': '三江雷诺', 'Brand': 'L - 雷诺', 'Url': '/Images/Logo/leinuo.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-RENTrafic.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Trafic(塔菲克)', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-RENTrafic.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LeiNuo.png', 'Tires': '205/70R15;235/35R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 1, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 雷诺 - VE-VF1-VelSatis - {'Vehicle': 'Vel Satis(威赛帝)-雷诺进口', 'ProductID': 'VE-VF1-VelSatis', 'BrandType': '雷诺进口', 'Brand': 'L - 雷诺', 'Url': '/Images/Logo/leinuo.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-VF1-VelSatis.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Vel Satis(威赛帝)', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-VF1-VelSatis.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LeiNuo.png', 'Tires': '225/55R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "L - 路特斯 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 路特斯 - VE-LLJJSLJJK - {'Vehicle': 'Esprit -宝腾汽车', 'ProductID': 'VE-LLJJSLJJK', 'BrandType': '宝腾汽车', 'Brand': 'L - 路特斯', 'Url': '/Images/Logo/lutesi.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-LLJJSLJJK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Esprit ', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-LLJJSLJJK.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LuTeSi.png', 'Tires': '195/60R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 路特斯 - VE-LLJJYLJJK - {'Vehicle': 'Elite-宝腾汽车', 'ProductID': 'VE-LLJJYLJJK', 'BrandType': '宝腾汽车', 'Brand': 'L - 路特斯', 'Url': '/Images/Logo/lutesi.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-LLJJYLJJK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Elite', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-LLJJYLJJK.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LuTeSi.png', 'Tires': '195/60R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n", + "L - 莲花 done\n", + "L - 陆风 done\n", + "L - 罗孚 done\n", + ">> L - 罗孚 - VE-MG06AC - {'Vehicle': 'Rover75-罗孚进口', 'ProductID': 'VE-MG06AC', 'BrandType': '罗孚进口', 'Brand': 'L - 罗孚', 'Url': '/Images/Logo/luozuo.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-MG06AC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Rover75', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-MG06AC.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LuoZuo.png', 'Tires': '215/55R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 罗孚 - VE-MG06AA - {'Vehicle': 'TF-罗孚进口', 'ProductID': 'VE-MG06AA', 'BrandType': '罗孚进口', 'Brand': 'L - 罗孚', 'Url': '/Images/Logo/luozuo.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-MG06AA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'TF', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-MG06AA.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LuoZuo.png', 'Tires': '195/45R16;215/40R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "L - 劳伦士 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 劳伦士 - VE-LORINCLSclass - {'Vehicle': 'CLS级-劳伦士', 'ProductID': 'VE-LORINCLSclass', 'BrandType': '劳伦士', 'Brand': 'L - 劳伦士', 'Url': '/Images/Logo/laolunshi.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-LORINCLSclass.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'CLS级', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-LORINCLSclass.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LaoLunShi.png', 'Tires': '245/40R18;275/35R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 劳伦士 - VE-LORINMLclass - {'Vehicle': 'ML级-劳伦士', 'ProductID': 'VE-LORINMLclass', 'BrandType': '劳伦士', 'Brand': 'L - 劳伦士', 'Url': '/Images/Logo/laolunshi.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-LORINMLclass.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'ML级', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-LORINMLclass.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LaoLunShi.png', 'Tires': '295/40R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 劳伦士 - VE-LORINSclass - {'Vehicle': 'S级-劳伦士', 'ProductID': 'VE-LORINSclass', 'BrandType': '劳伦士', 'Brand': 'L - 劳伦士', 'Url': '/Images/Logo/laolunshi.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LORINSclass.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'S级', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LORINSclass.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/LaoLunShi.png', 'Tires': '255/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "L - 陆地方舟 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 陆地方舟 - VE-GREENWEvion - {'Vehicle': '艾威-陆地方舟', 'ProductID': 'VE-GREENWEvion', 'BrandType': '陆地方舟', 'Brand': 'L - 陆地方舟', 'Url': '/Images/Logo/ludifangzhou.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GREENWEvion.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '艾威', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GREENWEvion.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/LuDiFangZhou.png', 'Tires': '165/65R13', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 陆地方舟 - VE-GREENWJMA - {'Vehicle': '劲玛-陆地方舟', 'ProductID': 'VE-GREENWJMA', 'BrandType': '陆地方舟', 'Brand': 'L - 陆地方舟', 'Url': '/Images/Logo/ludifangzhou.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-GREENWJMA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '劲玛', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-GREENWJMA.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/LuDiFangZhou.png', 'Tires': '195/60R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 陆地方舟 - VE-GREENWFS - {'Vehicle': '风尚-陆地方舟', 'ProductID': 'VE-GREENWFS', 'BrandType': '陆地方舟', 'Brand': 'L - 陆地方舟', 'Url': '/Images/Logo/ludifangzhou.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-GREENWFS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '风尚', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-GREENWFS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/LuDiFangZhou.png', 'Tires': '195/65R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "L - 理念 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "L - 领克 done\n", + "L - 罗夫哈特 done\n", + "L - 力帆 done\n", + "L - 领途汽车 done\n", + "L - 劳斯莱斯 done\n", + "L - 雷克萨斯 done\n", + ">> L - 雷克萨斯 - VE-JTH-ES330 - {'Vehicle': 'ES330-雷克萨斯', 'ProductID': 'VE-JTH-ES330', 'BrandType': '雷克萨斯', 'Brand': 'L - 雷克萨斯', 'Url': '/Images/Logo/leikesasi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JTH-ES330.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'ES330', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JTH-ES330.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/LeiKeSaSi.png', 'Tires': '215/60R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 46, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 雷克萨斯 - VE-JTH-RX330 - {'Vehicle': 'RX330-雷克萨斯', 'ProductID': 'VE-JTH-RX330', 'BrandType': '雷克萨斯', 'Brand': 'L - 雷克萨斯', 'Url': '/Images/Logo/leikesasi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-JTH-RX330.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'RX330', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-JTH-RX330.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/LeiKeSaSi.png', 'Tires': '235/55R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 9, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "L - 林肯 done\n", + ">> L - 林肯 - VE-LINCOLNLS - {'Vehicle': 'LS-福特汽车', 'ProductID': 'VE-LINCOLNLS', 'BrandType': '福特汽车', 'Brand': 'L - 林肯', 'Url': '/Images/Logo/linken.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-LINCOLNLS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'LS', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-LINCOLNLS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/LinKen.png', 'Tires': '215/60R16;245/45R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 10, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> L - 林肯 - VE-FURDFIRMCS - {'Vehicle': '城市-福特汽车', 'ProductID': 'VE-FURDFIRMCS', 'BrandType': '福特汽车', 'Brand': 'L - 林肯', 'Url': '/Images/Logo/linken.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-FURDFIRMCS.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '城市', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-FURDFIRMCS.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/LinKen.png', 'Tires': '225/60R17;245/60R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "L - 零跑汽车 done\n", + "L - 洛克汽车 done\n", + "L - 理想 done\n", + ">> L - 理想 - VE-ONE - {'Vehicle': '理想ONE-理想智造', 'ProductID': 'VE-ONE', 'BrandType': '理想智造', 'Brand': 'L - 理想', 'Url': '/Images/Logo/lixiang.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-ONE.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '理想ONE', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-ONE.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/LiXiang.png', 'Tires': '', 'SpecialTireSize': '', 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "L - 雷丁 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "M - MINI done\n", + "M - MG done\n", + "M - 玛莎拉蒂 done\n", + ">> M - 玛莎拉蒂 - VE-LSLDCoupe - {'Vehicle': 'Coupe-玛莎拉蒂', 'ProductID': 'VE-LSLDCoupe', 'BrandType': '玛莎拉蒂', 'Brand': 'M - 玛莎拉蒂', 'Url': '/Images/Logo/mashaladi.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LSLDCoupe.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Coupe', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LSLDCoupe.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/MaShaLaDi.png', 'Tires': '235/40R18;265/35R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 7, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> M - 玛莎拉蒂 - VE-MAS3200GT - {'Vehicle': '3200GT-玛莎拉蒂', 'ProductID': 'VE-MAS3200GT', 'BrandType': '玛莎拉蒂', 'Brand': 'M - 玛莎拉蒂', 'Url': '/Images/Logo/mashaladi.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-MAS3200GT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '3200GT', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-MAS3200GT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/MaShaLaDi.png', 'Tires': '195/65R15;205/55R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> M - 玛莎拉蒂 - VE-MASEGranSport - {'Vehicle': 'GranSport-玛莎拉蒂', 'ProductID': 'VE-MASEGranSport', 'BrandType': '玛莎拉蒂', 'Brand': 'M - 玛莎拉蒂', 'Url': '/Images/Logo/mashaladi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-MASEGranSport.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'GranSport', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-MASEGranSport.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/MaShaLaDi.png', 'Tires': '235/50R18;275/45R18;245/35R20;285/35R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "M - 迈巴赫 done\n", + "M - 美亚 done\n", + "M - 马自达 done\n", + ">> M - 马自达 - VE-MAZD6Ruiyi - {'Vehicle': '睿翼-马自达进口', 'ProductID': 'VE-MAZD6Ruiyi', 'BrandType': '马自达进口', 'Brand': 'M - 马自达', 'Url': '/Images/Logo/mazida.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-MAZD6Ruiyi.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '睿翼', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-MAZD6Ruiyi.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/MaZiDa.png', 'Tires': '225/55R17;225/45R19;205/60R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "M - 迈凯伦 done\n", + ">> M - 迈凯伦 - VE-McLaren675LT - {'Vehicle': '675LT-迈凯伦汽车', 'ProductID': 'VE-McLaren675LT', 'BrandType': '迈凯伦汽车', 'Brand': 'M - 迈凯伦', 'Url': '/Images/Logo/maikailun.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-McLaren675LT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '675LT', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-McLaren675LT.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/MaiKaiLun.png', 'Tires': '235/35R19;305/30R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "N - 纳智捷 done\n", + "N - 哪吒汽车 done\n", + "O - 欧宝 done\n", + ">> O - 欧宝 - VE-OPEL99AB - {'Vehicle': '欧美佳-通用汽车', 'ProductID': 'VE-OPEL99AB', 'BrandType': '通用汽车', 'Brand': 'O - 欧宝', 'Url': '/Images/Logo/oubao.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-OPEL99AB.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '欧美佳', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-OPEL99AB.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/OuBao.png', 'Tires': '235/45R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 6, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "O - 欧朗 done\n", + "O - 讴歌 done\n", + "O - 欧拉 done\n", + "O - 欧尚汽车 done\n", + "P - Polestar done\n", + "P - 帕加尼 done\n", + "Q - 奇瑞 done\n", + ">> Q - 奇瑞 - VE-LVV-RUIHU7 - {'Vehicle': '瑞虎7-奇瑞汽车', 'ProductID': 'VE-LVV-RUIHU7', 'BrandType': '奇瑞汽车', 'Brand': 'Q - 奇瑞', 'Url': '/Images/Logo/qirui.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-LVV-RUIHU7.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '瑞虎7', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-LVV-RUIHU7.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/QiRui.png', 'Tires': '225/65R17;225/60R18;225/55R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 11, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 65, in \n", + " gbk_fp.write(ij.encode('gbk'))\n", + "UnicodeEncodeError: 'gbk' codec can't encode character '\\xa0' in position 48: illegal multibyte sequence\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Q - 起亚 done\n", + "Q - 庆铃 done\n", + "Q - 启腾 done\n", + "Q - 乔治·巴顿 done\n", + "Q - 前途汽车 done\n", + "Q - 启辰 done\n", + "R - 日产 done\n", + ">> R - 日产 - VE-NISS03AD - {'Vehicle': '蓝鸟-日产进口', 'ProductID': 'VE-NISS03AD', 'BrandType': '日产进口', 'Brand': 'R - 日产', 'Url': '/Images/Logo/richan.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-NISS03AD.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '蓝鸟', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-NISS03AD.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/RiChan.png', 'Tires': '205/60R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 6, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> R - 日产 - VE-NISS07AF - {'Vehicle': '西玛-日产进口', 'ProductID': 'VE-NISS07AF', 'BrandType': '日产进口', 'Brand': 'R - 日产', 'Url': '/Images/Logo/richan.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-NISS07AF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '西玛', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-NISS07AF.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/RiChan.png', 'Tires': '255/55R17;245/45R18', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "R - 瑞麒 done\n", + "R - RUF done\n", + "R - 荣威 done\n", + "S - Smart done\n", + "S - 思铭 done\n", + "S - 斯巴鲁 done\n", + "S - 萨博 done\n", + ">> S - 萨博 - VE-SAAB9000 - {'Vehicle': '9000-通用汽车', 'ProductID': 'VE-SAAB9000', 'BrandType': '通用汽车', 'Brand': 'S - 萨博', 'Url': '/Images/Logo/sabo.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-SAAB9000.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '9000', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-SAAB9000.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/SaBo.png', 'Tires': '185/55R15;195/55R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "S - 赛宝 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "S - 双环 done\n", + "S - 双龙 done\n", + "S - 世爵 done\n", + "S - 陕汽通家 done\n", + "S - 斯威汽车 done\n", + "S - 三菱 done\n", + "S - 斯柯达 done\n", + ">> S - 斯柯达 - VE-SKOD06AH - {'Vehicle': 'Fabia-斯柯达进口', 'ProductID': 'VE-SKOD06AH', 'BrandType': '斯柯达进口', 'Brand': 'S - 斯柯达', 'Url': '/Images/Logo/sikeda.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-SKOD06AH.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Fabia', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-SKOD06AH.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/SiKeDa.png', 'Tires': '185/60R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "S - 绅宝 done\n", + "T - 天马 done\n", + ">> T - 天马 - VE-TIANMAYXIONG - {'Vehicle': '英雄-天马汽车', 'ProductID': 'VE-TIANMAYXIONG', 'BrandType': '天马汽车', 'Brand': 'T - 天马', 'Url': '/Images/Logo/tianma.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-TIANMAYXIONG.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '英雄', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-TIANMAYXIONG.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/TianMa.png', 'Tires': '245/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "T - 通田 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T - 腾势 done\n", + "T - 天津一汽 done\n", + ">> T - 天津一汽 - VE-LFP-A+SX - {'Vehicle': '夏利A+(三厢)-天津一汽夏利', 'ProductID': 'VE-LFP-A+SX', 'BrandType': '天津一汽夏利', 'Brand': 'T - 天津一汽', 'Url': '/Images/Logo/tianjinyiqi.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-LFP-A+SX.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '夏利A+(三厢)', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-LFP-A+SX.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/TianJinYiQi.png', 'Tires': '165/70R13', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 19, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T - 特斯拉 done\n", + ">> T - 特斯拉 - VE-TSLLFIOWX - {'Vehicle': 'Model X-特斯拉汽车', 'ProductID': 'VE-TSLLFIOWX', 'BrandType': '特斯拉汽车', 'Brand': 'T - 特斯拉', 'Url': '/Images/Logo/tesila.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-TSLLFIOWX.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Model X', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-TSLLFIOWX.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/TeSiLa.png', 'Tires': '255/45R20;275/45R20;265/35R22;285/35R22', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 65, in \n", + " gbk_fp.write(ij.encode('gbk'))\n", + "UnicodeEncodeError: 'gbk' codec can't encode character '\\xa0' in position 51: illegal multibyte sequence\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "W - 万丰 done\n", + "W - 威麟 done\n", + "W - 沃尔沃 done\n", + ">> W - 沃尔沃 - VE-XC70WEWJK - {'Vehicle': 'XC70-沃尔沃进口', 'ProductID': 'VE-XC70WEWJK', 'BrandType': '沃尔沃进口', 'Brand': 'W - 沃尔沃', 'Url': '/Images/Logo/woerwo.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-XC70WEWJK.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'XC70', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-XC70WEWJK.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/WoErWo.png', 'Tires': '215/65R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 7, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> W - 沃尔沃 - VE-VOLVEV70 - {'Vehicle': 'V70-沃尔沃进口', 'ProductID': 'VE-VOLVEV70', 'BrandType': '沃尔沃进口', 'Brand': 'W - 沃尔沃', 'Url': '/Images/Logo/woerwo.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-VOLVEV70.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'V70', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-VOLVEV70.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/WoErWo.png', 'Tires': '225/55R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> W - 沃尔沃 - VE-VOLVE850 - {'Vehicle': '850-沃尔沃进口', 'ProductID': 'VE-VOLVE850', 'BrandType': '沃尔沃进口', 'Brand': 'W - 沃尔沃', 'Url': '/Images/Logo/woerwo.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-VOLVE850.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '850', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-VOLVE850.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/WoErWo.png', 'Tires': '205/50R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "W - 五菱 done\n", + ">> W - 五菱 - VE-WULI05AC - {'Vehicle': '都市清风-上汽通用五菱', 'ProductID': 'VE-WULI05AC', 'BrandType': '上汽通用五菱', 'Brand': 'W - 五菱', 'Url': '/Images/Logo/wuling.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-WULI05AC.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '都市清风', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-WULI05AC.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/WuLing.png', 'Tires': '175/70R13', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 19, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n", + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "W - 威旺 done\n", + "W - 威兹曼 done\n", + "W - 五十铃 done\n", + "W - WEY done\n", + "W - 威马 done\n", + "W - 蔚来 done\n", + "X - 新雅途 done\n", + "X - 厦门金龙 done\n", + "X - 雪佛兰 done\n", + ">> X - 雪佛兰 - VE-CHVJ05AA - {'Vehicle': 'S10皮卡-金杯通用', 'ProductID': 'VE-CHVJ05AA', 'BrandType': '金杯通用', 'Brand': 'X - 雪佛兰', 'Url': '/Images/Logo/xuefolan.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CHVJ05AA.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'S10皮卡', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CHVJ05AA.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/XueFoLan.png', 'Tires': '225/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 3, 'Priority3': 2, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> X - 雪佛兰 - VE-SPRINGO - {'Vehicle': '赛欧SPRINGO-上海通用', 'ProductID': 'VE-SPRINGO', 'BrandType': '上海通用', 'Brand': 'X - 雪佛兰', 'Url': '/Images/Logo/xuefolan.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-SPRINGO.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '赛欧SPRINGO', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-SPRINGO.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/XueFoLan.png', 'Tires': '155/60R15;175/55R15;195/50R15;185/55R15;195/55R15;175/70R14', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 5, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> X - 雪佛兰 - VE-CHVCorvette - {'Vehicle': '克尔维特-雪佛兰进口', 'ProductID': 'VE-CHVCorvette', 'BrandType': '雪佛兰进口', 'Brand': 'X - 雪佛兰', 'Url': '/Images/Logo/xuefolan.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-CHVCorvette.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '克尔维特', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-CHVCorvette.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/XueFoLan.png', 'Tires': '245/40R18;285/35R19', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 5, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> X - 雪佛兰 - VE-CHVExpress - {'Vehicle': 'Express-雪佛兰进口', 'ProductID': 'VE-CHVExpress', 'BrandType': '雪佛兰进口', 'Brand': 'X - 雪佛兰', 'Url': '/Images/Logo/xuefolan.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-CHVExpress.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Express', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-CHVExpress.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/XueFoLan.png', 'Tires': '235/75R16;245/75R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 4, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> X - 雪佛兰 - VE-CHVImpala - {'Vehicle': '英帕拉-雪佛兰进口', 'ProductID': 'VE-CHVImpala', 'BrandType': '雪佛兰进口', 'Brand': 'X - 雪佛兰', 'Url': '/Images/Logo/xuefolan.png', 'Src': 'https://img4.tuhu.org/Images/type/VE-CHVImpala.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '英帕拉', 'appSrc': None, 'Image': 'https://img4.tuhu.org/Images/type/VE-CHVImpala.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/XueFoLan.png', 'Tires': '235/50R18;245/45R19;245/40R20', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 3, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "X - 雪铁龙 done\n", + "X - 西雅特 done\n", + "X - 新凯 done\n", + "X - 新特汽车 done\n", + "X - 现代 done\n", + ">> X - 现代 - VE-HYUNWCHAO - {'Vehicle': '王朝-现代进口', 'ProductID': 'VE-HYUNWCHAO', 'BrandType': '现代进口', 'Brand': 'X - 现代', 'Url': '/Images/Logo/xiandai.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HYUNWCHAO.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '王朝', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HYUNWCHAO.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/XianDai.png', 'Tires': '215/65R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 8, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> X - 现代 - VE-HYUNGrandeur - {'Vehicle': '君爵-现代进口', 'ProductID': 'VE-HYUNGrandeur', 'BrandType': '现代进口', 'Brand': 'X - 现代', 'Url': '/Images/Logo/xiandai.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-HYUNGrandeur.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '君爵', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-HYUNGrandeur.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/XianDai.png', 'Tires': '205/65R15;205/60R16;205/60R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 6, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "X - 小鹏汽车 done\n", + "X - 星途 done\n", + "Y - 英菲尼迪 done\n", + ">> Y - 英菲尼迪 - VE-INFIQ45 - {'Vehicle': 'Q45-日产汽车', 'ProductID': 'VE-INFIQ45', 'BrandType': '日产汽车', 'Brand': 'Y - 英菲尼迪', 'Url': '/Images/Logo/yingfeinidi.png', 'Src': 'https://img3.tuhu.org/Images/type/VE-INFIQ45.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': 'Q45', 'appSrc': None, 'Image': 'https://img3.tuhu.org/Images/type/VE-INFIQ45.png@100Q.png', 'ImageUrl': 'https://img3.tuhu.org/Images/Logo/YingFeiNiDi.png', 'Tires': '225/60R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 11, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Y - 永源 done\n", + "Y - 云雀 done\n", + "Y - 一汽吉林 done\n", + "Y - 一汽华利 done\n", + "Y - 依维柯 done\n", + "Y - 一汽通用 done\n", + ">> Y - 一汽通用 - VE-YIQIGMZYF - {'Vehicle': '自由风-一汽轻型汽车', 'ProductID': 'VE-YIQIGMZYF', 'BrandType': '一汽轻型汽车', 'Brand': 'Y - 一汽通用', 'Url': '/Images/Logo/yiqitongyong.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-YIQIGMZYF.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '自由风', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-YIQIGMZYF.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/YiQiTongYong.png', 'Tires': '215/65R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 2, 'Priority3': 1, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> Y - 一汽通用 - VE-YIQILT - {'Vehicle': '蓝舰-一汽通用', 'ProductID': 'VE-YIQILT', 'BrandType': '一汽通用', 'Brand': 'Y - 一汽通用', 'Url': '/Images/Logo/yiqitongyong.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-YIQILT.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '蓝舰', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-YIQILT.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/YiQiTongYong.png', 'Tires': '245/70R16', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "Y - 云度汽车 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Y - 裕路 done\n", + "Y - 御捷新能源 done\n", + "Y - 一汽奔腾 done\n", + "Y - 野马 done\n", + "Y - 英致 done\n", + "Y - 易至汽车 done\n", + "Y - 银隆新能源 done\n", + "Z - 中华 done\n", + "Z - 中顺 done\n", + "Z - 中兴 done\n", + ">> Z - 中兴 - VE-ZHON04BO - {'Vehicle': '福星皮卡-中兴汽车', 'ProductID': 'VE-ZHON04BO', 'BrandType': '中兴汽车', 'Brand': 'Z - 中兴', 'Url': '/Images/Logo/zhongxing.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-ZHON04BO.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '福星皮卡', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-ZHON04BO.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/ZhongXing.png', 'Tires': '215/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 19, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> Z - 中兴 - VE-ZHON04AP - {'Vehicle': '田野皮卡-中兴汽车', 'ProductID': 'VE-ZHON04AP', 'BrandType': '中兴汽车', 'Brand': 'Z - 中兴', 'Url': '/Images/Logo/zhongxing.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-ZHON04AP.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '田野皮卡', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-ZHON04AP.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/ZhongXing.png', 'Tires': '215/75R15', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 14, 'VehicleSeries': None}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Z - 众泰 done\n", + "Z - 中欧 done\n", + "Z - 知豆 done\n", + "Z - 浙江卡尔森 done\n", + ">> Z - 浙江卡尔森 - VE-ZJKESMPV - {'Vehicle': '商务车-浙江卡尔森', 'ProductID': 'VE-ZJKESMPV', 'BrandType': '浙江卡尔森', 'Brand': 'Z - 浙江卡尔森', 'Url': '/Images/Logo/zhejiangkaersen.png', 'Src': 'https://img2.tuhu.org/Images/type/VE-ZJKESMPV.png@163w_163h_100Q.png', 'IsBaoYang': 'True', 'CarName': '商务车', 'appSrc': None, 'Image': 'https://img2.tuhu.org/Images/type/VE-ZJKESMPV.png@100Q.png', 'ImageUrl': 'https://img2.tuhu.org/Images/Logo/ZheJiangKaErSen.png', 'Tires': '205/65R16;235/60R17', 'SpecialTireSize': None, 'OriginalIsBaoyang': 1, 'Priority2': 1, 'Priority3': 1, 'VehicleSeries': None}\n", + "Z - 之诺 done\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Traceback (most recent call last):\n", + " File \"\", line 60, in \n", + " for pailiang in load_pailiang(vid):\n", + " File \"\", line 11, in load_pailiang\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "KeyError: 'PaiLiang'\n" + ] + } + ], + "source": [ + "# get child brand\n", + "from typing import List\n", + "\n", + "headers = {\n", + " 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',\n", + "}\n", + "\n", + "\n", + "def load_pailiang(vid) -> List[str]:\n", + " url = f'https://api.tuhu.cn/Vehicle/SelectVehicle?VehicleId={vid}'\n", + " return requests.get(url, headers=headers).json()['PaiLiang']\n", + "# print(url, r)\n", + "# return r['PaiLiang']\n", + "\n", + "\n", + "def load_brand_yrs(vid, pailiang) -> List[dict]:\n", + " \"\"\"\n", + " Args:\n", + " \n", + " vid(str): 'VE-LSG-GL6'\n", + " pailiang(str): '1.3T'\n", + " \n", + " Return: [{Key: \"VE-LSG-GL6\", Value: \"2019\"}, {Key: \"VE-LSG-GL6\", Value: \"2018\"},…]\n", + " \"\"\"\n", + " url = f'https://item.tuhu.cn/Car/SelectVehicle?callback=__GetCarBrands__&VehicleID={vid}&PaiLiang={pailiang}&_=1565330440229'\n", + " return json.loads(index_regex.findall(requests.get(url).text)[0])['Nian']\n", + "\n", + "\n", + "def load_child_brands(vid, pailiang, nian):\n", + " \"\"\"\n", + " Args:\n", + " \n", + " nian(str): 2017\n", + " \n", + " Return: [{LiYangID: null, TID: \"113193\", Name: \"2018款 1.3T 手自一体 18T 6座 豪华版\"},…]\n", + " \"\"\"\n", + " url = f'https://item.tuhu.cn/Car/SelectVehicleSalesName?callback=__GetCarBrands__&VehicleID={vid}&PaiLiang={pailiang}&Nian={nian}&_=1565330440230'\n", + " return json.loads(index_regex.findall(requests.get(url).text)[0])['SalesName']\n", + "\n", + "\n", + "\n", + "vid_dones = set([])\n", + "\n", + "with open('./车系/child-brands-gbk.txt', '+ab') as gbk_fp, \\\n", + " open('./车系/child-brands-utf.txt', '+ab') as utf8_fp:\n", + "# open('./车系/child-brands-utf-2.txt', '+ab') as utf8_fp_2, \\\n", + "# open('./车系/child-brands-gbk-2.txt', '+ab') as gbk_fp_2:\n", + " \n", + " utf8_fp.seek(0, 0)\n", + " for ij in utf8_fp:\n", + " vid_dones.add(json.loads(ij.decode('utf8'))['vid'])\n", + " \n", + " for b_1, bl in result.items():\n", + " print(f'{b_1} done')\n", + " for bd in bl:\n", + " vid = bd['ProductID']\n", + " if vid in vid_dones:\n", + " continue \n", + "\n", + " vid_dones.add(vid)\n", + " try:\n", + " for pailiang in load_pailiang(vid):\n", + " for nian in [d['Value'] for d in load_brand_yrs(vid, pailiang)]:\n", + " for b in load_child_brands(vid, pailiang, nian):\n", + " item = {'brand': b, 'pailiang': pailiang, 'vid': vid, 'year': nian}\n", + " ij = json.dumps(item, sort_keys=True, ensure_ascii=False) + '\\n'\n", + " gbk_fp.write(ij.encode('gbk'))\n", + " utf8_fp.write(ij.encode('utf8'))\n", + " except Exception:\n", + " print(f'>> {b_1} - {vid} - {bd}')\n", + " traceback.print_exc()\n", + " finally:\n", + " gbk_fp.flush()\n", + " utf8_fp.flush()\n", + "\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "vid_binfo_map = {}\n", + "for _, bl in result.items():\n", + " for binfo in bl:\n", + " vid_binfo_map[binfo['ProductID']] = binfo\n", + "\n", + "\n", + "with open('./车系/child-brands-gbk.txt', '+ab') as gbk_fp, \\\n", + " open('./车系/child-brands-utf8.txt', '+ab') as utf8_fp, \\\n", + " open('./车系/child-brands-utf8-2.txt', '+ab') as utf8_fp_2, \\\n", + " open('./车系/child-brands-gbk-2.txt', '+ab') as gbk_fp_2:\n", + " \n", + " utf8_fp.seek(0, 0)\n", + " for ij in utf8_fp:\n", + " d = json.loads(ij.decode('utf8'))\n", + " d['brand'].update(vid_binfo_map[d['vid']])\n", + " dj = json.dumps(d, sort_keys=True, ensure_ascii=False) + '\\n'\n", + " gbk_fp_2.write(dj.encode('gbk'))\n", + " utf8_fp_2.write(dj.encode('utf8'))\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "89214\n" + ] + } + ], + "source": [ + "with open('child-brands-utf8.txt') as fp:\n", + " print(fp.read().count('\\n'))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/py3/tutorial/process_thread_coroutine.py b/py3/tutorial/process_thread_coroutine.py new file mode 100644 index 00000000..49f42b49 --- /dev/null +++ b/py3/tutorial/process_thread_coroutine.py @@ -0,0 +1,109 @@ +""" +✗ python process_thread_coroutine.py + +[2019-08-11 09:09:37,670Z - INFO - kipp] - main running... +[2019-08-11 09:09:37,671Z - INFO - kipp] - coroutine_main running... +[2019-08-11 09:09:37,671Z - INFO - kipp] - io_blocking_task running... +[2019-08-11 09:09:37,690Z - INFO - kipp] - coroutine_task running... +[2019-08-11 09:09:37,691Z - INFO - kipp] - coroutine_error running... +[2019-08-11 09:09:37,691Z - INFO - kipp] - coroutine_error end, cost 0.00s +[2019-08-11 09:09:37,693Z - INFO - kipp] - cpu_blocking_task running... +[2019-08-11 09:09:38,674Z - INFO - kipp] - io_blocking_task end, cost 1.00s +[2019-08-11 09:09:38,695Z - INFO - kipp] - coroutine_task end, cost 1.00s +[2019-08-11 09:09:39,580Z - INFO - kipp] - cpu_blocking_task end, cost 1.89s +[2019-08-11 09:09:39,582Z - INFO - kipp] - coroutine_main got [None, AttributeError('yo'), None, None] +[2019-08-11 09:09:39,582Z - INFO - kipp] - coroutine_main end, cost 1.91s +[2019-08-11 09:09:39,582Z - INFO - kipp] - main end, cost 1.91s +""" + + +from time import sleep, time +from asyncio import get_event_loop, sleep as asleep, gather, ensure_future, iscoroutine +from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor, wait +from functools import wraps + +from kipp.utils import get_logger + + +logger = get_logger() + + +N_FORK = 4 +N_THREADS = 10 + +thread_executor = ThreadPoolExecutor(max_workers=N_THREADS) +process_executor = ProcessPoolExecutor(max_workers=N_FORK) +ioloop = get_event_loop() + + +def timer(func): + @wraps(func) + def wrapper(*args, **kw): + logger.info(f"{func.__name__} running...") + start_at = time() + try: + r = func(*args, **kw) + finally: + logger.info(f"{func.__name__} end, cost {time() - start_at:.2f}s") + + return wrapper + + +def async_timer(func): + @wraps(func) + async def wrapper(*args, **kw): + logger.info(f"{func.__name__} running...") + start_at = time() + try: + return await func(*args, **kw) + finally: + logger.info(f"{func.__name__} end, cost {time() - start_at:.2f}s") + + return wrapper + + +@timer +def io_blocking_task(): + """I/O 型阻塞调用""" + sleep(1) + + +@timer +def cpu_blocking_task(): + """CPU 型阻塞调用""" + for _ in range(1 << 26): + pass + + +@async_timer +async def coroutine_task(): + """异步协程调用""" + await asleep(1) + + +@async_timer +async def coroutine_error(): + """会抛出异常的协程调用""" + raise AttributeError("yo") + + +@async_timer +async def coroutine_main(): + ioloop = get_event_loop() + r = await gather( + coroutine_task(), + coroutine_error(), + ioloop.run_in_executor(thread_executor, io_blocking_task), + ioloop.run_in_executor(process_executor, cpu_blocking_task), + return_exceptions=True, + ) + logger.info(f"coroutine_main got {r}") + + +@timer +def main(): + get_event_loop().run_until_complete(coroutine_main()) + + +if __name__ == "__main__": + main() diff --git a/py3/utf-fp.txt b/py3/utf-fp.txt new file mode 100644 index 00000000..d800886d --- /dev/null +++ b/py3/utf-fp.txt @@ -0,0 +1 @@ +123 \ No newline at end of file From 85b90cca2e23bd6fe8352a010b374cc7507165d3 Mon Sep 17 00:00:00 2001 From: Laisky Date: Thu, 5 Sep 2019 17:54:35 +0800 Subject: [PATCH 13/27] + singleflight --- go.mod | 1 + go.sum | 1 + golang/src/demo/perf_demo/bounds_test.go | 44 ++++++ golang/src/demo/perf_demo/escape.go | 20 +++ golang/src/demo/test_syntax/chan_test.go | 28 ++++ golang/src/demo/test_syntax/ctx_test.go | 27 ++++ golang/src/demo/test_syntax/for_test.go | 24 ++++ .../src/demo/test_syntax/singleflight_test.go | 46 +++++++ py3/Untitled.ipynb | 130 ++++++++++++++++++ .../algorithms}/DP.ipynb | 0 .../algorithms}/KMP.ipynb | 0 py3/algorithms/Untitled.ipynb | 62 +++++++++ .../data-structure/Recursion.ipynb | 0 .../algorithms}/data-structure/array.ipynb | 0 .../algorithms}/data-structure/heap.ipynb | 0 .../algorithms}/data-structure/stack.ipynb | 0 .../algorithms}/pybloof.ipynb | 0 .../algorithms}/sort.ipynb | 33 ++--- 18 files changed, 396 insertions(+), 20 deletions(-) create mode 100644 golang/src/demo/perf_demo/bounds_test.go create mode 100644 golang/src/demo/perf_demo/escape.go create mode 100644 golang/src/demo/test_syntax/chan_test.go create mode 100644 golang/src/demo/test_syntax/ctx_test.go create mode 100644 golang/src/demo/test_syntax/for_test.go create mode 100644 golang/src/demo/test_syntax/singleflight_test.go create mode 100644 py3/Untitled.ipynb rename {python-algorithms => py3/algorithms}/DP.ipynb (100%) rename {python-algorithms => py3/algorithms}/KMP.ipynb (100%) create mode 100644 py3/algorithms/Untitled.ipynb rename {python-algorithms => py3/algorithms}/data-structure/Recursion.ipynb (100%) rename {python-algorithms => py3/algorithms}/data-structure/array.ipynb (100%) rename {python-algorithms => py3/algorithms}/data-structure/heap.ipynb (100%) rename {python-algorithms => py3/algorithms}/data-structure/stack.ipynb (100%) rename {python-algorithms => py3/algorithms}/pybloof.ipynb (100%) rename {python-algorithms => py3/algorithms}/sort.ipynb (93%) diff --git a/go.mod b/go.mod index 56243048..7ae9a9e8 100644 --- a/go.mod +++ b/go.mod @@ -72,6 +72,7 @@ require ( golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9 // indirect golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 // indirect golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect + golang.org/x/sync v0.0.0-20190423024810-112230192c58 golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect golang.org/x/text v0.3.2 golang.org/x/tools v0.0.0-20190723021737-8bb11ff117ca // indirect diff --git a/go.sum b/go.sum index e2637961..27614899 100644 --- a/go.sum +++ b/go.sum @@ -391,6 +391,7 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/golang/src/demo/perf_demo/bounds_test.go b/golang/src/demo/perf_demo/bounds_test.go new file mode 100644 index 00000000..61c6b967 --- /dev/null +++ b/golang/src/demo/perf_demo/bounds_test.go @@ -0,0 +1,44 @@ +package main_test + +import "testing" + +/* +BenchmarkBound/normal-4 200000000 7.69 ns/op 0 B/op 0 allocs/op +BenchmarkBound/reorder-4 300000000 5.49 ns/op 0 B/op 0 allocs/op +*/ +func BenchmarkBound(b *testing.B) { + var ( + v = make([]int, 9) + A, B, C, D, E, F, G, H, I int + ) + b.ReportAllocs() + b.Run("normal", func(b *testing.B) { + for i := 0; i < b.N; i++ { + A = v[0] + B = v[1] + C = v[2] + D = v[3] + E = v[4] + F = v[5] + G = v[6] + H = v[7] + I = v[8] + } + }) + + b.Run("reorder", func(b *testing.B) { + for i := 0; i < b.N; i++ { + I = v[8] + A = v[0] + B = v[1] + C = v[2] + D = v[3] + E = v[4] + F = v[5] + G = v[6] + H = v[7] + } + }) + + b.Log(A, B, C, D, E, F, G, H, I) +} diff --git a/golang/src/demo/perf_demo/escape.go b/golang/src/demo/perf_demo/escape.go new file mode 100644 index 00000000..9f92af06 --- /dev/null +++ b/golang/src/demo/perf_demo/escape.go @@ -0,0 +1,20 @@ +/* + ✗ go build -gcflags="-m -m" escape.go + +# command-line-arguments +./escape.go:8:6: can inline foo as: func(*P) { p = new(P); p.X = 1; p.Y = 2 } +./escape.go:8:10: foo p does not escape +./escape.go:9:9: foo new(P) does not escape +*/ + +package perf + +type P struct { + X, Y int +} + +func foo(p *P) { + p = new(P) + p.X = 1 + p.Y = 2 +} diff --git a/golang/src/demo/test_syntax/chan_test.go b/golang/src/demo/test_syntax/chan_test.go new file mode 100644 index 00000000..0f698b18 --- /dev/null +++ b/golang/src/demo/test_syntax/chan_test.go @@ -0,0 +1,28 @@ +package test + +import "testing" + +func TestClocsChan(t *testing.T) { + + intChan := make(chan int, 100) + n := 123 + close(intChan) + <-intChan + <-intChan + <-intChan + + n = <-intChan + if n != 0 { + t.Fatalf("got n: %v", n) + } + + mapChan := make(chan map[string]string, 10) + mm := map[string]string{"1": "123"} + close(mapChan) + + mm = <-mapChan + if mm != nil { + t.Fatalf("got n: %v", n) + } + +} diff --git a/golang/src/demo/test_syntax/ctx_test.go b/golang/src/demo/test_syntax/ctx_test.go new file mode 100644 index 00000000..b4441629 --- /dev/null +++ b/golang/src/demo/test_syntax/ctx_test.go @@ -0,0 +1,27 @@ +package test + +import ( + "context" + "fmt" + "sync" + "testing" +) + +func TestContext(t *testing.T) { + ctx := context.Background() + wg := &sync.WaitGroup{} + + ctx2, cancel := context.WithCancel(ctx) + for i := 0; i < 10; i++ { + wg.Add(1) + go func(i int) { + <-ctx2.Done() + fmt.Println(i, "quit") + wg.Done() + }(i) + } + + cancel() + wg.Wait() + <-ctx2.Done() +} diff --git a/golang/src/demo/test_syntax/for_test.go b/golang/src/demo/test_syntax/for_test.go new file mode 100644 index 00000000..f65f0d0e --- /dev/null +++ b/golang/src/demo/test_syntax/for_test.go @@ -0,0 +1,24 @@ +package test + +import ( + "sync" + "testing" +) + +func TestFor(t *testing.T) { + wg := &sync.WaitGroup{} + z := 0 + for i := 0; i < 5; i++ { + z++ + wg.Add(1) + go func() { + defer wg.Done() + t.Log(i) + t.Log(z) + t.Log("----------------") + }() + } + + wg.Wait() + // t.Error() +} diff --git a/golang/src/demo/test_syntax/singleflight_test.go b/golang/src/demo/test_syntax/singleflight_test.go new file mode 100644 index 00000000..80f6635a --- /dev/null +++ b/golang/src/demo/test_syntax/singleflight_test.go @@ -0,0 +1,46 @@ +package test + +import ( + "testing" + + "golang.org/x/sync/singleflight" +) + +func TestSingleFlight(t *testing.T) { + g := singleflight.Group{} + const key = "1" + n := 0 + v, err, shared := g.Do(key, func() (interface{}, error) { + n++ + return n, nil + }) + if err != nil { + t.Fatalf("got error: %+v", err) + } + if v != 1 { + t.Logf("got v: %v, shared: %v", v, shared) + } + + v, err, shared = g.Do(key, func() (interface{}, error) { + n++ + return n, nil + }) + if err != nil { + t.Fatalf("got error: %+v", err) + } + if v != 1 { + t.Logf("got v: %v, shared: %v", v, shared) + } + + g.Forget(key) + v, err, shared = g.Do(key, func() (interface{}, error) { + n++ + return n, nil + }) + if err != nil { + t.Fatalf("got error: %+v", err) + } + if v != 2 { + t.Logf("got v: %v, shared: %v", v, shared) + } +} diff --git a/py3/Untitled.ipynb b/py3/Untitled.ipynb new file mode 100644 index 00000000..d72316b1 --- /dev/null +++ b/py3/Untitled.ipynb @@ -0,0 +1,130 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import gzip\n", + "import base64" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "22410" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = '''\n", + "{\\\"bodyEncryptAlg\\\":\\\"\\\",\\\"bodyPtlVersion\\\":\\\"32\\\",\\\"channelType\\\":\\\"NETTY_HTTP\\\",\\\"clientId\\\":\\\"P866793030084423\\\",\\\"clientType\\\":\\\"0\\\",\\\"colletionDataTime\\\":\\\"2019-08-22 13:51:50\\\",\\\"content\\\":\\\"7e107d014e2cdcca7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004bf7c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdccc7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c47c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdccd7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c17c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcce7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c27c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcd07d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004bf7c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcd17d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c27c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcd27d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c17c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcd47d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c27c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcd57d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c47c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcd67d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c27c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcd87d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c57c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcd97d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c47c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcdb7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c07c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcdc7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c37c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcde7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b77c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c07c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcdf7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b77c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004bf7c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdce07d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b77c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c17c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdce17d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b77c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c17c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdce37d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b77c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c47c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdce47d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b77c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004be7c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdce67d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b77c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c17c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdce77d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b77c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a010202010002010000000\\n07c9b007c9c007c9d0004c07c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdce87d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b77c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c27c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcea7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004bf7c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdceb7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c27c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdced7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c37c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcee7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c07c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcef7d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c57c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcf07d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004c27c9e00357c9f007ca1000100000000000000017ca2003c2800657d014e2cdcf17d027c05073d061801dbf83c7c08000000007c0900007c0b007c0e007c10177c11027c1202007c1301b87c1b000000007c1d007c240000007c270000007c2901044280007c3a00017c40000000007c57007c7000007c710000000000000000000000007c7242414e445f455f555452415f4f5045524154494e475f42414e445f337c737b013436307b0230337b0300007b04000031f07c74007c75000001007c7600000000007c77000000000000007c780000001e7c790000007c800000000064000064007c8100007c820000000000000000007c83007c84000000000000000000000000000000007c85000000007c86007c87007c88007c89d8d8d8d87c8a007c8b007c8c007c8d0000000000007c8e0000007c8f0000007c90007c91007c92007c93007c94007c95007c96007c97007c98007c99007c9a01020201000201000000007c9b007c9c007c9d0004bf7c9e00357c9f007ca1000100000000000000017ca2003c280065\\\",\\\"direction\\\":\\\"1\\\",\\\"errorMsg\\\":\\\"\\\",\\\"eventId\\\":\\\"50\\\",\\\"extra\\\":\\\"原始报文\\\",\\\"headerPtlVersion\\\":\\\"16\\\",\\\"isEncode\\\":\\\"0\\\",\\\"messageStatus\\\":\\\"2\\\",\\\"messageType\\\":\\\"42\\\",\\\"projectId\\\":\\\"\\\",\\\"receiveDataTime\\\":\\\"2019-08-22 13:51:54\\\",\\\"serviceType\\\":\\\"9\\\"}\n", + "'''\n", + "len(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2240" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(base64.b64encode(gzip.compress(a.encode('utf8'))).hex())" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "b'\\x1f\\x8b\\x08\\x00\\x19]^]\\x02\\xff\\x01x\\x03\\x87\\xfc\\x1f\\x8b\\x08\\x00\\x19]^]\\x02\\xff-\\x92\\xb7\\xba\\x83H\\x14\\x83\\x1f\\x88\\x02\\x18\\xc20\\xa5\\x01\\x13l\\xc0\\xe4\\xd4\\x01\\x83\\x8dM\\xce\\xe1\\xe9\\xf7\\xee~[\\xa9\\xd0\\x91\\xce_Hcg\\xfd&68n(\\x89$@\\xe1\\x819p\\\\Y\\x83d\\x1d\\xcckq\\'~\\x1d\\xee\\xd2\\xe5\\xe3\\xdc\\xd0s\\xbf\\xc7\\xfbC\\xb6\\xb1\\x15\\xa5\\xcd|,\\xed\\x01n\\xce\\xc5>%\\x97\\'\\xca\\xe3.D6\\xfb\\x0e\\x17\\xdf\\xccY\\xf2\\xb5\\x8bz\\xd6>\\x1a\\xd1\\'SD@\\x96\\xa8\\xf8\\xb2\\x0bv\\xbc\\xa43\\xc5\\xc5\\x0f~K\\xe2\\x90\\xa1\\x10Wl\\xa9P^\\xc0S\\x86\\x81dN5\\xf6\\xf2#\\x1e\\x95\\xb6\\xc9\\xfac\\xb2\\xf8%1\\x1a\\xf2\\xd5K\\x816\\x9c\\xe6 \\x90oR\\xd9\\xed\\x1fi\\xfd\\xb8\\xc4\\x88\\xec\\xc8\\xbe\\xafc\\xb7\\x8dCA\\xddu\\x83Mh\\xb7\\xdc0\\xf5\\x94\\xcasV\\xd8\\xb5/\\xcaQC.\\xb2C\\xa2Hi\\xea\\xa1&\\xfc\\xdd\\xa6\\x8d\\xb1[|-\\xac`\\x9e\\x17\\\\\\xf8\\x03\\xf1\\xb1:\\xe6\\x10\\x8b\\x86\\xf7\\xd1\\xfb\\xe1\\xa8\\x06\\xc4e\\xcf}_\\xeb\\xfa\\xb9\\xb6\\x8a\\x7fg&\\x1c\\xf8\\xd6\\x97P${\\xbf\\x98\\xea{\\xd4O6\\xa425X\\r.t\\x06\\xb5\\xaeT\\x96d\\xb81\\x9b}\\xab\\x1eM>\\x0b\\x01\\xd3\\x88\\x9e\\xae\\xca\\x02\\xe7{\\x16\\xe6\\xeb/\\x95\\x17\\x8d\\x11\\xac\\xd1U\\xd6\\x9d\\xe8\\x92\\xeb[J\\xcdy\\xfa\\x8c\\xfayL\\xb9\\n\\x16\\x9cd\\xdf}l\\xa3\\xef\\xe2\\x9c9{\\xdcb\\x93\\xa5\\xb5\\x94[\\x8a\\xec\\x04\\xbfP\\xcaFs2\\xb0\\xe8\\xbf^KJ\\x85\\xee\\xa5\\xf3\\x95\\x1cM\\x19\\xa7\\x04\\xd6\\x12ECP7$\\xe6\\xfb\\x18N!)\\x1b\\xf7\\xe1f\\xb3\\xd7\\x98\\xb7\\x83\\x92\\x06\\x991Vg9\\xfe\\x08\\x8bR\\xd7\\xd3\\xdd\\xaen\\xff]\\xe0\\x01\\x85\\xafG\\xda\\xbd\\x8d[\\x87\\xb4\\x13\\x9bL\\xfb\\x80hB\\xf4x,\\xc4\\xe8, \\xfe-|\\x12-\\x03\\xa9+\\x04\\xa2D$]\\xde31\\x1boe\\xb5L\\xc6\\xee*\\xa9\\xee\\xd4\\x19\\xd8\\xf4\\x0e8\\xd1=O\\x07_AB\\x9eQ\\xc7\\xc3\\xb7u\\x1d2\\xa7\\x8f|\\xcbq:\\xad)\\xc3DGq\\x06\\xc0\\xdc\\xb0\\xb9\\x7f\\xc2w\\xd2\\xad_\\xdb\\xbfb\\xd7nJ\\xaeG\\xa3\\x03ML\\x9b\\x08\\xf8C\\xd3m\\x9e\\x1c\\xec\\x0cu\\xd1\\xe9\\xba\\x84\\x04\\x96\\xde\"\\xfe\\xdb\\xd9\\x90\\xf1\\xb0\\x06\\x1e\\xdf\\x96\\xdc\\x97A\\xe0\\xc9G\\x19\\xef\\xd14\\xf3\\x10,\\xcaD\\x8c\\xb2M\\xf3B\\t4\\xd5\\xc0\\xfe\\xd7Jc\\xdb\\x12\\xf5\\x8a\\x16fi\\xa3\\xbf\\x08|P\\xe0b\\x06\\xb9\\xfe\\xeb\\xa5\\x99\\xf9\\x1c\\xddj\\x1d\\xba\\xf5\\xc4\\xfa\\x82F/\\xbf\\xb8?\\x03\\xbf\\x9a\\x88@\\x0fD\\xd3\\xc27\\xc6\\xa6\\x85L\\xf4\\xa7\\xcc\\xc98\\x17\\x93\\x85\\xc4\\xd7\\xf9\\x9f#\\xe6\\'\\xd1l\\xfe\\xfbI\\x8d \\xcd\\xc7\\x0c\\xd2\"-\\x9a\\xf7\\x7f\\x99\\x99\\x14\\xfb\\xef\\xd9\\x8b\\xdf\\xca\\xbf\\xb7G\\xc6\\x99\\x9ae[\\xf8N\\xdc`oB\\xe0\\xea\\xf7\\x8b\\xf9\\\\\\xcc\\x18\\x94\\xfd\\xae\\xbf\\x88B\\xfc\\xe3\\xdd\\xaa\\xcb\\xc1V\\xfb\\xe2N\\x06Q\\x85\\xd0k\\x83\\xb1e\\x1f)\\x96u\\x91\\xcf \\xd0\\xcd\\x96\\x92\\r\\xeck\\xe5@B\\xe8\\x14\\xf5\\xcd\\x1f\\xa6-\\xc1\\xf1\\xdb\\xb8\\x05 \\x81\\xb3\\x01|5\\xd3f\\xe8\\xf7\\xba\\x9d\\xe7\\x94\\xe1x\\x14\\x12i\\x9e\\x80G\\xdaW\\xa5\\xc4\\xe1\\x9f\\xa1\\xf4O\\xddY6b\\x84\\xeaaG\\x9d\\x81\\xdeo\\xbb\\x83\\xa4`\\xc7\\x90#\\x8b\\xbe\\xa3T\\xdc\\x1bs\\xc8\\x85i4J\\x02x\\xf0+\\xeb\\xb7\\xaf\\x1etv\\x92\\xbf\\xc6X0\\xbc\\x8d@e\\xae=s\\xe0V\\xb3\\x04\\x86~\\x8ec\\x7f\\n\\xd1\\xa7\\xc9\\xaa\\xc8\\x072\\x9d\\xc4\\xa6N\\xeeh\\xce.\\xa3\\x14a\\xa7\\xbb\\x077I\\xd0bD\\xf9\\xb4/X\\xf0^\\xb8\\xdfn\\xff\\x00\\xd9\\xd8}\\x03`\\x04\\x00\\x00\\x0f\\xa7\\xbd\\x83x\\x03\\x00\\x00'" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gzip.compress(gzip.compress(base64.b64encode(gzip.compress(a.encode('utf8')))))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "ename": "JSONDecodeError", + "evalue": "Invalid control character at: line 2 column 16248 (char 16248)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mJSONDecodeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mjson\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.pyenv/versions/3.7.4/lib/python3.7/json/__init__.py\u001b[0m in \u001b[0;36mloads\u001b[0;34m(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)\u001b[0m\n\u001b[1;32m 346\u001b[0m \u001b[0mparse_int\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mparse_float\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 347\u001b[0m parse_constant is None and object_pairs_hook is None and not kw):\n\u001b[0;32m--> 348\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_default_decoder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 349\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 350\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mJSONDecoder\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/3.7.4/lib/python3.7/json/decoder.py\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(self, s, _w)\u001b[0m\n\u001b[1;32m 335\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 336\u001b[0m \"\"\"\n\u001b[0;32m--> 337\u001b[0;31m \u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mraw_decode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0m_w\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 338\u001b[0m \u001b[0mend\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_w\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 339\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mend\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/3.7.4/lib/python3.7/json/decoder.py\u001b[0m in \u001b[0;36mraw_decode\u001b[0;34m(self, s, idx)\u001b[0m\n\u001b[1;32m 351\u001b[0m \"\"\"\n\u001b[1;32m 352\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 353\u001b[0;31m \u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscan_once\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 354\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mStopIteration\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 355\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mJSONDecodeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Expecting value\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mJSONDecodeError\u001b[0m: Invalid control character at: line 2 column 16248 (char 16248)" + ] + } + ], + "source": [ + "json.loads(a)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python-algorithms/DP.ipynb b/py3/algorithms/DP.ipynb similarity index 100% rename from python-algorithms/DP.ipynb rename to py3/algorithms/DP.ipynb diff --git a/python-algorithms/KMP.ipynb b/py3/algorithms/KMP.ipynb similarity index 100% rename from python-algorithms/KMP.ipynb rename to py3/algorithms/KMP.ipynb diff --git a/py3/algorithms/Untitled.ipynb b/py3/algorithms/Untitled.ipynb new file mode 100644 index 00000000..a2b90dcb --- /dev/null +++ b/py3/algorithms/Untitled.ipynb @@ -0,0 +1,62 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tree(root=22, left=tree(root=5, left=tree(root=1, left=None, right=tree(root=2, left=None, right=None)), right=tree(root=8, left=tree(root=6, left=None, right=None), right=tree(root=12, left=None, right=None))), right=tree(root=56, left=tree(root=23, left=None, right=tree(root=54, left=None, right=None)), right=tree(root=89, left=tree(root=68, left=None, right=None), right=tree(root=976, left=None, right=None))))" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from collections import namedtuple\n", + "\n", + "\n", + "Tree = namedtuple('tree', ['root', 'left', 'right'])\n", + "\n", + "def build_obt(data, start, end):\n", + " if end < start:\n", + " return None\n", + "\n", + " mid = (end + start) // 2\n", + " left = build_obt(data, start, mid-1)\n", + " right = build_obt(data, mid+1, end)\n", + " return Tree(root=data[mid], left=left, right=right)\n", + "\n", + "\n", + "\n", + "s = sorted([1,2,6,8,5,22,68,976,23,54,89,12,56])\n", + "build_obt(s, 0, len(s)-1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python-algorithms/data-structure/Recursion.ipynb b/py3/algorithms/data-structure/Recursion.ipynb similarity index 100% rename from python-algorithms/data-structure/Recursion.ipynb rename to py3/algorithms/data-structure/Recursion.ipynb diff --git a/python-algorithms/data-structure/array.ipynb b/py3/algorithms/data-structure/array.ipynb similarity index 100% rename from python-algorithms/data-structure/array.ipynb rename to py3/algorithms/data-structure/array.ipynb diff --git a/python-algorithms/data-structure/heap.ipynb b/py3/algorithms/data-structure/heap.ipynb similarity index 100% rename from python-algorithms/data-structure/heap.ipynb rename to py3/algorithms/data-structure/heap.ipynb diff --git a/python-algorithms/data-structure/stack.ipynb b/py3/algorithms/data-structure/stack.ipynb similarity index 100% rename from python-algorithms/data-structure/stack.ipynb rename to py3/algorithms/data-structure/stack.ipynb diff --git a/python-algorithms/pybloof.ipynb b/py3/algorithms/pybloof.ipynb similarity index 100% rename from python-algorithms/pybloof.ipynb rename to py3/algorithms/pybloof.ipynb diff --git a/python-algorithms/sort.ipynb b/py3/algorithms/sort.ipynb similarity index 93% rename from python-algorithms/sort.ipynb rename to py3/algorithms/sort.ipynb index 61d697b6..ead780fd 100644 --- a/python-algorithms/sort.ipynb +++ b/py3/algorithms/sort.ipynb @@ -12,7 +12,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -58,26 +58,24 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1 loops, best of 3: 646 ms per loop\n" + "603 ms ± 23.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], "source": [ "# 希尔排序\n", - "from math import floor\n", - "\n", "\n", "def shell_sort(numbers):\n", " step = 2\n", " n_numbers = len(numbers)\n", - " n_group = floor(n_numbers / 2)\n", + " n_group = n_numbers // 2\n", " while n_group > 0:\n", " for i in range(n_group):\n", " for j in range(i + n_group, n_numbers):\n", @@ -88,7 +86,7 @@ " numbers[k + n_group] = tmp\n", " numbers[k] = key\n", " \n", - " n_group = floor(n_group / step)\n", + " n_group = n_group // step\n", " \n", " return numbers\n", " \n", @@ -103,14 +101,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "10 loops, best of 3: 59.2 ms per loop\n" + "64.8 ms ± 4.98 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], @@ -118,13 +116,10 @@ "# 冒泡排序\n", "\n", "def bubble_sort(numbers):\n", - " for i, tmp1 in enumerate(numbers):\n", + " for i, tmp in enumerate(numbers):\n", " for j in range(i + 1, len(numbers)):\n", - " tmp2 = numbers[j]\n", - " if tmp1 > tmp2:\n", - " numbers[i] = tmp2\n", - " numbers[j] = tmp1\n", - " tmp1 = tmp2\n", + " if numbers[i] > numbers[j]:\n", + " numbers[i], numbers[j] = numbers[j], numbers[i]\n", " \n", " return numbers\n", "\n", @@ -295,21 +290,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "100 loops, best of 3: 8.6 ms per loop\n" + "7.62 ms ± 752 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], "source": [ "# 归并排序\n", - "from math import floor\n", - "\n", "\n", "def merge_sort(numbers):\n", " size = len(numbers)\n", " if size <= 1:\n", " return numbers\n", " \n", - " threshold = floor(size / 2)\n", + " threshold = size // 2\n", " left = merge_sort(numbers[:threshold])\n", " right = merge_sort(numbers[threshold:])\n", " \n", @@ -399,7 +392,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.2" + "version": "3.7.4" } }, "nbformat": 4, From dba8e0fb47224c03e65935eeddd75d293a4cf2d9 Mon Sep 17 00:00:00 2001 From: Laisky Date: Thu, 10 Oct 2019 15:35:14 +0800 Subject: [PATCH 14/27] prepare ssl --- go.mod | 16 +- go.sum | 73 ++++++++ golang/src/demo/ssl/README.md | 1 + golang/src/demo/ssl/ca.crt | 33 ++++ golang/src/demo/ssl/ca.key | 54 ++++++ golang/src/demo/ssl/ca.key.text | 51 +++++ golang/src/demo/ssl/client.crt | 22 +++ golang/src/demo/ssl/client.csr | 12 ++ golang/src/demo/ssl/client.key | 18 ++ golang/src/demo/ssl/client.key.text | 15 ++ golang/src/demo/ssl/client/client.go | 126 +++++++++++++ golang/src/demo/ssl/csr.json | 12 ++ golang/src/demo/ssl/server.crt | 22 +++ golang/src/demo/ssl/server.csr | 11 ++ golang/src/demo/ssl/server.key | 18 ++ golang/src/demo/ssl/server.key.text | 15 ++ golang/src/demo/ssl/server/server.go | 174 ++++++++++++++++++ .../src/demo/test_uber_guide/channel_test.go | 69 +++++++ golang/src/demo/test_uber_guide/mutex_test.go | 32 ++++ leetcode/python/Lesson 1~10.ipynb | 2 +- py3/gcp/firestore.ipynb | 164 +++++++++++++++++ py3/tutorial/bad_link_code.py | 16 ++ py3/tutorial/good_funcs.py | 20 ++ py3/tutorial/test_demo.py | 21 +++ .../org.eclipse.buildship.core.prefs | 2 +- 25 files changed, 995 insertions(+), 4 deletions(-) create mode 100644 golang/src/demo/ssl/README.md create mode 100644 golang/src/demo/ssl/ca.crt create mode 100644 golang/src/demo/ssl/ca.key create mode 100644 golang/src/demo/ssl/ca.key.text create mode 100644 golang/src/demo/ssl/client.crt create mode 100644 golang/src/demo/ssl/client.csr create mode 100644 golang/src/demo/ssl/client.key create mode 100644 golang/src/demo/ssl/client.key.text create mode 100644 golang/src/demo/ssl/client/client.go create mode 100644 golang/src/demo/ssl/csr.json create mode 100644 golang/src/demo/ssl/server.crt create mode 100644 golang/src/demo/ssl/server.csr create mode 100644 golang/src/demo/ssl/server.key create mode 100644 golang/src/demo/ssl/server.key.text create mode 100644 golang/src/demo/ssl/server/server.go create mode 100644 golang/src/demo/test_uber_guide/channel_test.go create mode 100644 golang/src/demo/test_uber_guide/mutex_test.go create mode 100644 py3/gcp/firestore.ipynb create mode 100644 py3/tutorial/bad_link_code.py create mode 100644 py3/tutorial/good_funcs.py create mode 100644 py3/tutorial/test_demo.py diff --git a/go.mod b/go.mod index 7ae9a9e8..67abeea8 100644 --- a/go.mod +++ b/go.mod @@ -5,15 +5,18 @@ go 1.12 require ( cloud.google.com/go v0.43.0 // indirect github.com/DataDog/zstd v1.4.0 // indirect + github.com/GeertJohan/go.rice v1.0.0 // indirect github.com/Joker/hpp v1.0.0 // indirect github.com/Laisky/go-chaining v0.0.0-20180507092046-43dcdc5a21be github.com/Laisky/go-utils v1.5.2 + github.com/Laisky/zap v1.9.2 github.com/Shopify/sarama v1.23.1 // indirect github.com/appleboy/gofight/v2 v2.1.1 // indirect github.com/astaxie/beego v1.12.0 // indirect github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 // indirect github.com/casbin/casbin v1.9.1 // indirect github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 + github.com/cloudflare/cfssl v0.0.0-20190911221928-1a911ca1b1d6 // indirect github.com/coreos/bbolt v1.3.3 // indirect github.com/coreos/etcd v3.3.13+incompatible // indirect github.com/coreos/go-semver v0.3.0 // indirect @@ -21,28 +24,34 @@ require ( github.com/couchbase/go-couchbase v0.0.0-20190708161019-23e7ca2ce2b7 // indirect github.com/couchbase/gomemcached v0.0.0-20190515232915-c4b4ca0eb21d // indirect github.com/couchbase/goutils v0.0.0-20190315194238-f9d42b11473b // indirect + github.com/daaku/go.zipexe v1.0.1 // indirect github.com/dvyukov/go-fuzz v0.0.0-20190516070045-5cc3605ccbb6 // indirect github.com/dvyukov/go-fuzz-corpus v0.0.0-20190304103735-86a5af9d6842 // indirect github.com/eapache/go-resiliency v1.2.0 // indirect github.com/edsrzf/mmap-go v1.0.0 // indirect github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 // indirect github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gin-gonic/gin v1.4.0 github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31 // indirect github.com/go-kit/kit v0.9.0 // indirect github.com/go-redis/redis v6.15.2+incompatible // indirect github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect github.com/gomarkdown/markdown v0.0.0-20190222000725-ee6a7931a1e4 + github.com/google/certificate-transparency-go v1.0.21 // indirect github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70 // indirect github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect github.com/gorilla/mux v1.7.3 // indirect github.com/gorilla/pat v1.0.1 // indirect github.com/grpc-ecosystem/grpc-gateway v1.9.5 // indirect github.com/jcmturner/gofork v1.0.0 // indirect + github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548 // indirect + github.com/jmoiron/sqlx v1.2.0 // indirect github.com/juju/errors v0.0.0-20190207033735-e65537c515d7 // indirect github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 // indirect github.com/juju/testing v0.0.0-20190613124551-e81189438503 // indirect github.com/kataras/golog v0.0.0-20190624001437-99c81de45f40 // indirect github.com/kisielk/errcheck v1.2.0 // indirect + github.com/kisielk/sqlstruct v0.0.0-20150923205031-648daed35d49 // indirect github.com/klauspost/compress v1.7.4 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kr/pty v1.1.8 // indirect @@ -66,16 +75,19 @@ require ( github.com/tidwall/gjson v1.3.2 // indirect github.com/ugorji/go/codec v1.1.7 github.com/wendal/errors v0.0.0-20181209125328-7f31f4b264ec // indirect + github.com/weppos/publicsuffix-go v0.10.0 // indirect + github.com/zmap/zlint v1.0.2 // indirect go.etcd.io/bbolt v1.3.3 // indirect - golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 // indirect + golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc // indirect golang.org/x/exp v0.0.0-20190718202018-cfdd5522f6f6 // indirect golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9 // indirect golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 // indirect - golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect + golang.org/x/net v0.0.0-20191009170851-d66e71096ffb // indirect golang.org/x/sync v0.0.0-20190423024810-112230192c58 golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect golang.org/x/text v0.3.2 golang.org/x/tools v0.0.0-20190723021737-8bb11ff117ca // indirect + google.golang.org/appengine v1.6.5 // indirect google.golang.org/grpc v1.22.0 // indirect gopkg.in/jcmturner/gokrb5.v7 v7.3.0 // indirect ) diff --git a/go.sum b/go.sum index 27614899..8b060524 100644 --- a/go.sum +++ b/go.sum @@ -2,14 +2,19 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.3.8/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.0/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Depado/ginprom v1.1.2/go.mod h1:OPTeCiC3QLr6QueEA0UNChKGWyxKOqmC4k4WUJUh5lg= +github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= +github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/Joker/hpp v0.0.0-20180418125244-6893e659854a/go.mod h1:MzD2WMdSxvbHw5fM/OXOFily/lipJWRc9C1px0Mt0ZE= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.0.0 h1:lOCEPvTAtWfLpSZYMOv/g44MGQFAolbKh2khHHGu0Kc= github.com/Joker/jade v1.0.0/go.mod h1:efZIdO0py/LtcJRSa/j2WEklMSAw84WV0zZVMxNToB8= github.com/Julusian/godocdown v0.0.0-20170816220326-6d19f8ff2df8/go.mod h1:INZr5t32rG59/5xeltqoCJoNY7e5x/3xoY9WSWVWg74= github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= @@ -24,11 +29,13 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM= github.com/RoaringBitmap/roaring v0.4.18/go.mod h1:D3qVegWTmfCaX4Bl5CrBE9hfrSrrXIr8KVNvRsDi1NI= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 h1:WDC6ySpJzbxGWFh4aMxFFC28wwGp5pEuoTtvA4q/qQ4= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/sarama v1.22.1/go.mod h1:FRzlvRpMFO/639zY1SDxUxkqH97Y0ndM5CbGj6oG3As= github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -38,6 +45,7 @@ github.com/appleboy/gofight/v2 v2.1.1/go.mod h1:6E7pthKhmwss84j/zEixBNim8Q6ahhHc github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/astaxie/beego v1.11.1/go.mod h1:i69hVzgauOPSw5qeyF4GVZhn7Od0yG5bbCGzmhbWxgQ= github.com/astaxie/beego v1.12.0/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o= +github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0= github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= @@ -53,6 +61,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cfssl v0.0.0-20190911221928-1a911ca1b1d6 h1:A7RURps5t4yDU0zktlgrE3Bdmjfv35nVs+xJdoWgIgY= +github.com/cloudflare/cfssl v0.0.0-20190911221928-1a911ca1b1d6/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -71,7 +81,12 @@ github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFl github.com/couchbase/goutils v0.0.0-20190315194238-f9d42b11473b/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= +github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= +github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= +github.com/daaku/go.zipexe v1.0.1 h1:wV4zMsDOI2SZ2m7Tdz1Ps96Zrx+TzaK15VbUaGozw0M= +github.com/daaku/go.zipexe v1.0.1/go.mod h1:5xWogtqlYnfBXkSB1o9xysukNP9GTvaNkqzUZbt3Bw8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -87,18 +102,23 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164/go.mod h1:tbAXHifHQWNSpWbiJHpJTZH5fi3XHhDMdP//vuz9WS4= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 h1:GY1+t5Dr9OKADM64SYnQjw/w99HMYvQ0A8/JoUkxVmc= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gavv/monotime v0.0.0-20190418164738-30dba4353424/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= @@ -111,6 +131,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -123,6 +145,7 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -131,6 +154,8 @@ github.com/gomarkdown/markdown v0.0.0-20190222000725-ee6a7931a1e4/go.mod h1:gmFA github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/certificate-transparency-go v1.0.21 h1:Yf1aXowfZ2nuboBsg7iYGLmwsOARdV86pfH3g95wXmE= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= @@ -159,18 +184,27 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 h1:7GsNnSLoVceNylMpwcfy5aFNz/S5/TV25crb34I5PEo= github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1/go.mod h1:i8kTYUOEstd/S8TG0ChTXQdf4ermA/e8vJX0+QruD9w= +github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce/go.mod h1:VER17o2JZqquOx41avolD/wMGQSFEFBKWmhag9/RQRY= github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548 h1:dYTbLf4m0a5u0KLmPfB6mgxbcV7588bOCx79hxa5Sr4= +github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548/go.mod h1:hGT6jSUVzF6no3QaDSMLGLEHtHSBSefs+MgcDWnmhmo= +github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/errors v0.0.0-20190207033735-e65537c515d7 h1:dMIPRDg6gi7CUp0Kj2+HxqJ5kTr1iAdzsXYIrLCNSmU= github.com/juju/errors v0.0.0-20190207033735-e65537c515d7/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= @@ -179,14 +213,21 @@ github.com/juju/testing v0.0.0-20190613124551-e81189438503/go.mod h1:63prj8cnj0t github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.0-20180321173939-03be10146386/go.mod h1:PcaEvfvhGsqwXZ6S3CgCbmjcp+4UDUh2MIfF2ZEul8M= +github.com/kataras/golog v0.0.0-20190624001437-99c81de45f40 h1:Q/QxpyNBtfkhXE68tnEA4yyqm77eh/3YOjOw875VbBY= github.com/kataras/golog v0.0.0-20190624001437-99c81de45f40/go.mod h1:PcaEvfvhGsqwXZ6S3CgCbmjcp+4UDUh2MIfF2ZEul8M= +github.com/kataras/iris v11.1.1+incompatible h1:c2iRKvKLpTYMXKdVB8YP/+A67NtZFt9kFFy+ZwBhWD0= github.com/kataras/iris v11.1.1+incompatible/go.mod h1:ki9XPua5SyAJbIxDdsssxevgGrbpBmmvoQmo/A0IodY= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d h1:V5Rs9ztEWdp58oayPq/ulmlqJJZeJP6pP79uP3qjcao= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kisielk/sqlstruct v0.0.0-20150923205031-648daed35d49 h1:o/c0aWEP/m6n61xlYW2QP4t9424qlJOsxugn5Zds2Rg= +github.com/kisielk/sqlstruct v0.0.0-20150923205031-648daed35d49/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= github.com/klauspost/compress v1.7.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.7.4 h1:4UqAIzZ1Ns2epCTyJ1d2xMWvxtX+FNSCYWeOFogK9nc= github.com/klauspost/compress v1.7.4/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -199,17 +240,22 @@ github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8c github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4= github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -218,15 +264,18 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= @@ -240,6 +289,7 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/profile v1.3.0/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -263,14 +313,17 @@ github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962/go.mod h1:bCqn github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481/go.mod h1:C9WhFzY47SzYBIvzFqSvHIR6ROgDo4TtdTuRaOMjF/s= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= @@ -300,6 +353,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= @@ -321,6 +375,10 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= github.com/wendal/errors v0.0.0-20181209125328-7f31f4b264ec/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= +github.com/weppos/publicsuffix-go v0.4.0 h1:YSnfg3V65LcCFKtIGKGoBhkyKolEd0hlipcXaOjdnQw= +github.com/weppos/publicsuffix-go v0.4.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= +github.com/weppos/publicsuffix-go v0.10.0 h1:u6FEJZ3kGCsIVns99k49dV9y4cE7dLpdaWscDllWOzQ= +github.com/weppos/publicsuffix-go v0.10.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= @@ -333,6 +391,12 @@ github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmv github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/zmap/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= +github.com/zmap/zcertificate v0.0.0-20180516150559-0e3d58b1bac4/go.mod h1:5iU54tB79AMBcySS0R2XIyZBAVmeHranShAFELYx7is= +github.com/zmap/zcrypto v0.0.0-20190729165852-9051775e6a2e h1:mvOa4+/DXStR4ZXOks/UsjeFdn5O5JpLUtzqk9U8xXw= +github.com/zmap/zcrypto v0.0.0-20190729165852-9051775e6a2e/go.mod h1:w7kd3qXHh8FNaczNjslXqvFQiv5mMWRXlL9klTUAHc8= +github.com/zmap/zlint v1.0.2 h1:07+WuC/prlXVlWa1CJx2lCpuCd8biIeBAVnwTN2CPaA= +github.com/zmap/zlint v1.0.2/go.mod h1:29UiAJNsiVdvTBFCJW8e3q6dcDbOoPkhMgttOSCIMMY= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -352,6 +416,8 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXT golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -383,7 +449,10 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191009170851-d66e71096ffb h1:TR699M2v0qoKTOHxeLgp6zPqaQNs74f01a/ob9W0qko= +golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -443,7 +512,10 @@ google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -461,6 +533,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= diff --git a/golang/src/demo/ssl/README.md b/golang/src/demo/ssl/README.md new file mode 100644 index 00000000..5a83e986 --- /dev/null +++ b/golang/src/demo/ssl/README.md @@ -0,0 +1 @@ +Details: diff --git a/golang/src/demo/ssl/ca.crt b/golang/src/demo/ssl/ca.crt new file mode 100644 index 00000000..cd21d052 --- /dev/null +++ b/golang/src/demo/ssl/ca.crt @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIJAOdAgEw9U786MA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTkxMDEwMDE1MzE0WhcNMjAxMDA5MDE1MzE0WjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAz+vS5dvX9qqcjuxLnsNvq1KU4EJaLOrjfC/+aO40205/qIYHaeXGw+n0 +NxrccXDyXPsHXAGs/806g3Lc8wCuS43rmnpVjqdYLRnFege4OyG+7xmGGjPVtqBh +5agW7cfu8VOcV9Iv0nW/P2MYfN1PjUO4AFy5jaEssZF8av9fsplRKU0ud4ZTGIo3 +gPLPWu2YZRXQHYiMmodS6mn4RYncKTiVSMCkrcOv9rWe0j0JfJC2dIO1aAr/tL2r +7AKS8YchT4+cj/oqR0xIEfVURiYv0o/+PVeENZ/VngBv57qI6b3nEQByL89LyaJh +J+gjSOq9MSQhQQ5YLSkoWsAbOdVahT0IYUy8+GKRY+/98tCCB9k1/Pgwaqd0rfkT +QTtpokxYEmqIQYe/Et/ktOkgud0+isCSL0euo8t4qNkvgCpilEQWDpALIWHVisXk +XruKGnios78I7PNjaVTjq69If0ULl8QhCyYNYHNNoisRIlObdWVWxy5XKgpLutOW +6i8rJvc2CruMr0KWsJ3U8T5Q40uXteUa2o5wH4uvaQkxt0G9XA/iWX+S44blAZYJ +iVCE9Fh6yyimykqIxw+X8qBFjR9ej9jdT/NvfWcx4mbvrRWdDrISgRCckTzO7Oeu +7kGcHCf+a/PAx9NuLMdumrBDMgnejMwe3yanVhyCJZ8MQIsPcIsCAwEAAaOBpzCB +pDAdBgNVHQ4EFgQUyCYrzeVnSsrA100NRLRLRGgthPYwdQYDVR0jBG4wbIAUyCYr +zeVnSsrA100NRLRLRGgthPahSaRHMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpT +b21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGSCCQDn +QIBMPVO/OjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4ICAQDB4MnxGmYF +aPq0atZiqzJMtCC/y/WwsqHkU5Z3p7QC+S11VPI19F3RVpbMDoho/Z5Ds/PWAt6s +AZMoQAmdrst2at47/HQaLeIIGc68vHuBw3Lzzb5gg/USXihBzx9ugABlOb8h1S+T +YXT0TMXwJVgUQmW+2YNjKrd2O/s4PNw5CC3UXkBVdFs/+UG7xA6LSYK8tmX0n0py +pfZqiq0pS8k8JSCsTTmWAD1j3XbVPP+HIzNsKDmNjrrmXSWD7/BKz0Kt9UtmO/Fg +J0QB3zXVznR4rXpM4iQJ0U05Xpq8Km5n13xA8bof+go6nj0GrjA8nucnxH4AsDr6 +yZThU7dV/t2yQskE6eiwAAeN2xOzwQe9dysykTgnznqli7tiYy5U4hdeWR8Yz9DA +GcyJ7D1ultBKZ5hdoa9e+EQOtuMn8+2COHYbPErw7SBlk6ZtQ5kO/rvzYIrVJMbE +CWQCIdDWXNE2IrSchVVrLbcw97tk5FBoFSBUhBEq78zyDgRBiF+ygnT6n+v3YrT7 +/4Qp1sy58pwqnbmbHRPm9q94LGPN//nAbF6KxRe+o3VFOiNDTMD+3PRlICE6P+/Z +I0SAtTOxgZANGPKoRTslIWb/PDA7sHaGZoAIadKQlzJHtDOR1EFwJ6ABFQYz0bVJ +xD7xsZEsYPG8IDIHfH+zEivH7eb8eRbt/Q== +-----END CERTIFICATE----- diff --git a/golang/src/demo/ssl/ca.key b/golang/src/demo/ssl/ca.key new file mode 100644 index 00000000..1eab09e8 --- /dev/null +++ b/golang/src/demo/ssl/ca.key @@ -0,0 +1,54 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,50CDE54058CE3E87 + +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 +-----END RSA PRIVATE KEY----- diff --git a/golang/src/demo/ssl/ca.key.text b/golang/src/demo/ssl/ca.key.text new file mode 100644 index 00000000..cf742648 --- /dev/null +++ b/golang/src/demo/ssl/ca.key.text @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/golang/src/demo/ssl/client.crt b/golang/src/demo/ssl/client.crt new file mode 100644 index 00000000..bda710c9 --- /dev/null +++ b/golang/src/demo/ssl/client.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDpDCCAYwCAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV +BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDAeFw0xOTEwMTAwNzI0MjBaFw0yMDEwMDkwNzI0MjBaMG8xCzAJBgNVBAYTAmNu +MQ4wDAYDVQQIEwVzdGF0ZTEPMA0GA1UEBxMGbGFpc2t5MQ4wDAYDVQQKEwVwYXRl +bzENMAsGA1UECxMEcGFhczEMMAoGA1UEAxMDY3poMRIwEAYJKoZIhvcNAQkBFgNs +bGwwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKbKFqIibZ6yyQ6uPQDj1JmB +yV1T9SPy5lvzrVf4J6Or9wryjLRdLiE/HghEcaqfUYGJ+scA+f3Ihh4MxbJUeDQv +P6Ah/+33tM9HKKN+hSdMhcOmN/Wv1/hNY/g6ylcdV+OBv4avGZZgJLriNX2hkn+3 +fD+WCp/EWfkSA6qi32NxAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAGC9h+fuSkWA +hAKZhbQ7fGaDBKiN6yIZ0eAQZjRw28nM7SzfIyHFiiHXAf9NWgykk2vSqNLeXkkR ++nBYv1bIOhnnWjiKlSWnew1H/ix14EHigK0rZHCOPqV9E6bmbXA+MChk/B+ryVsL +rMRtM3MARrKbPZOMyyLTBKrOFGwxyLPtkIafwWj4/ibQ5wt1j2VEoCEyZpXhIRAk +3U1yIUKmQ/3OxWoTsCzolwEWfrVNw1RClVFyHrS4xaK6SkeiT3goz44CyV37opCN +iXeyC2VARmHcGhTH0fiJjbhUnuMhaJyTq0fVo4hgdH48lBMMptEt8ElIlSpOQyVP +7YnwS0gDpZK8JxoghMeGbMKoZKtAWJYMTOcD0l4HoKqYLYrTuhIzokJ6DrmFA+rX +Z/Z0IAXXVD/vPTVOrrRsWHQPKqkiIhvQe0dSX7m62SsuFOb5Efrk6s1vtRrfNeCf +WByFeqdBWsmWd8VZTL+BEzrBcB/NkuVdo1+crQWyw/e3tyHW6r06MWJS+alWp2uS +JhT2fzBigx+ipDRs+RRnaMmd69ddV3zfE2Ch7Jst1uYZQsC9sYyXxv5NHKAhgBuY +HOwD1SbspdXlPMgph54dL0JPQZAsWvT5SQSZ9ER4tiO/U+f3U3ixGDZhiTOwALp6 +eWApK+Slh2Q3gGS3k32I4A7P45QN/+kb +-----END CERTIFICATE----- diff --git a/golang/src/demo/ssl/client.csr b/golang/src/demo/ssl/client.csr new file mode 100644 index 00000000..f497de63 --- /dev/null +++ b/golang/src/demo/ssl/client.csr @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBrzCCARgCAQAwbzELMAkGA1UEBhMCY24xDjAMBgNVBAgTBXN0YXRlMQ8wDQYD +VQQHEwZsYWlza3kxDjAMBgNVBAoTBXBhdGVvMQ0wCwYDVQQLEwRwYWFzMQwwCgYD +VQQDEwNjemgxEjAQBgkqhkiG9w0BCQEWA2xsbDCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEApsoWoiJtnrLJDq49AOPUmYHJXVP1I/LmW/OtV/gno6v3CvKMtF0u +IT8eCERxqp9RgYn6xwD5/ciGHgzFslR4NC8/oCH/7fe0z0coo36FJ0yFw6Y39a/X ++E1j+DrKVx1X44G/hq8ZlmAkuuI1faGSf7d8P5YKn8RZ+RIDqqLfY3ECAwEAAaAA +MA0GCSqGSIb3DQEBBQUAA4GBAJnGij+wkG9IN5gAsI+UNVc4Ls8iwsvRSFB2751U +ciEtxGlYurTsHgP0LYHDRDuus01yxkD38UdJFwt2lCr+pyc3gDa5MnZ1R1E5m7Jx +u8pen03AmC5jEeA+3tW23RcPj7Cdq2hf7oguR/htJTA9LFcCBmrROi8VTIdI07fU +le5b +-----END CERTIFICATE REQUEST----- diff --git a/golang/src/demo/ssl/client.key b/golang/src/demo/ssl/client.key new file mode 100644 index 00000000..91e586e6 --- /dev/null +++ b/golang/src/demo/ssl/client.key @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,F8AE9065E5E0E8A3 + +LlKvrxNOWjlVneIf+3bV0krkeNyz+Pf/UmfbL7JMtWq/wiu0lHOBTicNo+8SC3IQ +P1Lv95iLFpxWcwKsunV1LsfROciZzD+J3IRzow4gNjzAKVIT1gQQdukECmjxRYHm +aHfuvgDdLSi/7ERGxVDj4qBMQ+vCLKkrL0/ZTDVtECDdDJxEqP1sehMNeo7u1EZg +jHLkubb/uJPo7iygNZDZ2BvF9qnLuY7Tkd8jQmSFIsmIIXvHMVkfFDFeBo/7RuG3 +/RIUc+wpf8rN0J1EAumh6oZrH5K35/V5GLxdsGYNZ5DzS/lp3txw++zad3CjA/Qa +xxTZviIJEk4t/0choKvmIFgOw7vb9ZoFTpkSS4yDzCivN4o26qum+KCEuCnOJ/D/ +k4qidrM2vPRXnAw11nSu9eZvRXrr0bWEDMBDIorKLgUcG5vxmptjOzdbo4wK1N+A +ZCeViX2vH38YfmYY9Bt28HWtwQkuNP6uG6hc35DtxUzX1ffrl8QC3QwkT00O6FQI +S1V0/9XzeDXI7EYOVCUto/5Dk9OgmoJOQVnnuawRo+TYegwYOBCDPKQ//F0oLG6+ +ffXkbL5a9+8FdvsAMOa8T42ZOMlF33oiwYD+I2SUVvdJ9C2pWQa/lENpphUaY2yN +JwwmaOiRmkEhsZPQibv7Y5xiKzktJtM1/hnKXKwg4yQFoY1/pxGai+RnKwSnK5cu +gIJmGmyXUq8Kq5eYGjfr69ht54+4bkEXhQM+XlzfW+gcAG8RCd5T2Oz4F3bY9koG +5tOpzBLUuBxbm23ClsH+wBJ/nLJoNBt9qWTrfUfiScRxmukl/7gKCQ== +-----END RSA PRIVATE KEY----- diff --git a/golang/src/demo/ssl/client.key.text b/golang/src/demo/ssl/client.key.text new file mode 100644 index 00000000..f01a01ce --- /dev/null +++ b/golang/src/demo/ssl/client.key.text @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQCmyhaiIm2esskOrj0A49SZgcldU/Uj8uZb861X+Cejq/cK8oy0 +XS4hPx4IRHGqn1GBifrHAPn9yIYeDMWyVHg0Lz+gIf/t97TPRyijfoUnTIXDpjf1 +r9f4TWP4OspXHVfjgb+GrxmWYCS64jV9oZJ/t3w/lgqfxFn5EgOqot9jcQIDAQAB +AoGAEqBpDKxZn6qJx6jvySSofog/C7wvmVcsIMLC7hsZmi6/RSq3SgFKAI6C9Rtn +sk1eld/p8MWMJap6R+rXPUYvsj4YCBhzaYppQ2zQdkp6ehA20Foy3gLVrSc9LktX +vyiAZ0Gk1U4plN+0K6q/IPLQ7iGP/ZhEfJOFPW+whqgV8O0CQQDRoGETMNXX9GPT +nXJlYhIKo6XY2vdo/4GLi2D5qED4R0zPVnu2FrhI+786meVqi3NgwbCWckr+VO9N +d2q/Y7ljAkEAy6+/wgz4OxNtTWwX2Ld5MuHaDOjcW+m1TMPLqtVl/ViCwhO8EE9l +nj3RDhlQcXGyQS2p9P54hS2LJt7slfyyGwJBAIRvSmURaUhyAc9jnS4n8zX9hX2n +eL9BDNrYR3/yqHkysngbLzUuzWZuhbXEHIhfaZkrRSEHPBHKHxVV6H7ZxfkCQEjD +fAligLr58a4a01oEETPwIulBtpbPIolN2NAqc8jRecTDMAfTlUW2Z5xVxrsAFuHZ +4kE3Nu68ml1EfdgG8ckCQQDJjHw2lZQbJGyrg7V0o3tOSPiyA6KPGwES8IJRuL7o +wYWUbvrJmhZ9RNQUgeIFE6npESMvKj3nX/RROzrG9s1j +-----END RSA PRIVATE KEY----- diff --git a/golang/src/demo/ssl/client/client.go b/golang/src/demo/ssl/client/client.go new file mode 100644 index 00000000..6e9dbff4 --- /dev/null +++ b/golang/src/demo/ssl/client/client.go @@ -0,0 +1,126 @@ +package main + +import ( + "bufio" + "crypto/tls" + "crypto/x509" + "time" + + "github.com/Laisky/go-utils" + "github.com/Laisky/zap" +) + +var ( + clientKey = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQCmyhaiIm2esskOrj0A49SZgcldU/Uj8uZb861X+Cejq/cK8oy0 +XS4hPx4IRHGqn1GBifrHAPn9yIYeDMWyVHg0Lz+gIf/t97TPRyijfoUnTIXDpjf1 +r9f4TWP4OspXHVfjgb+GrxmWYCS64jV9oZJ/t3w/lgqfxFn5EgOqot9jcQIDAQAB +AoGAEqBpDKxZn6qJx6jvySSofog/C7wvmVcsIMLC7hsZmi6/RSq3SgFKAI6C9Rtn +sk1eld/p8MWMJap6R+rXPUYvsj4YCBhzaYppQ2zQdkp6ehA20Foy3gLVrSc9LktX +vyiAZ0Gk1U4plN+0K6q/IPLQ7iGP/ZhEfJOFPW+whqgV8O0CQQDRoGETMNXX9GPT +nXJlYhIKo6XY2vdo/4GLi2D5qED4R0zPVnu2FrhI+786meVqi3NgwbCWckr+VO9N +d2q/Y7ljAkEAy6+/wgz4OxNtTWwX2Ld5MuHaDOjcW+m1TMPLqtVl/ViCwhO8EE9l +nj3RDhlQcXGyQS2p9P54hS2LJt7slfyyGwJBAIRvSmURaUhyAc9jnS4n8zX9hX2n +eL9BDNrYR3/yqHkysngbLzUuzWZuhbXEHIhfaZkrRSEHPBHKHxVV6H7ZxfkCQEjD +fAligLr58a4a01oEETPwIulBtpbPIolN2NAqc8jRecTDMAfTlUW2Z5xVxrsAFuHZ +4kE3Nu68ml1EfdgG8ckCQQDJjHw2lZQbJGyrg7V0o3tOSPiyA6KPGwES8IJRuL7o +wYWUbvrJmhZ9RNQUgeIFE6npESMvKj3nX/RROzrG9s1j +-----END RSA PRIVATE KEY-----`) + clientCrt = []byte(`-----BEGIN CERTIFICATE----- +MIIDpDCCAYwCAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV +BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDAeFw0xOTEwMTAwNzI0MjBaFw0yMDEwMDkwNzI0MjBaMG8xCzAJBgNVBAYTAmNu +MQ4wDAYDVQQIEwVzdGF0ZTEPMA0GA1UEBxMGbGFpc2t5MQ4wDAYDVQQKEwVwYXRl +bzENMAsGA1UECxMEcGFhczEMMAoGA1UEAxMDY3poMRIwEAYJKoZIhvcNAQkBFgNs +bGwwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKbKFqIibZ6yyQ6uPQDj1JmB +yV1T9SPy5lvzrVf4J6Or9wryjLRdLiE/HghEcaqfUYGJ+scA+f3Ihh4MxbJUeDQv +P6Ah/+33tM9HKKN+hSdMhcOmN/Wv1/hNY/g6ylcdV+OBv4avGZZgJLriNX2hkn+3 +fD+WCp/EWfkSA6qi32NxAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAGC9h+fuSkWA +hAKZhbQ7fGaDBKiN6yIZ0eAQZjRw28nM7SzfIyHFiiHXAf9NWgykk2vSqNLeXkkR ++nBYv1bIOhnnWjiKlSWnew1H/ix14EHigK0rZHCOPqV9E6bmbXA+MChk/B+ryVsL +rMRtM3MARrKbPZOMyyLTBKrOFGwxyLPtkIafwWj4/ibQ5wt1j2VEoCEyZpXhIRAk +3U1yIUKmQ/3OxWoTsCzolwEWfrVNw1RClVFyHrS4xaK6SkeiT3goz44CyV37opCN +iXeyC2VARmHcGhTH0fiJjbhUnuMhaJyTq0fVo4hgdH48lBMMptEt8ElIlSpOQyVP +7YnwS0gDpZK8JxoghMeGbMKoZKtAWJYMTOcD0l4HoKqYLYrTuhIzokJ6DrmFA+rX +Z/Z0IAXXVD/vPTVOrrRsWHQPKqkiIhvQe0dSX7m62SsuFOb5Efrk6s1vtRrfNeCf +WByFeqdBWsmWd8VZTL+BEzrBcB/NkuVdo1+crQWyw/e3tyHW6r06MWJS+alWp2uS +JhT2fzBigx+ipDRs+RRnaMmd69ddV3zfE2Ch7Jst1uYZQsC9sYyXxv5NHKAhgBuY +HOwD1SbspdXlPMgph54dL0JPQZAsWvT5SQSZ9ER4tiO/U+f3U3ixGDZhiTOwALp6 +eWApK+Slh2Q3gGS3k32I4A7P45QN/+kb +-----END CERTIFICATE-----`) + caCrt = []byte(`-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIJAOdAgEw9U786MA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTkxMDEwMDE1MzE0WhcNMjAxMDA5MDE1MzE0WjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAz+vS5dvX9qqcjuxLnsNvq1KU4EJaLOrjfC/+aO40205/qIYHaeXGw+n0 +NxrccXDyXPsHXAGs/806g3Lc8wCuS43rmnpVjqdYLRnFege4OyG+7xmGGjPVtqBh +5agW7cfu8VOcV9Iv0nW/P2MYfN1PjUO4AFy5jaEssZF8av9fsplRKU0ud4ZTGIo3 +gPLPWu2YZRXQHYiMmodS6mn4RYncKTiVSMCkrcOv9rWe0j0JfJC2dIO1aAr/tL2r +7AKS8YchT4+cj/oqR0xIEfVURiYv0o/+PVeENZ/VngBv57qI6b3nEQByL89LyaJh +J+gjSOq9MSQhQQ5YLSkoWsAbOdVahT0IYUy8+GKRY+/98tCCB9k1/Pgwaqd0rfkT +QTtpokxYEmqIQYe/Et/ktOkgud0+isCSL0euo8t4qNkvgCpilEQWDpALIWHVisXk +XruKGnios78I7PNjaVTjq69If0ULl8QhCyYNYHNNoisRIlObdWVWxy5XKgpLutOW +6i8rJvc2CruMr0KWsJ3U8T5Q40uXteUa2o5wH4uvaQkxt0G9XA/iWX+S44blAZYJ +iVCE9Fh6yyimykqIxw+X8qBFjR9ej9jdT/NvfWcx4mbvrRWdDrISgRCckTzO7Oeu +7kGcHCf+a/PAx9NuLMdumrBDMgnejMwe3yanVhyCJZ8MQIsPcIsCAwEAAaOBpzCB +pDAdBgNVHQ4EFgQUyCYrzeVnSsrA100NRLRLRGgthPYwdQYDVR0jBG4wbIAUyCYr +zeVnSsrA100NRLRLRGgthPahSaRHMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpT +b21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGSCCQDn +QIBMPVO/OjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4ICAQDB4MnxGmYF +aPq0atZiqzJMtCC/y/WwsqHkU5Z3p7QC+S11VPI19F3RVpbMDoho/Z5Ds/PWAt6s +AZMoQAmdrst2at47/HQaLeIIGc68vHuBw3Lzzb5gg/USXihBzx9ugABlOb8h1S+T +YXT0TMXwJVgUQmW+2YNjKrd2O/s4PNw5CC3UXkBVdFs/+UG7xA6LSYK8tmX0n0py +pfZqiq0pS8k8JSCsTTmWAD1j3XbVPP+HIzNsKDmNjrrmXSWD7/BKz0Kt9UtmO/Fg +J0QB3zXVznR4rXpM4iQJ0U05Xpq8Km5n13xA8bof+go6nj0GrjA8nucnxH4AsDr6 +yZThU7dV/t2yQskE6eiwAAeN2xOzwQe9dysykTgnznqli7tiYy5U4hdeWR8Yz9DA +GcyJ7D1ultBKZ5hdoa9e+EQOtuMn8+2COHYbPErw7SBlk6ZtQ5kO/rvzYIrVJMbE +CWQCIdDWXNE2IrSchVVrLbcw97tk5FBoFSBUhBEq78zyDgRBiF+ygnT6n+v3YrT7 +/4Qp1sy58pwqnbmbHRPm9q94LGPN//nAbF6KxRe+o3VFOiNDTMD+3PRlICE6P+/Z +I0SAtTOxgZANGPKoRTslIWb/PDA7sHaGZoAIadKQlzJHtDOR1EFwJ6ABFQYz0bVJ +xD7xsZEsYPG8IDIHfH+zEivH7eb8eRbt/Q== +-----END CERTIFICATE-----`) +) + +const ( + addr = "127.0.0.1:24444" +) + +func main() { + cliCrt, err := tls.X509KeyPair(clientCrt, clientKey) + if err != nil { + utils.Logger.Panic("try to load key & crt got error", zap.Error(err)) + } + + // load ca + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(caCrt) + + // https tls config + tlsConfig := &tls.Config{ + Certificates: []tls.Certificate{cliCrt}, + RootCAs: caCertPool, + InsecureSkipVerify: true, + } + tlsConfig.BuildNameToCertificate() + + conn, err := tls.Dial("tcp", addr, tlsConfig) + if err != nil { + utils.Logger.Panic("try to dial tcp got error", zap.Error(err)) + } + defer conn.Close() + + writer := bufio.NewWriter(conn) + utils.Logger.Info("start writing") + for { + utils.Logger.Info("sending...") + if _, err = writer.WriteString("hello, world\n"); err != nil { + utils.Logger.Panic("try to write got error", zap.Error(err)) + } + if err = writer.Flush(); err != nil { + utils.Logger.Panic("try to flush got error", zap.Error(err)) + } + time.Sleep(1 * time.Second) + } +} diff --git a/golang/src/demo/ssl/csr.json b/golang/src/demo/ssl/csr.json new file mode 100644 index 00000000..ca0cb1a3 --- /dev/null +++ b/golang/src/demo/ssl/csr.json @@ -0,0 +1,12 @@ +{ + "CN": "127.0.0.1:24444", + "names": [ + { + "C": "US", + "L": "San Francisco", + "O": "Internet Widgets, Inc.", + "OU": "WWW", + "ST": "California" + } + ] +} diff --git a/golang/src/demo/ssl/server.crt b/golang/src/demo/ssl/server.crt new file mode 100644 index 00000000..8012352a --- /dev/null +++ b/golang/src/demo/ssl/server.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDnjCCAYYCAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV +BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDAeFw0xOTEwMTAwNzEyMjdaFw0yMDEwMDkwNzEyMjdaMGkxCzAJBgNVBAYTAmNu +MRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRz +IFB0eSBMdGQxIjAgBgNVBAMTGTEyNy4wLjAuMToyNDQ0NCwxMjcuMC4wLjEwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALOC5Y1g6gSBk2knkxj6wcKJK801bHzh +ig38nBuxeR1+dWfwC6u59Spd301VUGbbgn0NJtz6RyIhtB6uq5Wkep2396Ry5UEO +e1rkvmbgN0L3GNio1x+dw6nRzGSULFikFperIpX89khUWRqQOO7M+winCu4XNWnW +BdNhB+2ITR4ZAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAGoP0P6zIQpXUzZrFalI +J97f1hzkW+BwqZ0XtYWF+8Tb2aWHfr6CmU20XezoJ84eE5cAc5XcWB2ez5ETznq4 +7NXA31lN/khjJJUxKkJhE1Ct9E+e6gGMn4DR0ZdlfvPp72KqTBhe24bnSSGcS34d +AGtkN1EpexIONXYGARCANWTMe4cQgmaKN09raTxEuVM+jrGDiMfaSm0st2zO/l/S +EcQ2UQ1XLoUOqCrjFM038vxKvFvEkdDaz5VdoPCDGb0pVxYCj70ClD7VOWGIl70a +37Tih9K5FH3VKMQQwZjeB/2Mxn5JkGthRCi/G2H7CCw1gAXphhvPWYar/lVDDGNv +7BlmNwwHDnsG/i/EB9ieUhSdGdbJ8rBZ6gSGx4cWFSRPhIsDO+GZClvjgs8LXN7m +1mfCwF4RmuBSzcPY/QQCnpSH6mYqn7fOaKMCKwQL3x5V7aif2UfG94CTJL2LnRkw +dB3rgzHqbwKiS4iXvaNSehIm0mzw0aNN81kmStCB5NmHv66YIFlznss0iH+QUf6y +/hdqWwd1FW1drzj4OKY23V3e64+AkEzRyWk6SVpLCZuxqAys4ooiYH+bj0GDsrLc +fxpOUjHiuboitqxZ8fE+pVGbGXQWHrtwRg02l9ga5Rainyo4gAj+Zoiy/acbuMDV +bd2si0VgwJ2KiU68GiRJr1ck +-----END CERTIFICATE----- diff --git a/golang/src/demo/ssl/server.csr b/golang/src/demo/ssl/server.csr new file mode 100644 index 00000000..07f320a9 --- /dev/null +++ b/golang/src/demo/ssl/server.csr @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBqTCCARICAQAwaTELMAkGA1UEBhMCY24xEzARBgNVBAgTClNvbWUtU3RhdGUx +ITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEiMCAGA1UEAxMZMTI3 +LjAuMC4xOjI0NDQ0LDEyNy4wLjAuMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC +gYEAs4LljWDqBIGTaSeTGPrBwokrzTVsfOGKDfycG7F5HX51Z/ALq7n1Kl3fTVVQ +ZtuCfQ0m3PpHIiG0Hq6rlaR6nbf3pHLlQQ57WuS+ZuA3QvcY2KjXH53DqdHMZJQs +WKQWl6silfz2SFRZGpA47sz7CKcK7hc1adYF02EH7YhNHhkCAwEAAaAAMA0GCSqG +SIb3DQEBBQUAA4GBABax4w7wgn7Llgp457NkCtJgFs1bizX4ySoX/GIoZI8VuYYW +XE2ov0FbFfV8G7SG+2yY6Z9yYbDUT59V/5v73MSNLnkcc6HQybQr4v6t1MJMzRIT +6KLMWqXdeluHTW3A5csAtIYDPPcuj/T2rmmndeh52NJCLPmEqtGO2FVzX7lE +-----END CERTIFICATE REQUEST----- diff --git a/golang/src/demo/ssl/server.key b/golang/src/demo/ssl/server.key new file mode 100644 index 00000000..61674a61 --- /dev/null +++ b/golang/src/demo/ssl/server.key @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,CD504D99958AE6B8 + +rgMkaV8OwDQdUr0nhHQKjKtZVUahAX17EM60oDwa7+gfPEHl+m/e339mW3/x0BoC +9cw4s3FVOC3YztAswTJ53uiEumFF4Bd0zI6Jo/UjkEN0fdMa4SqhMK5fZ7sanJlY +b0HvxgSM5bjLnEOkZcYHt/2cA30moK9QIAvh65I4MBlkLrz/i7M7QraXy/ccEoJH +xtZbYbFBSNQB01GzkPJBP0L36AI5jUurL+9qzRZzhVZtEmi9WmvVr9hBnHGLLmJD +OpPl7vhd6T04cIdT30DkgEK0OPdG2JkCav1bmDSL4E33QuX9D0VmpCyftKkh2N/w +nRBFT9vQbJ45O+qPy2sOOW22GHCji3bcbYzS2IE1siOMJuI+Rgvwy9ELPjE5Yfjv +Q+G1yxgYBmwSTWJRBXAEFGJRGdv43lJzwOXppytHVHoYg2tjQvC4cuOJaciXssrP +Yp6S/YKhMfuCJ3DvWnBA5SZ8yihrnJEzbOnkJOZDoK4nyXfdlgaBEWq2AN7MvJjn +1+Lz5weZAttFpU7NWcBtUY8TqCnrMhs/+AlJ5pqchpU0vxtcjGKFtiEB0dfJS8mD +CCanmotPKRl0suaq2c6Q3bIi+DaYoMy7pYzlbaVYMneJaSnHPlx/aka+WgKl3Dfk +NzPpbTsO95KoWaXb3ocCltl9fv7J3++TAabRYsZBn0k/CSuG42wcwgVNy30rgDrq +wuPeYi1ab5MseyA1U/yueE06eKsYycISAFva2/Agqa8gyOjWMYibI6xRthMXzQc/ +0Vvj2Q2U03Hu/9Zn0V86l2KQ5Y1j2bhy8vO6FdKwZc/q3VfnhhNy4w== +-----END RSA PRIVATE KEY----- diff --git a/golang/src/demo/ssl/server.key.text b/golang/src/demo/ssl/server.key.text new file mode 100644 index 00000000..6d733eb2 --- /dev/null +++ b/golang/src/demo/ssl/server.key.text @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXwIBAAKBgQCzguWNYOoEgZNpJ5MY+sHCiSvNNWx84YoN/JwbsXkdfnVn8Aur +ufUqXd9NVVBm24J9DSbc+kciIbQerquVpHqdt/ekcuVBDnta5L5m4DdC9xjYqNcf +ncOp0cxklCxYpBaXqyKV/PZIVFkakDjuzPsIpwruFzVp1gXTYQftiE0eGQIDAQAB +AoGBAKj++CDrNiTb3+1FJoSDvdnozWW5f9LpedDFGiowIDeWD+2z3SjkPlyOV2U0 +hibvTJ9xvD6ZGFKXrDyecEbGu+8fldTGZOKzve9fhNNPK6pVE8FT6lyEmGfZhOoH +uO2L0rjrI0Sb4GzSb/GW43IBTA8JHRTNN/DyNrHn/+PS2r2hAkEA3lGRPDOikBA+ +WkPCiNicQzZmX/68wv0Lx76MevcFqBjQQ1BvO1JQN5t6urqfqQ1H1RZss73IvE// +p/gnuBqGDQJBAM61FeSjyg7q1DBOkLUDnE00/4JyQ1/c9pv880X7otiKAPCFZlWs +Q8hXiUiUr7tNF9dsXn3+lj7QdNXKtIQhoT0CQQCPBWhqk0lEZr7GMQtIIBm+/5My +tF1ZD5Nxh7s2LA4+iuAIPgmg3x5t958n24F1Lu8EPa3mn/QweUKeG33p6V5NAkEA +nAwC2hd4G6jVxR4aijyOi46d8ZlXGZCTL5FXChb8ieIs8WaTqcuhZCYJQpzUyV5a +yEtMTmuaexMdkKQ1gKZutQJBAKMNnhMLAspV49zjW43y7MpKtx9UcwhRWBJk+Qgq +U/bp2jv5RlBg1cCmdZn1rAnYbV+kubJ93X+NnQc2sKtsuYA= +-----END RSA PRIVATE KEY----- diff --git a/golang/src/demo/ssl/server/server.go b/golang/src/demo/ssl/server/server.go new file mode 100644 index 00000000..7bf878c5 --- /dev/null +++ b/golang/src/demo/ssl/server/server.go @@ -0,0 +1,174 @@ +package main + +import ( + "bufio" + "crypto/tls" + "crypto/x509" + "fmt" + "net" + + "github.com/Laisky/go-utils" + "github.com/Laisky/zap" +) + +var ( + serverKey = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIICXwIBAAKBgQCzguWNYOoEgZNpJ5MY+sHCiSvNNWx84YoN/JwbsXkdfnVn8Aur +ufUqXd9NVVBm24J9DSbc+kciIbQerquVpHqdt/ekcuVBDnta5L5m4DdC9xjYqNcf +ncOp0cxklCxYpBaXqyKV/PZIVFkakDjuzPsIpwruFzVp1gXTYQftiE0eGQIDAQAB +AoGBAKj++CDrNiTb3+1FJoSDvdnozWW5f9LpedDFGiowIDeWD+2z3SjkPlyOV2U0 +hibvTJ9xvD6ZGFKXrDyecEbGu+8fldTGZOKzve9fhNNPK6pVE8FT6lyEmGfZhOoH +uO2L0rjrI0Sb4GzSb/GW43IBTA8JHRTNN/DyNrHn/+PS2r2hAkEA3lGRPDOikBA+ +WkPCiNicQzZmX/68wv0Lx76MevcFqBjQQ1BvO1JQN5t6urqfqQ1H1RZss73IvE// +p/gnuBqGDQJBAM61FeSjyg7q1DBOkLUDnE00/4JyQ1/c9pv880X7otiKAPCFZlWs +Q8hXiUiUr7tNF9dsXn3+lj7QdNXKtIQhoT0CQQCPBWhqk0lEZr7GMQtIIBm+/5My +tF1ZD5Nxh7s2LA4+iuAIPgmg3x5t958n24F1Lu8EPa3mn/QweUKeG33p6V5NAkEA +nAwC2hd4G6jVxR4aijyOi46d8ZlXGZCTL5FXChb8ieIs8WaTqcuhZCYJQpzUyV5a +yEtMTmuaexMdkKQ1gKZutQJBAKMNnhMLAspV49zjW43y7MpKtx9UcwhRWBJk+Qgq +U/bp2jv5RlBg1cCmdZn1rAnYbV+kubJ93X+NnQc2sKtsuYA= +-----END RSA PRIVATE KEY-----`) + serverCrt = []byte(`-----BEGIN CERTIFICATE----- +MIIDnjCCAYYCAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV +BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDAeFw0xOTEwMTAwNzEyMjdaFw0yMDEwMDkwNzEyMjdaMGkxCzAJBgNVBAYTAmNu +MRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRz +IFB0eSBMdGQxIjAgBgNVBAMTGTEyNy4wLjAuMToyNDQ0NCwxMjcuMC4wLjEwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALOC5Y1g6gSBk2knkxj6wcKJK801bHzh +ig38nBuxeR1+dWfwC6u59Spd301VUGbbgn0NJtz6RyIhtB6uq5Wkep2396Ry5UEO +e1rkvmbgN0L3GNio1x+dw6nRzGSULFikFperIpX89khUWRqQOO7M+winCu4XNWnW +BdNhB+2ITR4ZAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAGoP0P6zIQpXUzZrFalI +J97f1hzkW+BwqZ0XtYWF+8Tb2aWHfr6CmU20XezoJ84eE5cAc5XcWB2ez5ETznq4 +7NXA31lN/khjJJUxKkJhE1Ct9E+e6gGMn4DR0ZdlfvPp72KqTBhe24bnSSGcS34d +AGtkN1EpexIONXYGARCANWTMe4cQgmaKN09raTxEuVM+jrGDiMfaSm0st2zO/l/S +EcQ2UQ1XLoUOqCrjFM038vxKvFvEkdDaz5VdoPCDGb0pVxYCj70ClD7VOWGIl70a +37Tih9K5FH3VKMQQwZjeB/2Mxn5JkGthRCi/G2H7CCw1gAXphhvPWYar/lVDDGNv +7BlmNwwHDnsG/i/EB9ieUhSdGdbJ8rBZ6gSGx4cWFSRPhIsDO+GZClvjgs8LXN7m +1mfCwF4RmuBSzcPY/QQCnpSH6mYqn7fOaKMCKwQL3x5V7aif2UfG94CTJL2LnRkw +dB3rgzHqbwKiS4iXvaNSehIm0mzw0aNN81kmStCB5NmHv66YIFlznss0iH+QUf6y +/hdqWwd1FW1drzj4OKY23V3e64+AkEzRyWk6SVpLCZuxqAys4ooiYH+bj0GDsrLc +fxpOUjHiuboitqxZ8fE+pVGbGXQWHrtwRg02l9ga5Rainyo4gAj+Zoiy/acbuMDV +bd2si0VgwJ2KiU68GiRJr1ck +-----END CERTIFICATE-----`) + caCrt = []byte(`-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIJAOdAgEw9U786MA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTkxMDEwMDE1MzE0WhcNMjAxMDA5MDE1MzE0WjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAz+vS5dvX9qqcjuxLnsNvq1KU4EJaLOrjfC/+aO40205/qIYHaeXGw+n0 +NxrccXDyXPsHXAGs/806g3Lc8wCuS43rmnpVjqdYLRnFege4OyG+7xmGGjPVtqBh +5agW7cfu8VOcV9Iv0nW/P2MYfN1PjUO4AFy5jaEssZF8av9fsplRKU0ud4ZTGIo3 +gPLPWu2YZRXQHYiMmodS6mn4RYncKTiVSMCkrcOv9rWe0j0JfJC2dIO1aAr/tL2r +7AKS8YchT4+cj/oqR0xIEfVURiYv0o/+PVeENZ/VngBv57qI6b3nEQByL89LyaJh +J+gjSOq9MSQhQQ5YLSkoWsAbOdVahT0IYUy8+GKRY+/98tCCB9k1/Pgwaqd0rfkT +QTtpokxYEmqIQYe/Et/ktOkgud0+isCSL0euo8t4qNkvgCpilEQWDpALIWHVisXk +XruKGnios78I7PNjaVTjq69If0ULl8QhCyYNYHNNoisRIlObdWVWxy5XKgpLutOW +6i8rJvc2CruMr0KWsJ3U8T5Q40uXteUa2o5wH4uvaQkxt0G9XA/iWX+S44blAZYJ +iVCE9Fh6yyimykqIxw+X8qBFjR9ej9jdT/NvfWcx4mbvrRWdDrISgRCckTzO7Oeu +7kGcHCf+a/PAx9NuLMdumrBDMgnejMwe3yanVhyCJZ8MQIsPcIsCAwEAAaOBpzCB +pDAdBgNVHQ4EFgQUyCYrzeVnSsrA100NRLRLRGgthPYwdQYDVR0jBG4wbIAUyCYr +zeVnSsrA100NRLRLRGgthPahSaRHMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpT +b21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGSCCQDn +QIBMPVO/OjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4ICAQDB4MnxGmYF +aPq0atZiqzJMtCC/y/WwsqHkU5Z3p7QC+S11VPI19F3RVpbMDoho/Z5Ds/PWAt6s +AZMoQAmdrst2at47/HQaLeIIGc68vHuBw3Lzzb5gg/USXihBzx9ugABlOb8h1S+T +YXT0TMXwJVgUQmW+2YNjKrd2O/s4PNw5CC3UXkBVdFs/+UG7xA6LSYK8tmX0n0py +pfZqiq0pS8k8JSCsTTmWAD1j3XbVPP+HIzNsKDmNjrrmXSWD7/BKz0Kt9UtmO/Fg +J0QB3zXVznR4rXpM4iQJ0U05Xpq8Km5n13xA8bof+go6nj0GrjA8nucnxH4AsDr6 +yZThU7dV/t2yQskE6eiwAAeN2xOzwQe9dysykTgnznqli7tiYy5U4hdeWR8Yz9DA +GcyJ7D1ultBKZ5hdoa9e+EQOtuMn8+2COHYbPErw7SBlk6ZtQ5kO/rvzYIrVJMbE +CWQCIdDWXNE2IrSchVVrLbcw97tk5FBoFSBUhBEq78zyDgRBiF+ygnT6n+v3YrT7 +/4Qp1sy58pwqnbmbHRPm9q94LGPN//nAbF6KxRe+o3VFOiNDTMD+3PRlICE6P+/Z +I0SAtTOxgZANGPKoRTslIWb/PDA7sHaGZoAIadKQlzJHtDOR1EFwJ6ABFQYz0bVJ +xD7xsZEsYPG8IDIHfH+zEivH7eb8eRbt/Q== +-----END CERTIFICATE-----`) +) + +const ( + addr = "127.0.0.1:24444" +) + +func main() { + srvCert, err := tls.X509KeyPair(serverCrt, serverKey) + if err != nil { + utils.Logger.Panic("try to load key & crt got error", zap.Error(err)) + } + + // load ca + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(caCrt) + + // https tls config + tlsConfig := &tls.Config{ + Certificates: []tls.Certificate{srvCert}, + // RootCAs: caCertPool, + ClientCAs: caCertPool, + InsecureSkipVerify: false, + ClientAuth: tls.RequireAndVerifyClientCert, + } + tlsConfig.BuildNameToCertificate() + +LISTEN_LOOP: + for { + // tlsConfig.BuildNameToCertificate() + ln, err := tls.Listen("tcp", addr, tlsConfig) + if err != nil { + utils.Logger.Error("try to listen tcp got error", zap.Error(err)) + break LISTEN_LOOP + } + utils.Logger.Info("listening...", zap.String("addr", addr)) + + var ( + tlsConn *tls.Conn + ok bool + ) + ACCEPT_LOOP: + for { + conn, err := ln.Accept() + if err != nil { + utils.Logger.Error("accept conn got error", zap.Error(err)) + break ACCEPT_LOOP + } + if tlsConn, ok = conn.(*tls.Conn); !ok { + utils.Logger.Info("refuse connection since tls error") + continue ACCEPT_LOOP + } + + state := tlsConn.ConnectionState() + fmt.Printf(">> Version: %x\n", state.Version) + fmt.Printf(">> HandshakeComplete: %t\n", state.HandshakeComplete) + fmt.Printf(">> DidResume: %t\n", state.DidResume) + fmt.Printf(">> CipherSuite: %x\n", state.CipherSuite) + fmt.Printf(">> NegotiatedProtocol: %s\n", state.NegotiatedProtocol) + fmt.Printf(">> NegotiatedProtocolIsMutual: %t\n", state.NegotiatedProtocolIsMutual) + for i, cert := range state.PeerCertificates { + subject := cert.Subject + issuer := cert.Issuer + fmt.Printf(">> %d s:/C=%v/ST=%v/L=%v/O=%v/OU=%v/CN=%s\n", i, subject.Country, subject.Province, subject.Locality, subject.Organization, subject.OrganizationalUnit, subject.CommonName) + fmt.Printf(">> i:/C=%v/ST=%v/L=%v/O=%v/OU=%v/CN=%s\n", issuer.Country, issuer.Province, issuer.Locality, issuer.Organization, issuer.OrganizationalUnit, issuer.CommonName) + } + + go handle(tlsConn) + } + ln.Close() + } +} + +func handle(conn net.Conn) { + utils.Logger.Info("got connection", zap.String("remote", conn.RemoteAddr().String())) + defer utils.Logger.Info("close connection", zap.String("remote", conn.RemoteAddr().String())) + defer conn.Close() + reader := bufio.NewReader(conn) + var ( + err error + content string + ) + for { + if content, err = reader.ReadString('\n'); err != nil { + utils.Logger.Error("try to read got error", zap.Error(err)) + break + } + + utils.Logger.Info("got", zap.String("cnt", content)) + } +} diff --git a/golang/src/demo/test_uber_guide/channel_test.go b/golang/src/demo/test_uber_guide/channel_test.go new file mode 100644 index 00000000..7cd4b6b5 --- /dev/null +++ b/golang/src/demo/test_uber_guide/channel_test.go @@ -0,0 +1,69 @@ +package test_uber + +import ( + "context" + "testing" +) + +/* +BenchmarkChannel/size_0-4 1102160 1348 ns/op 0 B/op 0 allocs/op +BenchmarkChannel/size_1-4 1000000 1195 ns/op 0 B/op 0 allocs/op +BenchmarkChannel/size_100-4 2956615 431 ns/op 0 B/op 0 allocs/op +BenchmarkChannel/size_1000-4 4134514 278 ns/op 0 B/op 0 allocs/op +PASS +*/ +func BenchmarkChannel(b *testing.B) { + c0 := make(chan int) + ctx, cancel := context.WithCancel(context.Background()) + runConsumer(ctx, c0) + b.Run("size 0", func(b *testing.B) { + for i := 0; i < b.N; i++ { + c0 <- i + } + }) + cancel() + + c1 := make(chan int, 1) + ctx, cancel = context.WithCancel(context.Background()) + runConsumer(ctx, c1) + b.Run("size 1", func(b *testing.B) { + for i := 0; i < b.N; i++ { + c1 <- i + } + }) + cancel() + + c100 := make(chan int, 100) + ctx, cancel = context.WithCancel(context.Background()) + runConsumer(ctx, c100) + b.Run("size 100", func(b *testing.B) { + for i := 0; i < b.N; i++ { + c100 <- i + } + }) + cancel() + + c1000 := make(chan int, 1000) + ctx, cancel = context.WithCancel(context.Background()) + runConsumer(ctx, c1000) + b.Run("size 1000", func(b *testing.B) { + for i := 0; i < b.N; i++ { + c1000 <- i + } + }) + cancel() +} + +func runConsumer(ctx context.Context, c chan int) { + for i := 0; i < 100; i++ { + go func() { + for { + select { + case <-ctx.Done(): + return + case <-c: + } + } + }() + } +} diff --git a/golang/src/demo/test_uber_guide/mutex_test.go b/golang/src/demo/test_uber_guide/mutex_test.go new file mode 100644 index 00000000..2fe02921 --- /dev/null +++ b/golang/src/demo/test_uber_guide/mutex_test.go @@ -0,0 +1,32 @@ +package test_uber + +import ( + "sync" + "testing" + "time" + + "github.com/Laisky/go-utils" +) + +func TestMutex(t *testing.T) { + var ( + l sync.Mutex + wg = new(sync.WaitGroup) + ) + for i := 0; i < 10; i++ { + wg.Add(1) + go foo(wg, l) + } + + wg.Wait() + t.Error("done") +} + +func foo(wg *sync.WaitGroup, l sync.Mutex) { + l.Lock() + defer wg.Done() + defer l.Unlock() + defer utils.Logger.Info("release lock") + utils.Logger.Info("acquired lock") + time.Sleep(3 * time.Second) +} diff --git a/leetcode/python/Lesson 1~10.ipynb b/leetcode/python/Lesson 1~10.ipynb index f7dbfb88..bec9ac40 100644 --- a/leetcode/python/Lesson 1~10.ipynb +++ b/leetcode/python/Lesson 1~10.ipynb @@ -539,7 +539,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.2" + "version": "3.7.4" } }, "nbformat": 4, diff --git a/py3/gcp/firestore.ipynb b/py3/gcp/firestore.ipynb new file mode 100644 index 00000000..3f82204a --- /dev/null +++ b/py3/gcp/firestore.ipynb @@ -0,0 +1,164 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [], + "source": [ + "from google.cloud import firestore\n", + "\n", + "db = firestore.Client()\n", + "posts = db.collection(\"posts\")\n", + "categories = db.collection('categories')\n", + "users = db.collection('users')" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "from pymongo import MongoClient\n", + "\n", + "mgocli = MongoClient()\n", + "mgo_db = mgocli['blog']\n", + "mgo_posts = mgo_db['posts']\n", + "mgo_categories = mgo_db['categories']\n", + "mgo_users = mgo_db['users']" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mgo_posts.find().count()\n", + "mgo_categories.find().count()\n", + "mgo_users.find().count()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "# delete document\n", + "\n", + "# for docu in posts.stream():\n", + "# if docu.to_dict().get('author'):\n", + "# posts.document(docu.id).delete()" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# len(list(posts.stream()))\n", + "len(list(categories.stream()))" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "for docu in mgo_posts.find():\n", + " docu['mgo_id'] = str(docu['_id'])\n", + " if docu.get('category'):\n", + " docu['category'] = str(docu['category'])\n", + " docu['post_author'] = str(docu['post_author'])\n", + "# print(docu)\n", + " del docu['_id']\n", + " posts.add(document_id=docu['mgo_id'], document_data=docu)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "for docu in mgo_categories.find():\n", + " docu['mgo_id'] = str(docu['_id'])\n", + " del docu['_id']\n", + " \n", + " if docu.get('category'):\n", + " docu['category'] = str(docu['category'])\n", + " docu['author'] = str(docu['author'])\n", + "\n", + " categories.document(document_id=docu['mgo_id']).set(docu)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "for docu in mgo_users.find():\n", + " docu['mgo_id'] = str(docu['_id'])\n", + " del docu['_id']\n", + " \n", + " users.document(document_id=docu['mgo_id']).set(docu)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/py3/tutorial/bad_link_code.py b/py3/tutorial/bad_link_code.py new file mode 100644 index 00000000..49e6762c --- /dev/null +++ b/py3/tutorial/bad_link_code.py @@ -0,0 +1,16 @@ +""" +这是很糟糕的链式调用 +""" + +def main(): + func1() + + +def func1(): + return func2() + +def func2(): + return func3() + +def func3(): + return "shit" diff --git a/py3/tutorial/good_funcs.py b/py3/tutorial/good_funcs.py new file mode 100644 index 00000000..074d3016 --- /dev/null +++ b/py3/tutorial/good_funcs.py @@ -0,0 +1,20 @@ +""" +这样写会好很多 +""" + +def step1(): + return "yoo" + + +def step2(v): + return f"hello, {v}" + + +def step3(v): + return f"you know nothing, {v}" + + +def main(): + r1 = step1() + r2 = step2(r1) + step3(r2) diff --git a/py3/tutorial/test_demo.py b/py3/tutorial/test_demo.py new file mode 100644 index 00000000..dcab7096 --- /dev/null +++ b/py3/tutorial/test_demo.py @@ -0,0 +1,21 @@ +""" +test_demo.py +""" + +from unittest import TestCase +from typing import List + +def demo(l: List[int]) -> int: + return l[0] + +class DemoTestCase(TestCase): + + def setUp(self): + print("first run") + + def tearDown(self): + print("last run") + + def test_demo(self): + data = [] + self.assertRaises(IndexError, demo, data) diff --git a/spring/simpleapp/jvm-service/.settings/org.eclipse.buildship.core.prefs b/spring/simpleapp/jvm-service/.settings/org.eclipse.buildship.core.prefs index 03dfab77..e8895216 100644 --- a/spring/simpleapp/jvm-service/.settings/org.eclipse.buildship.core.prefs +++ b/spring/simpleapp/jvm-service/.settings/org.eclipse.buildship.core.prefs @@ -1,2 +1,2 @@ -#Thu Apr 12 08:59:17 CST 2018 connection.project.dir= +eclipse.preferences.version=1 From b11d3d660f7770a079a6bf946fd9f873545dd4d1 Mon Sep 17 00:00:00 2001 From: Laisky Date: Wed, 16 Oct 2019 15:37:09 +0800 Subject: [PATCH 15/27] + sharedmemory --- py3/concurrent.ipynb | 88 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/py3/concurrent.ipynb b/py3/concurrent.ipynb index 45deead7..e0516bd3 100644 --- a/py3/concurrent.ipynb +++ b/py3/concurrent.ipynb @@ -135,6 +135,8 @@ } ], "source": [ + "## shared value\n", + "\n", "from time import sleep\n", "from concurrent.futures import ProcessPoolExecutor, wait\n", "from multiprocessing import Manager, Queue\n", @@ -163,6 +165,90 @@ "main()\n" ] }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "ename": "BrokenProcessPool", + "evalue": "A process in the process pool was terminated abruptly while the future was running or pending.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mBrokenProcessPool\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 33\u001b[0;31m \u001b[0mmain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mmain\u001b[0;34m()\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0mworkers\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mexecutor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubmit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mworker\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnormal_v\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshared_v\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mworkers\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 29\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mworkers\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 30\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'all done'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0mworkers\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mexecutor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubmit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mworker\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnormal_v\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshared_v\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mworkers\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 29\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mworkers\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 30\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'all done'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/3.8.0/lib/python3.8/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 430\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mCancelledError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 431\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mFINISHED\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 432\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 433\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 434\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_condition\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/3.8.0/lib/python3.8/concurrent/futures/_base.py\u001b[0m in \u001b[0;36m__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 386\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 387\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 388\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 389\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 390\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_result\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mBrokenProcessPool\u001b[0m: A process in the process pool was terminated abruptly while the future was running or pending." + ] + } + ], + "source": [ + "\"\"\"\n", + "shared memory\n", + "=============\n", + "\n", + "Output:\n", + "::\n", + " worker[0] got normal_v 1, shared_v 1\n", + " worker[2] got normal_v 1, shared_v 2\n", + " worker[3] got normal_v 1, shared_v 3\n", + " worker[1] got normal_v 1, shared_v 4\n", + " worker[4] got normal_v 1, shared_v 5\n", + " worker[5] got normal_v 1, shared_v 6\n", + " worker[6] got normal_v 1, shared_v 7\n", + " worker[8] got normal_v 1, shared_v 8\n", + " worker[7] got normal_v 1, shared_v 9\n", + " worker[9] got normal_v 1, shared_v 10\n", + " all done\n", + "\"\"\"\n", + "\n", + "from traceback import print_exc\n", + "from time import sleep\n", + "from concurrent.futures import ProcessPoolExecutor, wait\n", + "from multiprocessing import Event, RLock\n", + "from multiprocessing.shared_memory import ShareableList\n", + "from multiprocessing.managers import SharedMemoryManager, SyncManager\n", + "from ctypes import c_int64\n", + "\n", + "\n", + "def worker(l: RLock, evt: Event, i: int, normal_v: int, shared_v: ShareableList):\n", + " try:\n", + " evt.wait() # 确保任务同时开始\n", + " normal_v += 1 # 因为进程间内存隔离,所以每个进程都会得到 1\n", + " with RLock(): # 需要自行处理锁\n", + " shared_v[0] += 1 # 因为使用了共享内存,所以会得到连续累加的值\n", + "\n", + " print(f\"worker[{i}] got normal_v {normal_v}, shared_v {shared_v[0]}\")\n", + " except Exception:\n", + " print_exc()\n", + " raise\n", + "\n", + "\n", + "def main():\n", + " executor = ProcessPoolExecutor(max_workers=10)\n", + " with SharedMemoryManager() as smm, SyncManager() as sm:\n", + " evt = sm.Event()\n", + " shared_v = smm.ShareableList([0])\n", + " normal_v = 0\n", + " workers = [\n", + " executor.submit(worker, sm.RLock(), evt, i, normal_v, shared_v)\n", + " for i in range(10)\n", + " ]\n", + "\n", + " evt.set()\n", + " wait(workers)\n", + " [f.result() for f in workers]\n", + " print(\"all done\")\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " main()\n" + ] + }, { "cell_type": "code", "execution_count": 16, @@ -270,7 +356,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.4" + "version": "3.8.0" } }, "nbformat": 4, From 1210d97ac061b43740f8d24b412dd1fa2944b20a Mon Sep 17 00:00:00 2001 From: Laisky Date: Fri, 1 Nov 2019 11:18:52 +0800 Subject: [PATCH 16/27] + shurcool/graphql --- go.mod | 5 +- go.sum | 6 +++ .../{helloworld.go => graphqlgo_test.go} | 5 +- golang/graphql/shurcool_test.go | 48 +++++++++++++++++++ 4 files changed, 61 insertions(+), 3 deletions(-) rename golang/graphql/{helloworld.go => graphqlgo_test.go} (93%) create mode 100644 golang/graphql/shurcool_test.go diff --git a/go.mod b/go.mod index 67abeea8..0d45583e 100644 --- a/go.mod +++ b/go.mod @@ -42,6 +42,7 @@ require ( github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect github.com/gorilla/mux v1.7.3 // indirect github.com/gorilla/pat v1.0.1 // indirect + github.com/graphql-go/graphql v0.7.8 github.com/grpc-ecosystem/grpc-gateway v1.9.5 // indirect github.com/jcmturner/gofork v1.0.0 // indirect github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548 // indirect @@ -60,10 +61,12 @@ require ( github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pelletier/go-toml v1.4.0 // indirect + github.com/pkg/errors v0.8.1 github.com/pkg/profile v1.3.0 // indirect github.com/prometheus/common v0.6.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962 // indirect github.com/rogpeppe/fastuuid v1.2.0 // indirect + github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92 // indirect github.com/sirupsen/logrus v1.4.2 // indirect github.com/smartystreets/assertions v1.0.1 // indirect @@ -82,7 +85,7 @@ require ( golang.org/x/exp v0.0.0-20190718202018-cfdd5522f6f6 // indirect golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9 // indirect golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 // indirect - golang.org/x/net v0.0.0-20191009170851-d66e71096ffb // indirect + golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 // indirect golang.org/x/sync v0.0.0-20190423024810-112230192c58 golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect golang.org/x/text v0.3.2 diff --git a/go.sum b/go.sum index 8b060524..aa97a623 100644 --- a/go.sum +++ b/go.sum @@ -173,6 +173,8 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= github.com/gorilla/pat v1.0.1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/graphql-go/graphql v0.7.8 h1:769CR/2JNAhLG9+aa8pfLkKdR0H+r5lsQqling5WwpU= +github.com/graphql-go/graphql v0.7.8/go.mod h1:k6yrAYQaSP59DC5UVxbgxESlmVyojThKdORUqGDGmrI= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -316,6 +318,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f h1:tygelZueB1EtXkPI6mQ4o9DQ0+FKW41hTbunoXZCTqk= +github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= @@ -453,6 +457,8 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8 golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191009170851-d66e71096ffb h1:TR699M2v0qoKTOHxeLgp6zPqaQNs74f01a/ob9W0qko= golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 h1:N66aaryRB3Ax92gH0v3hp1QYZ3zWWCCUR/j8Ifh45Ss= +golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/golang/graphql/helloworld.go b/golang/graphql/graphqlgo_test.go similarity index 93% rename from golang/graphql/helloworld.go rename to golang/graphql/graphqlgo_test.go index d014e942..5bdec3dd 100644 --- a/golang/graphql/helloworld.go +++ b/golang/graphql/graphqlgo_test.go @@ -1,14 +1,15 @@ -package main +package main_test import ( "encoding/json" "fmt" "log" + "testing" "github.com/graphql-go/graphql" ) -func main() { +func TestGraphqlgo(t *testing.T) { // Schema fields := graphql.Fields{ "hello": &graphql.Field{ diff --git a/golang/graphql/shurcool_test.go b/golang/graphql/shurcool_test.go new file mode 100644 index 00000000..57fcec7b --- /dev/null +++ b/golang/graphql/shurcool_test.go @@ -0,0 +1,48 @@ +package main_test + +import ( + "context" + "testing" + + "github.com/shurcooL/graphql" +) + +var client = graphql.NewClient("http://127.0.0.1:8080/query/", nil) + +// var client = graphql.NewClient("https://blog.laisky.com/graphql/query/", nil) + +type QueryHello struct { + Hello graphql.String `graphql:"Hello"` +} + +func TestShurCli(t *testing.T) { + + ctx := context.Background() + query := new(QueryHello) + if err := client.Query(ctx, query, nil); err != nil { + t.Fatalf("got error: %+v", err) + } + + t.Logf("got: %v", query.Hello) + t.Error("all done") +} + +type alertMutation struct { + TelegramMonitorAlert struct { + Name graphql.String + } `graphql:"TelegramMonitorAlert(type: $type, token: $token, msg: $msg)"` +} + +func TestShurMutation(t *testing.T) { + query := new(alertMutation) + vars := map[string]interface{}{ + "type": graphql.String("hello"), + "token": graphql.String("123"), + "msg": graphql.String("321"), + } + + ctx := context.Background() + if err := client.Mutate(ctx, query, vars); err != nil { + t.Fatalf("%+v", err) + } +} From c55e18d15e342c2fc45ff28aaf989c85651f8889 Mon Sep 17 00:00:00 2001 From: Laisky Date: Fri, 1 Nov 2019 18:01:39 +0800 Subject: [PATCH 17/27] + aws iotcore --- py3/mqtt/aws iot.ipynb | 133 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 py3/mqtt/aws iot.ipynb diff --git a/py3/mqtt/aws iot.ipynb b/py3/mqtt/aws iot.ipynb new file mode 100644 index 00000000..815a4f54 --- /dev/null +++ b/py3/mqtt/aws iot.ipynb @@ -0,0 +1,133 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "References:\n", + "\n", + "* [AWS IoT Python](https://github.com/aws/aws-iot-device-sdk-python/blob/master/README.rst)\n", + "* [AWS CA](https://docs.aws.amazon.com/en_pv/iot/latest/developerguide/server-authentication.html)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import time\n", + "import json\n", + "\n", + "from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure logging\n", + "logger = logging.getLogger(\"AWSIoTPythonSDK.core\")\n", + "logger.setLevel(logging.INFO)\n", + "\n", + "# streamHandler = logging.StreamHandler()\n", + "# formatter = logging.Formatter(\"%(asctime)s - %(name)s - %(levelname)s - %(message)s\")\n", + "# streamHandler.setFormatter(formatter)\n", + "# logger.addHandler(streamHandler)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cli = AWSIoTMQTTClient(\"laisky-demo\")\n", + "cli.configureEndpoint(\"a2mth8rkdw0p8j-ats.iot.us-west-2.amazonaws.com\", 8883)\n", + "cli.configureCredentials(\n", + " \"/Users/laisky/repo/laisky/configs/mqtt/root-CA.crt\",\n", + " \"/Users/laisky/repo/laisky/configs/mqtt/python-cli.private.key\",\n", + " \"/Users/laisky/repo/laisky/configs/mqtt/python-cli.cert.pem\",\n", + ")\n", + "\n", + "cli.configureAutoReconnectBackoffTime(1, 32, 20)\n", + "cli.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing\n", + "cli.configureDrainingFrequency(2) # Draining: 2 Hz\n", + "cli.configureConnectDisconnectTimeout(10) # 10 sec\n", + "cli.configureMQTTOperationTimeout(10) # 5 sec\n", + "\n", + "\n", + "def customCallback(cli, userdata, message):\n", + " print(\"Received a new message: \")\n", + " print(message.payload)\n", + " print(\"from topic: \")\n", + " print(message.topic)\n", + " print(\"--------------\\n\\n\")\n", + "\n", + "\n", + "cli.connect()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> publish hello\n", + "<< True\n", + ">> publish hello\n", + "<< True\n", + ">> publish hello\n", + "<< True\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\">> publish hello\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"<<\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcli\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpublish\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"laisky-hello\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjson\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdumps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"yo\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m\"jedi\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "while 1:\n", + " # print(help(cli.publish))\n", + " print(\">> publish hello\")\n", + " print(\"<<\", cli.publish(\"laisky-hello\", json.dumps({\"yo\": \"jedi\"}), 1))\n", + " time.sleep(1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 5715bbc29145076e39e1724de8b5278633a1c2fa Mon Sep 17 00:00:00 2001 From: Laisky Date: Tue, 12 Nov 2019 17:26:58 +0800 Subject: [PATCH 18/27] + py thread safe --- py3/tutorial/abc.py | 56 +++++++++++++++++++++++++++++++++++++ py3/tutorial/thread_safe.py | 26 +++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 py3/tutorial/abc.py create mode 100644 py3/tutorial/thread_safe.py diff --git a/py3/tutorial/abc.py b/py3/tutorial/abc.py new file mode 100644 index 00000000..dc1971e9 --- /dev/null +++ b/py3/tutorial/abc.py @@ -0,0 +1,56 @@ +from abc import ABC, abstractmethod, abstractproperty + +class ThingsABC(ABC): + @abstractproperty + def etable(self): + pass + + +class BaseFood(ThingsABC): + etable = True + + +class BirdABC(ABC): + """ + 在抽象类中定义抽象方法和属性, + 实例化的时候会自动检查这些抽象方法和方法必须已被实现,否则会抛出一场。 + + 具体实现的方法多种多样,比如直接在类里定义,或者多继承等等 + """ + @abstractmethod + def fly(self): + pass + + @abstractmethod + def eat(self, food: BaseFood): + pass + + +class BaseBird(BirdABC): + """ + 可以定义一些鸟类都应该有的通用属性和方法 + """ + pass + + +class Robin(BaseBird): + """ + 定义一些知更鸟特有的属性和方法 + """ +# def fly(self): +# pass + +# def eat(self, foold: BaseFood): +# pass + + +r = Robin() # 会报错,因为没有实现抽象方法 + +# --------------------------------------------------------------------------- +# TypeError Traceback (most recent call last) +# in +# 45 +# 46 +# ---> 47 r = Robin() # 会报错,因为没有实现抽象方法 + +# TypeError: Can't instantiate abstract class Robin with abstract methods eat, fly diff --git a/py3/tutorial/thread_safe.py b/py3/tutorial/thread_safe.py new file mode 100644 index 00000000..bc8fe105 --- /dev/null +++ b/py3/tutorial/thread_safe.py @@ -0,0 +1,26 @@ +from concurrent.futures import ThreadPoolExecutor, wait +from typing import Dict +from threading import Event + + +V_KEY = "key" + + +def worker(evt: Event, data: Dict[str, int]): + evt.wait() + for _ in range(100000): + data[V_KEY] += 1 + + +def main(): + data = {V_KEY: 0} + evt = Event() + executor = ThreadPoolExecutor(max_workers=10) + fs = [executor.submit(worker, evt, data) for _ in range(10)] + evt.set() + wait(fs) + print(data) # not equal to 10*100000 + + +if __name__ == "__main__": + main() From 74c95f28d6bd8acf70c9ab4dae8ced7dd2f67c8d Mon Sep 17 00:00:00 2001 From: Laisky Date: Tue, 17 Dec 2019 15:43:31 +0800 Subject: [PATCH 19/27] + mqtt --- aws/iot/aws iot.ipynb | 224 +++++++++ aws/iot/requirements.txt | 1 + go.mod | 5 +- go.sum | 6 + golang/src/demo/test_gzip/main.go | 56 --- golang/src/demo/test_gzip/pgz_test.go | 452 ++++++++++++++++++ golang/src/demo/test_syntax/structure_test.go | 30 ++ py3/mqtt/aws iot.ipynb | 133 ------ py3/{python-syntax => syntax}/Coroutine.html | 0 py3/{python-syntax => syntax}/README.md | 0 .../concurrent.futures.html | 0 py3/{python-syntax => syntax}/descriptor.html | 0 .../notebook/Coroutine.ipynb | 0 .../notebook/asterisk.ipynb | 0 .../notebook/bisect.ipynb | 0 .../notebook/calendar.ipynb | 0 .../notebook/collections.ipynb | 0 .../notebook/concurrent.futures.ipynb | 0 .../notebook/copy.ipynb | 0 .../notebook/decimal.ipynb | 0 .../notebook/descriptor.ipynb | 0 .../notebook/email.ipynb | 0 .../notebook/enum.ipynb | 0 .../notebook/format.ipynb | 0 .../notebook/fractions.ipynb | 0 .../notebook/functools.ipynb | 0 .../notebook/headq.ipynb | 0 .../notebook/itertools.ipynb | 0 .../notebook/mock.ipynb | 0 .../notebook/pytz.ipynb | 0 .../notebook/sched.ipynb | 0 .../notebook/selectors.ipynb | 0 .../notebook/smtplib.ipynb | 4 +- .../notebook/statistics.ipynb | 0 .../notebook/textwrap.ipynb | 0 .../notebook/weakref.ipynb | 0 .../notebook/xml.ipynb | 0 .../notebook/yield & yield from.ipynb | 0 38 files changed, 719 insertions(+), 192 deletions(-) create mode 100644 aws/iot/aws iot.ipynb create mode 100644 aws/iot/requirements.txt delete mode 100644 golang/src/demo/test_gzip/main.go create mode 100644 golang/src/demo/test_gzip/pgz_test.go create mode 100644 golang/src/demo/test_syntax/structure_test.go delete mode 100644 py3/mqtt/aws iot.ipynb rename py3/{python-syntax => syntax}/Coroutine.html (100%) rename py3/{python-syntax => syntax}/README.md (100%) rename py3/{python-syntax => syntax}/concurrent.futures.html (100%) rename py3/{python-syntax => syntax}/descriptor.html (100%) rename py3/{python-syntax => syntax}/notebook/Coroutine.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/asterisk.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/bisect.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/calendar.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/collections.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/concurrent.futures.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/copy.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/decimal.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/descriptor.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/email.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/enum.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/format.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/fractions.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/functools.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/headq.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/itertools.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/mock.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/pytz.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/sched.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/selectors.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/smtplib.ipynb (98%) rename py3/{python-syntax => syntax}/notebook/statistics.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/textwrap.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/weakref.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/xml.ipynb (100%) rename py3/{python-syntax => syntax}/notebook/yield & yield from.ipynb (100%) diff --git a/aws/iot/aws iot.ipynb b/aws/iot/aws iot.ipynb new file mode 100644 index 00000000..dfb09d3f --- /dev/null +++ b/aws/iot/aws iot.ipynb @@ -0,0 +1,224 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "References:\n", + "\n", + "* [AWS IoT Python](https://github.com/aws/aws-iot-device-sdk-python/blob/master/README.rst)\n", + "* [AWS CA](https://docs.aws.amazon.com/en_pv/iot/latest/developerguide/server-authentication.html)\n", + "\n", + "\n", + "prepares:\n", + "\n", + "```python\n", + "pip install AWSIoTPythonSDK kipp3\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import os\n", + "import time\n", + "import json\n", + "from concurrent.futures import ThreadPoolExecutor\n", + "from threading import Event\n", + "\n", + "from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient\n", + "from kipp3.utils import setup_logger\n", + "from kipp3.decorator import debug_wrapper\n", + "\n", + "\n", + "logger = setup_logger(\"awsiot\")\n", + "executor = ThreadPoolExecutor(max_workers=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure logging\n", + "logging.getLogger(\"AWSIoTPythonSDK.core\").setLevel(logging.INFO)\n", + "\n", + "\n", + "# streamHandler = logging.StreamHandler()\n", + "# formatter = logging.Formatter(\"%(asctime)s - %(name)s - %(levelname)s - %(message)s\")\n", + "# streamHandler.setFormatter(formatter)\n", + "# logger.addHandler(streamHandler)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2019-12-17 06:22:02,617 - INFO - :8 - awsiot] - >> topic='laisky-hello' publish True, payload='{\"yo\": \"jedi\"}'\n", + "[2019-12-17 06:22:02,960 - INFO - :8 - awsiot] - >> topic='laisky-hello' publish True, payload='{\"yo\": \"jedi\"}'\n" + ] + } + ], + "source": [ + "# config_path = \"/Users/laisky/repo/laisky/configs\"\n", + "config_path = \"/opt/configs\"\n", + "\n", + "cli = AWSIoTMQTTClient(\"laisky-demo\")\n", + "cli.configureEndpoint(\"a2mth8rkdw0p8j-ats.iot.us-west-2.amazonaws.com\", 8883)\n", + "cli.configureCredentials(\n", + " os.path.join(config_path, \"mqtt/root-CA.crt\"),\n", + " os.path.join(config_path, \"mqtt/python-cli.private.key\"),\n", + " os.path.join(config_path, \"mqtt/python-cli.cert.pem\"),\n", + ")\n", + "\n", + "cli.configureAutoReconnectBackoffTime(1, 32, 20)\n", + "cli.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing\n", + "cli.configureDrainingFrequency(2) # Draining: 2 Hz\n", + "cli.configureConnectDisconnectTimeout(10) # 10 sec\n", + "cli.configureMQTTOperationTimeout(10) # 5 sec\n", + "\n", + "\n", + "def customCallback(cli, userdata, message):\n", + " print(\"Received a new message: \")\n", + " print(message.payload)\n", + " print(\"from topic: \")\n", + " print(message.topic)\n", + " print(\"--------------\\n\\n\")\n", + "\n", + "\n", + "cli.connect()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "stop_evt = Event()" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2019-12-17 06:22:15,548 - INFO - :20 - awsiot] - subscribe to topic='laisky-hello'\n", + "[2019-12-17 06:22:15,952 - INFO - :8 - awsiot] - >> topic='laisky-hello' publish True, payload='{\"yo\": \"jedi\"}'\n", + "[2019-12-17 06:22:15,972 - INFO - :23 - awsiot] - << topic='laisky-hello' got: userdata=None, msg.mid=1, msg.state=0, msg.retain=0, msg.topic='laisky-hello', msg.payload=b'{\"yo\": \"jedi\"}'\n", + "[2019-12-17 06:22:15,973 - INFO - /Users/laisky/repo/laisky/kipp/kipp3/decorator/__init__.py:129 - kipp] - callback cost 0.00s\n", + "[2019-12-17 06:22:18,956 - INFO - :8 - awsiot] - >> topic='laisky-hello' publish False, payload='{\"yo\": \"jedi\"}'\n", + "[2019-12-17 06:22:21,235 - INFO - :23 - awsiot] - << topic='laisky-hello' got: userdata=None, msg.mid=1, msg.state=0, msg.retain=0, msg.topic='laisky-hello', msg.payload=b'{\"yo\": \"jedi\"}'\n", + "[2019-12-17 06:22:21,237 - INFO - /Users/laisky/repo/laisky/kipp/kipp3/decorator/__init__.py:129 - kipp] - callback cost 0.00s\n", + "[2019-12-17 06:22:22,166 - INFO - :8 - awsiot] - >> topic='laisky-hello' publish True, payload='{\"yo\": \"jedi\"}'\n", + "[2019-12-17 06:22:22,184 - INFO - :23 - awsiot] - << topic='laisky-hello' got: userdata=None, msg.mid=1, msg.state=0, msg.retain=0, msg.topic='laisky-hello', msg.payload=b'{\"yo\": \"jedi\"}'\n", + "[2019-12-17 06:22:22,185 - INFO - /Users/laisky/repo/laisky/kipp/kipp3/decorator/__init__.py:129 - kipp] - callback cost 0.00s\n", + "[2019-12-17 06:22:25,372 - INFO - :8 - awsiot] - >> topic='laisky-hello' publish True, payload='{\"yo\": \"jedi\"}'\n", + "[2019-12-17 06:22:25,395 - INFO - :23 - awsiot] - << topic='laisky-hello' got: userdata=None, msg.mid=1, msg.state=0, msg.retain=0, msg.topic='laisky-hello', msg.payload=b'{\"yo\": \"jedi\"}'\n", + "[2019-12-17 06:22:25,396 - INFO - /Users/laisky/repo/laisky/kipp/kipp3/decorator/__init__.py:129 - kipp] - callback cost 0.00s\n" + ] + } + ], + "source": [ + "TOPIC = \"laisky-hello\"\n", + "\n", + "\n", + "@debug_wrapper\n", + "def publisher(topic:str, stop_evt: Event):\n", + " while not stop_evt.is_set():\n", + " payload = json.dumps({\"yo\": \"jedi\"})\n", + " logger.info(f\">> {topic=} publish {cli.publish(topic, payload, 1)}, {payload=}\")\n", + " time.sleep(3)\n", + "\n", + " logger.info(\"publisher stop\")\n", + "\n", + "\n", + "@debug_wrapper\n", + "def stop_all_publisher():\n", + " stop_evt.set()\n", + "\n", + " \n", + "def get_subscriber(topic):\n", + " logger.info(f\"subscribe to {topic=}\")\n", + " @debug_wrapper\n", + " def callback(client, userdata, msg):\n", + " logger.info(\n", + " f\"<< {topic=} got: {userdata=}, {msg.mid=}, {msg.state=}, {msg.retain=}, {msg.topic=}, {msg.payload=}\"\n", + " )\n", + " \n", + " return callback\n", + "\n", + "topic = TOPIC\n", + "# cli.unsubscribe(TOPIC)\n", + "\n", + "cli.subscribe(topic, 1, get_subscriber(topic))\n", + "fp = executor.submit(publisher, topic, stop_evt)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2019-12-17 06:22:28,376 - INFO - :11 - awsiot] - publisher stop\n", + "[2019-12-17 06:22:28,378 - INFO - /Users/laisky/repo/laisky/kipp/kipp3/decorator/__init__.py:129 - kipp] - publisher cost 12.63s\n" + ] + } + ], + "source": [ + "stop_evt.set()\n", + "stop_evt = Event()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/aws/iot/requirements.txt b/aws/iot/requirements.txt new file mode 100644 index 00000000..8579e8b2 --- /dev/null +++ b/aws/iot/requirements.txt @@ -0,0 +1 @@ +paho-mqtt diff --git a/go.mod b/go.mod index 0d45583e..ac1ea6b6 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,9 @@ require ( github.com/kataras/golog v0.0.0-20190624001437-99c81de45f40 // indirect github.com/kisielk/errcheck v1.2.0 // indirect github.com/kisielk/sqlstruct v0.0.0-20150923205031-648daed35d49 // indirect - github.com/klauspost/compress v1.7.4 // indirect + github.com/klauspost/compress v1.9.3 // indirect + github.com/klauspost/cpuid v1.2.2 // indirect + github.com/klauspost/pgzip v1.2.1 github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kr/pty v1.1.8 // indirect github.com/lib/pq v1.2.0 // indirect @@ -81,6 +83,7 @@ require ( github.com/weppos/publicsuffix-go v0.10.0 // indirect github.com/zmap/zlint v1.0.2 // indirect go.etcd.io/bbolt v1.3.3 // indirect + go.uber.org/zap v1.10.0 golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc // indirect golang.org/x/exp v0.0.0-20190718202018-cfdd5522f6f6 // indirect golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9 // indirect diff --git a/go.sum b/go.sum index aa97a623..3badd23c 100644 --- a/go.sum +++ b/go.sum @@ -229,8 +229,13 @@ github.com/kisielk/sqlstruct v0.0.0-20150923205031-648daed35d49/go.mod h1:yyMNCy github.com/klauspost/compress v1.7.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.7.4 h1:4UqAIzZ1Ns2epCTyJ1d2xMWvxtX+FNSCYWeOFogK9nc= github.com/klauspost/compress v1.7.4/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.3 h1:hkFELABwacUEgBfiguNeQydKv3M9pawBq8o24Ypw9+M= +github.com/klauspost/compress v1.9.3/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.2/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM= +github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -409,6 +414,7 @@ go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= diff --git a/golang/src/demo/test_gzip/main.go b/golang/src/demo/test_gzip/main.go deleted file mode 100644 index 5f26a7e2..00000000 --- a/golang/src/demo/test_gzip/main.go +++ /dev/null @@ -1,56 +0,0 @@ -package main - -import ( - "bufio" - "compress/gzip" - "io" - "os" - - "github.com/Laisky/go-utils" - "go.uber.org/zap" -) - -func main() { - // Write - fp, err := os.OpenFile("/Users/laisky/Downloads/test.txt.gz", os.O_CREATE|os.O_RDWR, 0666) - if err != nil { - utils.Logger.Panic("open file got error", zap.Error(err)) - } - - fpb := bufio.NewWriter(fp) - gwriter := gzip.NewWriter(fpb) - for i := 0; i < 100; i++ { - if _, err = gwriter.Write([]byte("1234567890")); err != nil { - utils.Logger.Panic("write date got error", zap.Error(err)) - } - - gwriter.Flush() - } - - gwriter.Close() - fpb.Flush() - fp.Seek(0, 0) - - // Read - fpc := bufio.NewReader(fp) - greader, err := gzip.NewReader(fpc) - if err != nil { - utils.Logger.Panic("create gzip reader got error", zap.Error(err)) - } - - cnt := make([]byte, 10) - for { - n, err := greader.Read(cnt) - if err == io.EOF { - utils.Logger.Info("all done") - break - } - if err != nil { - utils.Logger.Panic("try to load file got error", zap.Error(err)) - } - - utils.Logger.Info("read bytes", zap.Int("n", n), zap.ByteString("cnt", cnt)) - - } - -} diff --git a/golang/src/demo/test_gzip/pgz_test.go b/golang/src/demo/test_gzip/pgz_test.go new file mode 100644 index 00000000..3b842c2b --- /dev/null +++ b/golang/src/demo/test_gzip/pgz_test.go @@ -0,0 +1,452 @@ +package test + +import ( + "bytes" + "compress/gzip" + "github.com/klauspost/pgzip" + "io/ioutil" + "os" + "testing" + + "github.com/Laisky/go-utils" +) + +/* +goos: darwin +goarch: amd64 +pkg: github.com/Laisky/HelloWorld/golang/src/demo/test_gzip +BenchmarkGZCompressor/gz_write_1kB-4 10000 225748 ns/op 0 B/op 0 allocs/op +BenchmarkGZCompressor/gz_write_10kB-4 2613 1014270 ns/op 0 B/op 0 allocs/op +BenchmarkGZCompressor/gz_write_50kB-4 364 4494456 ns/op 1 B/op 0 allocs/op +BenchmarkGZCompressor/gz_write_100kB-4 231 6200921 ns/op 1 B/op 0 allocs/op +BenchmarkGZCompressor/normal_write_1KB-4 29948092 52.4 ns/op 0 B/op 0 allocs/op +BenchmarkGZCompressor/normal_write_10KB-4 4443848 233 ns/op 0 B/op 0 allocs/op +BenchmarkGZCompressor/normal_write_50KB-4 470455 3163 ns/op 0 B/op 0 allocs/op +BenchmarkGZCompressor/normal_write_100KB-4 186914 7632 ns/op 0 B/op 0 allocs/op +BenchmarkGZCompressor/gz_write_50kB_best_compression-4 603 3108414 ns/op 0 B/op 0 allocs/op +BenchmarkGZCompressor/gz_write_50kB_best_speed-4 3037 520604 ns/op 0 B/op 0 allocs/op +BenchmarkGZCompressor/gz_write_50kB_HuffmanOnly-4 3652 323248 ns/op 0 B/op 0 allocs/op +BenchmarkGZCompressor/normal_write_50KB_to_file-4 10000 102742 ns/op 0 B/op 0 allocs/op +BenchmarkGZCompressor/gz_write_50KB_to_file-4 175 6240226 ns/op 2 B/op 0 allocs/op +BenchmarkGZCompressor/gz_write_50KB_to_file_best_speed-4 2668 585101 ns/op 95866 B/op 0 allocs/op +BenchmarkGZCompressor/gz_write_50KB_to_file_BestCompression-4 417 4713929 ns/op 633083 B/op 0 allocs/op +PASS +ok github.com/Laisky/HelloWorld/golang/src/demo/test_gzip 27.592s +Success: Benchmarks passed. +*/ +func BenchmarkGZCompressor(b *testing.B) { + fp, err := ioutil.TempFile("", "gz-test") + if err != nil { + b.Fatalf("%+v", err) + } + defer fp.Close() + defer os.Remove(fp.Name()) + b.Logf("create file name: %v", fp.Name()) + + payload1K := []byte(utils.RandomStringWithLength(1024)) + payload10K := []byte(utils.RandomStringWithLength(10240)) + payload50K := []byte(utils.RandomStringWithLength(10240 * 5)) + payload100K := []byte(utils.RandomStringWithLength(102400)) + buf := &bytes.Buffer{} + gzWriter := gzip.NewWriter(buf) + b.Run("gz write 1kB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload1K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + b.Run("gz write 10kB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload10K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + b.Run("gz write 50kB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + b.Run("gz write 100kB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload100K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + b.Run("normal write 1KB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + buf.Write(payload1K) + buf.Reset() + } + }) + buf.Reset() + b.Run("normal write 10KB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + buf.Write(payload10K) + buf.Reset() + } + }) + buf.Reset() + b.Run("normal write 50KB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + buf.Write(payload50K) + buf.Reset() + } + }) + buf.Reset() + b.Run("normal write 100KB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + buf.Write(payload100K) + buf.Reset() + } + }) + if gzWriter, err = gzip.NewWriterLevel(buf, gzip.BestCompression); err != nil { + b.Fatalf("got error: %+v", err) + } + b.Run("gz write 50kB best compression", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + if gzWriter, err = gzip.NewWriterLevel(buf, gzip.BestSpeed); err != nil { + b.Fatalf("got error: %+v", err) + } + b.Run("gz write 50kB best speed", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + if gzWriter, err = gzip.NewWriterLevel(buf, gzip.HuffmanOnly); err != nil { + b.Fatalf("got error: %+v", err) + } + b.Run("gz write 50kB HuffmanOnly", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + + b.Run("normal write 50KB to file", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = fp.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + } + }) + if _, err = fp.Seek(0, 0); err != nil { + b.Fatalf("seek: %+v", err) + } + + gzWriter = gzip.NewWriter(fp) + b.Run("gz write 50KB to file", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + } + }) + if _, err = fp.Seek(0, 0); err != nil { + b.Fatalf("seek: %+v", err) + } + + if gzWriter, err = gzip.NewWriterLevel(buf, gzip.BestSpeed); err != nil { + b.Fatalf("got error: %+v", err) + } + b.Run("gz write 50KB to file best speed", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + } + }) + if _, err = fp.Seek(0, 0); err != nil { + b.Fatalf("seek: %+v", err) + } + + if gzWriter, err = gzip.NewWriterLevel(buf, gzip.BestCompression); err != nil { + b.Fatalf("got error: %+v", err) + } + b.Run("gz write 50KB to file BestCompression", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + } + }) +} + +/* +goos: darwin +goarch: amd64 +pkg: github.com/Laisky/HelloWorld/golang/src/demo/test_gzip +BenchmarkPGZCompressor/gz_write_1kB-4 7909 142196 ns/op 692997 B/op 11 allocs/op +BenchmarkPGZCompressor/gz_write_10kB-4 8539 151424 ns/op 691951 B/op 11 allocs/op +BenchmarkPGZCompressor/gz_write_50kB-4 6038 178688 ns/op 696439 B/op 12 allocs/op +BenchmarkPGZCompressor/gz_write_100kB-4 5464 214991 ns/op 675344 B/op 11 allocs/op +BenchmarkPGZCompressor/normal_write_1KB-4 38609056 31.7 ns/op 0 B/op 0 allocs/op +BenchmarkPGZCompressor/normal_write_10KB-4 8489320 140 ns/op 0 B/op 0 allocs/op +BenchmarkPGZCompressor/normal_write_50KB-4 486973 2410 ns/op 0 B/op 0 allocs/op +BenchmarkPGZCompressor/normal_write_100KB-4 263452 4764 ns/op 0 B/op 0 allocs/op +BenchmarkPGZCompressor/gz_write_50kB_best_compression-4 1614 737059 ns/op 581633 B/op 12 allocs/op +BenchmarkPGZCompressor/gz_write_50kB_best_speed-4 6607 166990 ns/op 659595 B/op 12 allocs/op +BenchmarkPGZCompressor/gz_write_50kB_HuffmanOnly-4 2769 420641 ns/op 547038 B/op 12 allocs/op +BenchmarkPGZCompressor/normal_write_50KB_to_file-4 14587 85377 ns/op 0 B/op 0 allocs/op +BenchmarkPGZCompressor/gz_write_50KB_to_file-4 19995 87519 ns/op 66030 B/op 3 allocs/op +BenchmarkPGZCompressor/gz_write_50KB_to_file_best_speed-4 10000 159127 ns/op 199775 B/op 3 allocs/op +BenchmarkPGZCompressor/gz_write_50KB_to_file_BestCompression-4 4347 335686 ns/op 55145 B/op 3 allocs/op +PASS +ok github.com/Laisky/HelloWorld/golang/src/demo/test_gzip 22.745s +Success: Benchmarks passed. + +*/ +func BenchmarkPGZCompressor(b *testing.B) { + fp, err := ioutil.TempFile("", "gz-test") + if err != nil { + b.Fatalf("%+v", err) + } + defer fp.Close() + defer os.Remove(fp.Name()) + b.Logf("create file name: %v", fp.Name()) + + payload1K := []byte(utils.RandomStringWithLength(1024)) + payload10K := []byte(utils.RandomStringWithLength(10240)) + payload50K := []byte(utils.RandomStringWithLength(10240 * 5)) + payload100K := []byte(utils.RandomStringWithLength(102400)) + buf := &bytes.Buffer{} + + gzWriter := pgzip.NewWriter(buf) + gzWriter.SetConcurrency(100000, 4) + // gzWriter := gzip.NewWriter(buf) + b.Run("gz write 1kB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload1K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + b.Run("gz write 10kB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload10K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + b.Run("gz write 50kB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + b.Run("gz write 100kB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload100K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + b.Run("normal write 1KB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + buf.Write(payload1K) + buf.Reset() + } + }) + buf.Reset() + b.Run("normal write 10KB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + buf.Write(payload10K) + buf.Reset() + } + }) + buf.Reset() + b.Run("normal write 50KB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + buf.Write(payload50K) + buf.Reset() + } + }) + buf.Reset() + b.Run("normal write 100KB", func(b *testing.B) { + for i := 0; i < b.N; i++ { + buf.Write(payload100K) + buf.Reset() + } + }) + if gzWriter, err = pgzip.NewWriterLevel(buf, pgzip.BestCompression); err != nil { + b.Fatalf("got error: %+v", err) + } + gzWriter.SetConcurrency(100000, 4) + b.Run("gz write 50kB best compression", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + if gzWriter, err = pgzip.NewWriterLevel(buf, pgzip.BestSpeed); err != nil { + b.Fatalf("got error: %+v", err) + } + gzWriter.SetConcurrency(100000, 4) + b.Run("gz write 50kB best speed", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + if gzWriter, err = pgzip.NewWriterLevel(buf, pgzip.HuffmanOnly); err != nil { + b.Fatalf("got error: %+v", err) + } + gzWriter.SetConcurrency(100000, 4) + b.Run("gz write 50kB HuffmanOnly", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + if err = gzWriter.Close(); err != nil { + b.Fatalf("close: %+v", err) + } + gzWriter.Reset(buf) + buf.Reset() + } + }) + buf.Reset() + + b.Run("normal write 50KB to file", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = fp.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + } + }) + if _, err = fp.Seek(0, 0); err != nil { + b.Fatalf("seek: %+v", err) + } + + gzWriter = pgzip.NewWriter(fp) + gzWriter.SetConcurrency(100000, 4) + b.Run("gz write 50KB to file", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + } + }) + if _, err = fp.Seek(0, 0); err != nil { + b.Fatalf("seek: %+v", err) + } + + if gzWriter, err = pgzip.NewWriterLevel(buf, pgzip.BestSpeed); err != nil { + b.Fatalf("got error: %+v", err) + } + gzWriter.SetConcurrency(100000, 4) + b.Run("gz write 50KB to file best speed", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + } + }) + if _, err = fp.Seek(0, 0); err != nil { + b.Fatalf("seek: %+v", err) + } + + if gzWriter, err = pgzip.NewWriterLevel(buf, pgzip.BestCompression); err != nil { + b.Fatalf("got error: %+v", err) + } + gzWriter.SetConcurrency(100000, 4) + b.Run("gz write 50KB to file BestCompression", func(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err = gzWriter.Write(payload50K); err != nil { + b.Fatalf("write: %+v", err) + } + } + }) +} diff --git a/golang/src/demo/test_syntax/structure_test.go b/golang/src/demo/test_syntax/structure_test.go new file mode 100644 index 00000000..690ac5e7 --- /dev/null +++ b/golang/src/demo/test_syntax/structure_test.go @@ -0,0 +1,30 @@ +package test + +import ( + "reflect" + "testing" +) + +type Foo struct { + A string + CS []string +} + +func TestStruct(t *testing.T) { + a := &Foo{ + A: "yo", + CS: []string{"a"}, + } + b := &Foo{ + A: "yo", + CS: []string{"a"}, + } + + if a == b { + t.Error("should not equal") + } + + if !reflect.DeepEqual(a, b) { + t.Error("should equal") + } +} diff --git a/py3/mqtt/aws iot.ipynb b/py3/mqtt/aws iot.ipynb deleted file mode 100644 index 815a4f54..00000000 --- a/py3/mqtt/aws iot.ipynb +++ /dev/null @@ -1,133 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "References:\n", - "\n", - "* [AWS IoT Python](https://github.com/aws/aws-iot-device-sdk-python/blob/master/README.rst)\n", - "* [AWS CA](https://docs.aws.amazon.com/en_pv/iot/latest/developerguide/server-authentication.html)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import time\n", - "import json\n", - "\n", - "from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure logging\n", - "logger = logging.getLogger(\"AWSIoTPythonSDK.core\")\n", - "logger.setLevel(logging.INFO)\n", - "\n", - "# streamHandler = logging.StreamHandler()\n", - "# formatter = logging.Formatter(\"%(asctime)s - %(name)s - %(levelname)s - %(message)s\")\n", - "# streamHandler.setFormatter(formatter)\n", - "# logger.addHandler(streamHandler)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cli = AWSIoTMQTTClient(\"laisky-demo\")\n", - "cli.configureEndpoint(\"a2mth8rkdw0p8j-ats.iot.us-west-2.amazonaws.com\", 8883)\n", - "cli.configureCredentials(\n", - " \"/Users/laisky/repo/laisky/configs/mqtt/root-CA.crt\",\n", - " \"/Users/laisky/repo/laisky/configs/mqtt/python-cli.private.key\",\n", - " \"/Users/laisky/repo/laisky/configs/mqtt/python-cli.cert.pem\",\n", - ")\n", - "\n", - "cli.configureAutoReconnectBackoffTime(1, 32, 20)\n", - "cli.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing\n", - "cli.configureDrainingFrequency(2) # Draining: 2 Hz\n", - "cli.configureConnectDisconnectTimeout(10) # 10 sec\n", - "cli.configureMQTTOperationTimeout(10) # 5 sec\n", - "\n", - "\n", - "def customCallback(cli, userdata, message):\n", - " print(\"Received a new message: \")\n", - " print(message.payload)\n", - " print(\"from topic: \")\n", - " print(message.topic)\n", - " print(\"--------------\\n\\n\")\n", - "\n", - "\n", - "cli.connect()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">> publish hello\n", - "<< True\n", - ">> publish hello\n", - "<< True\n", - ">> publish hello\n", - "<< True\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\">> publish hello\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"<<\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcli\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpublish\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"laisky-hello\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjson\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdumps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"yo\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m\"jedi\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "while 1:\n", - " # print(help(cli.publish))\n", - " print(\">> publish hello\")\n", - " print(\"<<\", cli.publish(\"laisky-hello\", json.dumps({\"yo\": \"jedi\"}), 1))\n", - " time.sleep(1)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/py3/python-syntax/Coroutine.html b/py3/syntax/Coroutine.html similarity index 100% rename from py3/python-syntax/Coroutine.html rename to py3/syntax/Coroutine.html diff --git a/py3/python-syntax/README.md b/py3/syntax/README.md similarity index 100% rename from py3/python-syntax/README.md rename to py3/syntax/README.md diff --git a/py3/python-syntax/concurrent.futures.html b/py3/syntax/concurrent.futures.html similarity index 100% rename from py3/python-syntax/concurrent.futures.html rename to py3/syntax/concurrent.futures.html diff --git a/py3/python-syntax/descriptor.html b/py3/syntax/descriptor.html similarity index 100% rename from py3/python-syntax/descriptor.html rename to py3/syntax/descriptor.html diff --git a/py3/python-syntax/notebook/Coroutine.ipynb b/py3/syntax/notebook/Coroutine.ipynb similarity index 100% rename from py3/python-syntax/notebook/Coroutine.ipynb rename to py3/syntax/notebook/Coroutine.ipynb diff --git a/py3/python-syntax/notebook/asterisk.ipynb b/py3/syntax/notebook/asterisk.ipynb similarity index 100% rename from py3/python-syntax/notebook/asterisk.ipynb rename to py3/syntax/notebook/asterisk.ipynb diff --git a/py3/python-syntax/notebook/bisect.ipynb b/py3/syntax/notebook/bisect.ipynb similarity index 100% rename from py3/python-syntax/notebook/bisect.ipynb rename to py3/syntax/notebook/bisect.ipynb diff --git a/py3/python-syntax/notebook/calendar.ipynb b/py3/syntax/notebook/calendar.ipynb similarity index 100% rename from py3/python-syntax/notebook/calendar.ipynb rename to py3/syntax/notebook/calendar.ipynb diff --git a/py3/python-syntax/notebook/collections.ipynb b/py3/syntax/notebook/collections.ipynb similarity index 100% rename from py3/python-syntax/notebook/collections.ipynb rename to py3/syntax/notebook/collections.ipynb diff --git a/py3/python-syntax/notebook/concurrent.futures.ipynb b/py3/syntax/notebook/concurrent.futures.ipynb similarity index 100% rename from py3/python-syntax/notebook/concurrent.futures.ipynb rename to py3/syntax/notebook/concurrent.futures.ipynb diff --git a/py3/python-syntax/notebook/copy.ipynb b/py3/syntax/notebook/copy.ipynb similarity index 100% rename from py3/python-syntax/notebook/copy.ipynb rename to py3/syntax/notebook/copy.ipynb diff --git a/py3/python-syntax/notebook/decimal.ipynb b/py3/syntax/notebook/decimal.ipynb similarity index 100% rename from py3/python-syntax/notebook/decimal.ipynb rename to py3/syntax/notebook/decimal.ipynb diff --git a/py3/python-syntax/notebook/descriptor.ipynb b/py3/syntax/notebook/descriptor.ipynb similarity index 100% rename from py3/python-syntax/notebook/descriptor.ipynb rename to py3/syntax/notebook/descriptor.ipynb diff --git a/py3/python-syntax/notebook/email.ipynb b/py3/syntax/notebook/email.ipynb similarity index 100% rename from py3/python-syntax/notebook/email.ipynb rename to py3/syntax/notebook/email.ipynb diff --git a/py3/python-syntax/notebook/enum.ipynb b/py3/syntax/notebook/enum.ipynb similarity index 100% rename from py3/python-syntax/notebook/enum.ipynb rename to py3/syntax/notebook/enum.ipynb diff --git a/py3/python-syntax/notebook/format.ipynb b/py3/syntax/notebook/format.ipynb similarity index 100% rename from py3/python-syntax/notebook/format.ipynb rename to py3/syntax/notebook/format.ipynb diff --git a/py3/python-syntax/notebook/fractions.ipynb b/py3/syntax/notebook/fractions.ipynb similarity index 100% rename from py3/python-syntax/notebook/fractions.ipynb rename to py3/syntax/notebook/fractions.ipynb diff --git a/py3/python-syntax/notebook/functools.ipynb b/py3/syntax/notebook/functools.ipynb similarity index 100% rename from py3/python-syntax/notebook/functools.ipynb rename to py3/syntax/notebook/functools.ipynb diff --git a/py3/python-syntax/notebook/headq.ipynb b/py3/syntax/notebook/headq.ipynb similarity index 100% rename from py3/python-syntax/notebook/headq.ipynb rename to py3/syntax/notebook/headq.ipynb diff --git a/py3/python-syntax/notebook/itertools.ipynb b/py3/syntax/notebook/itertools.ipynb similarity index 100% rename from py3/python-syntax/notebook/itertools.ipynb rename to py3/syntax/notebook/itertools.ipynb diff --git a/py3/python-syntax/notebook/mock.ipynb b/py3/syntax/notebook/mock.ipynb similarity index 100% rename from py3/python-syntax/notebook/mock.ipynb rename to py3/syntax/notebook/mock.ipynb diff --git a/py3/python-syntax/notebook/pytz.ipynb b/py3/syntax/notebook/pytz.ipynb similarity index 100% rename from py3/python-syntax/notebook/pytz.ipynb rename to py3/syntax/notebook/pytz.ipynb diff --git a/py3/python-syntax/notebook/sched.ipynb b/py3/syntax/notebook/sched.ipynb similarity index 100% rename from py3/python-syntax/notebook/sched.ipynb rename to py3/syntax/notebook/sched.ipynb diff --git a/py3/python-syntax/notebook/selectors.ipynb b/py3/syntax/notebook/selectors.ipynb similarity index 100% rename from py3/python-syntax/notebook/selectors.ipynb rename to py3/syntax/notebook/selectors.ipynb diff --git a/py3/python-syntax/notebook/smtplib.ipynb b/py3/syntax/notebook/smtplib.ipynb similarity index 98% rename from py3/python-syntax/notebook/smtplib.ipynb rename to py3/syntax/notebook/smtplib.ipynb index 09943840..30986765 100644 --- a/py3/python-syntax/notebook/smtplib.ipynb +++ b/py3/syntax/notebook/smtplib.ipynb @@ -24,7 +24,7 @@ "outputs": [], "source": [ "mail_username = 'ppcelery@gmail.com'\n", - "mail_password = 'yanagi0706'\n", + "mail_password = '12345'\n", "from_addr = mail_username\n", "to_addrs = (mail_username,)\n", "\n", @@ -101,4 +101,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file diff --git a/py3/python-syntax/notebook/statistics.ipynb b/py3/syntax/notebook/statistics.ipynb similarity index 100% rename from py3/python-syntax/notebook/statistics.ipynb rename to py3/syntax/notebook/statistics.ipynb diff --git a/py3/python-syntax/notebook/textwrap.ipynb b/py3/syntax/notebook/textwrap.ipynb similarity index 100% rename from py3/python-syntax/notebook/textwrap.ipynb rename to py3/syntax/notebook/textwrap.ipynb diff --git a/py3/python-syntax/notebook/weakref.ipynb b/py3/syntax/notebook/weakref.ipynb similarity index 100% rename from py3/python-syntax/notebook/weakref.ipynb rename to py3/syntax/notebook/weakref.ipynb diff --git a/py3/python-syntax/notebook/xml.ipynb b/py3/syntax/notebook/xml.ipynb similarity index 100% rename from py3/python-syntax/notebook/xml.ipynb rename to py3/syntax/notebook/xml.ipynb diff --git a/py3/python-syntax/notebook/yield & yield from.ipynb b/py3/syntax/notebook/yield & yield from.ipynb similarity index 100% rename from py3/python-syntax/notebook/yield & yield from.ipynb rename to py3/syntax/notebook/yield & yield from.ipynb From 9a23a2c5b32873c890d9cc1e9a2c990ecd96ef2b Mon Sep 17 00:00:00 2001 From: Laisky Date: Thu, 19 Dec 2019 15:52:06 +0800 Subject: [PATCH 20/27] + graphql client --- go.mod | 19 ++++-- go.sum | 75 ++++++++++++++++++++++ golang/src/demo/test_graphql/query_test.go | 33 ++++++++++ 3 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 golang/src/demo/test_graphql/query_test.go diff --git a/go.mod b/go.mod index ac1ea6b6..aaa10015 100644 --- a/go.mod +++ b/go.mod @@ -4,17 +4,20 @@ go 1.12 require ( cloud.google.com/go v0.43.0 // indirect + git.apache.org/thrift.git v0.13.0 github.com/DataDog/zstd v1.4.0 // indirect github.com/GeertJohan/go.rice v1.0.0 // indirect github.com/Joker/hpp v1.0.0 // indirect github.com/Laisky/go-chaining v0.0.0-20180507092046-43dcdc5a21be github.com/Laisky/go-utils v1.5.2 + github.com/Laisky/graphql v1.0.4-0.20191219072120-f743add4d25b github.com/Laisky/zap v1.9.2 github.com/Shopify/sarama v1.23.1 // indirect github.com/appleboy/gofight/v2 v2.1.1 // indirect - github.com/astaxie/beego v1.12.0 // indirect + github.com/astaxie/beego v1.12.0 github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 // indirect github.com/casbin/casbin v1.9.1 // indirect + github.com/cespare/xxhash v1.1.0 github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 github.com/cloudflare/cfssl v0.0.0-20190911221928-1a911ca1b1d6 // indirect github.com/coreos/bbolt v1.3.3 // indirect @@ -25,18 +28,19 @@ require ( github.com/couchbase/gomemcached v0.0.0-20190515232915-c4b4ca0eb21d // indirect github.com/couchbase/goutils v0.0.0-20190315194238-f9d42b11473b // indirect github.com/daaku/go.zipexe v1.0.1 // indirect + github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc github.com/dvyukov/go-fuzz v0.0.0-20190516070045-5cc3605ccbb6 // indirect github.com/dvyukov/go-fuzz-corpus v0.0.0-20190304103735-86a5af9d6842 // indirect github.com/eapache/go-resiliency v1.2.0 // indirect github.com/edsrzf/mmap-go v1.0.0 // indirect github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/gin-gonic/gin v1.4.0 github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31 // indirect github.com/go-kit/kit v0.9.0 // indirect github.com/go-redis/redis v6.15.2+incompatible // indirect github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect - github.com/gomarkdown/markdown v0.0.0-20190222000725-ee6a7931a1e4 + github.com/golang/protobuf v1.3.2 + github.com/gomarkdown/markdown v0.0.0-20190222000725-ee6a7931a1e4 // indirect github.com/google/certificate-transparency-go v1.0.21 // indirect github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70 // indirect github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect @@ -59,25 +63,28 @@ require ( github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kr/pty v1.1.8 // indirect github.com/lib/pq v1.2.0 // indirect + github.com/libp2p/go-reuseport v0.0.1 github.com/mattn/go-sqlite3 v1.11.0 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pelletier/go-toml v1.4.0 // indirect - github.com/pkg/errors v0.8.1 github.com/pkg/profile v1.3.0 // indirect github.com/prometheus/common v0.6.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962 // indirect github.com/rogpeppe/fastuuid v1.2.0 // indirect + github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92 // indirect github.com/sirupsen/logrus v1.4.2 // indirect github.com/smartystreets/assertions v1.0.1 // indirect github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 // indirect + github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 github.com/spf13/afero v1.2.2 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/stephens2424/writerset v1.0.2 // indirect github.com/syndtr/goleveldb v1.0.0 // indirect github.com/tidwall/gjson v1.3.2 // indirect + github.com/tinylib/msgp v1.1.0 github.com/ugorji/go/codec v1.1.7 github.com/wendal/errors v0.0.0-20181209125328-7f31f4b264ec // indirect github.com/weppos/publicsuffix-go v0.10.0 // indirect @@ -88,12 +95,12 @@ require ( golang.org/x/exp v0.0.0-20190718202018-cfdd5522f6f6 // indirect golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9 // indirect golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 // indirect - golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 // indirect + golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 golang.org/x/sync v0.0.0-20190423024810-112230192c58 golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect golang.org/x/text v0.3.2 golang.org/x/tools v0.0.0-20190723021737-8bb11ff117ca // indirect google.golang.org/appengine v1.6.5 // indirect - google.golang.org/grpc v1.22.0 // indirect + google.golang.org/grpc v1.22.0 gopkg.in/jcmturner/gokrb5.v7 v7.3.0 // indirect ) diff --git a/go.sum b/go.sum index 3badd23c..b603bd71 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= +git.apache.org/thrift.git v0.13.0 h1:/3bz5WZ+sqYArk7MBBBbDufMxKKOA56/6JO6psDpUDY= +git.apache.org/thrift.git v0.13.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -13,6 +15,7 @@ github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/Joker/hpp v0.0.0-20180418125244-6893e659854a/go.mod h1:MzD2WMdSxvbHw5fM/OXOFily/lipJWRc9C1px0Mt0ZE= +github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Joker/jade v1.0.0 h1:lOCEPvTAtWfLpSZYMOv/g44MGQFAolbKh2khHHGu0Kc= github.com/Joker/jade v1.0.0/go.mod h1:efZIdO0py/LtcJRSa/j2WEklMSAw84WV0zZVMxNToB8= @@ -23,8 +26,25 @@ github.com/Laisky/go-chaining v0.0.0-20180507092046-43dcdc5a21be h1:7Rxhm6IjOtDA github.com/Laisky/go-chaining v0.0.0-20180507092046-43dcdc5a21be/go.mod h1:1mdzaETo0kjvCQICPSePsoaatJN4l7JvEA1200lyevo= github.com/Laisky/go-utils v1.5.2 h1:hK/BEzR0jgTbUE+DF4J9dW7Zde+bQEx9RXfAyotBHJc= github.com/Laisky/go-utils v1.5.2/go.mod h1:MpydOPP7RWH/cINQIgI1exzT8/9wumQ49iw91Y/lDOk= +github.com/Laisky/graphql v1.0.1 h1:OFVxoRVsT9tGmxNF2zxZGpIQ2xOux1b2ova+sEO4Dbw= +github.com/Laisky/graphql v1.0.1/go.mod h1:5ZcjUzEYy4ai2tmwmdwSYgxdd3YHThzy0f+ycPFgQQw= +github.com/Laisky/graphql v1.0.2-0.20191218072838-59d5ff744ff0 h1:5UbdojDd32lg67ZVTiFVE/4vz2DGxGt6YTwFBU0AuP4= +github.com/Laisky/graphql v1.0.2-0.20191218072838-59d5ff744ff0/go.mod h1:5ZcjUzEYy4ai2tmwmdwSYgxdd3YHThzy0f+ycPFgQQw= +github.com/Laisky/graphql v1.0.2-0.20191218075226-918c0e702027 h1:pRhxlxbgdZ3EI7MxHK822zifj2x/OvpTWx9k2BZXRt0= +github.com/Laisky/graphql v1.0.2-0.20191218075226-918c0e702027/go.mod h1:5ZcjUzEYy4ai2tmwmdwSYgxdd3YHThzy0f+ycPFgQQw= +github.com/Laisky/graphql v1.0.2-0.20191218083044-5f7478f5bfe7 h1:IS7yAjV10/kML+9oeFGuoqDEmVsPb/HYF6HHTQfgF6s= +github.com/Laisky/graphql v1.0.2-0.20191218083044-5f7478f5bfe7/go.mod h1:5ZcjUzEYy4ai2tmwmdwSYgxdd3YHThzy0f+ycPFgQQw= +github.com/Laisky/graphql v1.0.2-0.20191218101312-b0ad68952627 h1:kfGy7eqRmR8N8Rype2GvJgStFmczVClbrOE254lICwE= +github.com/Laisky/graphql v1.0.2-0.20191218101312-b0ad68952627/go.mod h1:5ZcjUzEYy4ai2tmwmdwSYgxdd3YHThzy0f+ycPFgQQw= +github.com/Laisky/graphql v1.0.2-0.20191218101618-083073e0f56a h1:WIFXSAO+QJ+oCgJzjX4GhZNekel0JjVm0xHVBnM/IHI= +github.com/Laisky/graphql v1.0.2-0.20191218101618-083073e0f56a/go.mod h1:5ZcjUzEYy4ai2tmwmdwSYgxdd3YHThzy0f+ycPFgQQw= +github.com/Laisky/graphql v1.0.2-0.20191219034634-6bcf149d0dc6 h1:jVLog5Sqixi4AFfRYDQDqVibDWqscjfEInmjvfVtz+w= +github.com/Laisky/graphql v1.0.2-0.20191219034634-6bcf149d0dc6/go.mod h1:5ZcjUzEYy4ai2tmwmdwSYgxdd3YHThzy0f+ycPFgQQw= +github.com/Laisky/graphql v1.0.4-0.20191219072120-f743add4d25b h1:AvO0JnaYxdDDztAcTSyYKdtXKgWnCfNbQ8pvodT5zN4= +github.com/Laisky/graphql v1.0.4-0.20191219072120-f743add4d25b/go.mod h1:8nTxZuOwua8Ga6EFL1HuF9rNiJtvSEnwGXGLnW+9i9k= github.com/Laisky/zap v1.9.2 h1:7dTtABboHk8DnT0d6Dc8A9Opu2cyIEaMlL9JO11zvag= github.com/Laisky/zap v1.9.2/go.mod h1:CQdLb2wEfqBvoNLmfOp7wnKTOMvhc4DQRc3xfshL4EQ= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM= @@ -34,6 +54,7 @@ github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqR github.com/Shopify/sarama v1.22.1/go.mod h1:FRzlvRpMFO/639zY1SDxUxkqH97Y0ndM5CbGj6oG3As= github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -44,6 +65,7 @@ github.com/appleboy/gofight/v2 v2.0.0+incompatible/go.mod h1:6E7pthKhmwss84j/zEi github.com/appleboy/gofight/v2 v2.1.1/go.mod h1:6E7pthKhmwss84j/zEixBNim8Q6ahhHcYOtmW5ts5vA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/astaxie/beego v1.11.1/go.mod h1:i69hVzgauOPSw5qeyF4GVZhn7Od0yG5bbCGzmhbWxgQ= +github.com/astaxie/beego v1.12.0 h1:MRhVoeeye5N+Flul5PoVfD9CslfdoH+xqC/xvSQ5u2Y= github.com/astaxie/beego v1.12.0/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o= github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0= github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= @@ -57,6 +79,7 @@ github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQ github.com/bsm/sarama-cluster v2.1.15+incompatible/go.mod h1:r7ao+4tTNXvWm+VRpRJchr2kQhqxgmAp2iEX5W96gMM= github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= github.com/casbin/casbin v1.9.1/go.mod h1:z8uPsfBJGUsnkagrt3G8QvjgTKFMBJ32UP8HpZllfog= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= @@ -90,6 +113,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc h1:8WFBn63wegobsYAX0YjD+8suexZDga5CctH4CCTx2+8= +github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dvyukov/go-fuzz v0.0.0-20190516070045-5cc3605ccbb6 h1:JQBgIQumUT/1PnZs9cWQzx/xH+djYh+oGDLO8H68SWE= @@ -113,6 +138,7 @@ github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 h1:GY1+t5Dr9OKADM64S github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gavv/monotime v0.0.0-20190418164738-30dba4353424 h1:Vh7rylVZRZCj6W41lRlP17xPk4Nq260H4Xo/DDYmEZk= github.com/gavv/monotime v0.0.0-20190418164738-30dba4353424/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= @@ -124,6 +150,7 @@ github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-check/check v1.0.0-20180628173108-788fd7840127 h1:3dbHpVjNKf7Myfit4Xmw4BA0JbCt47OJPhMQ5w8O3E8= github.com/go-check/check v1.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -137,6 +164,7 @@ github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -158,6 +186,7 @@ github.com/google/certificate-transparency-go v1.0.21 h1:Yf1aXowfZ2nuboBsg7iYGLm github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -166,6 +195,7 @@ github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OI github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -173,6 +203,7 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= github.com/gorilla/pat v1.0.1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/graphql-go/graphql v0.7.8 h1:769CR/2JNAhLG9+aa8pfLkKdR0H+r5lsQqling5WwpU= github.com/graphql-go/graphql v0.7.8/go.mod h1:k6yrAYQaSP59DC5UVxbgxESlmVyojThKdORUqGDGmrI= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -184,7 +215,9 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= @@ -192,6 +225,7 @@ github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 h1:7GsNnSL github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1/go.mod h1:i8kTYUOEstd/S8TG0ChTXQdf4ermA/e8vJX0+QruD9w= github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce h1:q8Ka/exfHNgK7izJE+aUOZd7KZXJ7oQbnJWiZakEiMo= github.com/iris-contrib/httpexpect v0.0.0-20180314041918-ebe99fcebbce/go.mod h1:VER17o2JZqquOx41avolD/wMGQSFEFBKWmhag9/RQRY= github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= @@ -204,15 +238,19 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= github.com/juju/errors v0.0.0-20190207033735-e65537c515d7 h1:dMIPRDg6gi7CUp0Kj2+HxqJ5kTr1iAdzsXYIrLCNSmU= github.com/juju/errors v0.0.0-20190207033735-e65537c515d7/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 h1:UUHMLvzt/31azWTN/ifGWef4WUqvXk0iRqdhdy/2uzI= github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/juju/testing v0.0.0-20190613124551-e81189438503 h1:ZUgTbk8oHgP0jpMieifGC9Lv47mHn8Pb3mFX3/Ew4iY= github.com/juju/testing v0.0.0-20190613124551-e81189438503/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.0-20180321173939-03be10146386/go.mod h1:PcaEvfvhGsqwXZ6S3CgCbmjcp+4UDUh2MIfF2ZEul8M= github.com/kataras/golog v0.0.0-20190624001437-99c81de45f40 h1:Q/QxpyNBtfkhXE68tnEA4yyqm77eh/3YOjOw875VbBY= @@ -239,19 +277,25 @@ github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kubernetes/kubernetes v1.17.0 h1:NmJcE3Wyc9DgUACMfoWIG71RX5ipEv62N33D2+eVuVw= github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4= github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= +github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= @@ -270,6 +314,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= @@ -279,16 +324,20 @@ github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYX github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -322,7 +371,10 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= +github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg= github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f h1:tygelZueB1EtXkPI6mQ4o9DQ0+FKW41hTbunoXZCTqk= github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= @@ -335,10 +387,13 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff/go.mod h1:KSQcGKpxUMHk3nbYzs/tIBAM2iDooCn0BmttHOJEbLs= +github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 h1:N8Bg45zpk/UcpNGnfJt2y/3lRWASHNTUET8owPYCgYI= github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= @@ -364,6 +419,8 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA= @@ -371,6 +428,7 @@ github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJH github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/pretty v0.0.0-20190325153808-1166b9ac2b65/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -391,14 +449,21 @@ github.com/weppos/publicsuffix-go v0.10.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8L github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.1.0 h1:ngVtJC9TY/lg0AA/1k48FYhBrhRoFlEmWzsehpNAaZg= github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/zmap/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= github.com/zmap/zcertificate v0.0.0-20180516150559-0e3d58b1bac4/go.mod h1:5iU54tB79AMBcySS0R2XIyZBAVmeHranShAFELYx7is= @@ -465,6 +530,8 @@ golang.org/x/net v0.0.0-20191009170851-d66e71096ffb h1:TR699M2v0qoKTOHxeLgp6zPqa golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 h1:N66aaryRB3Ax92gH0v3hp1QYZ3zWWCCUR/j8Ifh45Ss= golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -481,6 +548,7 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -533,16 +601,21 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610 h1:Ygq9/SRJX9+dU0WCIICM8RkWvDw03lvB77hrhJnpxfU= google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0 h1:J0UbZOIrCAl+fpTOf8YLs4dJo8L/owV4LYVtAXQoPkw= google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= @@ -554,8 +627,10 @@ gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eR gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/golang/src/demo/test_graphql/query_test.go b/golang/src/demo/test_graphql/query_test.go new file mode 100644 index 00000000..a849fddc --- /dev/null +++ b/golang/src/demo/test_graphql/query_test.go @@ -0,0 +1,33 @@ +package test + +import ( + "context" + "net/http" + "testing" + + "github.com/Laisky/graphql" +) + +type gcpLockQuery struct { + Lock struct { + Name graphql.String `graphql:"name"` + ExpiresAt graphql.String `graphql:"expires_at"` + } `graphql:"Lock(name: $name)"` +} + +func TestQueryWithHTTPGet(t *testing.T) { + ctx := context.Background() + httpClient := http.DefaultClient + query := new(gcpLockQuery) + vars := map[string]interface{}{ + "name": graphql.String("laisky.123"), + } + gracli := graphql.NewClient( + "https://blog.laisky.com/graphql/query/", + httpClient, + ) + if err := gracli.Query(ctx, query, vars); err != nil { + t.Fatalf("%+v", err) + } + +} From 9d43d2be68a96f4d723167c283f519b241c10dc6 Mon Sep 17 00:00:00 2001 From: Laisky Date: Tue, 24 Dec 2019 16:23:32 +0800 Subject: [PATCH 21/27] + false sharing --- golang/src/demo/perf_demo/bounds_test.go | 2 +- golang/src/demo/perf_demo/escape.go | 2 +- .../src/demo/perf_demo/fake_sharing_test.go | 89 +++++++++++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 golang/src/demo/perf_demo/fake_sharing_test.go diff --git a/golang/src/demo/perf_demo/bounds_test.go b/golang/src/demo/perf_demo/bounds_test.go index 61c6b967..d5c59af4 100644 --- a/golang/src/demo/perf_demo/bounds_test.go +++ b/golang/src/demo/perf_demo/bounds_test.go @@ -1,4 +1,4 @@ -package main_test +package test import "testing" diff --git a/golang/src/demo/perf_demo/escape.go b/golang/src/demo/perf_demo/escape.go index 9f92af06..46ba2525 100644 --- a/golang/src/demo/perf_demo/escape.go +++ b/golang/src/demo/perf_demo/escape.go @@ -7,7 +7,7 @@ ./escape.go:9:9: foo new(P) does not escape */ -package perf +package test type P struct { X, Y int diff --git a/golang/src/demo/perf_demo/fake_sharing_test.go b/golang/src/demo/perf_demo/fake_sharing_test.go new file mode 100644 index 00000000..7b193c3b --- /dev/null +++ b/golang/src/demo/perf_demo/fake_sharing_test.go @@ -0,0 +1,89 @@ +package test + +import ( + "sync/atomic" + "testing" +) + +type noPadding struct { + a, b, c uint64 +} + +type padding struct { + a uint64 + _p1 [8]uint64 + b uint64 + _p2 [8]uint64 + c uint64 +} + +func BenchmarkFakeSharing(b *testing.B) { + const nFork = 4 + b.ResetTimer() + b.Run("no padding individual var", func(b *testing.B) { + noPaddingData := new(noPadding) + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + atomic.AddUint64(&noPaddingData.a, 1) + } + }) + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + atomic.AddUint64(&noPaddingData.b, 1) + } + }) + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + atomic.AddUint64(&noPaddingData.c, 1) + } + }) + }) + + b.ResetTimer() + b.Run("no padding all vars", func(b *testing.B) { + noPaddingData := new(noPadding) + for i := 0; i < nFork; i++ { + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + atomic.AddUint64(&noPaddingData.a, 1) + atomic.AddUint64(&noPaddingData.b, 1) + atomic.AddUint64(&noPaddingData.c, 1) + } + }) + } + }) + + b.ResetTimer() + b.Run("padding individual var", func(b *testing.B) { + paddingData := new(padding) + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + atomic.AddUint64(&paddingData.a, 1) + } + }) + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + atomic.AddUint64(&paddingData.b, 1) + } + }) + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + atomic.AddUint64(&paddingData.c, 1) + } + }) + }) + + b.ResetTimer() + b.Run("padding all vars", func(b *testing.B) { + paddingData := new(padding) + for i := 0; i < nFork; i++ { + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + atomic.AddUint64(&paddingData.a, 1) + atomic.AddUint64(&paddingData.b, 1) + atomic.AddUint64(&paddingData.c, 1) + } + }) + } + }) +} From 3c26b70c77fc3af9b9194489ba6798c80243b43d Mon Sep 17 00:00:00 2001 From: Laisky Date: Tue, 24 Dec 2019 16:24:00 +0800 Subject: [PATCH 22/27] rename --- .../perf_demo/{fake_sharing_test.go => false_sharing_test.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename golang/src/demo/perf_demo/{fake_sharing_test.go => false_sharing_test.go} (100%) diff --git a/golang/src/demo/perf_demo/fake_sharing_test.go b/golang/src/demo/perf_demo/false_sharing_test.go similarity index 100% rename from golang/src/demo/perf_demo/fake_sharing_test.go rename to golang/src/demo/perf_demo/false_sharing_test.go From b9538dff4507b6f8570ccc3b8503b870ce0e4578 Mon Sep 17 00:00:00 2001 From: Laisky Date: Thu, 16 Jan 2020 15:49:43 +0800 Subject: [PATCH 23/27] + channel --- .../src/demo/perf_demo/false_sharing_test.go | 12 +++++++++++ golang/src/demo/test_syntax/chan_test.go | 20 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/golang/src/demo/perf_demo/false_sharing_test.go b/golang/src/demo/perf_demo/false_sharing_test.go index 7b193c3b..ecd678d6 100644 --- a/golang/src/demo/perf_demo/false_sharing_test.go +++ b/golang/src/demo/perf_demo/false_sharing_test.go @@ -25,16 +25,22 @@ func BenchmarkFakeSharing(b *testing.B) { b.RunParallel(func(pb *testing.PB) { for pb.Next() { atomic.AddUint64(&noPaddingData.a, 1) + atomic.AddUint64(&noPaddingData.a, 1) + atomic.AddUint64(&noPaddingData.a, 1) } }) b.RunParallel(func(pb *testing.PB) { for pb.Next() { atomic.AddUint64(&noPaddingData.b, 1) + atomic.AddUint64(&noPaddingData.b, 1) + atomic.AddUint64(&noPaddingData.b, 1) } }) b.RunParallel(func(pb *testing.PB) { for pb.Next() { atomic.AddUint64(&noPaddingData.c, 1) + atomic.AddUint64(&noPaddingData.c, 1) + atomic.AddUint64(&noPaddingData.c, 1) } }) }) @@ -59,16 +65,22 @@ func BenchmarkFakeSharing(b *testing.B) { b.RunParallel(func(pb *testing.PB) { for pb.Next() { atomic.AddUint64(&paddingData.a, 1) + atomic.AddUint64(&paddingData.a, 1) + atomic.AddUint64(&paddingData.a, 1) } }) b.RunParallel(func(pb *testing.PB) { for pb.Next() { atomic.AddUint64(&paddingData.b, 1) + atomic.AddUint64(&paddingData.b, 1) + atomic.AddUint64(&paddingData.b, 1) } }) b.RunParallel(func(pb *testing.PB) { for pb.Next() { atomic.AddUint64(&paddingData.c, 1) + atomic.AddUint64(&paddingData.c, 1) + atomic.AddUint64(&paddingData.c, 1) } }) }) diff --git a/golang/src/demo/test_syntax/chan_test.go b/golang/src/demo/test_syntax/chan_test.go index 0f698b18..a1422f7a 100644 --- a/golang/src/demo/test_syntax/chan_test.go +++ b/golang/src/demo/test_syntax/chan_test.go @@ -26,3 +26,23 @@ func TestClocsChan(t *testing.T) { } } + +func TestSelectChan(t *testing.T) { + chan1 := make(chan int, 100000) + chan2 := make(chan int, 100000) + chan3 := make(chan int, 100000) + + for i := 0; i < 100; i++ { + select { + case chan1 <- i: + case chan2 <- i: + default: + chan3 <- i + } + } + + t.Logf("len chan1: %v", len(chan1)) + t.Logf("len chan2: %v", len(chan2)) + t.Logf("len chan3: %v", len(chan3)) + t.Error() +} From 83baf0cafbc81959ebbd70ee4816914e73a29201 Mon Sep 17 00:00:00 2001 From: Laisky Date: Tue, 10 Mar 2020 15:44:35 +0800 Subject: [PATCH 24/27] + closed c --- go.sum | 1 + golang/src/demo/test_syntax/chan_test.go | 37 +++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/go.sum b/go.sum index b603bd71..4e303193 100644 --- a/go.sum +++ b/go.sum @@ -284,6 +284,7 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kubernetes/kubernetes v1.17.0 h1:NmJcE3Wyc9DgUACMfoWIG71RX5ipEv62N33D2+eVuVw= +github.com/kubernetes/kubernetes v1.17.3 h1:R48XdHaBsm98Dx97znpvyOTovPfROuSmmyQLwDurbts= github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4= github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4= diff --git a/golang/src/demo/test_syntax/chan_test.go b/golang/src/demo/test_syntax/chan_test.go index a1422f7a..55a0b742 100644 --- a/golang/src/demo/test_syntax/chan_test.go +++ b/golang/src/demo/test_syntax/chan_test.go @@ -1,6 +1,11 @@ package test -import "testing" +import ( + "runtime" + "sync" + "testing" + "time" +) func TestClocsChan(t *testing.T) { @@ -27,6 +32,11 @@ func TestClocsChan(t *testing.T) { } +/* + * 44: len chan1: 42 + * 45: len chan2: 58 + * 46: len chan3: 0 + */ func TestSelectChan(t *testing.T) { chan1 := make(chan int, 100000) chan2 := make(chan int, 100000) @@ -46,3 +56,28 @@ func TestSelectChan(t *testing.T) { t.Logf("len chan3: %v", len(chan3)) t.Error() } + +func TestClosedChan(t *testing.T) { + c := make(chan int, 10) + var wg sync.WaitGroup + wg.Add(2) + + go func() { + defer wg.Done() + for i := 0; i < 10; i++ { + c <- i + } + close(c) + }() + go func() { + defer wg.Done() + for v := range c { + time.Sleep(100 * time.Millisecond) + t.Logf("got: %+v", v) + runtime.Gosched() + } + }() + + wg.Wait() + t.Error() +} From 28c2ad009c3f24d3e6ada1fa6e9c16948a62952f Mon Sep 17 00:00:00 2001 From: Laisky Date: Mon, 23 Mar 2020 11:33:17 +0800 Subject: [PATCH 25/27] refact go --- golang/.env | 2 +- golang/src/demo/test_io/read_by_bufio.go | 30 ---- golang/src/demo/test_syntax/for_test.go | 24 --- golang/src/demo/test_unsafe/README.md | 8 - .../src/demo/test_unsafe/bytes2string_test.go | 30 ---- golang/src/demo/test_unsafe/main.go | 25 --- golang/src/demo/test_unsafe/p/default.go | 18 -- golang/syntax/certs/README.md | 0 golang/syntax/certs/ca-config.json | 34 ++++ golang/syntax/certs/ca-csr.json | 20 +++ golang/syntax/certs/self-ca-key.pem | 5 + golang/syntax/certs/self-ca.csr | 9 + golang/syntax/certs/self-ca.pem | 12 ++ .../demo/test_syntax => syntax}/chan_test.go | 0 .../demo/test_syntax => syntax}/ctx_test.go | 0 golang/{src/demo/test_io => syntax}/data.txt | 0 golang/syntax/for_test.go | 44 +++++ golang/syntax/go.mod | 8 + golang/syntax/go.sum | 4 + .../io_read_test.go} | 27 ++- golang/syntax/os_test.go | 19 +++ golang/syntax/sign_and_verify_test.go | 82 +++++++++ .../singleflight_test.go | 0 .../test_syntax => syntax}/structure_test.go | 0 golang/syntax/unsafe_test.go | 63 +++++++ golang/templates/simple-login.html | 16 -- py3/kafka/oogway.ipynb | 160 ++++++++++++++++++ 27 files changed, 486 insertions(+), 154 deletions(-) delete mode 100644 golang/src/demo/test_io/read_by_bufio.go delete mode 100644 golang/src/demo/test_syntax/for_test.go delete mode 100644 golang/src/demo/test_unsafe/README.md delete mode 100644 golang/src/demo/test_unsafe/bytes2string_test.go delete mode 100644 golang/src/demo/test_unsafe/main.go delete mode 100644 golang/src/demo/test_unsafe/p/default.go create mode 100644 golang/syntax/certs/README.md create mode 100644 golang/syntax/certs/ca-config.json create mode 100644 golang/syntax/certs/ca-csr.json create mode 100644 golang/syntax/certs/self-ca-key.pem create mode 100644 golang/syntax/certs/self-ca.csr create mode 100644 golang/syntax/certs/self-ca.pem rename golang/{src/demo/test_syntax => syntax}/chan_test.go (100%) rename golang/{src/demo/test_syntax => syntax}/ctx_test.go (100%) rename golang/{src/demo/test_io => syntax}/data.txt (100%) create mode 100644 golang/syntax/for_test.go create mode 100644 golang/syntax/go.mod create mode 100644 golang/syntax/go.sum rename golang/{src/demo/test_io/read_by_bytes.go => syntax/io_read_test.go} (54%) create mode 100644 golang/syntax/os_test.go create mode 100644 golang/syntax/sign_and_verify_test.go rename golang/{src/demo/test_syntax => syntax}/singleflight_test.go (100%) rename golang/{src/demo/test_syntax => syntax}/structure_test.go (100%) create mode 100644 golang/syntax/unsafe_test.go delete mode 100644 golang/templates/simple-login.html create mode 100644 py3/kafka/oogway.ipynb diff --git a/golang/.env b/golang/.env index 79fc6976..b5bad617 100644 --- a/golang/.env +++ b/golang/.env @@ -2,4 +2,4 @@ export GOROOT=/usr/local/opt/go/libexec/ export GOPATH=/Users/laisky/repo/laisky/HelloWorld/golang export PATH=/Users/laisky/repo/laisky/HelloWorld/golang/bin:$PATH -export GO111MODULE=off +export GO111MODULE=on diff --git a/golang/src/demo/test_io/read_by_bufio.go b/golang/src/demo/test_io/read_by_bufio.go deleted file mode 100644 index 37d4cece..00000000 --- a/golang/src/demo/test_io/read_by_bufio.go +++ /dev/null @@ -1,30 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "io" - "os" -) - -func main() { - inputFile, inputError := os.Open("data.txt") - if inputError != nil { - fmt.Printf("An error occurred on opening the inputfile\n" + - "Does the file exist?\n" + - "Have you got acces to it?\n") - return // exit the function on error - } - defer inputFile.Close() - - // 用 bufio 封装 Reader - // 会自动将数据读入缓存区,减少 IO 的使用 - inputReader := bufio.NewReader(inputFile) - for { - inputString, readerError := inputReader.ReadString('\n') - if readerError == io.EOF { - return - } - fmt.Printf("The input was: %s", inputString) - } -} diff --git a/golang/src/demo/test_syntax/for_test.go b/golang/src/demo/test_syntax/for_test.go deleted file mode 100644 index f65f0d0e..00000000 --- a/golang/src/demo/test_syntax/for_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package test - -import ( - "sync" - "testing" -) - -func TestFor(t *testing.T) { - wg := &sync.WaitGroup{} - z := 0 - for i := 0; i < 5; i++ { - z++ - wg.Add(1) - go func() { - defer wg.Done() - t.Log(i) - t.Log(z) - t.Log("----------------") - }() - } - - wg.Wait() - // t.Error() -} diff --git a/golang/src/demo/test_unsafe/README.md b/golang/src/demo/test_unsafe/README.md deleted file mode 100644 index 86279f0e..00000000 --- a/golang/src/demo/test_unsafe/README.md +++ /dev/null @@ -1,8 +0,0 @@ -Go Unsafe -=== - -> Golang 指针的各种黑科技玩法 - -## Reference - - - [golang: 利用unsafe操作未导出变量](http://studygolang.com/articles/685) diff --git a/golang/src/demo/test_unsafe/bytes2string_test.go b/golang/src/demo/test_unsafe/bytes2string_test.go deleted file mode 100644 index 0b50d618..00000000 --- a/golang/src/demo/test_unsafe/bytes2string_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// -// $ go test -test.bench=".*" -package main - -import "testing" -import "unsafe" - -func Test_ByteString(t *testing.T) { - var x = []byte("Hello World!") - var y = *(*string)(unsafe.Pointer(&x)) - var z = string(x) - - if y != z { - t.Fail() - } -} - -func Benchmark_Normal(b *testing.B) { - var x = []byte("Hello World!") - for i := 0; i < b.N; i++ { - _ = string(x) - } -} - -func Benchmark_ByteString(b *testing.B) { - var x = []byte("Hello World!") - for i := 0; i < b.N; i++ { - _ = *(*string)(unsafe.Pointer(&x)) - } -} diff --git a/golang/src/demo/test_unsafe/main.go b/golang/src/demo/test_unsafe/main.go deleted file mode 100644 index 7938a151..00000000 --- a/golang/src/demo/test_unsafe/main.go +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "test_unsafe/p" - "unsafe" -) - -func main() { - // 分配空间,创建新对象 - var v *p.V = new(p.V) - - // 将 v 的指针转换为 int32 的指针 - var i *int32 = (*int32)(unsafe.Pointer(v)) - // 赋值,相当于给 V.i 赋值 - *i = int32(98) - - // 获取 V.j 的指针 - // 方法是 i 的指针加上一个 int32 的长度,因为结构体内的内存是连续的 - var j *int64 = (*int64)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + uintptr(unsafe.Sizeof(int32(0))))) - *j = int64(763) - - // 输出,会发现私有变量的值都被改变了 - v.PutI() - v.PutJ() -} diff --git a/golang/src/demo/test_unsafe/p/default.go b/golang/src/demo/test_unsafe/p/default.go deleted file mode 100644 index 1f536311..00000000 --- a/golang/src/demo/test_unsafe/p/default.go +++ /dev/null @@ -1,18 +0,0 @@ -package p - -import ( - "fmt" -) - -type V struct { - i int32 - j int64 -} - -func (this V) PutI() { - fmt.Printf("i=%d\n", this.i) -} - -func (this V) PutJ() { - fmt.Printf("j=%d\n", this.j) -} diff --git a/golang/syntax/certs/README.md b/golang/syntax/certs/README.md new file mode 100644 index 00000000..e69de29b diff --git a/golang/syntax/certs/ca-config.json b/golang/syntax/certs/ca-config.json new file mode 100644 index 00000000..77c1772e --- /dev/null +++ b/golang/syntax/certs/ca-config.json @@ -0,0 +1,34 @@ +{ + "signing": { + "default": { + "expiry": "168h" + }, + "profiles": { + "www": { + "expiry": "8760h", + "usages": [ + "signing", + "key encipherment", + "server auth" + ] + }, + "server": { + "expiry": "8760h", + "usages": [ + "signing", + "key encipherment", + "server auth" + ] + }, + "client": { + "expiry": "8760h", + "usages": [ + "signing", + "key encipherment", + "client auth" + ] + } + } + } +} + diff --git a/golang/syntax/certs/ca-csr.json b/golang/syntax/certs/ca-csr.json new file mode 100644 index 00000000..9c24890b --- /dev/null +++ b/golang/syntax/certs/ca-csr.json @@ -0,0 +1,20 @@ +{ + "CN": "example.net", + "hosts": [ + "example.net", + "www.example.net", + "localhost" + ], + "key": { + "algo": "ecdsa", + "size": 256 + }, + "names": [ + { + "C": "US", + "ST": "CA", + "L": "San Francisco" + } + ] +} + diff --git a/golang/syntax/certs/self-ca-key.pem b/golang/syntax/certs/self-ca-key.pem new file mode 100644 index 00000000..2c162a45 --- /dev/null +++ b/golang/syntax/certs/self-ca-key.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIOocbtOXVafsZbp6j3DBkU5YeiDOPcWKLPrKs6Q5yzPMoAoGCCqGSM49 +AwEHoUQDQgAE849ur0RR2ZS05WS6uTgpouo8vi7jm0KQPiaxV12ithVGDOebLzRk +RKAa3VTQclUcZi6A1y5w/vlFs8x+k6w+jg== +-----END EC PRIVATE KEY----- diff --git a/golang/syntax/certs/self-ca.csr b/golang/syntax/certs/self-ca.csr new file mode 100644 index 00000000..8dc74188 --- /dev/null +++ b/golang/syntax/certs/self-ca.csr @@ -0,0 +1,9 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBSTCB7wIBADBIMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcT +DVNhbiBGcmFuY2lzY28xFDASBgNVBAMTC2V4YW1wbGUubmV0MFkwEwYHKoZIzj0C +AQYIKoZIzj0DAQcDQgAE849ur0RR2ZS05WS6uTgpouo8vi7jm0KQPiaxV12ithVG +DOebLzRkRKAa3VTQclUcZi6A1y5w/vlFs8x+k6w+jqBFMEMGCSqGSIb3DQEJDjE2 +MDQwMgYDVR0RBCswKYILZXhhbXBsZS5uZXSCD3d3dy5leGFtcGxlLm5ldIIJbG9j +YWxob3N0MAoGCCqGSM49BAMCA0kAMEYCIQDBfeWTi3wmJNJuKYRaEiECZMvlbZx9 +Vh4YShOZfZrgdQIhANtIcdGAFfyDYVa5weZXaCbmUS5evQciaSIwSTKp66oZ +-----END CERTIFICATE REQUEST----- diff --git a/golang/syntax/certs/self-ca.pem b/golang/syntax/certs/self-ca.pem new file mode 100644 index 00000000..d51c8de4 --- /dev/null +++ b/golang/syntax/certs/self-ca.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIB1TCCAXqgAwIBAgIUaO+mfo2HHbdSE6uC7G9U5z8mna0wCgYIKoZIzj0EAwIw +SDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1TYW4gRnJhbmNp +c2NvMRQwEgYDVQQDEwtleGFtcGxlLm5ldDAeFw0yMDAzMjIwNzE2MDBaFw0yNTAz +MjEwNzE2MDBaMEgxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMN +U2FuIEZyYW5jaXNjbzEUMBIGA1UEAxMLZXhhbXBsZS5uZXQwWTATBgcqhkjOPQIB +BggqhkjOPQMBBwNCAATzj26vRFHZlLTlZLq5OCmi6jy+LuObQpA+JrFXXaK2FUYM +55svNGREoBrdVNByVRxmLoDXLnD++UWzzH6TrD6Oo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUkPpLdWHk7zn7jzeP0y435+66 +qnAwCgYIKoZIzj0EAwIDSQAwRgIhALjsW3NVSWcpF3puIVHLwNo1h3SG94LokEhJ +tLu/FwZiAiEAkzVXK1RtfWbBq04oI4GVUaPCSnS/yLagroXkK1/Hykk= +-----END CERTIFICATE----- diff --git a/golang/src/demo/test_syntax/chan_test.go b/golang/syntax/chan_test.go similarity index 100% rename from golang/src/demo/test_syntax/chan_test.go rename to golang/syntax/chan_test.go diff --git a/golang/src/demo/test_syntax/ctx_test.go b/golang/syntax/ctx_test.go similarity index 100% rename from golang/src/demo/test_syntax/ctx_test.go rename to golang/syntax/ctx_test.go diff --git a/golang/src/demo/test_io/data.txt b/golang/syntax/data.txt similarity index 100% rename from golang/src/demo/test_io/data.txt rename to golang/syntax/data.txt diff --git a/golang/syntax/for_test.go b/golang/syntax/for_test.go new file mode 100644 index 00000000..284d52b1 --- /dev/null +++ b/golang/syntax/for_test.go @@ -0,0 +1,44 @@ +package test + +import ( + "sync" + "testing" + + "golang.org/x/sync/errgroup" +) + +func TestFor(t *testing.T) { + wg := &sync.WaitGroup{} + z := 0 + for i := 0; i < 5; i++ { + z++ + wg.Add(1) + go func() { + defer wg.Done() + t.Log(i) + t.Log(z) + t.Log("----------------") + }() + } + + wg.Wait() + // t.Error() +} + +func TestErrgroupInFor(t *testing.T) { + var pool errgroup.Group + for i := 0; i < 10; i++ { + j := i + pool.Go(func() error { + t.Logf("%v", j) + return nil + }) + + } + + if err := pool.Wait(); err != nil { + t.Fatalf("%+v", err) + } + + t.Error("done") +} diff --git a/golang/syntax/go.mod b/golang/syntax/go.mod new file mode 100644 index 00000000..5785a256 --- /dev/null +++ b/golang/syntax/go.mod @@ -0,0 +1,8 @@ +module github.com/Laisky/test + +go 1.14 + +require ( + github.com/pkg/errors v0.9.1 + golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a +) diff --git a/golang/syntax/go.sum b/golang/syntax/go.sum new file mode 100644 index 00000000..854ec9ee --- /dev/null +++ b/golang/syntax/go.sum @@ -0,0 +1,4 @@ +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/golang/src/demo/test_io/read_by_bytes.go b/golang/syntax/io_read_test.go similarity index 54% rename from golang/src/demo/test_io/read_by_bytes.go rename to golang/syntax/io_read_test.go index 21f71c41..1629e790 100644 --- a/golang/src/demo/test_io/read_by_bytes.go +++ b/golang/syntax/io_read_test.go @@ -1,4 +1,4 @@ -package main +package test import ( "fmt" @@ -23,7 +23,30 @@ func ReadLine(reader io.Reader) (line []byte, err error) { } } -func main() { +func TestBufio(t *testing.T) { + inputFile, inputError := os.Open("data.txt") + if inputError != nil { + fmt.Printf("An error occurred on opening the inputfile\n" + + "Does the file exist?\n" + + "Have you got acces to it?\n") + return // exit the function on error + } + defer inputFile.Close() + + // 用 bufio 封装 Reader + // 会自动将数据读入缓存区,减少 IO 的使用 + inputReader := bufio.NewReader(inputFile) + for { + inputString, readerError := inputReader.ReadString('\n') + if readerError == io.EOF { + return + } + fmt.Printf("The input was: %s", inputString) + } +} + + +func TestReader(t *testing.T) { inputFile, inputError := os.Open("data.txt") if inputError != nil { fmt.Printf("An error occurred on opening the inputfile\n" + diff --git a/golang/syntax/os_test.go b/golang/syntax/os_test.go new file mode 100644 index 00000000..51ab3ad1 --- /dev/null +++ b/golang/syntax/os_test.go @@ -0,0 +1,19 @@ +package test + +import ( + "os" + "testing" + "time" +) + +func TestExit(t *testing.T) { + p, err := os.FindProcess(os.Getpid()) + if err != nil { + t.Fatalf("%+v", err) + } + + if err := p.Kill(); err != nil { + t.Fatalf("%+v", err) + } + time.Sleep(1 * time.Second) +} diff --git a/golang/syntax/sign_and_verify_test.go b/golang/syntax/sign_and_verify_test.go new file mode 100644 index 00000000..2a950b25 --- /dev/null +++ b/golang/syntax/sign_and_verify_test.go @@ -0,0 +1,82 @@ +package test + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/sha256" + "crypto/x509" + "encoding/pem" + "fmt" + "testing" + + "github.com/pkg/errors" +) + +func EncodeECDSAPrivateKey(privateKey *ecdsa.PrivateKey) ([]byte, error) { + x509Encoded, err := x509.MarshalECPrivateKey(privateKey) + if err != nil { + return nil, errors.Wrap(err, "marshal private key") + } + + return pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509Encoded}), nil +} + +func EncodeECDSAPublicKey(publicKey *ecdsa.PublicKey) ([]byte, error) { + x509EncodedPub, err := x509.MarshalPKIXPublicKey(publicKey) + if err != nil { + return nil, errors.Wrap(err, "marshal public key") + } + return pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: x509EncodedPub}), nil +} + +func DecodeECDSAPrivateKey(pemEncoded []byte) (*ecdsa.PrivateKey, error) { + block, _ := pem.Decode(pemEncoded) + privateKey, err := x509.ParseECPrivateKey(block.Bytes) + if err != nil { + return nil, errors.Wrap(err, "parse private key") + } + return privateKey, nil +} + +func DecodeECDSAPublicKey(pemEncodedPub []byte) (*ecdsa.PublicKey, error) { + blockPub, _ := pem.Decode(pemEncodedPub) + genericPublicKey, err := x509.ParsePKIXPublicKey(blockPub.Bytes) + if err != nil { + return nil, errors.Wrap(err, "parse public key") + } + + return genericPublicKey.(*ecdsa.PublicKey), nil +} + +func TestECDSASign(t *testing.T) { + privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + t.Fatalf("%+v", err) + } + + if pubkey, err := EncodeECDSAPublicKey(&privateKey.PublicKey); err != nil { + t.Fatalf("%+v", err) + } else { + t.Logf("pub: %+v", pubkey) + } + if prikey, err := EncodeECDSAPrivateKey(privateKey); err != nil { + t.Fatalf("%+v", err) + } else { + t.Logf("pri: %+v", prikey) + } + + msg := "hello, world" + hash := sha256.Sum256([]byte(msg)) + + r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:]) + if err != nil { + t.Fatalf("%+v", err) + } + + fmt.Printf("signature: (0x%x, 0x%x)\n", r, s) + + valid := ecdsa.Verify(&privateKey.PublicKey, hash[:], r, s) + fmt.Println("signature verified:", valid) + t.Error() +} diff --git a/golang/src/demo/test_syntax/singleflight_test.go b/golang/syntax/singleflight_test.go similarity index 100% rename from golang/src/demo/test_syntax/singleflight_test.go rename to golang/syntax/singleflight_test.go diff --git a/golang/src/demo/test_syntax/structure_test.go b/golang/syntax/structure_test.go similarity index 100% rename from golang/src/demo/test_syntax/structure_test.go rename to golang/syntax/structure_test.go diff --git a/golang/syntax/unsafe_test.go b/golang/syntax/unsafe_test.go new file mode 100644 index 00000000..28b1ec9a --- /dev/null +++ b/golang/syntax/unsafe_test.go @@ -0,0 +1,63 @@ +package test + +import ( + "fmt" + "testing" + "unsafe" +) + +func Test_ByteString(t *testing.T) { + var x = []byte("Hello World!") + var y = *(*string)(unsafe.Pointer(&x)) + var z = string(x) + + if y != z { + t.Fail() + } +} + +func Benchmark_Normal(b *testing.B) { + var x = []byte("Hello World!") + for i := 0; i < b.N; i++ { + _ = string(x) + } +} + +func Benchmark_ByteString(b *testing.B) { + var x = []byte("Hello World!") + for i := 0; i < b.N; i++ { + _ = *(*string)(unsafe.Pointer(&x)) + } +} + +type V struct { + i int32 + j int64 +} + +func (this V) PutI() { + fmt.Printf("i=%d\n", this.i) +} + +func (this V) PutJ() { + fmt.Printf("j=%d\n", this.j) +} + +func ExampleUnsafe() { + // 分配空间,创建新对象 + var v *V = new(V) + + // 将 v 的指针转换为 int32 的指针 + var i *int32 = (*int32)(unsafe.Pointer(v)) + // 赋值,相当于给 V.i 赋值 + *i = int32(98) + + // 获取 V.j 的指针 + // 方法是 i 的指针加上一个 int32 的长度,因为结构体内的内存是连续的 + var j *int64 = (*int64)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + uintptr(unsafe.Sizeof(int32(0))))) + *j = int64(763) + + // 输出,会发现私有变量的值都被改变了 + v.PutI() + v.PutJ() +} diff --git a/golang/templates/simple-login.html b/golang/templates/simple-login.html deleted file mode 100644 index e7a8c451..00000000 --- a/golang/templates/simple-login.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - Simple Login - - - -
- - - -
- - \ No newline at end of file diff --git a/py3/kafka/oogway.ipynb b/py3/kafka/oogway.ipynb new file mode 100644 index 00000000..9804a716 --- /dev/null +++ b/py3/kafka/oogway.ipynb @@ -0,0 +1,160 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'bootstrap.servers': '10.213.113.26:9092',\n", + " 'group.id': 'host-one',\n", + " 'virus_topic': 'antivirus-scan-results'}" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import yaml\n", + "import codecs\n", + "import kipp\n", + "import json\n", + "from string import ascii_letters\n", + "from random import choice,sample\n", + "\n", + "\n", + "with codecs.open(r'/opt/configs/360/yunjia.yml', 'r', 'utf8') as f:\n", + " config = yaml.load(f, yaml.CLoader)['kafka']\n", + " \n", + "config" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from kafka import KafkaProducer\n", + "KafkaProducer?" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from kafka import KafkaProducer\n", + "\n", + "producer = KafkaProducer(\n", + " bootstrap_servers=config['bootstrap.servers'],\n", + ")\n", + "\n", + "\n", + "def generate_scan_result():\n", + " return {\n", + " 'IsVirus': True,\n", + " 'VirusClass': \"病毒类型\",\n", + " 'VirusName': \"病毒名.\" + ''.join(sample(ascii_letters, 8)),\n", + " 'VirusFileFullName': \"VirusFileFullName\",\n", + " 'VirusFileShortName': \"VirusFileShortName\",\n", + " 'VirusFilePath': \"VirusFilePath\",\n", + " 'VirusMajorType': \"VirusMajorType\",\n", + " 'VirusMinorType': \"VirusMinorType\",\n", + " 'VirusFileType': \"VirusFileType\",\n", + " 'VirusProcAction':123,\n", + " 'UserOwner': \"UserOwner\",\n", + " 'EngineType': 1,\n", + " 'FileLevel': 1,\n", + " 'IsArchive': True,\n", + " 'FileNeedUpload': True,\n", + " 'AttrNeedUpload': True,\n", + " 'MD5': \"MD5.\"+''.join(sample(ascii_letters, 2)),\n", + " 'SHA1': \"SHA1\",\n", + " 'AgentID': \"AgentID\",\n", + "}\n", + "\n", + "# generate_scan_result()\n", + "\n", + "for _ in range(1000):\n", + " producer.send(config['virus_topic'], json.dumps(generate_scan_result()).encode('utf8'))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "KafkaConsumer?" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 10\u001b[0m )\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mconsumer\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0mprint\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/38/lib/python3.8/site-packages/kafka/consumer/group.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1190\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_v1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1191\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1192\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_v2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1193\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1194\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mnext_v2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/38/lib/python3.8/site-packages/kafka/consumer/group.py\u001b[0m in \u001b[0;36mnext_v2\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1198\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterator\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_message_generator_v2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1199\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1200\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1201\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mStopIteration\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1202\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterator\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/38/lib/python3.8/site-packages/kafka/consumer/group.py\u001b[0m in \u001b[0;36m_message_generator_v2\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1113\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_message_generator_v2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1114\u001b[0m \u001b[0mtimeout_ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1000\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_consumer_timeout\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1115\u001b[0;31m \u001b[0mrecord_map\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpoll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout_ms\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout_ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mupdate_offsets\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1116\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrecords\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msix\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miteritems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrecord_map\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1117\u001b[0m \u001b[0;31m# Generators are stateful, and it is possible that the tp / records\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/38/lib/python3.8/site-packages/kafka/consumer/group.py\u001b[0m in \u001b[0;36mpoll\u001b[0;34m(self, timeout_ms, max_records, update_offsets)\u001b[0m\n\u001b[1;32m 652\u001b[0m \u001b[0mremaining\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimeout_ms\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 653\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 654\u001b[0;31m \u001b[0mrecords\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_poll_once\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mremaining\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_records\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mupdate_offsets\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mupdate_offsets\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 655\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrecords\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 656\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrecords\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/38/lib/python3.8/site-packages/kafka/consumer/group.py\u001b[0m in \u001b[0;36m_poll_once\u001b[0;34m(self, timeout_ms, max_records, update_offsets)\u001b[0m\n\u001b[1;32m 699\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 700\u001b[0m \u001b[0mtimeout_ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout_ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_coordinator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime_to_next_poll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m1000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 701\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_client\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpoll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout_ms\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout_ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 702\u001b[0m \u001b[0;31m# after the long poll, we should check whether the group needs to rebalance\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 703\u001b[0m \u001b[0;31m# prior to returning data so that the group can stabilize faster\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/38/lib/python3.8/site-packages/kafka/client_async.py\u001b[0m in \u001b[0;36mpoll\u001b[0;34m(self, timeout_ms, future)\u001b[0m\n\u001b[1;32m 598\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# avoid negative timeouts\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 599\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 600\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_poll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;36m1000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 601\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 602\u001b[0m \u001b[0;31m# called without the lock to avoid deadlock potential\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.virtualenvs/38/lib/python3.8/site-packages/kafka/client_async.py\u001b[0m in \u001b[0;36m_poll\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 630\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 631\u001b[0m \u001b[0mstart_select\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 632\u001b[0;31m \u001b[0mready\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_selector\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mselect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 633\u001b[0m \u001b[0mend_select\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 634\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sensors\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/3.8.0/lib/python3.8/selectors.py\u001b[0m in \u001b[0;36mselect\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0mready\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 557\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 558\u001b[0;31m \u001b[0mkev_list\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_selector\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontrol\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_ev\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 559\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mInterruptedError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 560\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mready\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "from kafka import KafkaConsumer\n", + "consumer = KafkaConsumer(\n", + " config['virus_topic'],\n", + " bootstrap_servers=config['bootstrap.servers'],\n", + " group_id=config['group.id'],\n", + " fetch_max_wait_ms=3000,\n", + "# request_timeout_ms=3500,\n", + "# session_timeout_ms=3100,\n", + " enable_auto_commit=False,\n", + ")\n", + "\n", + "for msg in consumer:\n", + " print (msg)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 6d58d06e95b09ce6df1cb495a1d70874bbbc8b8d Mon Sep 17 00:00:00 2001 From: Laisky Date: Wed, 29 Apr 2020 09:51:48 +0800 Subject: [PATCH 26/27] fix --- golang/syntax/buf_test.go | 18 ++++++++ golang/syntax/for_test.go | 4 +- golang/syntax/io_read_test.go | 3 +- golang/syntax/os_test.go | 18 ++++++++ rpm/src/go.mod | 3 ++ rpm/src/main.go | 7 ++++ rpm/src/test | Bin 0 -> 2068040 bytes rpm/test.spec | 77 ++++++++++++++++++++++++++++++++++ 8 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 golang/syntax/buf_test.go create mode 100644 rpm/src/go.mod create mode 100644 rpm/src/main.go create mode 100755 rpm/src/test create mode 100644 rpm/test.spec diff --git a/golang/syntax/buf_test.go b/golang/syntax/buf_test.go new file mode 100644 index 00000000..f3442680 --- /dev/null +++ b/golang/syntax/buf_test.go @@ -0,0 +1,18 @@ +package test + +import ( + "bytes" + "testing" +) + +func TestBytesBuffer(t *testing.T) { + buf := bytes.NewBuffer([]byte{}) + + for i := 0; i < 1000; i++ { + buf.Write([]byte("1")) + } + + t.Logf("len: %d", buf.Len()) + t.Logf("len: %d", buf.Len()) + t.Error() +} diff --git a/golang/syntax/for_test.go b/golang/syntax/for_test.go index 284d52b1..c961a6f5 100644 --- a/golang/syntax/for_test.go +++ b/golang/syntax/for_test.go @@ -22,7 +22,7 @@ func TestFor(t *testing.T) { } wg.Wait() - // t.Error() + t.Error() } func TestErrgroupInFor(t *testing.T) { @@ -30,7 +30,7 @@ func TestErrgroupInFor(t *testing.T) { for i := 0; i < 10; i++ { j := i pool.Go(func() error { - t.Logf("%v", j) + t.Logf("%v - %v", i, j) return nil }) diff --git a/golang/syntax/io_read_test.go b/golang/syntax/io_read_test.go index 1629e790..a97e0826 100644 --- a/golang/syntax/io_read_test.go +++ b/golang/syntax/io_read_test.go @@ -1,9 +1,11 @@ package test import ( + "bufio" "fmt" "io" "os" + "testing" ) func ReadLine(reader io.Reader) (line []byte, err error) { @@ -45,7 +47,6 @@ func TestBufio(t *testing.T) { } } - func TestReader(t *testing.T) { inputFile, inputError := os.Open("data.txt") if inputError != nil { diff --git a/golang/syntax/os_test.go b/golang/syntax/os_test.go index 51ab3ad1..f418eaeb 100644 --- a/golang/syntax/os_test.go +++ b/golang/syntax/os_test.go @@ -2,6 +2,7 @@ package test import ( "os" + "path/filepath" "testing" "time" ) @@ -17,3 +18,20 @@ func TestExit(t *testing.T) { } time.Sleep(1 * time.Second) } + +// func TestMove(t *testing.T) { +// dir, err := ioutil.TempDir("", "") +// if err != nil { +// t.Fatalf("%+v", err) +// } +// defer os.Remove(dir) + +// os.Makedir(filepath.Join(dir, "a")) +// os.MkDir(filepath.Join(dir, "b")) +// } + +func TestFilepath(t *testing.T) { + src := "/a/v/c/d.xxx" + t.Logf("%+v", filepath.Split(src)) + t.Error() +} diff --git a/rpm/src/go.mod b/rpm/src/go.mod new file mode 100644 index 00000000..ec4cee23 --- /dev/null +++ b/rpm/src/go.mod @@ -0,0 +1,3 @@ +module github.com/Laisky/test + +go 1.14 diff --git a/rpm/src/main.go b/rpm/src/main.go new file mode 100644 index 00000000..d8fa9292 --- /dev/null +++ b/rpm/src/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("hello") +} diff --git a/rpm/src/test b/rpm/src/test new file mode 100755 index 0000000000000000000000000000000000000000..7b0df9fb55ef58b9f36b586413a7f3af16674185 GIT binary patch literal 2068040 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�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

v>zuM3unk812U`P&Q#0MDBI1Fc!3_(~ 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

h;@x)_+>wbO7v3WOv9C1XORm2 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

36i0L)jmbkmHb((9{JbVu|2i`hl*+I;_{ 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 z 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%0ApYh4J}JL* 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