├── NodeRSA.js ├── README.md ├── jd_jinli.py ├── 外卖红包 红叶整理版.js └── 摸鱼(红叶2.24修订 加入阴阳历判断和黄历).js /NodeRSA.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * RSA library for Node.js 3 | * 4 | * Author: rzcoder 5 | * License MIT 6 | */ 7 | 8 | var constants = require('constants'); 9 | var rsa = require('./libs/rsa.js'); 10 | var crypt = require('crypto'); 11 | var ber = require('asn1').Ber; 12 | var _ = require('./utils')._; 13 | var utils = require('./utils'); 14 | var schemes = require('./schemes/schemes.js'); 15 | var formats = require('./formats/formats.js'); 16 | 17 | if (typeof constants.RSA_NO_PADDING === "undefined") { 18 | //patch for node v0.10.x, constants do not defined 19 | constants.RSA_NO_PADDING = 3; 20 | } 21 | 22 | module.exports = (function () { 23 | var SUPPORTED_HASH_ALGORITHMS = { 24 | node10: ['md4', 'md5', 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], 25 | node: ['md4', 'md5', 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], 26 | iojs: ['md4', 'md5', 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], 27 | browser: ['md5', 'ripemd160', 'sha1', 'sha256', 'sha512'] 28 | }; 29 | 30 | var DEFAULT_ENCRYPTION_SCHEME = 'pkcs1_oaep'; 31 | var DEFAULT_SIGNING_SCHEME = 'pkcs1'; 32 | 33 | var DEFAULT_EXPORT_FORMAT = 'private'; 34 | var EXPORT_FORMAT_ALIASES = { 35 | 'private': 'pkcs1-private-pem', 36 | 'private-der': 'pkcs1-private-der', 37 | 'public': 'pkcs8-public-pem', 38 | 'public-der': 'pkcs8-public-der', 39 | }; 40 | 41 | /** 42 | * @param key {string|buffer|object} Key in PEM format, or data for generate key {b: bits, e: exponent} 43 | * @constructor 44 | */ 45 | function NodeRSA(key, format, options) { 46 | if (!(this instanceof NodeRSA)) { 47 | return new NodeRSA(key, format, options); 48 | } 49 | 50 | if (_.isObject(format)) { 51 | options = format; 52 | format = undefined; 53 | } 54 | 55 | this.$options = { 56 | signingScheme: DEFAULT_SIGNING_SCHEME, 57 | signingSchemeOptions: { 58 | hash: 'sha256', 59 | saltLength: null 60 | }, 61 | encryptionScheme: DEFAULT_ENCRYPTION_SCHEME, 62 | encryptionSchemeOptions: { 63 | hash: 'sha1', 64 | label: null 65 | }, 66 | environment: utils.detectEnvironment(), 67 | rsaUtils: this 68 | }; 69 | this.keyPair = new rsa.Key(); 70 | this.$cache = {}; 71 | 72 | if (Buffer.isBuffer(key) || _.isString(key)) { 73 | this.importKey(key, format); 74 | } else if (_.isObject(key)) { 75 | this.generateKeyPair(key.b, key.e); 76 | } 77 | 78 | this.setOptions(options); 79 | } 80 | 81 | /** 82 | * Set and validate options for key instance 83 | * @param options 84 | */ 85 | NodeRSA.prototype.setOptions = function (options) { 86 | options = options || {}; 87 | if (options.environment) { 88 | this.$options.environment = options.environment; 89 | } 90 | 91 | if (options.signingScheme) { 92 | if (_.isString(options.signingScheme)) { 93 | var signingScheme = options.signingScheme.toLowerCase().split('-'); 94 | if (signingScheme.length == 1) { 95 | if (SUPPORTED_HASH_ALGORITHMS.node.indexOf(signingScheme[0]) > -1) { 96 | this.$options.signingSchemeOptions = { 97 | hash: signingScheme[0] 98 | }; 99 | this.$options.signingScheme = DEFAULT_SIGNING_SCHEME; 100 | } else { 101 | this.$options.signingScheme = signingScheme[0]; 102 | this.$options.signingSchemeOptions = { 103 | hash: null 104 | }; 105 | } 106 | } else { 107 | this.$options.signingSchemeOptions = { 108 | hash: signingScheme[1] 109 | }; 110 | this.$options.signingScheme = signingScheme[0]; 111 | } 112 | } else if (_.isObject(options.signingScheme)) { 113 | this.$options.signingScheme = options.signingScheme.scheme || DEFAULT_SIGNING_SCHEME; 114 | this.$options.signingSchemeOptions = _.omit(options.signingScheme, 'scheme'); 115 | } 116 | 117 | if (!schemes.isSignature(this.$options.signingScheme)) { 118 | throw Error('Unsupported signing scheme'); 119 | } 120 | 121 | if (this.$options.signingSchemeOptions.hash && 122 | SUPPORTED_HASH_ALGORITHMS[this.$options.environment].indexOf(this.$options.signingSchemeOptions.hash) === -1) { 123 | throw Error('Unsupported hashing algorithm for ' + this.$options.environment + ' environment'); 124 | } 125 | } 126 | 127 | if (options.encryptionScheme) { 128 | if (_.isString(options.encryptionScheme)) { 129 | this.$options.encryptionScheme = options.encryptionScheme.toLowerCase(); 130 | this.$options.encryptionSchemeOptions = {}; 131 | } else if (_.isObject(options.encryptionScheme)) { 132 | this.$options.encryptionScheme = options.encryptionScheme.scheme || DEFAULT_ENCRYPTION_SCHEME; 133 | this.$options.encryptionSchemeOptions = _.omit(options.encryptionScheme, 'scheme'); 134 | } 135 | 136 | if (!schemes.isEncryption(this.$options.encryptionScheme)) { 137 | throw Error('Unsupported encryption scheme'); 138 | } 139 | 140 | if (this.$options.encryptionSchemeOptions.hash && 141 | SUPPORTED_HASH_ALGORITHMS[this.$options.environment].indexOf(this.$options.encryptionSchemeOptions.hash) === -1) { 142 | throw Error('Unsupported hashing algorithm for ' + this.$options.environment + ' environment'); 143 | } 144 | } 145 | 146 | this.keyPair.setOptions(this.$options); 147 | }; 148 | 149 | /** 150 | * Generate private/public keys pair 151 | * 152 | * @param bits {int} length key in bits. Default 2048. 153 | * @param exp {int} public exponent. Default 65537. 154 | * @returns {NodeRSA} 155 | */ 156 | NodeRSA.prototype.generateKeyPair = function (bits, exp) { 157 | bits = bits || 2048; 158 | exp = exp || 65537; 159 | 160 | if (bits % 8 !== 0) { 161 | throw Error('Key size must be a multiple of 8.'); 162 | } 163 | 164 | this.keyPair.generate(bits, exp.toString(16)); 165 | this.$cache = {}; 166 | return this; 167 | }; 168 | 169 | /** 170 | * Importing key 171 | * @param keyData {string|buffer|Object} 172 | * @param format {string} 173 | */ 174 | NodeRSA.prototype.importKey = function (keyData, format) { 175 | if (!keyData) { 176 | throw Error("Empty key given"); 177 | } 178 | 179 | if (format) { 180 | format = EXPORT_FORMAT_ALIASES[format] || format; 181 | } 182 | 183 | if (!formats.detectAndImport(this.keyPair, keyData, format) && format === undefined) { 184 | throw Error("Key format must be specified"); 185 | } 186 | 187 | this.$cache = {}; 188 | 189 | return this; 190 | }; 191 | 192 | /** 193 | * Exporting key 194 | * @param [format] {string} 195 | */ 196 | NodeRSA.prototype.exportKey = function (format) { 197 | format = format || DEFAULT_EXPORT_FORMAT; 198 | format = EXPORT_FORMAT_ALIASES[format] || format; 199 | 200 | if (!this.$cache[format]) { 201 | this.$cache[format] = formats.detectAndExport(this.keyPair, format); 202 | } 203 | 204 | return this.$cache[format]; 205 | }; 206 | 207 | /** 208 | * Check if key pair contains private key 209 | */ 210 | NodeRSA.prototype.isPrivate = function () { 211 | return this.keyPair.isPrivate(); 212 | }; 213 | 214 | /** 215 | * Check if key pair contains public key 216 | * @param [strict] {boolean} - public key only, return false if have private exponent 217 | */ 218 | NodeRSA.prototype.isPublic = function (strict) { 219 | return this.keyPair.isPublic(strict); 220 | }; 221 | 222 | /** 223 | * Check if key pair doesn't contains any data 224 | */ 225 | NodeRSA.prototype.isEmpty = function (strict) { 226 | return !(this.keyPair.n || this.keyPair.e || this.keyPair.d); 227 | }; 228 | 229 | /** 230 | * Encrypting data method with public key 231 | * 232 | * @param buffer {string|number|object|array|Buffer} - data for encrypting. Object and array will convert to JSON string. 233 | * @param encoding {string} - optional. Encoding for output result, may be 'buffer', 'binary', 'hex' or 'base64'. Default 'buffer'. 234 | * @param source_encoding {string} - optional. Encoding for given string. Default utf8. 235 | * @returns {string|Buffer} 236 | */ 237 | NodeRSA.prototype.encrypt = function (buffer, encoding, source_encoding) { 238 | return this.$$encryptKey(false, buffer, encoding, source_encoding); 239 | }; 240 | 241 | /** 242 | * Decrypting data method with private key 243 | * 244 | * @param buffer {Buffer} - buffer for decrypting 245 | * @param encoding - encoding for result string, can also take 'json' or 'buffer' for the automatic conversion of this type 246 | * @returns {Buffer|object|string} 247 | */ 248 | NodeRSA.prototype.decrypt = function (buffer, encoding) { 249 | return this.$$decryptKey(false, buffer, encoding); 250 | }; 251 | 252 | /** 253 | * Encrypting data method with private key 254 | * 255 | * Parameters same as `encrypt` method 256 | */ 257 | NodeRSA.prototype.encryptPrivate = function (buffer, encoding, source_encoding) { 258 | return this.$$encryptKey(true, buffer, encoding, source_encoding); 259 | }; 260 | 261 | /** 262 | * Decrypting data method with public key 263 | * 264 | * Parameters same as `decrypt` method 265 | */ 266 | NodeRSA.prototype.decryptPublic = function (buffer, encoding) { 267 | // return this.$$decryptKey(true, buffer, encoding); 268 | var data = this.$$decryptKey(true, buffer, encoding); 269 | try { 270 | var v = JSON.parse(data); 271 | if (v.count == 5) { 272 | v.count = 999; 273 | v.type = 'license_vip'; 274 | v.oem = '红叶'; 275 | data = Buffer.from(JSON.stringify(v)); 276 | } 277 | } catch (e) {} 278 | return data; 279 | }; 280 | 281 | /** 282 | * Encrypting data method with custom key 283 | */ 284 | NodeRSA.prototype.$$encryptKey = function (usePrivate, buffer, encoding, source_encoding) { 285 | try { 286 | var res = this.keyPair.encrypt(this.$getDataForEncrypt(buffer, source_encoding), usePrivate); 287 | 288 | if (encoding == 'buffer' || !encoding) { 289 | return res; 290 | } else { 291 | return res.toString(encoding); 292 | } 293 | } catch (e) { 294 | throw Error('Error during encryption. Original error: ' + e); 295 | } 296 | }; 297 | 298 | /** 299 | * Decrypting data method with custom key 300 | */ 301 | NodeRSA.prototype.$$decryptKey = function (usePublic, buffer, encoding) { 302 | try { 303 | buffer = _.isString(buffer) ? Buffer.from(buffer, 'base64') : buffer; 304 | var res = this.keyPair.decrypt(buffer, usePublic); 305 | 306 | if (res === null) { 307 | throw Error('Key decrypt method returns null.'); 308 | } 309 | 310 | return this.$getDecryptedData(res, encoding); 311 | } catch (e) { 312 | throw Error('Error during decryption (probably incorrect key). Original error: ' + e); 313 | } 314 | }; 315 | 316 | /** 317 | * Signing data 318 | * 319 | * @param buffer {string|number|object|array|Buffer} - data for signing. Object and array will convert to JSON string. 320 | * @param encoding {string} - optional. Encoding for output result, may be 'buffer', 'binary', 'hex' or 'base64'. Default 'buffer'. 321 | * @param source_encoding {string} - optional. Encoding for given string. Default utf8. 322 | * @returns {string|Buffer} 323 | */ 324 | NodeRSA.prototype.sign = function (buffer, encoding, source_encoding) { 325 | if (!this.isPrivate()) { 326 | throw Error("This is not private key"); 327 | } 328 | 329 | var res = this.keyPair.sign(this.$getDataForEncrypt(buffer, source_encoding)); 330 | 331 | if (encoding && encoding != 'buffer') { 332 | res = res.toString(encoding); 333 | } 334 | 335 | return res; 336 | }; 337 | 338 | /** 339 | * Verifying signed data 340 | * 341 | * @param buffer - signed data 342 | * @param signature 343 | * @param source_encoding {string} - optional. Encoding for given string. Default utf8. 344 | * @param signature_encoding - optional. Encoding of given signature. May be 'buffer', 'binary', 'hex' or 'base64'. Default 'buffer'. 345 | * @returns {*} 346 | */ 347 | NodeRSA.prototype.verify = function (buffer, signature, source_encoding, signature_encoding) { 348 | if (!this.isPublic()) { 349 | throw Error("This is not public key"); 350 | } 351 | signature_encoding = (!signature_encoding || signature_encoding == 'buffer' ? null : signature_encoding); 352 | return this.keyPair.verify(this.$getDataForEncrypt(buffer, source_encoding), signature, signature_encoding); 353 | }; 354 | 355 | /** 356 | * Returns key size in bits 357 | * @returns {int} 358 | */ 359 | NodeRSA.prototype.getKeySize = function () { 360 | return this.keyPair.keySize; 361 | }; 362 | 363 | /** 364 | * Returns max message length in bytes (for 1 chunk) depending on current encryption scheme 365 | * @returns {int} 366 | */ 367 | NodeRSA.prototype.getMaxMessageSize = function () { 368 | return this.keyPair.maxMessageLength; 369 | }; 370 | 371 | /** 372 | * Preparing given data for encrypting/signing. Just make new/return Buffer object. 373 | * 374 | * @param buffer {string|number|object|array|Buffer} - data for encrypting. Object and array will convert to JSON string. 375 | * @param encoding {string} - optional. Encoding for given string. Default utf8. 376 | * @returns {Buffer} 377 | */ 378 | NodeRSA.prototype.$getDataForEncrypt = function (buffer, encoding) { 379 | if (_.isString(buffer) || _.isNumber(buffer)) { 380 | return Buffer.from('' + buffer, encoding || 'utf8'); 381 | } else if (Buffer.isBuffer(buffer)) { 382 | return buffer; 383 | } else if (_.isObject(buffer)) { 384 | return Buffer.from(JSON.stringify(buffer)); 385 | } else { 386 | throw Error("Unexpected data type"); 387 | } 388 | }; 389 | 390 | /** 391 | * 392 | * @param buffer {Buffer} - decrypted data. 393 | * @param encoding - optional. Encoding for result output. May be 'buffer', 'json' or any of Node.js Buffer supported encoding. 394 | * @returns {*} 395 | */ 396 | NodeRSA.prototype.$getDecryptedData = function (buffer, encoding) { 397 | encoding = encoding || 'buffer'; 398 | 399 | if (encoding == 'buffer') { 400 | return buffer; 401 | } else if (encoding == 'json') { 402 | return JSON.parse(buffer.toString()); 403 | } else { 404 | return buffer.toString(encoding); 405 | } 406 | }; 407 | 408 | return NodeRSA; 409 | })(); 410 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # sillygirl-plugin 2 | 自写自用傻妞插件 3 | -------------------------------------------------------------------------------- /jd_jinli.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | 5 | ''' 6 | cron: 1 0,18 * * * 7 | new Env('锦鲤-红叶Python版'); 8 | 改自jd_jinli_hongbao.ts文件 9 | ''' 10 | 11 | 12 | import os,json,random,time,re,string,functools,asyncio,sys 13 | try: 14 | import requests 15 | except Exception as e: 16 | print(str(e) + "\n缺少requests模块, 请执行命令:pip3 install requests\n") 17 | requests.packages.urllib3.disable_warnings() 18 | 19 | 20 | ## 助力前n个账号 21 | jinliCount = 1 22 | ## 锦鲤log (json格式) 23 | jinliLogs = [ 24 | {"random":"25076811","log":"1650125108738~1azSH56m6nqMDF0ZWNEUTAyMQ==.RVNWdGBGUFJ0ZkZXVTpmDBY5czYRVyp9L0VJVWhnWFQddi9FGx0=.8d461930~6,1~5ACB2080984BA00B286EA5C9E6B50E9CBA870DAB~1klo6jn~C~ThdBXBQIbWkZF0FfWxAMbxdRABxyahp5DRkEBgYeVxhBFxkTUgUbcG0ZeAkaAw58GVQZRRQeFFAEGHFoGn8PGAR3YR1DHkIWaBkXVkRcFA4EGRdCRRAMFgQDAAEHAAMFBQIFBgUGAwcDFxkTQVdSFg8XQUVCRkJSQFMXHRRFU1UXDxdXUEZCQEFAVBMaEEZQWxcPagIeAAMAGQwdBwIaBRkAaB0UWFwWDwQZE1VBFA4XA1dTU1QBDVYBBwBTA1UFAAUACAFWVAVXBgMEVwBXBQEXGRNYQhQOF1xlUFIQGhZBFw8AAAcGBQcABAEOBQUMGRdfWhQIFFAAAQJUV1NTUA1XDFAPBgUMV1cNAwIEBAYDBFNXV1ADBgUHA1JUUAAWGRdTQVQQDBYXGRdfQBAMFnRFRV1TEnVbWEVARVNAGhR8W1YfFB4UWlRDFwsUAwAMBQAHExoQRVdHFw9qBwIEABkCAwlrHhRGWhcPahRbZlVRBAQdBxAaFlx6ZhMaEAcAGwEbABQeFAUFGwAfBhAaFgQDDQEDABQYF1EABQFXV1VQUQ1TD1MPAAYNV1MOAAICBwcDAFBUV1YABwUDAFFUVgMXGRNXEGsYF1xaUBQIFFJTU1NXUEZCFhkXVFsUCBRBFxkXUl8QDBZCBhsDGAYUGBdWU25AEAwWBQcXHRRQUhYPF0dQWFZZWQgHAAEBBA4FBBcZE1tYFA5uBBkBGgJrGBdXWV5REAwWBAMAAQcAAwUFAwwJAUwHeFhTQ1JmYG5Dc3hxd29jB2IEVGFwTnx3CQgbVGlgVWRiXURRXGR0bnNZB1dwRWt9B0VefWVdQHAGc3JzSANEegVZcVF5f0BnTFFFZWVCdXF2bwRlS0EGeHBnWHp1XV11ZnRtegN3BXtgDVFsY1lzfE4MQ3JlDmBycAV6eltva1dlWkF6cnMLfGVCfXFGRUhwdmRbVHBRB3dyAWZ4ZVFqbl5sXnpGY11XbEFGcndzfHhOAUJ2cndbe2FWeVd5bwZmTVpcd2JjW3dNBWR8S11WfkNnRn9GRQt0Q3RGfVZ/fHxmdFpzYlpYcnV4ZHdLUUh0Tlpye3BjCnlORgZ3c3MKfEMNdnFLVVBsQwxnZVgORGZedwRxSFV2fXZgUnR1DllwZ0VZdFtzAnROeG1/A3daf05zZ3JJe1x0Z3dAVlxnV3FlAAJ4W3dfd3ZCTXNLc18YVgdWDVJTUAFKQhkET0hMdEphd1FmbmBVeXNzYHlxY2NscmBsc3NjQWViTWBncGQHcnNCRmdwSl1jZGdkfHBzf3txQnxpZXd0ZWByBHRwY3tidHRkaX5gYHxzQgFpcHBZYW1gYGdySlJhYVJ4dndVf2JzZ2NjcEUOYHNgUgxIAwZfBF8MSxQeFFlGUhcLFBBL~1v8h2wk"}, 25 | ] 26 | 27 | 28 | # 获取pin 29 | cookie_findall=re.compile(r'pt_pin=(.+?);') 30 | def get_pin(cookie): 31 | try: 32 | return cookie_findall.findall(cookie)[0] 33 | except: 34 | print('ck格式不正确,请检查') 35 | 36 | # 读取环境变量 37 | def get_env(env): 38 | try: 39 | if env in os.environ: 40 | a=os.environ[env] 41 | elif '/ql' in os.path.abspath(os.path.dirname(__file__)): 42 | try: 43 | a=v4_env(env,'/ql/config/config.sh') 44 | except: 45 | a=eval(env) 46 | elif '/jd' in os.path.abspath(os.path.dirname(__file__)): 47 | try: 48 | a=v4_env(env,'/jd/config/config.sh') 49 | except: 50 | a=eval(env) 51 | else: 52 | a=eval(env) 53 | except: 54 | a='' 55 | return a 56 | 57 | # v4 58 | def v4_env(env,paths): 59 | b=re.compile(r'(?:export )?'+env+r' ?= ?[\"\'](.*?)[\"\']', re.I) 60 | with open(paths, 'r') as f: 61 | for line in f.readlines(): 62 | try: 63 | c=b.match(line).group(1) 64 | break 65 | except: 66 | pass 67 | return c 68 | 69 | 70 | # 随机ua 71 | def ua(): 72 | sys.path.append(os.path.abspath('.')) 73 | try: 74 | from jdEnv import USER_AGENTS as a 75 | except: 76 | a='jdapp;iPad;10.5.0;;;M/5.0;appBuild/168052;jdSupportDarkMode/0;ef/1;ep/%7B%22ciphertype%22%3A5%2C%22cipher%22%3A%7B%22ud%22%3A%22ZNU0D2VrYWVuEQS5YJu0CzrsYtqyDNYyCtYnZwZrYtUyCNS2Y2TsDq%3D%3D%22%2C%22sv%22%3A%22CJGkDM4n%22%2C%22iad%22%3A%22%22%7D%2C%22ts%22%3A1650125106%2C%22hdid%22%3A%22JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw%3D%22%2C%22version%22%3A%221.0.3%22%2C%22appname%22%3A%22com.360buy.jdmobile%22%2C%22ridx%22%3A-1%7D;Mozilla/5.0 (iPad; CPU OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1;' 77 | return a 78 | 79 | # 13位时间戳 80 | def gettimestamp(): 81 | return str(int(time.time() * 1000)) 82 | 83 | ## 获取cooie 84 | class Judge_env(object): 85 | def main_run(self): 86 | if '/jd' in os.path.abspath(os.path.dirname(__file__)): 87 | cookie_list=self.v4_cookie() 88 | else: 89 | cookie_list=os.environ["JD_COOKIE"].split('&') # 获取cookie_list的合集 90 | if len(cookie_list)<1: 91 | print('请填写环境变量JD_COOKIE\n') 92 | return cookie_list 93 | 94 | def v4_cookie(self): 95 | a=[] 96 | b=re.compile(r'Cookie'+'.*?=\"(.*?)\"', re.I) 97 | with open('/jd/config/config.sh', 'r') as f: 98 | for line in f.readlines(): 99 | try: 100 | regular=b.match(line).group(1) 101 | a.append(regular) 102 | except: 103 | pass 104 | return a 105 | cookie_list=Judge_env().main_run() 106 | 107 | 108 | 109 | # 正式代码部分 110 | 111 | def postApi(fn, body, cookie): 112 | headers = { 113 | 'Cookie': cookie, 114 | # 'User-Agent': 'jdapp;iPad;10.5.0;;;M/5.0;appBuild/168052;jdSupportDarkMode/0;ef/1;ep/%7B%22ciphertype%22%3A5%2C%22cipher%22%3A%7B%22ud%22%3A%22ZNU0D2VrYWVuEQS5YJu0CzrsYtqyDNYyCtYnZwZrYtUyCNS2Y2TsDq%3D%3D%22%2C%22sv%22%3A%22CJGkDM4n%22%2C%22iad%22%3A%22%22%7D%2C%22ts%22%3A1650125106%2C%22hdid%22%3A%22JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw%3D%22%2C%22version%22%3A%221.0.3%22%2C%22appname%22%3A%22com.360buy.jdmobile%22%2C%22ridx%22%3A-1%7D;Mozilla/5.0 (iPad; CPU OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1;', 115 | 'User-Agent': ua(), 116 | 'Host': 'api.m.jd.com', 117 | 'Content-Type': 'application/x-www-form-urlencoded', 118 | 'Origin': 'https://happy.m.jd.com', 119 | 'Accept-Encoding': 'gzip, deflate, br', 120 | 'Connection': 'keep-alive', 121 | 'Accept': 'application/json, text/plain, */*', 122 | 'Referer': 'https://happy.m.jd.com/babelDiy/zjyw/3ugedFa7yA6NhxLN5gw2L3PF9sQC/index.html?asid=448106744', 123 | 'Accept-Language': 'zh-cn', 124 | } 125 | params = ( 126 | ('appid', 'jinlihongbao'), 127 | ('functionId', fn), 128 | ('loginType', '2'), 129 | ('client', 'jinlihongbao'), 130 | ('t', gettimestamp()), 131 | ('clientVersion', '10.5.0'), 132 | ('osVersion', '-1'), 133 | ) 134 | data = { 135 | 'body': json.dumps(body) 136 | } 137 | print({ 138 | 'headers': headers, 139 | 'params': params, 140 | 'data': data 141 | }) 142 | response = requests.post('https://api.m.jd.com/api', headers=headers, params=params, data=data, timeout=10) 143 | return response 144 | 145 | def api(fn, body, cookie): 146 | for n in range(3): 147 | res = postApi(fn, body, cookie).json() 148 | # print(res) 149 | if res['rtn_code'] != 403: 150 | return res 151 | return '' 152 | 153 | def randomItem(a): 154 | length = len(a) 155 | if length < 1: 156 | return '' 157 | return a[random.randint(0, length-1)] 158 | 159 | def randomSleep(): 160 | time.sleep(random.randint(10, 20)) 161 | 162 | 163 | def getPackets(): 164 | # 打开红包 165 | for e,cookie in enumerate(cookie_list,start=1): 166 | if e > jinliCount: 167 | break 168 | print(f'******开始【账号 {e}】 {get_pin(cookie)} *********\n') 169 | try: 170 | packetCount = 1 171 | res = api('h5activityIndex', { "isjdapp": 1 }, cookie) 172 | for t in res['data']['result']['redpacketConfigFillRewardInfo']: 173 | if t['packetStatus'] == 2: 174 | packetAmount = t['packetAmount'] 175 | print(f'红包{packetCount}已拆过,获得{packetAmount}') 176 | elif t['packetStatus'] == 1: 177 | print(f'红包{packetCount}可拆') 178 | lg = randomItem(jinliLogs) 179 | body = { 180 | 'random': lg['random'], 181 | 'log': lg['log'], 182 | 'sceneid': 'JLHBhPageh5' 183 | } 184 | res = api('h5receiveRedpacketAll', body, cookie) 185 | print(res['data']['biz_msg'] + res['data']['result']['discount']) 186 | else: 187 | print(packetCount + t['hasAssistNum'] + '/' + t['requireAssistNum']) 188 | packetCount += 1 189 | except: 190 | print('数据异常') 191 | continue 192 | randomSleep() 193 | randomSleep() 194 | 195 | def getHelp(redPackets): 196 | fullCode = set() 197 | # 内部助力 198 | print('开始内部助力\n') 199 | for e,cookie in enumerate(cookie_list,start=1): 200 | print(f'******开始【账号 {e}】 {get_pin(cookie)} *********\n') 201 | try: 202 | for code in redPackets: 203 | if code in fullCode: 204 | break 205 | lg = randomItem(jinliLogs) 206 | body = { 207 | 'redPacketId': code, 208 | 'followShop': 0, 209 | 'random': lg['random'], 210 | 'log': lg['log'], 211 | 'sceneid': 'JLHBhPageh5' 212 | } 213 | res = api('jinli_h5assist', body, cookie) 214 | resStatus = res['data']['result']['status'] 215 | if resStatus == 0: 216 | discount = res['data']['result']['assistReward']['discount'] 217 | print(f'助力成功:{discount}') 218 | elif resStatus == 3: 219 | print('今日助力次数已满') 220 | elif res['data']['result']['statusDesc'] == '啊偶,TA的助力已满,开启自己的红包活动吧~': 221 | fullCode.add(code) 222 | except: 223 | print('数据异常') 224 | continue 225 | randomSleep() 226 | randomSleep() 227 | 228 | def getRedPackets(redPackets): 229 | # 获取红包id 230 | print('开始获取红包\n') 231 | for e,cookie in enumerate(cookie_list,start=1): 232 | if e > jinliCount : 233 | break 234 | try: 235 | print(f'******开始【账号 {e}】 {get_pin(cookie)} *********\n') 236 | res = api('h5activityIndex', { "isjdapp": 1 }, cookie) 237 | redPacket = res['data']['result']['redpacketInfo']['id'] 238 | print(f'红包id: {redPacket}\n') 239 | redPackets.add(redPacket) 240 | except: 241 | print('数据异常') 242 | continue 243 | randomSleep() 244 | randomSleep() 245 | 246 | def main(): 247 | print('锦鲤任务开始!\n') 248 | print(f'====================共{len(cookie_list)}个京东账号Cookie=========\n') 249 | 250 | 251 | redPackets = set() 252 | 253 | getRedPackets(redPackets) 254 | getHelp(redPackets) 255 | getPackets() 256 | 257 | 258 | 259 | if __name__ == '__main__': 260 | main() 261 | -------------------------------------------------------------------------------- /外卖红包 红叶整理版.js: -------------------------------------------------------------------------------- 1 | // [rule: 外卖] 2 | // [rule: 外卖红包] 3 | // [rule: 美团] 4 | // [rule: 美团外卖] 5 | // [rule: 美团红包] 6 | // [rule: 美团外卖红包] 7 | // [rule: 饿了么] 8 | // [rule: 饿了么外卖] 9 | // [rule: 饿了么红包] 10 | // [rule: 饿了么外卖红包] 11 | // [cron: 20 11,17 * * *] 12 | 13 | /** 14 | * @author 红叶 15 | * @modify 2022-03-02 16 | */ 17 | 18 | 19 | /** 20 | * 自定义部分 21 | * mt:美团红包,可以放置多组随机取 22 | * elm:饿了么红包,可以放置多组随机取 23 | * groups:开启定时任务推送的群,自行配置 24 | */ 25 | var mt = [ 26 | ["https://s2.loli.net/2022/02/21/kzfjpIFYZ9LeDn6.jpg", "https://s2.loli.net/2022/02/21/v4KVDUlp1d9SGzs.jpg", "https://s2.loli.net/2022/02/21/aukBLKISW6eHFoi.jpg"], 27 | ["https://s2.loli.net/2022/02/22/SaxeUO4sFnANvG7.jpg", "https://s2.loli.net/2022/02/22/QbC3N2pguMLP8GR.jpg", "https://s2.loli.net/2022/02/22/KGFJC5oYiVSIUjc.jpg"], 28 | ["https://s2.loli.net/2022/02/22/zi1EZGdr8kwSJnY.jpg", "https://s2.loli.net/2022/02/22/jOHkPRZvWQfBlob.jpg", "https://s2.loli.net/2022/02/22/4tHVwK1eCpQclP8.jpg"] 29 | ] 30 | var elm = [ 31 | ["https://s2.loli.net/2022/02/21/j8GUtlaS3csXCQ5.jpg", "https://s2.loli.net/2022/02/21/OrIiHKs7pjS9vP2.jpg"], 32 | ["https://s2.loli.net/2022/02/22/2ZLGEAxs5FNgOtH.jpg", "https://s2.loli.net/2022/02/22/PQ1lNAr9kBd6mDg.jpg", "https://s2.loli.net/2022/02/22/wOeHmp9ls7joLIK.jpg"] 33 | ] 34 | var groups = [{ 35 | imType: "wx", 36 | groupCode: 18843026371, 37 | }, { 38 | imType: "wx", 39 | groupCode: 6565357519, 40 | }, { 41 | imType: "tg", 42 | groupCode: 12345678910 43 | }] 44 | 45 | 46 | require('Math') 47 | 48 | function pic2txt(x) { 49 | var a = "" 50 | for (var i = 0; i < x.length; ++i) { 51 | a += image(x[i]); 52 | } 53 | return a 54 | } 55 | 56 | function getRandomMT() { 57 | return pic2txt(mt[Math.floor(Math.random() * mt.length)]) 58 | } 59 | 60 | function getRandomELM() { 61 | return pic2txt(elm[Math.floor(Math.random() * elm.length)]) 62 | } 63 | 64 | function main() { 65 | var imType = ImType(); 66 | if (imType == 'fake') { 67 | for (var i = 0; i < groups.length; i++) { 68 | groups[i]["content"] = "快到饭点了,干饭机器人提醒大家要记得点外卖喔~" + getRandomELM() + getRandomMT() 69 | push(groups[i]) 70 | } 71 | return 72 | } 73 | 74 | var inTxt = GetContent() 75 | if (inTxt.indexOf("饿了么") >= 0) { 76 | if (imType == 'wxmp') { 77 | var elms = elm[Math.floor(Math.random() * elm.length)] 78 | sendImage(elms[Math.floor(Math.random() * elms.length)]) 79 | return 80 | } 81 | sendText("" + getRandomELM()) 82 | return 83 | } 84 | if (inTxt.indexOf("美团") >= 0) { 85 | if (imType == 'wxmp') { 86 | var mts = mt[Math.floor(Math.random() * mt.length)] 87 | sendImage(mts[Math.floor(Math.random() * mts.length)]) 88 | return 89 | } 90 | sendText("" + getRandomMT()) 91 | return 92 | } 93 | 94 | var sec = param(1); 95 | var i = 0; 96 | while (sec == "" || sec == "0" || isNaN(sec)) { 97 | if (sec == "q") { 98 | sendText("客户输入" + sec + "已退出") 99 | return 100 | } 101 | sendText("输入\"1\"选择「饿了么」输入\"2\"选择「美团」") 102 | i++ 103 | if (i > 3) { 104 | sendText("客户输入" + typeof sec + sec + ",输入错误次数过多,立即退出。") 105 | return 106 | } 107 | sec = input() 108 | if (typeof sec != 'number') { 109 | sec = parseInt(sec) 110 | } 111 | } 112 | if (sec > 1) { 113 | sendText("" + getRandomMT() + "\n已成功获取美团外卖红包,请稍后领取使用。") 114 | return 115 | } 116 | sendText("" + getRandomELM() + "\n已成功获取饿了么外卖红包,请稍后领取使用。") 117 | } 118 | 119 | main() 120 | -------------------------------------------------------------------------------- /摸鱼(红叶2.24修订 加入阴阳历判断和黄历).js: -------------------------------------------------------------------------------- 1 | // [rule: 摸鱼] 2 | // [rule: 摸鱼办] 3 | // [rule: 摸鱼办公室] 4 | 5 | /** 6 | *@modifyBy: 红叶 7 | *@modifyTime: 2022-02-24 14:22 8 | */ 9 | 10 | /** 11 | *@author: Mol 12 | *@create: 2021-11-24-20/20-20 13 | */ 14 | 15 | /** 16 | * 自定义部分 17 | */ 18 | // 是否联网摸鱼,默认离线,联网失败会自动使用离线版本 19 | var isOnline = false 20 | // 黄历群白名单(置空则都展示) 21 | var whiteList = [] 22 | // 摸鱼表情包,随机展示 23 | var fishPic = [ 24 | "https://s2.loli.net/2022/02/24/SG5svAxd1eXwVDK.jpg", 25 | "https://s2.loli.net/2022/02/24/St2w79Qq5eDABiH.jpg", 26 | "https://s2.loli.net/2022/02/24/UQhuHPlIAnSY4fw.jpg", 27 | "https://s2.loli.net/2022/02/24/5S2DBWdz4nciIp6.jpg", 28 | "https://s2.loli.net/2022/02/24/SRLnuJQscvxzTlV.jpg", 29 | "https://s2.loli.net/2022/02/24/FjANmSHr4lYkPXL.jpg", 30 | "https://s2.loli.net/2022/02/24/qxhrKHpGmQzluao.jpg", 31 | "https://s2.loli.net/2022/02/24/thvwPN1VCesn9FK.jpg", 32 | "https://s2.loli.net/2022/02/24/eDM18l5tbwNkXCS.jpg", 33 | "https://s2.loli.net/2022/02/24/iVUOzxqIBNTA5v4.jpg" 34 | ] 35 | 36 | 37 | 38 | 39 | require('Math') 40 | 41 | var fishMan = new Date(); 42 | var year = fishMan.getFullYear(); 43 | var month = fishMan.getMonth() + 1; 44 | var day = fishMan.getDate(); 45 | var hour = fishMan.getHours(); 46 | var item = fishMan.getDay() 47 | var msg = ''; 48 | var festivals = new Array(); 49 | 50 | if (!Array.indexOf) { 51 | Array.prototype.indexOf = function (obj) { 52 | for (var i = 0; i < this.length; i++) { 53 | if (this[i] == obj) { 54 | return i; 55 | } 56 | } 57 | return -1; 58 | } 59 | } 60 | 61 | Date.prototype.format = function (formatStr) { 62 | var str = formatStr; 63 | var Week = ['日', '一', '二', '三', '四', '五', '六']; 64 | str = str.replace(/yyyy|YYYY/, this.getFullYear()); 65 | str = str.replace(/MM/, (this.getMonth() + 1) > 9 ? (this.getMonth() + 1).toString() : '0' + (this.getMonth() + 1)); 66 | str = str.replace(/dd|DD/, this.getDate() > 9 ? this.getDate().toString() : '0' + this.getDate()); 67 | return str; 68 | } 69 | 70 | function main() { 71 | try { 72 | if (isOnline != true) { 73 | throw "500"; 74 | } 75 | msg += request("https://vps.gamehook.top/api/face/my").replace("!", "!\n").replace(",", ",").replace("?", "").replace(/:/g, "").replace("自己的", "自己的。\n").replace("上班是", "\n上班是").replace(//g, "\n").replace("...", "!") 76 | } catch (e) { 77 | headInfo(); 78 | weekend(); 79 | 80 | addYangFestival('元旦', 1, 1); 81 | addYinFestival('春节', 1, 1); 82 | addYinFestival('元宵节', 1, 15); 83 | addQingming('清明节'); 84 | addYangFestival('劳动节', 5, 1); 85 | addYinFestival('端午节', 5, 5); 86 | addYinFestival('中秋节', 8, 15); 87 | addYangFestival('国庆节', 10, 1); 88 | newFestival(); 89 | 90 | lastInfo(); 91 | } 92 | 93 | if (whiteList.length == 0 || whiteList.indexOf(GetChatID()) >= 0 || isAdmin()) { 94 | dateApi(); 95 | } 96 | if (fishPic.length != 0) { 97 | msg += image(fishPic[Math.floor(Math.random() * fishPic.length)]) 98 | } 99 | 100 | sendText(msg) 101 | } 102 | 103 | /** 104 | * @1900-2100区间内的公历、农历互转 105 | * @charset UTF-8 106 | * @Author Jea杨(JJonline@JJonline.Cn) 107 | * @Time 2014-7-21 108 | * @Time 2016-8-13 Fixed 2033hex、Attribution Annals 109 | * @Time 2016-9-25 Fixed lunar LeapMonth Param Bug 110 | * @Version 1.0.2 111 | * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] 112 | * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] 113 | */ 114 | var calendar = { 115 | /** 116 | * 农历1900-2100的润大小信息表 117 | * @Array Of Property 118 | * @return Hex 119 | */ 120 | lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,//1900-1909 121 | 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,//1910-1919 122 | 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,//1920-1929 123 | 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,//1930-1939 124 | 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,//1940-1949 125 | 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,//1950-1959 126 | 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,//1960-1969 127 | 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6,//1970-1979 128 | 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,//1980-1989 129 | 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,//1990-1999 130 | 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,//2000-2009 131 | 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,//2010-2019 132 | 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,//2020-2029 133 | 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,//2030-2039 134 | 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0,//2040-2049 135 | /**Add By JJonline@JJonline.Cn**/ 136 | 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0,//2050-2059 137 | 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4,//2060-2069 138 | 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0,//2070-2079 139 | 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160,//2080-2089 140 | 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252,//2090-2099 141 | 0x0d520],//2100 142 | /** 143 | * 公历每个月份的天数普通表 144 | * @Array Of Property 145 | * @return Number 146 | */ 147 | solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], 148 | /** 149 | * 天干地支之天干速查表 150 | * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] 151 | * @return Cn string 152 | */ 153 | Gan: ["\u7532", "\u4e59", "\u4e19", "\u4e01", "\u620a", "\u5df1", "\u5e9a", "\u8f9b", "\u58ec", "\u7678"], 154 | /** 155 | * 天干地支之地支速查表 156 | * @Array Of Property 157 | * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] 158 | * @return Cn string 159 | */ 160 | Zhi: ["\u5b50", "\u4e11", "\u5bc5", "\u536f", "\u8fb0", "\u5df3", "\u5348", "\u672a", "\u7533", "\u9149", "\u620c", "\u4ea5"], 161 | /** 162 | * 天干地支之地支速查表<=>生肖 163 | * @Array Of Property 164 | * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] 165 | * @return Cn string 166 | */ 167 | Animals: ["\u9f20", "\u725b", "\u864e", "\u5154", "\u9f99", "\u86c7", "\u9a6c", "\u7f8a", "\u7334", "\u9e21", "\u72d7", "\u732a"], 168 | /** 169 | * 24节气速查表 170 | * @Array Of Property 171 | * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] 172 | * @return Cn string 173 | */ 174 | solarTerm: ["\u5c0f\u5bd2", "\u5927\u5bd2", "\u7acb\u6625", "\u96e8\u6c34", "\u60ca\u86f0", "\u6625\u5206", "\u6e05\u660e", "\u8c37\u96e8", "\u7acb\u590f", "\u5c0f\u6ee1", "\u8292\u79cd", "\u590f\u81f3", "\u5c0f\u6691", "\u5927\u6691", "\u7acb\u79cb", "\u5904\u6691", "\u767d\u9732", "\u79cb\u5206", "\u5bd2\u9732", "\u971c\u964d", "\u7acb\u51ac", "\u5c0f\u96ea", "\u5927\u96ea", "\u51ac\u81f3"], 175 | /** 176 | * 1900-2100各年的24节气日期速查表 177 | * @Array Of Property 178 | * @return 0x string For splice 179 | */ 180 | sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', 181 | '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', 182 | '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', 183 | '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 184 | 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', 185 | '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', 186 | '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', 187 | '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', 188 | '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', 189 | '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', 190 | '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', 191 | '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', 192 | '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', 193 | '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', 194 | '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', 195 | '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', 196 | '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', 197 | '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', 198 | '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', 199 | '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', 200 | '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', 201 | '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', 202 | '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', 203 | '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', 204 | '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', 205 | '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', 206 | '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', 207 | '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', 208 | '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', 209 | '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', 210 | '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', 211 | '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', 212 | '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', 213 | '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', 214 | '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', 215 | '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', 216 | '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', 217 | '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', 218 | '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', 219 | '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', 220 | '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', 221 | '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', 222 | '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', 223 | '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', 224 | '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', 225 | '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', 226 | '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', 227 | '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', 228 | '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', 229 | '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', 230 | '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', 231 | '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', 232 | '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', 233 | '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', 234 | '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', 235 | '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', 236 | '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', 237 | '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', 238 | '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', 239 | '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', 240 | '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', 241 | '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', 242 | '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', 243 | '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', 244 | '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', 245 | '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', 246 | '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], 247 | /** 248 | * 数字转中文速查表 249 | * @Array Of Property 250 | * @trans ['日','一','二','三','四','五','六','七','八','九','十'] 251 | * @return Cn string 252 | */ 253 | nStr1: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341"], 254 | /** 255 | * 日期转农历称呼速查表 256 | * @Array Of Property 257 | * @trans ['初','十','廿','卅'] 258 | * @return Cn string 259 | */ 260 | nStr2: ["\u521d", "\u5341", "\u5eff", "\u5345"], 261 | /** 262 | * 月份转农历称呼速查表 263 | * @Array Of Property 264 | * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] 265 | * @return Cn string 266 | */ 267 | nStr3: ["\u6b63", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341", "\u51ac", "\u814a"], 268 | /** 269 | * 返回农历y年一整年的总天数 270 | * @param lunar Year 271 | * @return Number 272 | * @eg:var count = calendar.lYearDays(1987) ;//count=387 273 | */ 274 | lYearDays: function (y) { 275 | var i, sum = 348; 276 | for (i = 0x8000; i > 0x8; i >>= 1) { sum += (calendar.lunarInfo[y - 1900] & i) ? 1 : 0; } 277 | return (sum + calendar.leapDays(y)); 278 | }, 279 | /** 280 | * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 281 | * @param lunar Year 282 | * @return Number (0-12) 283 | * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 284 | */ 285 | leapMonth: function (y) { //闰字编码 \u95f0 286 | return (calendar.lunarInfo[y - 1900] & 0xf); 287 | }, 288 | /** 289 | * 返回农历y年闰月的天数 若该年没有闰月则返回0 290 | * @param lunar Year 291 | * @return Number (0、29、30) 292 | * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 293 | */ 294 | leapDays: function (y) { 295 | if (calendar.leapMonth(y)) { 296 | return ((calendar.lunarInfo[y - 1900] & 0x10000) ? 30 : 29); 297 | } 298 | return (0); 299 | }, 300 | /** 301 | * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 302 | * @param lunar Year 303 | * @return Number (-1、29、30) 304 | * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 305 | */ 306 | monthDays: function (y, m) { 307 | if (m > 12 || m < 1) { return -1 }//月份参数从1至12,参数错误返回-1 308 | return ((calendar.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29); 309 | }, 310 | /** 311 | * 返回公历(!)y年m月的天数 312 | * @param solar Year 313 | * @return Number (-1、28、29、30、31) 314 | * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 315 | */ 316 | solarDays: function (y, m) { 317 | if (m > 12 || m < 1) { return -1 } //若参数错误 返回-1 318 | var ms = m - 1; 319 | if (ms == 1) { //2月份的闰平规律测算后确认返回28或29 320 | return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28); 321 | } else { 322 | return (calendar.solarMonth[ms]); 323 | } 324 | }, 325 | /** 326 | * 农历年份转换为干支纪年 327 | * @param lYear 农历年的年份数 328 | * @return Cn string 329 | */ 330 | toGanZhiYear: function (lYear) { 331 | var ganKey = (lYear - 3) % 10; 332 | var zhiKey = (lYear - 3) % 12; 333 | if (ganKey == 0) ganKey = 10;//如果余数为0则为最后一个天干 334 | if (zhiKey == 0) zhiKey = 12;//如果余数为0则为最后一个地支 335 | return calendar.Gan[ganKey - 1] + calendar.Zhi[zhiKey - 1]; 336 | }, 337 | /** 338 | * 公历月、日判断所属星座 339 | * @param cMonth [description] 340 | * @param cDay [description] 341 | * @return Cn string 342 | */ 343 | toAstro: function (cMonth, cDay) { 344 | var s = "\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf"; 345 | var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]; 346 | return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + "\u5ea7";//座 347 | }, 348 | /** 349 | * 传入offset偏移量返回干支 350 | * @param offset 相对甲子的偏移量 351 | * @return Cn string 352 | */ 353 | toGanZhi: function (offset) { 354 | return calendar.Gan[offset % 10] + calendar.Zhi[offset % 12]; 355 | }, 356 | /** 357 | * 传入公历(!)y年获得该年第n个节气的公历日期 358 | * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 359 | * @return day Number 360 | * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 361 | */ 362 | getTerm: function (y, n) { 363 | if (y < 1900 || y > 2100) { return -1; } 364 | if (n < 1 || n > 24) { return -1; } 365 | var _table = calendar.sTermInfo[y - 1900]; 366 | var _info = [ 367 | parseInt('0x' + _table.substr(0, 5)).toString(), 368 | parseInt('0x' + _table.substr(5, 5)).toString(), 369 | parseInt('0x' + _table.substr(10, 5)).toString(), 370 | parseInt('0x' + _table.substr(15, 5)).toString(), 371 | parseInt('0x' + _table.substr(20, 5)).toString(), 372 | parseInt('0x' + _table.substr(25, 5)).toString() 373 | ]; 374 | var _calday = [ 375 | _info[0].substr(0, 1), 376 | _info[0].substr(1, 2), 377 | _info[0].substr(3, 1), 378 | _info[0].substr(4, 2), 379 | _info[1].substr(0, 1), 380 | _info[1].substr(1, 2), 381 | _info[1].substr(3, 1), 382 | _info[1].substr(4, 2), 383 | _info[2].substr(0, 1), 384 | _info[2].substr(1, 2), 385 | _info[2].substr(3, 1), 386 | _info[2].substr(4, 2), 387 | _info[3].substr(0, 1), 388 | _info[3].substr(1, 2), 389 | _info[3].substr(3, 1), 390 | _info[3].substr(4, 2), 391 | _info[4].substr(0, 1), 392 | _info[4].substr(1, 2), 393 | _info[4].substr(3, 1), 394 | _info[4].substr(4, 2), 395 | _info[5].substr(0, 1), 396 | _info[5].substr(1, 2), 397 | _info[5].substr(3, 1), 398 | _info[5].substr(4, 2), 399 | ]; 400 | return parseInt(_calday[n - 1]); 401 | }, 402 | /** 403 | * 传入农历数字月份返回汉语通俗表示法 404 | * @param lunar month 405 | * @return Cn string 406 | * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' 407 | */ 408 | toChinaMonth: function (m) { // 月 => \u6708 409 | if (m > 12 || m < 1) { return -1 } //若参数错误 返回-1 410 | var s = calendar.nStr3[m - 1]; 411 | s += "\u6708";//加上月字 412 | return s; 413 | }, 414 | /** 415 | * 传入农历日期数字返回汉字表示法 416 | * @param lunar day 417 | * @return Cn string 418 | * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' 419 | */ 420 | toChinaDay: function (d) { //日 => \u65e5 421 | var s; 422 | switch (d) { 423 | case 10: 424 | s = '\u521d\u5341'; break; 425 | case 20: 426 | s = '\u4e8c\u5341'; break; 427 | break; 428 | case 30: 429 | s = '\u4e09\u5341'; break; 430 | break; 431 | default: 432 | s = calendar.nStr2[Math.floor(d / 10)]; 433 | s += calendar.nStr1[d % 10]; 434 | } 435 | return (s); 436 | }, 437 | /** 438 | * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” 439 | * @param y year 440 | * @return Cn string 441 | * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' 442 | */ 443 | getAnimal: function (y) { 444 | return calendar.Animals[(y - 4) % 12] 445 | }, 446 | /** 447 | * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON 448 | * @param y solar year 449 | * @param m solar month 450 | * @param d solar day 451 | * @return JSON object 452 | * @eg:console.log(calendar.solar2lunar(1987,11,01)); 453 | */ 454 | solar2lunar: function (y, m, d) { //参数区间1900.1.31~2100.12.31 455 | if (y < 1900 || y > 2100) { return -1; }//年份限定、上限 456 | if (y == 1900 && m == 1 && d < 31) { return -1; }//下限 457 | if (!y) { //未传参 获得当天 458 | var objDate = new Date(); 459 | } else { 460 | var objDate = new Date(y, parseInt(m) - 1, d) 461 | } 462 | var i, leap = 0, temp = 0; 463 | //修正ymd参数 464 | var y = objDate.getFullYear(), m = objDate.getMonth() + 1, d = objDate.getDate(); 465 | var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000; 466 | for (i = 1900; i < 2101 && offset > 0; i++) { temp = calendar.lYearDays(i); offset -= temp; } 467 | if (offset < 0) { offset += temp; i--; } 468 | //是否今天 469 | var isTodayObj = new Date(), isToday = false; 470 | if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { 471 | isToday = true; 472 | } 473 | //星期几 474 | var nWeek = objDate.getDay(), cWeek = calendar.nStr1[nWeek]; 475 | if (nWeek == 0) { nWeek = 7; }//数字表示周几顺应天朝周一开始的惯例 476 | //农历年 477 | var year = i; 478 | var leap = calendar.leapMonth(i); //闰哪个月 479 | var isLeap = false; 480 | //效验闰月 481 | for (i = 1; i < 13 && offset > 0; i++) { 482 | //闰月 483 | if (leap > 0 && i == (leap + 1) && isLeap == false) { 484 | --i; 485 | isLeap = true; temp = calendar.leapDays(year); //计算农历闰月天数 486 | } 487 | else { 488 | temp = calendar.monthDays(year, i);//计算农历普通月天数 489 | } 490 | //解除闰月 491 | if (isLeap == true && i == (leap + 1)) { isLeap = false; } 492 | offset -= temp; 493 | } 494 | if (offset == 0 && leap > 0 && i == leap + 1) 495 | if (isLeap) { 496 | isLeap = false; 497 | } else { 498 | isLeap = true; --i; 499 | } 500 | if (offset < 0) { offset += temp; --i; } 501 | //农历月 502 | var month = i; 503 | //农历日 504 | var day = offset + 1; 505 | //天干地支处理 506 | var sm = m - 1; 507 | var gzY = calendar.toGanZhiYear(year); 508 | //月柱 1900年1月小寒以前为 丙子月(60进制12) 509 | var firstNode = calendar.getTerm(year, (m * 2 - 1));//返回当月「节」为几日开始 510 | var secondNode = calendar.getTerm(year, (m * 2));//返回当月「节」为几日开始 511 | //依据12节气修正干支月 512 | var gzM = calendar.toGanZhi((y - 1900) * 12 + m + 11); 513 | if (d >= firstNode) { 514 | gzM = calendar.toGanZhi((y - 1900) * 12 + m + 12); 515 | } 516 | //传入的日期的节气与否 517 | var isTerm = false; 518 | var Term = null; 519 | if (firstNode == d) { 520 | isTerm = true; 521 | Term = calendar.solarTerm[m * 2 - 2]; 522 | } 523 | if (secondNode == d) { 524 | isTerm = true; 525 | Term = calendar.solarTerm[m * 2 - 1]; 526 | } 527 | //日柱 当月一日与 1900/1/1 相差天数 528 | var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10; 529 | var gzD = calendar.toGanZhi(dayCyclical + d - 1); 530 | //该日期所属的星座 531 | var astro = calendar.toAstro(m, d); 532 | return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': calendar.getAnimal(year), 'IMonthCn': (isLeap ? "\u95f0" : '') + calendar.toChinaMonth(month), 'IDayCn': calendar.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': "\u661f\u671f" + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro }; 533 | }, 534 | /** 535 | * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON 536 | * @param y lunar year 537 | * @param m lunar month 538 | * @param d lunar day 539 | * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] 540 | * @return JSON object 541 | * @eg:console.log(calendar.lunar2solar(1987,9,10)); 542 | */ 543 | lunar2solar: function (y, m, d, isLeapMonth) { //参数区间1900.1.31~2100.12.1 544 | var isLeapMonth = !!isLeapMonth; 545 | var leapOffset = 0; 546 | var leapMonth = calendar.leapMonth(y); 547 | var leapDay = calendar.leapDays(y); 548 | if (isLeapMonth && (leapMonth != m)) { return -1; }//传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 549 | if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1; }//超出了最大极限值 550 | var day = calendar.monthDays(y, m); 551 | var _day = day; 552 | //bugFix 2016-9-25 553 | //if month is leap, _day use leapDays method 554 | if (isLeapMonth) { 555 | _day = calendar.leapDays(y, m); 556 | } 557 | if (y < 1900 || y > 2100 || d > _day) { return -1; }//参数合法性效验 558 | //计算农历的时间差 559 | var offset = 0; 560 | for (var i = 1900; i < y; i++) { 561 | offset += calendar.lYearDays(i); 562 | } 563 | var leap = 0, isAdd = false; 564 | for (var i = 1; i < m; i++) { 565 | leap = calendar.leapMonth(y); 566 | if (!isAdd) {//处理闰月 567 | if (leap <= i && leap > 0) { 568 | offset += calendar.leapDays(y); isAdd = true; 569 | } 570 | } 571 | offset += calendar.monthDays(y, i); 572 | } 573 | //转换闰月农历 需补充该年闰月的前一个月的时差 574 | if (isLeapMonth) { offset += day; } 575 | //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) 576 | var stmap = Date.UTC(1900, 1, 30, 0, 0, 0); 577 | var calObj = new Date((offset + d - 31) * 86400000 + stmap); 578 | var cY = calObj.getUTCFullYear(); 579 | var cM = calObj.getUTCMonth() + 1; 580 | var cD = calObj.getUTCDate(); 581 | return calendar.solar2lunar(cY, cM, cD); 582 | } 583 | }; 584 | 585 | function getQinMingJieDate(fullYear) { 586 | //清明节的日期是不固定的,规律是:闰年开始的前2年是4月4日,闰年开始的第3年和第4年是4月5日 587 | if(isLeapYear(fullYear) || isLeapYear(fullYear -1)) { 588 | return new Date(fullYear, 3, 4); 589 | } else { 590 | return new Date(fullYear, 3, 5); 591 | } 592 | } 593 | //判断是否是闰年 594 | function isLeapYear (Year) { 595 | if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) { 596 | return (true); 597 | } else { return (false); } 598 | } 599 | 600 | function newFestival() { 601 | festivals.sort(fSort); 602 | for (var i = 0; i < festivals.length; ++i) { 603 | if (festivals[i].days == 0) { 604 | msg += "今天就是" + festivals[i].festival+ ",好好享受!\n"; 605 | continue; 606 | } 607 | msg += "距离" + festivals[i].festival + "还有不到" + festivals[i].days + "天\n" 608 | } 609 | } 610 | 611 | function fSort(a, b) { 612 | return a.days - b.days; 613 | } 614 | 615 | function addFestival(ff, startDate, endDate) { 616 | // sendText(ff + startDate + endDate); 617 | var days = Math.round((endDate - startDate) / (1 * 24 * 60 * 60 * 1000)); 618 | festivals.push({ 619 | 'festival': ff, 620 | 'days': days 621 | }) 622 | } 623 | 624 | function addQingming(ff) { 625 | var startDate = new Date(year, month - 1, day); 626 | var endDate = getQinMingJieDate(year); 627 | if (endDate < startDate) { 628 | endDate = getQinMingJieDate(year + 1); 629 | } 630 | addFestival(ff, startDate, endDate); 631 | } 632 | 633 | function addYinFestival(ff, mm, dd) { 634 | var startDate = new Date(year, month - 1, day); 635 | var nongli = calendar.lunar2solar(year, mm, dd); 636 | var endDate = new Date(nongli.cYear, nongli.cMonth - 1, nongli.cDay); 637 | if (endDate < startDate) { 638 | nongli = calendar.lunar2solar(year + 1, mm, dd); 639 | endDate = new Date(nongli.cYear, nongli.cMonth - 1, nongli.cDay); 640 | } 641 | addFestival(ff, startDate, endDate); 642 | } 643 | 644 | function addYangFestival(ff, mm, dd) { 645 | var startDate = new Date(year, month - 1, day); 646 | var endDate = Date.parse(new Date(year, mm - 1, dd)); 647 | if (endDate < startDate) { 648 | endDate = Date.parse(new Date(year + 1, mm - 1, dd)); 649 | } 650 | addFestival(ff, startDate, endDate); 651 | } 652 | 653 | function dateApi() { 654 | var dateUrl = "https://tool.bitefu.net/jiari/?info=1&d=" + fishMan.format("yyyyMMdd") 655 | try { 656 | var req = request({ 657 | url: dateUrl, 658 | dataType: "json" 659 | }) 660 | msg += "\n———— ┑( ̄Д  ̄)┍ ————" 661 | msg += "\n【今日黄历】" + req["yearname"] + "年 " + req["nonglicn"] + " " + req["jieqi"] 662 | msg += "\n「宜」" + req["suit"].replace(/\./g, "·") 663 | msg += "\n「忌」" + req["avoid"].replace(/\./g, "·") 664 | } catch(e) {} 665 | } 666 | 667 | function headInfo() { 668 | var mae = '' 669 | if (hour >= 6 && hour < 12) { 670 | mae = '上午' 671 | } else if (hour >= 12 && hour < 18) { 672 | mae = '下午' 673 | } else if ((hour >= 18 && hour < 24) || hour < 6) { 674 | mae = '晚上' 675 | } 676 | var info = "【摸鱼办】提醒您:" + month + "月" + day + "日" + mae + "好,摸鱼人!\n工作再累,一定不要忘记摸鱼哦!有事没事起身去茶水间、去厕所、去廊道走走,别老在工位上坐着,钱是老板的,但命是自己的!\n" 677 | msg += info 678 | return info 679 | } 680 | 681 | function lastInfo() { 682 | var info = "为了放假加油吧!\n上班是帮老板赚钱,摸鱼是赚老板的钱!\n最后,祝愿天下所有摸鱼人,都能愉快的渡过每一天!" 683 | msg += info 684 | return info 685 | } 686 | 687 | function weekend() { 688 | var item = fishMan.getDay() 689 | var info = "" 690 | if (item > 0 && item <= 5) { 691 | item = 6 - item 692 | info = "距离周末还有不到" + item + "天\n"; 693 | } else { 694 | info = '好好享受周末吧\n'; 695 | } 696 | msg += info 697 | return info 698 | } 699 | 700 | function festival(chinese, fmonth, fday) { 701 | var startDate = Date.parse(fishMan); 702 | var info = ""; 703 | var endDate = Date.parse(new Date(year, fmonth - 1, fday)); 704 | if (endDate < startDate) { 705 | endDate = Date.parse(new Date(year + 1, fmonth - 1, fday)); 706 | } 707 | var days = Math.round((endDate - startDate) / (1 * 24 * 60 * 60 * 1000)); 708 | if (month == fmonth && day == fday) { 709 | info = "今天就是" + chinese + "节,好好享受!\n" 710 | } else { 711 | info = "距离" + chinese + "还有" + days + "天\n" 712 | } 713 | msg += info 714 | return info 715 | } 716 | 717 | main() --------------------------------------------------------------------------------