diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..00cbbdf --- /dev/null +++ b/.gitignore @@ -0,0 +1,59 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fd776f4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 xfgryujk + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/weibo-img-crypto.js b/weibo-img-crypto.js new file mode 100644 index 0000000..ad782fb --- /dev/null +++ b/weibo-img-crypto.js @@ -0,0 +1,40 @@ +window.isWbImgCryptoLoaded || (function () { + window.isWbImgCryptoLoaded = true + + function encrypt (data) { + const KEY = 0xAA + for (let i = 0; i < data.length; i += 4) { + data[i] ^= KEY + data[i + 1] ^= KEY + data[i + 2] ^= KEY + } + } + + // Hook FileReader.readAsDataURL + let originalReadAsDataURL = window.FileReader.prototype.readAsDataURL + window.FileReader.prototype.readAsDataURL = function (file) { + if (file.type.startsWith('image/') && file.type !== 'image/gif') { // GIF is not supported at present + // Hook onloadend + let originalOnloadend = this.onloadend + this.onloadend = () => { + let img = new window.Image() + img.onload = () => { + let canvas = document.createElement('canvas'); + [canvas.width, canvas.height] = [img.width, img.height] + let ctx = canvas.getContext('2d') + ctx.drawImage(img, 0, 0) + + // 加密 + let imgData = ctx.getImageData(0, 0, img.width, img.height) + encrypt(imgData.data) + ctx.putImageData(imgData, 0, 0) + + // 替换上传的图片 + originalOnloadend({target: {result: canvas.toDataURL()}}) + } + img.src = this.result + } + } + originalReadAsDataURL.call(this, file) + } +})()