// ==UserScript== // @name 小说下载器 // @version 3.5.0.1619536977475 // @author bgme // @description 一个可扩展的通用型小说下载器。 // @supportURL https://github.com/yingziwu/novel-downloader // @match *://www.ciweimao.com/chapter-list/* // @match *://book.sfacg.com/Novel/*/MainIndex/ // @match *://book.qidian.com/info/* // @match *://www.jjwxc.net/onebook.php?novelid=* // @match *://book.zongheng.com/showchapter/*.html // @match *://huayu.zongheng.com/showchapter/*.html // @match *://www.17k.com/list/*.html // @match *://www.shuhai.com/book/*.htm // @match *://mm.shuhai.com/book/*.htm // @match *://www.uukanshu.com/b/*/ // @match *://www.yruan.com/article/*.html // @match *://www.biquwoo.com/bqw*/ // @match *://www.shuquge.com/txt/*/index.html // @match *://www.dingdiann.net/ddk*/ // @match *://www.xkzw.org/xkzw*/ // @match *://www.266ks.com/*/ // @match *://www.266ks.com/*/index*.html // @match *://www.hetushu.com/book/*/index.html // @match *://www.shouda8.com/*/ // @match *://www.shouda88.com/*/ // @match *://www.gebiqu.com/biquge_*/ // @match *://www.meegoq.com/book*.html // @match *://www.viviyzw.com/book*.html // @match *://www.xiaoshuodaquan.com/*/ // @match *://www.81book.com/book/*/ // @namespace https://blog.bgme.me // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAABjCAYAAAH1Iv5EAAAABGdBTUEAALGPC/xhBQAAAYRpQ0NQSUNDIHByb2ZpbGUAACiRfZE9SMNAHMVf02pFKg52EHHIUHWxIH7hqFUoQoVQK7TqYHLpFzRpSFJcHAXXgoMfi1UHF2ddHVwFQfADxM3NSdFFSvxfWmgR48FxP97de9y9A4RaiWlWYAzQdNtMxmNiOrMqBl8RQCdCmMKIzCxjTpIS8Bxf9/Dx9S7Ks7zP/Tl61KzFAJ9IPMsM0ybeIJ7etA3O+8RhVpBV4nPiUZMuSPzIdaXBb5zzLgs8M2ymkvPEYWIx38ZKG7OCqRFPEkdUTad8Id1glfMWZ61UYc178heGsvrKMtdpDiKORSxBgggFFRRRgo0orTopFpK0H/PwD7h+iVwKuYpg5FhAGRpk1w/+B7+7tXIT442kUAzoeHGcjyEguAvUq47zfew49RPA/wxc6S1/uQbMfJJebWmRI6B3G7i4bmnKHnC5A/Q/GbIpu5KfppDLAe9n9E0ZoO8W6F5r9Nbcx+kDkKKuEjfAwSEwnKfsdY93d7X39u+ZZn8/iS5ysNxMqHoAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQflBAYMNg49CJybAAAgAElEQVR42u1dd1gUV9c/M1vovVcpEjoICArYhZhELNFYYkQTSTQaJUEUTExEMSqJDU3ArsESjVixxBZUQH01vIiKgqIxtqCoIGpAyu7v+4Odyc7u0oyp33ue5z6PsjNz+7mn/M65RE2Qq4lkC7VAG9atWwdNlJubC41voBVUUVGh9jJ+/fVXAMDDhw+bfHHMmDEgoguCytLS0vgHFi1ahJiYGDg6OmLXrl3834loIcO9QUTEMAwBoOrqatLT06OGhgYaMWIEnTlzhpzbOZKTiyuVFhU2qPWpvr4eRITExEQAgKurKyoqKuDl5QUimsd3aPigQVzVys3gCwCMHTsWRDSDeydT+YWDBw/y/7axsQERQUtLCwxRuerovQEA169fh4+PD+Lj4wEAlZWVcHBwgIhl0a5dO83zFRYWBnt7exAR7t69CyLCnTt3IJfLoa2tDSJ62tTqqASAQ4cOYePGjU3X0AS16WGOPFr8alNkrM3OaPKNTp06NbtgbYy0fxK8dO7cOf7HhoaGJl/k+6n8R26lKz8UEBCAadOm4eHDh2AYpvGlgIAAAICnpycAYNmyZfxLycnJguWUlZXV+NLRo0dhamwIALh//z4AQC6Xo66uDkSE6dOnY9euXVCdAo1tDwgIABHhq6++QlVVFSRiMTS+UVlZiUuXLvH/NzAwABFpXhVGRkYCRrJgwQIAgEwm4/sz/t3RDZqma9fBgwehr68PhmEgl8vh4eGBa9euISUlBSbGxk0vq2nTpvH7qXfv3mjLGgQRWTzPgiV7I+l+IkJGRobaCGdlZUFENLTNHy0rK0NdXR2el65evQp7Y609LVbEMozay3Fxcc9dcW1tLQx1pL+qVELXuAf+85//gGXVKw0LC2v2wzExMSAiuLq64s033xRuPtUFu23bNqiueNVKp06dCgMDAzx79gzXr19HfX09QkNDUV1dDQAYOnQoiAhSqRREBGNjI+HOUK1AX19f7TxgWYZf8BwT9vfz4U5X2NraYurUqUhPT8fkyZNhYmwkJ6JK5U45cx+7cuUKkpKSBJWOHTtWsJ9lMhkAwMzMDPn5+fD39wcRwdraGgAwYsQIjXviMDd5IpblPyiTySAWiQQVTJ06FQAwbdo0AEBRURFmz56NoqIiEBE6derE9fhEk5utvr6e/2hUVBSUFwcRcecSXF1dBa1fvHgxKioqcPDgQaSkpCAyMhJ9+vQBES1v1cEhl8sBAKtXr0avXr1QWlqK8+fPg4jg5ubGz9W7774LIoKVlRW/sa30JGfauo8Fc7Vhw4bGBeDvDwBISUnBw4cPce/ePYgb+S6IaCb9DpJwPaitrVU+PvLpDyJvQ23Jry/yg10YIoSHh/NzpfG4bes8dOrUqdlzvNmzvTn+SUSkK2V/AUDm5uYkEonaukIIAKQSMdq0mq5du/bcXNqkkZcxmirRVZVeVq5cid9Dik1swNcgZpkKHW1tuaZjwMLCos0V3Lx5U3mpE0tEogY5TKprahiZTE5ubm5UXV3NN6C8vFG+zs7ObnKsb9++TQzDkKGhITEMQw0NDVRaWkpExE8wPv30U7z11lvCc0bDiXrq1CkAwK1bt0BE8PX1BRFh37596NGjBx48eNDkyuP/qKOjg9cHDuT/v3nzZjVJMzY2FgsXLgSn1aWnp2Pu3LkAgIsXL4KI0LFjRxAR9LQlsDTQ/oWkYjqj/JHu3bsjKSkJ4WGhGk/Pbt26AQDmz5+PCxcugIjg4uLCz4FYLIafnx+vtxGRORERUlJScPr0aUGLU1JSGivrHAwAmDdvHn799VcQEUQiEf/R/fv3w9LSEn5+fsjOzsb9+/eRnp6uXHEgeZmZ3eU+rCyDKh/LH3/8MYI7+AIAZs6cCQA4c+YMDAwMMHv2bHzyySdITEyEcaOoCZZh5ESk2+RmVN2YZ878NpozZsyAr0d7/rnHjx9j2LBhEIlYfgEofjNVq0AikaBPnz78x7SlYjx79kxQWWhoaGMrWZaXVIgIAwYM4BloQkICLl26pM7PEhISAAAdO3YUsBMfHx9ERkby/584cSKvsJ49exYA8O6776K2thavvfZao+L6W+UBgkocHR35D1VVVQlaP2vWLH74lPcRd1Jy+0RLS0t5h+tq2rB+UqmU/0DSjBmCit577z1IRQykUik8PDz4j23btg379u3D119/rayvt8j+f+OkBgb8wxUVFZg5cyaWLFnC/84J8WlpaY0SjaMjX7lihZk1x/Jnu7i48BWEhoZi7ty5mKHonUKYg1QiAREhKCgIRITAwEDk5+ejvr4eVVVVaJO0YmJsjLCwML6VH374IQDg7bff5nc6t/urqqpw4sQJ5flpFV0cNmyY2ub08PBAZWUlrly5wivAjo6OsLS0fO5zXzBXISEhSE1N5ZVlhRoOIlrX3AeYVlbUkJqaKrp06RJJJBIqKCigU6dOERFJiaj+RYpIlopW36a/kIJcTaVbxCK2gRTy2tatW/mhzsjI4IY29K9sZD8LfUkut5LDw8ORkZHB60jPS4cPH248QMU05Y9quJGJkYH86NGjAlXpz6DCwkKwLAMbA8nKF9UZtUq++eYbpKSk4M+mO3fuQE9XB84mWgXP1RMTHcmNsrKyJit4+PAhnJyc8FfQ06dPYWNtDTN96QMF12llp3Sl8tjYSS1WEBISgvz8/L+kczKZDE5OTpCK2doWl1lpaSmGDx+ODl4vYezY91r8eEZGBoYMGfJCG1xWVsZLE5yA5uTkBCKCn58ftETMz5pOmtpx48ahOTt3Xl4eDHW1WtWxp0+fwt7evkWOp9pYa2trvrGRkZE4ffo0bt26hcmTJ2P48OGCVdAqMQkAHBwcQEQYOnRokw2xMDXGhx/GtmqEOaGjc+fOvIxgb2+PjIwMrF69GoMGDcKmTZv450tKSjB+/HiMHTsWN2/e5P9+8eJF3tgnkUhgZ2cH9jfRYEqznoeamhowDIPo6GgQESJ699L4nJGBfpMdIyIwSlrj6dOnMXjwYIwePVqgTKg2lltKpqamv+leIhYiplFi9vb2xrx58yCXy2GqK/2FnxZDiaTK0swEIpFIo5UFAHJyckBEuHfvHqZOnQoiQu+e3QXPyOVy6OnqCJYiEcHd3R1ffPEF9u/fj2HDhvGNMzU15dxofIno3QtffPEFb/ILDQ1Fly5dsH//fsycORNyuRyzZ89GYWEhoqKiYKCvDzFDP2pcZnfu3AER4e23325y2UyZMgVeXl78/xMSEhorDg4SSO0SsRhGRkaCxlqYm2HVqlUAgIKCAs75ARcXF5ibm2PdunWYNGkStm7divz8fEyePBkZGRkwNDSEvZ2d8rc+adaCp3rqJyoa+csvvzTZsfDwcLXlMn36dBAROvh4NmlPMzMzQ0NDAz755BM0NDTgq6++wuHDh9GhQwcEBgbyjebEZSsrKzBE99tybj42MzPT2GixiIWbm1uzG32gktFD2ebTuXPnRsOtkz0aGhpARBg5ciQcHR1h9ZvSAGtra1y9ehUAcODAAcyfP59Xd/V0dFqlWLwuFosELmJHa2ssX75cs3nNxESg3avSyy+/zO8TrpG2trZYunQpb6QcPnw4goKCUFFRwb9XXl6Ojz/+GElJSXj8+DG2bNnCc1UjIyOEKgZEUaKb6kzx4sWL1Rq1atUqEJFGK2l1dTV69eqF3j27Q1nN5pbQwIEDUVdXhxMnTqi9u2HDBshkMtTU1CAhIYFfRu7u7rAT7gkQEQxEogdENKq1S8uZiDBlypQmUQwWTSy9O3fu4Mcff0R9fT1YlsHYsWPh5+eHadOm4fPPP0dhYSEiIyP5hnXq1ElgYuH2wuzZs/nlpTownIbOMPSQiIxavWFEDN0mIgH2gaMuwcFQhW2sWrUK1tbWvL/HxcUF/fv3VxvdkJAQfPTRR0hOTsZ//vMfwTeqqqqwc+dO1NbWYs+ePQgPD+ff6+jjI2AEPs62j55HgGZYhqqJCLt371YbLU5M6dSpE4qLizXOWklJCRYuXIglS5YgOzsbFRUVmDZtGi8NaGtrw05p8xMR76uWSqVwcHDAhx9+iBMnTkDhMB73InQcfa6ywsJCAMDdu3dhqXQyA8DevXvRpUsXEBEcHR0FLieuDBs2DIWFhbh8+TJsbW1BRDA0NISenh5mzJiBrKwsteV269YtyGQy3qxIRPYvSnlz4Rp2584dfKKQBIgIJiYm+OKLL1BbWysQT548ecJbbr29vUFEPACAcy8XFBQAAJYuXYojR45g8uTJgucVpYSIjP8oFTuCW8tPnjzRuHkjIyMxZMgQ3iP89ddf8yO/adMmZGdnY8WKFWqsXOHAdf+rjB4fcSZTjpUTEV555RW+c48fP8bx48chlUrh7u6ubAhrIKKX6W9Ka7kR9vT0hJOTE/T19ZVHfSz9Q2kM/UtIrC2id9pbGlyx0hNn/VMara8toneczPR+JiIYGxogNjaWl7Rra2vR3rmd3NrwOU1GfxCZaLE02dxAu4yIYGjQ2OiioqJWWVIC/HzllvpaN9pg3H4hZCtlabauVPyEiKCvp9fqRrdEoZ1CYKIneUhEWn9Ewxkxy9Rx4sUHH3yA8+fP/6H2rj4vvwwDbclTgeP8d+9Olnn68OFDbNy48U834A0ZMgRaEnEdEVn//o4oKWOff/4575T8MykmJgYilpX9npPev2/fvmoWFWdnZ4FM9WdRXFwcGOb5fDYO4eHhGj+an5+P/v37/yU246SkJAWMgAa0fqdrgG8o0/vvv4/MzMy/pEOLFi0CEUFX0gpRx8pAq6glq75MJoO1tTUePXr0l3Ro9erVICJY6oqTW+rPEJZh1PAuqvTjjz8iNDQUfxVt3bqVE0aHqE0IJ6leu3YNHbxeQmt8LuPHj0d6evqf0vj169fziEsigrZE/IyIegt64WSqfSI1NZV/acSIEdi8eXOTipQqd7OyshJY31/UqCvbla2srKCvr6+sTapZXuY7WRprbEhUVBTsrcxbNTsFBQUCW/LvHXF3d3doa2vDysqKtzPL5XIsWbIERPSLaicsiAgTx48T6Neq1KlTp1bNDofGUp7d1o64l5cXRCIRdHV1MW/ePDQ0NCAzMxP9+vXDokWLeE301KlT0BXTadWObOncuXMjyE1bGyKWFYQaqPlS9HR4VEpLFBkZKTB8K4+4vr4+D5lhWRbx8fG4fv064uLi0Lt3b2RlZQmWrqqtTEvMgmnU9dtz8lVtXl4e/1BRURFYlgHLMk0KjDt37kRrOBvn+uNMRyEhIfzojx49GtnZ2RgzZgwmTpyIn3/+mW90RkYGhg8frhaekJaWBisrK372BGYoHQn7SJNMZWBgAG1tbTAM06TMZWZi1KILj3O19e3bF2fPnkVBQQG2bNki2FejR49GVFQUcnJymmy4nZ2dWuMt9SWcZ8COiChu8ODBGhsxadIk2NrawsjIEESkhkwEgHXr1oFlNc/O2rVrMXToUPz3v//lvQKLFi1CREQE0tLS1OI30tPT+Ybr6enxoTdccTA34EFvvr6+KCoqwvwvUoQxPLdv39bYGQ5ZeuTIERgaNnYoOztbjf3q6+mqzU63bt3w6quvqh2k06ZNQ25urqDhLMsiMDBQ2WQEZztr3lHk6uoKc3NzfPfdd5g3bx7q6+vR0NAAbTH7QDXeBp9//nmTS8TBwQG9evVCeXk59PT0QEQ4fvy44JkVK1YIONvAgQMxZMgQbNy4EZmZmYKGcyOrBLSHro42Zs+ejUGDBvHeY2uFXycpKQn5+fk4efIk5s+fj82bN0NXV5d715mIyMvV1RVyuRwiloUyzlETwEAsFgNoDNniZkiZwzQ0NEBLKsVHH32IkydPIioqim+ojY2NoOEMwyA+Ph6PHz9GbGwsj5H09PTE5MmTsWbNGnz99dd4+PAh4uPjceTIEdja2gos+kS0gtfLO3bs+NtyCG+ElHJmT1Wqra0FwzC8hb68vJw3xH3//fcC8Vs5/oUrw4cPx08//QQAvGeZg2dFRETgwIEDGDFiBOrq6pCUlITMzExERETwrg1FKeU2eLOgA0XUHHbu3Nnk7PTr108Q83T//n3eZbBnzx4AwLNnz9C1a1fk5uYK3uVmMjg4GJ6enjhw4ADCw8NRUlKCFStWYMWKFXj33Xfh5uambJ0HEf1MRJFNG6VEoryXX35ZUBkXmsoBsDXRtWvXYG9vr4ZK4hq6Y8cOjWK4lZUVDh48iL179+LQoUM4e/Ysli5digULFsDc3Bzm5mYCgLdSR0xa1EW0RaLHmpylbi5OEIvFTYIQAMDDw0ONlVZUVPC++e+++04wkzExMaiursaVK1ewe/du6Ovr8zhi5QNTWedpC7y0IxFp9PclJiaCiJo1Df3www/86ax6lnCjunHjRh4urKenJwDjkiK+k9uHqamp2LRpEy9fiRj10GFVSuA+tG/fPmgCG3ANIiKMGzeu2ZP866+/VkVno127dqr+EL64uLggOTmZdwBxtHfvXowaNQrffPMNjh07BnND7SoiqiYi7SbRRaWlpbyRoaysrEnY1MyZM2FvYwVTU9NmRZKwsDBlHo9hw4bxYk5JSQnc3NzUbGc7duzARx99hIMHD+L+/ftcBDvPFCxNTWTKwSktcqxZs2Zh1qxZMG/CbT1y5EjeslFeXi74bc+ePXzlXGhwTU0NPvvsMyxcuJDfZ3K5HMuWLcPbb7/Nc7TFixfzB629vb3qnmkgoukt2Ys1anz62tp47bXXNHama9euuH37NogIS5cu5f+uUHgQEhKCwsJCNXvYuXPncPHiRQDAkSNHeFlKLBbz8S3KhWVZENHeViNWmwq+be/ggBUrVmj8LTAwsBHEZmbCa4WnT5/mJVVNqLtRo0YJsFzKy4+DdXAnflhYGAdMi2udLYuojmEY1NTUaEbQSST8SaxKPj4+fCSFajyhXC7Hl19+yWO2bG1t4efnpzbivXr1wp49e9QgJTExMfjyyy+V43s+a7EzLENFzQmNTWFXOBiI6pKYNWsWRCIRH0GjXMaMGYOqqir8/PPPSE1NRWpqKo4cOQIAuHfvHlJSUvDBBx8gNjYWAQEBuHz5MoqLi9HSRlemnkQEXV1dtcPv2bNnGjkZF7vVoUMHsCyLV199FXo62oKGGxoaol+/fpg5cybWrFmDx48fq7H1wsJCVFRUIDExkWfdpqam8FNCTShkrbBWm01ZhqkgIrW9UVxcDAsltrts2TL06dMHT58+RVVVFVasWIGPP/4YiYmJGDFiBO7cuaPWcW6jA8D58+d5UA3XYXtzc8EgMAwDT0/PRrnLyvDa81jmx3J2JNXR66ew2AcHBzd53tTW1mLXrl1YuHAh0tLSUFlZqQaocbC3h1gpvk0ZYefl5QVTU1NcuHABCxYs+F3RL0REEqaRfwuk1zcHD8aqVav4jhw8eBBvvPEGBg4ciMzMTMhkMshkMqSlpQlAZsqRfpweP2nSJF4P19bWhrW1NWJjY5GVlYX9+/erylke9DtpJafNceRkY4OVK1di1KhR2L59uwAVxLIs/Pz8eG6ljLj76quvIJPJOCQQj0Gxt7fH+fPnNVr66+vr0b59e+75Qy8qmocXZ7hlERERocZWuUCpbdu2CaC6nAJmaWkJsViMOXPm8L8vXLiQt6KsXr0a+/bt4/HKPkq4rhflPM1TxpsoNzwqKkoAEZTJZJDL5TxQTSQSwc3NDR4eHrxok5+fz+ccuHfvHmbOnInLly/DxMQEEokEZmZmynV8+KI9v4Hcx5tLW6QS0ceHEwLAF198gcuXL/PS8okTJzBnzhwex6LU+DtEZPtH++BvNSXWc+BpR0dHfPbZZzzMlgtnrK6uxoIFC/DkyRP4+/uDZVlYW1srd2Dxn42CGMEtG2UBMS4ujlekkpOTcevWLX6f/PDDD9i+fTsYhhEEghJRDRGF/JWQDkbRCD40itukixYtEswUh6lXQcvtJEU+gr8LzSQi6OjoYPfu3byYcfHiRRgaGsLT0xMSReCqooyivzEZKnOy4OBgHn6uKIUKEOg/hnarnCsz/8nAM0cicqL/0W8mNyIKlrA0vp2xdIe9ie4tiSJUl4hga20p79+/P+Lj42FrZSFjGEZub6z1AxH5/2/ono83dJGwFGdvKN1vbqBdxjQmjWgUmg30ER4ejtjYWGRkZLQJ7yaTybB161a4t3eRExFsDKSXiajf/+fBtiWifmKWki30JbnGutIHynzMQF99sJuzLr8IksvlyMrKQnBQow/M0kD7F20RvUNE4n/yQIuIyJuIRumJaZGdoeQ/OlLRr6qqn5eXF6Kjo7FixQoUFRW1OcnSn0m5ubmI6tuYr8RYT/rIQExTqYl0In83GkdEcG/vKn///fexatUqnD179nelCPy70pkzZ9C/fz8wDANdLXGNuQ47nzSkx/mrKVFZUudc5oMHDxY4df+tdOnSJYwcORJikQgSsajB3lD6LRG1+ysnxIazZzRFV65cQWRkJMaMGdNsIO2/hW7cuIEJEyZAW0sKhmHkDsZaR/9sCc+LVGKPmqPKykrExsbCw8MDe/fuxf8Hun//PpKSkmCsQCFZG2qV/NESnljEMrLm8CrNSToZGRmws7NDbGxsqyCF/wZ68uQJUlNTYaMwd1kaaJe9cAlPzDYaTFRTvLaVfvzxR4SEhKB3794C18m/nWpqapCWlgZHx0ZnhYmetMpYi40nIp3fOzesgZSdJhGL6p0dHWSqMLS20sOHDzFu3DjY2Nhg3bp1f7h+8nei+vp6bNiwgbd862lJau0NJUuohTx4quRHRDlEdIqIbhIRLE2NIBGL4OrkqAYZbSvJZDKsWrUKlpaWGDdunFp6zn8b3bx5E+vXr8eYMWMEcHRF2dOaCUkgRaaNnJwcHDhwACUlJcjMzMTSpUtx584dpMyZDalEDGdHezVk6vNQQUEBwsLC0KFDBzVU3j+BysrKsHXrVowdO1YdgK2E/nBwcPgNBUJUQK2NN3OzMblJRM0GxxUUFCAqKgq9evXCm0MGQ8SycHZ0eCETxElzhoaGSEpK+kti2to66GKxGHZ2dnB1deWhOM7OzoiJicGmTZtQVlaGmpoaWFtZcPa9V1szF3N4rLRFI66U8wi2hnJyctC9e3eYmxqDYRi0d273u1kcJ82tW7cOtra2iI6OVkOTvSi6desW1q9fj5iYGE3sBRYWFvDx8YGrqyvvETI2NsaAAQOwZMkS3mDa0NCAoqIibNiwAUlJSfjyyy+xfPlynDp1CocOHWqcQIZyWm1OISKcO3cOBw4caPQ/syyio6NRUlLS5k7m5OTAzdUZDBGcXhCL4wYvOjoaXbt2bZPluLmVLhaL0b59ewQFBcHFxYVDx0EkEiEoKAiJiYk4fPgwnjx5gvz8fKSmpiI6OhoRERGIjo5Gamoq8vPzW0wrd+XKFUW8IltLRDFN2doYhfh7u0FOdgsXLqTJkyfzPz58+JCmTp1K6zO+IZkcxLIMvfZaX0pOTqaAgIBWSwyPHj2iMaNH0c6sPeTazpHWbdhIXbt2fSGi+/Hjx0kqlZKjoyMdPXqUjh07RseOHaNr134DH5mbm1O7du2IZVm6c+cO/fLLb+Fc7u7u1KtXL+rVqxe5ubnRxYsXKS8vj65evUomJiYUGhpKoaGhFBgYSBKJhH+vpqaGCgsLKT8/n6qqqsjY2JgcHR2pe/fuZGSknm3o0qVLdOzYMUpMTKSnT5+StYk+VT39lWrqQYrF8YMCXrOTUViAG4iISktLqX379ho739DQQLGxsbRs2TKSiMVU39BALMvQ6wNfp89mzCB//9ZZHB48eEATxo2lzB07ydXJkdat/30T9PTpU/L396eysjLq168fHTlyhCoqKgQT0rNnT+rVqxe5u7vTrVu36MKFC/TkyROys7Oj8PBwCgkJIX3939y6lZWVdPr0aTp9+jQVFBSQTCYjT09P6tKlC4WFhZGFhUWTg378+HE6fvw43bt3r3HVMwy5uLiQmZkZVVZW0k8//UQymayp7pQQ0cdERKQvYXKJCE1d3aVKJSUlfPCEr68vDA0NBOn3VJPGNcdS+inM589zBlVWVkJXVxempqaIiopC3759W0xve/PmTWRmZiI+Ph4RERHo2bMnJk2ahPXr16OkpKRJ3enixYtIS0vD0KFDBSFApEh4FxgYCD8/Px7xrFq0JGJY6IkhYhpB+CEhIfD29kb37t0xceJEEJGcVMJK7UQsI5NKpW2+mmH37t0wMzMDwzRmIZs+fTofr8FNEneFQEuD9XJEb36CWiMWv/POOyAijBo1CjY2NjwCdfPmzZg1axbi4+OxfPlynDx5kkeTNjQ0oLCwENu3b4dyNtyLFy8iPT1d46BLJBJ4enoiKCiIv+xMtTAMA1c7SzjY2fJYSJFIBC8vL/j4+MDBwQFTpkzBzp07sXbtWmRmZqK8vBw3b96Evo5Wg5Sl2Wr7xkIiydMSi3h0HIfjbS01NDTwWGGJRILk5GSUlZUhISFBsHoie/dqccB/+ukndO/WtcUJ4qAlr7zyCnr27MnDr44ePYo5c+bgnXfewXvvvYc1a9bg8OHDTQ66Mjjb2dmZP+hVi6WZMQa/PhBjxoxBjx49BLic9u3bIzg4GGZmZhgwYAA2btyITZs2Yfr06UhNTcUvv/yCuro67Nu3D9u2bUNxcTFmz54NEcvKWZZSSenCDI70GUU2tsYV20uAEFTOeNhac8rgwYN5mP3JkycBNMalTZ06VTBJPbp2wdGjR5tllZ07NUbWurk4CSaIu5Bt5MiRkEgkWLp0KYYNG6Zx0PX09ODm5gYnJyfBLRaCHSEWo2uXcMycORPZ2dnYuXMnRo4cyYeekSLHWqdOneDk5AQvLy/MmTMHOTk5+PLLLzFt2jTs2rULtbW1KC0txZw5cxAfH49t27Zh//79GD16NIyMjODj44PAwEBoaUlV2yBIX+5OivSrynT06FHYWJrzEdsZ5wwAAAzwSURBVIatCQ7XNKhcfOjrr78uiLy6d+8epkyZIpikLp1DcOjQIY3funDhAgIDOvATdPz4cVhZWcHKygo2NjawtbWFvb29KrJMGIPk7IT33nsPW7ZsQXl5OeRyOU6cOIFJkyYJAI0sy8LX1xehoaEwNTXFkCFDkJmZiR07diAhIQHTpk1DQUEBnj17hqysLHz66af8ZKampiIgIACWlpYICAiAuZmpajsaiGg/Eb3RHO6W1RaL683MzDQedPX19UhMTOR5pb+/Pw8ibgsdOnQINjY2MDAwEGTx56i8vByJiYmCdGudAv015jc9f/48AvzVQcu6ujqIiIhASkoK8vLycOTIER4rcOvWLcyYMUMtaMzKygrc9ZVBQUFITU3F/v37ERsbi9deew2pqam4f/8+bty4gcWLFyMuLg4bNmzA9u3bER0dDX19fbi7u2tUOlXsW21Lg2XKsh9y+N3mcqdcv34dwYEd+MMtISGhzQn95XI50tLSoKOjg549e/JxXar04MEDfPLJJwL2EeTnjd27d7fJwvzrr7/yeY39/f3h6+sLW1tbxMXFITs7G8uXL8fAgQPxwQcfIDc3l88W+vnnn2Pp0qX4/vvvMW3aNDg6OsLBwQH+/v7QUYHek4L929vbw9HBAUyjNPX1C8FiGYhE14kIH330UYud3blzJwz1dJ9bOOB2YUpKCgwMDPDNN9+0eFZ99tlngsTSfp4vYdu2bc1q06NHj+bZZ1BQkJpYvXXrVqxatQoHDx7E2rVr0bt3bxgYGCAoKIhP5N6UxOXl5YWJEydi8+bNuH37Nr799lvu9w9etOexm4hhGiQSCY4dO9biwFZXV+O1V1/hGzto0CC1G4Rau6InTpyIPn36tCrTUWVlZaNLVoHmJyJ4v+SKzZs3CyaJy5jv4OCA/v37Iy4uDidOnMCECRNgbm4ODw8PhISEQE8lpo+UYmE/++wzNYHnxo0byMjIwNixYzFo0CBERkZCKpVCImKevBBHIxEtIaL5RDSBiC4REVil4JLKyspWDezKlSuhIxEp+LuuxitQW0PV1dVYu3atIE7x2bNnOHnyJBYtWoQ33niDvz2zudLe0RapqamCSB9N0hknzAwZMgSpqanIyMhAdnY2f7mWXC7HmTNn1ILRnjx5gu+//x4ff/wxL3EyjWl59lFjptznIj0iqiBFuOsPP/yAxYsX83FT1dXV6KwIb23Lzazp6enQ0dHhLhZEx44dcf369TZPTl5enka9QU9PD56envD399eYx9vQ0BCRkZGIiIgQKLOkSKXdqVMnhIeHY/LkyThy5EiTQaoVFRXIyspCQkICxo0bh/j4eGzfvh13795FcXExlixZgqioKIFwoiH6vJS4LD2tjMRII6IJ3bp1o+PHjwt+vHz5Mn366af06quvUnBwMHUNDaXq2lo6eOgQ9ezZs1UVxMfH044dO8jN1YUO/5BNLMvS9OnTKSkpqcUbJO/evUt2dnYkl8vJ19eXRCIRFRYWEsMw5OHhQV26dOGLi4uLwJB69OhRKioqIiIiBwcHioiIoHbt1GFbN27coJycHCooKCC5XE5WVlbUvXt3CgkJIblcTidPnqTDhw/ToUOH6OzZsySXyxtZi1hML730EhkbG1P53bt07fp1AtSCF38hou8V4u9eIqpr7cRcJJVAcU1UXFyMbt26wVMR3+Pt7d3qc6Ourg5RUVEICQnBgQMHYGtlwUfEa8pur7zbSCl62MjIiJf0rl69itWrV2PhwoVYsGABcnJy1O7x48TgNWvWYMKECXjnnXeQnJzMS1icrrRp0ya8/fbbajvOwMAAAQEBCAwMFJxbTZQz9CLScCoon4gwadKkVrOU27dvw1HBlydPntzq9x49eoSgoCCMGjUK9fX1mDFjBp9h5s0331SDIyll48Mbb7yBkJCQ5zqfzp8/j4ULF6JPnz5qAfo2NjYIDAxUJHgRNSllGRoawtXVFZ07d0ZoaCi8vLwgFYvlirPjhVM8V7lyJGhr6KeffoKliQkkYnGzphJNSqK3tzfWr1/Pr+bwziGKTGt6fH6v+/fv8wrrhx9+CIZhNEpl1dXVOHjwIKZMmQJ/f39BximRSISXXnoJQUFBfI78lopYLIaLiwuioqKQmJiIFStWIDc3l180a9asARFBR+msYxm6r4D6vrAsvO+zTGMqYQ6uqpoKpTnauHFj4/UL3t5qsf3N0d27dzF69Gg+4raoqAiJiYnQ09Hib93hEkm9/vrr/KCqshKOzXTs2JG/5URTYVkWHh4eGD9+PJQz4nHomqtXr2LXrl3YsmUL9u7dqzHHx9OnTzFkyBAQEZ8Cs7i4GG+99ZZgp7EMVRFR8vNMkqrar0VEcxiiyVD81rlzZ1q/fj25ubk1+yEAFD18OG3aupWmTJlC8+fPbxkyk5AgeI5lWfL19SVdXV2qq6uja1ev0qOqKv73sLAwevbsGRUXF1NNTY3mmA2RiIKDg6lv377UsWNHEovFdOnSJf76Y5ZlycnJiXx9fcnNzY3EYjHJZDIqLi6mgoICKi4upurqaoLiOms/Pz9yd3enBw8eUF5eHuXl5dHJkyfp0aNH1CUkhPLOnCEtLS3q378/1dTU0IEDB6ihoYFrToVCxfjuRUZarVBeaREREXyAb3MYW1cHB0glkiZN7pWVlTAxMYGpqSnatWvHx5U7OTlh3759auJpYWEhXnIVatampqYIDg5GTEwMMjMzUVxc/NwhGjdu3MDGjRsxfvx4+Pj4qIngxsbG8HZzg0+7djARXoMg8Ln4+vrCxsYGLMvCyki7lP7gGGErhUgnOHibslkBQHZ2NiQiEXy9vNRY2qhRo2BpaQlDQ0N8++23/MDs27cP//3vf9sMzKurq0NhYSHWrl2LpUuXYuXKldiyZQtu3LiBmpoa5ObmYu7cuejbt69GKcrCwgKONjYwbEKjVy3m5uYICAiAgYEBQkNDsXbtWlRVVeGNgf1kTub6d/6K4CMPIvpRuZHR0dFNniUfK3KacRkYAMDFxQU9evQAEWlM01pZWYmcnBykp6fj/fffx4ABAzB8+HBMmDAB6enpOHXqFJ9Ps7lVzjAMLCws0K5dOxgrGTU1Heze3t7o2LGjmqJpZ2cHHx8fSKVS9OjRA5s2bcLly5exZs0arFy5ks/dWVJS0nj4S158Bom2UihDdFVZ0klISFDTF6qrq9GpQwdoSSTIy8tDTEwMbGxs4OzsDAsLC6SlpSE3N1dN7+FW+bx589RWuZaWFlxcXODh4QELlZw6qsXY2Bh9+/bFvHnzkJOTg127dmHQoEFqF2S1a9cO7du3h0gkwiuvvIJt27YhLy+PT9HZkl5maWkJYx3JE2rMBTeJ/uQbKzRRP4bonrIZe+7cuYK4x6KiIhjp6cHH3R0eHh6wtrZGeHg4JBKJYJVbWFjA398fgYGBrbJvubu7IyYmBt98840gA+Hjx4+xZs0a1fSeYFkWL730Euzt7SEWizFgwADs3bsX9fX1KCkpQV5eHmQyGS5evIjMzEy15LKlpaVYs2YNtmzZggsXLiAlJQXOzs588mSV9l36u4TmxTBET5TtVOnp6bwPZLXinrvWFIlEwgPisrKycO7cOcTFxandynb79m3MnTtX7T4vHR0deHt7w9TUFFKpFEOHDsXhw4cFVuTHjx9j7dq1iIuLw7JlywS6UG5uLpKTk7F48WKUlpZi9erVgisZ7ezs4O7ursk+9ysRrVYE8P7tooo/YRpvROelps2bNwNovJ5xwoQJmDhxIpYvX47z58+3iDKUyWTo3bs377BSzhPr5ubWaILX04OOjg5GjRqlBlt69uwZNmzYgKlTp2L9+vV83luZTIYDBw5gxowZSEtLw71797Br1y68/PLLvDJqbW0NDw8PTZp/PRFto8b0+Qz9g0iHiFIV+CYeQaKcxas1xCVhNDExQXBwMMLCwmBsbIwePXqo4c3q6uqwY8cOpKSkYOvWrQJF8MyZM0hJScGyZcvw8OFD5OXlYcSIEXziOnNzc3h6eqqmpOXwWUeIaPA/PQ5flUyIaLNyZ11dXZs1TnKWA+75bt26YdasWQIH2ebNm7FkyRLs3LlToLNcu3YN6enpWLlyJe7du4fi4mLExsbyHkxTU1N4e3urHfyKkt8c7vffSg4KHK0gs+e5c+fUJuXNN9/8DZrUowcGDx6M48ePC/z1dXV1OH36NPbv34/y8nKUlZUhOTmZFxiMjIx4HUPDBJQqbIGm9D8SRCX/V3mgOnfujCtXrgAAZigynhIR3nrrLYwePVowaY8fP0Z6ejqfOo9T7ppANd4lohT6X3aiNlEXIvpJeSCVk/q+//77jUZQxQTo6uoiLCxMLTOlolQR0VeKSf8fvSB6nYjKSUNiSg0T8IyINlBbssn+j343jaLfdCAZER2mxiupRP+WDv4fOF7wvCtwgZgAAAAASUVORK5CYII= // @license AGPL-3.0 // @run-at document-end // @noframes true // @incompatible Greasemonkey // @exclude *://www.jjwxc.net/onebook.php?novelid=*&chapterid=* // @exclude *://www.meegoq.com/book/*.html // @exclude *://www.viviyzw.com/book/*.html // @exclude *://www.yruan.com/article/*/*.html // @grant unsafeWindow // @grant GM_info // @grant GM_xmlhttpRequest // @grant GM_getTab // @grant GM_saveTab // @grant GM_getTabs // @grant GM.info // @grant GM.xmlHttpRequest // @connect img.shouda8.com // @connect qidian.com // @connect yuewen.com // @connect kuangxiangit.com // @connect sinaimg.cn // @connect jjwxc.net // @connect image.gebiqu.com // @connect qidian.qpic.cn // @connect zongheng.com // @connect 17k.com // @connect www.shuhai.com // @connect img.uukanshu.com // @connect oss-accelerate.aliyuncs.com // @connect cdn.bcebos.com // @connect rs.sfacg.com // @connect shuhai.com // @require https://cdn.jsdelivr.net/npm/file-saver@2.0.5/dist/FileSaver.min.js#sha512-Qlv6VSKh1gDKGoJbnyA5RMXYcvnpIqhO++MhIM2fStMcGT9i2T//tSwYFlcyoRRDcDZ+TYHpH8azBBCyhpSeqw== // @require https://cdn.jsdelivr.net/npm/jszip@3.6.0/dist/jszip.min.js#sha512-uVSVjE7zYsGz4ag0HEzfugJ78oHCI1KhdkivjQro8ABL/PRiEO4ROwvrolYAcZnky0Fl/baWKYilQfWvESliRA== // @require https://cdn.jsdelivr.net/npm/crypto-js@4.0.0/crypto-js.min.js#sha512-s+p/j7+gSFJa1SUEwmPBAlitcUccgbaTTM3yRSmDHUp0UCcRdBMgI2toIT97ZKGKItfV3N66PEZbHcT/iS5thg== // @downloadURL none // ==/UserScript== /******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ 563: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.sleep = exports.concurrencyRun = exports.gfetch = exports.rm = exports.cosCompare = exports.ggetHtmlDOM = exports.ggetHtmlText = exports.getHtmlDOM = exports.getHtmlText = exports.cleanDOM = exports._GM_info = void 0; const main_1 = __webpack_require__(519); try { exports._GM_info = GM_info; } catch (error) { try { exports._GM_info = GM.info; } catch (error) { console.error("未发现 _GM_info API"); } } let _GM_xmlhttpRequest; try { _GM_xmlhttpRequest = GM_xmlhttpRequest; } catch (error) { try { _GM_xmlhttpRequest = GM.xmlHttpRequest; } catch (error) { console.error("未发现 _GM_xmlhttpRequest API"); } } class CleanerClass { constructor(imgMode) { this.imgMode = imgMode; this.statusType = { init: this.parse_init, p: this.parse_p, br: this.parse_br, hr: this.parse_hr, }; this.typeParagraph = [ "DIV", "P", "OL", "H1", "H1", "H2", "H3", "H4", "H5", "H6", ]; this.typeInto = ["IMG", "HR", "BR"]; this.currentHtml = document.createElement("p"); this.currentText = ""; this.br_count = 0; this.images = []; this.doms = []; this.texts = []; this.status = "init"; } reset_current() { this.currentHtml = document.createElement("p"); this.currentText = ""; } create_pbr() { const p = document.createElement("p"); const br = document.createElement("br"); p.appendChild(br); return p; } parse_init(element) { var _a, _b; const nodeName = element.nodeName; if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") { this.br_count = 0; this.status = "p"; this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim(); } else if (this.typeParagraph.includes(nodeName)) { this.meet_p(element, nodeName); } else if (nodeName === "BR") { this.br_count++; this.status = "br"; } else if (nodeName === "IMG") { this.meet_img(element); } else if (nodeName === "HR") { this.meet_hr(); } } parse_p(element) { const nodeName = element.nodeName; if (nodeName === "BR") { this.br_count++; this.status = "br"; this.currentText += "\n"; } else if (this.typeParagraph.includes(nodeName)) { this.meet_p(element, nodeName); } else if (nodeName === "IMG") { this.meet_img(element); } else if (nodeName === "HR") { this.meet_hr(); } } parse_br(element) { var _a, _b; const nodeName = element.nodeName; if (nodeName === "BR") { this.br_count++; if (this.br_count <= 4) { this.currentText += "\n"; } } else if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") { this.meet_br_push(); this.status = "p"; this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim(); } else if (this.typeParagraph.includes(nodeName)) { if (this.br_count > 2) { this.doms.push(this.create_pbr()); } this.meet_p(element, nodeName); } else if (nodeName === "IMG") { this.meet_img(element); } else if (nodeName === "HR") { this.meet_hr(); } } parse_hr(element) { var _a, _b; const nodeName = element.nodeName; if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") { this.br_count = 0; this.status = "p"; this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim(); this.currentHtml.innerText = this.currentText; } else if (this.typeParagraph.includes(nodeName)) { this.meet_p(element, nodeName); } else if (nodeName === "IMG") { this.meet_img(element); } } meet_p(element, nodeName) { var _a; this.br_count = 0; const childrenNodeNamesSet = new Set(Array.from(element.children).map((ele) => ele.nodeName)); const typeParagraphSet = new Set(this.typeParagraph); const intersectParagraph = Array.from(childrenNodeNamesSet).filter((x) => typeParagraphSet.has(x)); const typeIntoSet = new Set(this.typeInto); const intersectInto = Array.from(childrenNodeNamesSet).filter((x) => typeIntoSet.has(x)); if (intersectParagraph.length !== 0 || intersectInto.length != 0) { this.meet_text_push(); const subcleaner = new CleanerClass(this.imgMode); const subcleanerBound = subcleaner.clean.bind(this); subcleanerBound(element); this.status = "init"; } else { this.status = "p"; this.currentText += "\n".repeat(2); this.currentText += (_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim(); this.meet_text_push(); } } meet_img(element) { function genImageName(url) { let t = btoa(new URL(url).pathname.split("/").slice(-2).join("/")) + `.${url.split(".").slice(-1)[0]}`; if (t.length >= 125) { t = btoa(new URL(url).pathname.split("/").slice(-1)[0]) + `.${url.split(".").slice(-1)[0]}`; } return t; } this.meet_br_push(); this.br_count = 0; const imageUrl = element.src; const imageName = genImageName(imageUrl); const image = new main_1.attachmentClass(imageUrl, imageName, this.imgMode); image.init(); this.images.push(image); const pimg = document.createElement("p"); const img = document.createElement("img"); img.src = imageName; img.alt = imageUrl; pimg.appendChild(img); this.doms.push(pimg); this.texts.push(`\n![${img.alt}](${img.src})\n`); } meet_hr() { this.meet_br_push(); this.br_count = 0; this.status = "hr"; this.texts.push(`\n${"-".repeat(20)}\n`); const hr = document.createElement("hr"); this.doms.push(hr); } meet_text_push() { this.currentHtml.innerText = this.currentText.trim(); this.doms.push(this.currentHtml); this.texts.push(this.currentText); this.reset_current(); } meet_br_push() { if (this.br_count === 1) { this.br_count = 0; this.meet_text_push(); } else if (this.br_count === 2) { this.br_count = 0; this.meet_text_push(); } else if (this.br_count >= 3) { this.br_count = 0; this.meet_text_push(); this.doms.push(this.create_pbr()); } } clean(DOM) { let i = 0; while (i < DOM.childNodes.length) { const fn = this.statusType[this.status].bind(this); fn(DOM.childNodes[i]); i++; } this.meet_text_push(); return { doms: this.doms, texts: this.texts, images: this.images }; } } function cleanDOM(DOM, imgMode) { const cleaner = new CleanerClass(imgMode); const { doms, texts, images } = cleaner.clean(DOM); const outputDOM = document.createElement("div"); for (const dom of doms) { outputDOM.appendChild(dom); } let outputText = ""; for (const t of texts) { outputText += t; } outputText = outputText.trim(); return { dom: outputDOM, text: outputText, images: images }; } exports.cleanDOM = cleanDOM; async function getHtmlText(url, charset) { if (charset === undefined) { return fetch(url).then((response) => { if (response.ok) { return response.text(); } else { console.error(new Error(`Bad response! ${url}`)); return response.text(); } }); } else { return fetch(url) .then((response) => { if (response.ok) { return response.arrayBuffer(); } else { console.error(new Error(`Bad response! ${url}`)); return response.arrayBuffer(); } }) .then((buffer) => { const decoder = new TextDecoder(charset); const text = decoder.decode(buffer); return text; }); } } exports.getHtmlText = getHtmlText; async function getHtmlDOM(url, charset) { const htmlText = await getHtmlText(url, charset); return new DOMParser().parseFromString(htmlText, "text/html"); } exports.getHtmlDOM = getHtmlDOM; async function ggetHtmlText(url, charset) { if (charset === undefined) { return gfetch(url).then((response) => { if (response.status >= 200 && response.status <= 299) { return response.responseText; } else { console.error(new Error(`Bad response! ${url}`)); return response.responseText; } }); } else { return gfetch(url, { responseType: "arraybuffer" }) .then((response) => { if (response.status >= 200 && response.status <= 299) { return response.response; } else { console.error(new Error(`Bad response! ${url}`)); return response.response; } }) .then((buffer) => { const decoder = new TextDecoder(charset); const text = decoder.decode(buffer); return text; }); } } exports.ggetHtmlText = ggetHtmlText; async function ggetHtmlDOM(url, charset) { const htmlText = await ggetHtmlText(url, charset); return new DOMParser().parseFromString(htmlText, "text/html"); } exports.ggetHtmlDOM = ggetHtmlDOM; function cosCompare(a, b) { if (a.sectionNumber !== null && b.sectionNumber != null) { if (a.sectionNumber > b.sectionNumber) { return 1; } if (a.sectionNumber === b.sectionNumber) { if (a.sectionChapterNumber !== null && b.sectionChapterNumber !== null) { if (a.sectionChapterNumber > b.sectionChapterNumber) { return 1; } if (a.sectionChapterNumber === b.sectionChapterNumber) { return 0; } if (a.sectionChapterNumber < b.sectionChapterNumber) { return -1; } } } if (a.sectionNumber < b.sectionNumber) { return -1; } } return 0; } exports.cosCompare = cosCompare; function rm(selector, all = false, dom) { if (all) { let rs = dom.querySelectorAll(selector); rs.forEach((e) => e.remove()); } else { let r = dom.querySelector(selector); if (r) { r.remove(); } } } exports.rm = rm; function gfetch(url, { method = "GET", headers, data, cookie, binary, nocache, revalidate, timeout, context, responseType, overrideMimeType, anonymous, username, password, } = {}) { return new Promise((resolve, reject) => { if (_GM_xmlhttpRequest) { _GM_xmlhttpRequest({ url: url, method: method, headers: headers, data: data, cookie: cookie, binary: binary, nocache: nocache, revalidate: revalidate, timeout: timeout, context: context, responseType: responseType, overrideMimeType: overrideMimeType, anonymous: anonymous, username: username, password: password, onload: (obj) => { resolve(obj); }, onerror: (err) => { reject(err); }, }); } else { throw new Error("未发现 _GM_xmlhttpRequest API"); } }); } exports.gfetch = gfetch; function concurrencyRun(list, limit, asyncHandle) { function recursion(arr) { return asyncHandle(arr.shift()).then(() => { if (arr.length !== 0) { return recursion(arr); } else { return "finish!"; } }); } let listCopy = [...list]; let asyncList = []; while (limit--) { asyncList.push(recursion(listCopy)); } return Promise.all(asyncList); } exports.concurrencyRun = concurrencyRun; function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } exports.sleep = sleep; /***/ }), /***/ 519: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.attachmentClass = exports.Chapter = exports.Book = exports.Status = void 0; const rules_1 = __webpack_require__(489); const lib_1 = __webpack_require__(563); var Status; (function (Status) { Status[Status["pending"] = 0] = "pending"; Status[Status["downloading"] = 1] = "downloading"; Status[Status["failed"] = 2] = "failed"; Status[Status["finished"] = 3] = "finished"; Status[Status["aborted"] = 4] = "aborted"; })(Status = exports.Status || (exports.Status = {})); class Book { constructor(bookUrl, bookname, author, introduction, additionalMetadate, chapters) { this.bookUrl = bookUrl; this.bookname = bookname; this.author = author; this.introduction = introduction; this.additionalMetadate = additionalMetadate; this.chapters = chapters; console.debug("[Book]初始化完成"); } } exports.Book = Book; class Chapter { constructor(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, charset) { this.bookUrl = bookUrl; this.bookname = bookname; this.chapterUrl = chapterUrl; this.chapterNumber = chapterNumber; this.chapterName = chapterName; this.isVIP = isVIP; this.isPaid = isPaid; this.sectionName = sectionName; this.sectionNumber = sectionNumber; this.sectionChapterNumber = sectionChapterNumber; this.chapterParse = chapterParse; this.charset = charset; this.status = Status.pending; this.retryTime = 0; } async init() { const obj = await this.parse(); const { chapterName, contentRaw, contentText, contentHTML, contentImages, } = obj; this.chapterName = chapterName; this.contentRaw = contentRaw; this.contentText = contentText; this.contentHTML = contentHTML; this.contentImages = contentImages; console.debug(`[Chapter]${this.chapterName} 解析完成。`); return obj; } async parse() { this.status = Status.downloading; return this.chapterParse(this.chapterUrl, this.chapterName, this.isVIP, this.isPaid, this.charset) .then((obj) => { this.status = Status.finished; return obj; }) .catch(async (err) => { this.retryTime++; console.error(`[Chapter]${this.chapterName}解析出错,第${this.retryTime}次重试,章节地址:${this.chapterUrl}`); if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) { await lib_1.sleep(this.retryTime * 1500); return this.parse(); } else { this.status = Status.failed; console.error(err); return { chapterName: this.chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } }); } } exports.Chapter = Chapter; class attachmentClass { constructor(imageUrl, name, mode) { this.imageUrl = imageUrl; this.name = name; this.mode = mode; this.status = Status.pending; this.retryTime = 0; } async init() { if (this.mode === "naive") { this.imageBlob = await this.downloadImage(); } else { this.imageBlob = await this.tmDownloadImage(); } console.debug(`[Image] ${this.imageUrl} 下载完成。`); return this.imageBlob; } downloadImage() { this.status = Status.downloading; return fetch(this.imageUrl) .then((response) => { if (response.ok) { this.status = Status.finished; return response.blob(); } else { if (response.status === 404) { this.status = Status.failed; } throw new Error(`Image request response is not ok!\nImage url: ${this.imageUrl} .`); } }) .catch(async (err) => { this.retryTime++; console.error(`[Image]下载 ${this.imageUrl} 出错,第${this.retryTime}次重试,下载模式:${this.mode}`); if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) { await lib_1.sleep(this.retryTime * 1500); return this.downloadImage(); } else { this.status = Status.failed; console.error(err); return null; } }); } tmDownloadImage() { this.status = Status.downloading; return lib_1.gfetch(this.imageUrl, { responseType: "blob" }) .then((response) => { if (response.status >= 200 && response.status <= 299) { this.status = Status.finished; return response.response; } else { if (response.status === 404) { this.status = Status.failed; } throw new Error(`Bad response!\nRequest url: ${this.imageUrl}`); } }) .catch(async (err) => { this.retryTime++; console.error(`[Image]下载 ${this.imageUrl} 出错,第${this.retryTime}次重试,下载模式:${this.mode}`); if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) { await lib_1.sleep(this.retryTime * 1500); return this.tmDownloadImage(); } else { this.status = Status.failed; console.error(err); return null; } }); } } exports.attachmentClass = attachmentClass; /***/ }), /***/ 489: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getRule = exports.icon1 = exports.icon0 = exports.retryLimit = void 0; const ciweimao_1 = __webpack_require__(444); const uukanshu_1 = __webpack_require__(623); const yruan_1 = __webpack_require__(514); const biquge_1 = __webpack_require__(931); const xkzw_1 = __webpack_require__(441); const sfacg_1 = __webpack_require__(116); const hetushu_1 = __webpack_require__(161); const shouda8_1 = __webpack_require__(382); const meegoq_1 = __webpack_require__(158); const xiaoshuodaquan_1 = __webpack_require__(678); const qidian_1 = __webpack_require__(839); const jjwxc_1 = __webpack_require__(217); const zongheng_1 = __webpack_require__(862); const _17k_1 = __webpack_require__(528); const shuhai_1 = __webpack_require__(113); exports.retryLimit = 5; exports.icon0 = "data:image/png;base64,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"; exports.icon1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAANSAAADUgEQACRKAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAUdQTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiYSOVQAAAGx0Uk5TAAECAwQFCAkKCwwNDhETFRkaHB0fICMkKCwwNTg5PD1AQUZKTk9QV1tcX2BjZGhtb3B2eHl6fX6AgYKHi4+QlJicnaChpamur7C3uru+v8LEyMzP0NXZ3N3f4OTn6uvt7/Hy8/T2+Pn6/P3+VI4wmgAAAyxJREFUeNrtmVdT4zAUhTFs6BB6Cb13WLpooffeQjW9hMT//3mVJbsT4li6ahbD6D4y5p5vzrGuFDkry5QpznLSygAYAANgAAyAATAABsAAGAADYAAMgAEwAD8XADlChTQTIM0eIM0pIM3vAdL8JiLNawFpXo1I8zxAmicS0jwTkeapjDTvC8r0gQQK9UEESvUBBIr1qQTK9SkESvR/wQkQ5V95KhS+Q1AC14N34ZCYenD0LGNjoH7ij2ejQV71QPd2lNQapI8rut0d4LMe0Bz4CHMUSetZCGgPMESRYj1cAGARMIqv1kMlgK8pNQq39TARBB8VhCgyW59S414y6frjxDYeUYTCNnnKHw4WeUxl1/wtGjwk97LToyBan6irmRrPfSHj/K+ZuSJ3TImCav3zaqvlvTN57T9W6+ozJAqa9fH9/gLS3kja/wr69+PUKMhGXUxVie0mVVMXZAUSwONys4ztvHn5kQcgttubJ+tEkde7G2MEiExUyD3VVExE4AAPS40qTlaNSw8QgI+dnlxVx8ncnp0PCsD5WJnaI23Z2Lk3wP1igx83jA2L998V4G8E5WrVy0kRfIeXMLkMm1TIN8GWYXIQTVbKVa+cjLCO4r2+fFnq+X17MZ7N6GmlxRJXt1pWnjh3Q1yX09Vi8tXTl/zb8eeB5GCgkFe9cOAgTutPBcD1stbGEYXVtvYCaA4BwHU9W8smXzt7DesMBMB1NFQMVS8eOgK3hQM4zut6ezZdPbt9/ZWhKQsArpu5OrJ83dwNW0dGAFzHwyVe6iXDx8zt2AEc522jI8etntOx8cbRjAcA1+18/Vf5+vlbvk6cALhORkr/qZeOnHC34QdwnPfNTvzjLtC5+S7QRAQg8eNuYcEW6yAIIF4GQD8A9W5IZX3eFQW6tqI61KNbXf9vy4K/T/2Wd90X+hqFnfHG1K8oUq1nuqpVZD3zjal865nvjBVY74pC/qpg/nYkNQqb6+uZrChYrFcQhcBnOwlR2KIfLoUGlIj1EgaUsPVCUcixnjcKmdZzRCHdeqYo1FgPjUKl9YAolFtPjMIf672i8NP6DFH4br2pH1d/AAm28mJJn9pPAAAAAElFTkSuQmCC"; function getRule() { const host = document.location.host; let ruleClass; switch (host) { case "www.ciweimao.com": ruleClass = ciweimao_1.ciweimao; break; case "www.uukanshu.com": ruleClass = uukanshu_1.uukanshu; break; case "www.yruan.com": ruleClass = yruan_1.yrun; break; case "www.biquwoo.com": ruleClass = biquge_1.biquwo; break; case "www.shuquge.com": ruleClass = biquge_1.shuquge; break; case "www.dingdiann.net": ruleClass = biquge_1.dingdiann; break; case "www.xkzw.org": ruleClass = xkzw_1.xkzw; break; case "www.266ks.com": ruleClass = biquge_1.c226ks; break; case "book.sfacg.com": ruleClass = sfacg_1.sfacg; break; case "www.hetushu.com": ruleClass = hetushu_1.hetushu; break; case "www.shouda8.com": case "www.shouda88.com": ruleClass = shouda8_1.shouda8; break; case "www.gebiqu.com": ruleClass = biquge_1.gebiqu; break; case "www.meegoq.com": case "www.viviyzw.com": ruleClass = meegoq_1.meegoq; break; case "www.xiaoshuodaquan.com": ruleClass = xiaoshuodaquan_1.xiaoshuodaquan; break; case "book.qidian.com": ruleClass = qidian_1.qidian; break; case "www.jjwxc.net": ruleClass = jjwxc_1.jjwxc; break; case "www.81book.com": ruleClass = biquge_1.zwdu; break; case "book.zongheng.com": case "huayu.zongheng.com": ruleClass = zongheng_1.zongheng; break; case "www.17k.com": ruleClass = _17k_1.c17k; break; case "www.shuhai.com": case "mm.shuhai.com": ruleClass = shuhai_1.shuhai; break; default: throw new Error("Not Found Rule!"); } const rule = new ruleClass(); return rule; } exports.getRule = getRule; /***/ }), /***/ 528: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.c17k = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class c17k { constructor() { this.imageMode = "TM"; this.concurrencyLimit = 5; } async bookParse(chapterParse) { const bookUrl = document.location.href.replace("/list/", "/book/"); const bookname = (document.querySelector("h1.Title")).innerText.trim(); const author = (document.querySelector("div.Author > a")).innerText.trim(); const doc = await lib_1.getHtmlDOM(bookUrl, undefined); let introduction; const introDom = doc.querySelector("#bookInfo p.intro > a"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; let coverUrl = doc.querySelector("#bookCover img.book") .src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const sections = document.querySelectorAll("dl.Volume"); const cos = []; for (let i = 0; i < sections.length; i++) { const s = sections[i]; const sectionNumber = i + 1; const sectionName = (s.querySelector("dt > span.tit")).innerText.trim(); const cs = s.querySelectorAll("dd > a"); for (let j = 0; j < cs.length; j++) { const a = cs[j]; const span = a.firstElementChild; const chapterName = span.innerText.trim(); const chapterUrl = a.href; const isVIP = () => { if (span === null || span === void 0 ? void 0 : span.className.includes("vip")) { return true; } else { return false; } }; const isPaid = () => { return false; }; const co = { bookUrl: bookUrl, bookname: bookname, chapterUrl: chapterUrl, chapterName: chapterName, isVIP: isVIP(), isPaid: isPaid(), sectionName: sectionName, sectionNumber: sectionNumber, sectionChapterNumber: j, }; cos.push(co); } } cos.sort(lib_1.cosCompare); for (let i = 0; i < cos.length; i++) { const chapterNumber = i + 1; let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i]; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); const isLogin = () => { return false; }; if (isVIP && !(isLogin() && chapter.isPaid)) { chapter.status = main_1.Status.aborted; } chapters.push(chapter); } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { async function publicChapter() { const doc = await lib_1.getHtmlDOM(chapterUrl, charset); const chapterName = (doc.querySelector("#readArea > div.readAreaBox.content > h1")).innerText.trim(); const content = (doc.querySelector("#readArea > div.readAreaBox.content > div.p")); if (content) { lib_1.rm("p.copy", false, content); lib_1.rm("#banner_content", false, content); lib_1.rm("div.qrcode", false, content); lib_1.rm("div.chapter_text_ad", false, content); let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } async function vipChapter() { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } if (isVIP) { return vipChapter(); } else { return publicChapter(); } } } exports.c17k = c17k; /***/ }), /***/ 931: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.zwdu = exports.c226ks = exports.gebiqu = exports.dingdiann = exports.shuquge = exports.biquwo = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class biquwo { constructor() { this.imageMode = "TM"; } async bookParse(chapterParse) { const bookUrl = document.location.href; const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim(); const author = (document.querySelector("#info > p:nth-child(2)")).innerText .replace(/作(\s+)?者[::]/, "") .trim(); let introduction; const introDom = document.querySelector("#intro"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = document.querySelector("#fmimg > img") .src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const dl = document.querySelector("#list>dl"); if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) { const dlc = Array.from(dl.children); if (dlc[0].nodeName === "DT" && dlc[0].innerText.includes("最新章节")) { for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) { if (i !== 0 && dlc[i].nodeName === "DT") { delete dlc[0]; break; } delete dlc[i]; } } const chapterList = dlc.filter((obj) => obj !== undefined); let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (let i = 0; i < chapterList.length; i++) { const node = chapterList[i]; if (node.nodeName === "DT") { sectionNumber++; sectionChapterNumber = 0; sectionName = node.innerText.replace(`《${bookname}》`, "").trim(); } else if (node.nodeName === "DD") { chapterNumber++; sectionChapterNumber++; const a = node.firstElementChild; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); chapters.push(chapter); } } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim(); const content = dom.querySelector("#content"); if (content) { let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.biquwo = biquwo; class shuquge { constructor() { this.imageMode = "TM"; } async bookParse(chapterParse) { const bookUrl = document.location.href; const bookname = (document.querySelector(".info > h2")).innerText.trim(); const author = (document.querySelector(".small > span:nth-child(1)")).innerText .replace(/作(\s+)?者[::]/, "") .trim(); let introduction; const introDom = document.querySelector(".intro"); if (introDom === null) { introduction = null; } else { introDom.innerHTML = introDom.innerHTML.replace(/推荐地址:http:\/\/www.shuquge.com\/txt\/\d+\/index\.html/, ""); let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = (document.querySelector(".info > .cover > img")).src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const dl = document.querySelector(".listmain>dl"); if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) { const dlc = Array.from(dl.children); if (dlc[0].nodeName === "DT" && dlc[0].innerText.includes("最新章节")) { for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) { if (i !== 0 && dlc[i].nodeName === "DT") { delete dlc[0]; break; } delete dlc[i]; } } const chapterList = dlc.filter((obj) => obj !== undefined); let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (let i = 0; i < chapterList.length; i++) { const node = chapterList[i]; if (node.nodeName === "DT") { sectionNumber++; sectionChapterNumber = 0; sectionName = node.innerText.replace(`《${bookname}》`, "").trim(); } else if (node.nodeName === "DD") { chapterNumber++; sectionChapterNumber++; const a = node.firstElementChild; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); chapters.push(chapter); } } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = (dom.querySelector(".content > h1:nth-child(1)")).innerText.trim(); const content = dom.querySelector("#content"); if (content) { content.innerHTML = content.innerHTML .replace("请记住本书首发域名:www.shuquge.com。书趣阁_笔趣阁手机版阅读网址:m.shuquge.com", "") .replace(/http:\/\/www.shuquge.com\/txt\/\d+\/\d+\.html/, ""); let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.shuquge = shuquge; class dingdiann { constructor() { this.imageMode = "TM"; this.concurrencyLimit = 5; } async bookParse(chapterParse) { const bookUrl = document.location.href; const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim(); const author = (document.querySelector("#info > p:nth-child(2)")).innerText .replace(/作(\s+)?者[::]/, "") .trim(); let introduction; const introDom = document.querySelector("#intro"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = document.querySelector("#fmimg > img") .src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const dl = document.querySelector("#list>dl"); if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) { const dlc = Array.from(dl.children); if (dlc[0].nodeName === "DT" && dlc[0].innerText.includes("最新章节")) { for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) { if (i !== 0 && dlc[i].nodeName === "DT") { delete dlc[0]; break; } delete dlc[i]; } } const chapterList = dlc.filter((obj) => obj !== undefined); let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (let i = 0; i < chapterList.length; i++) { const node = chapterList[i]; if (node.nodeName === "DT") { sectionNumber++; sectionChapterNumber = 0; sectionName = node.innerText.replace(`《${bookname}》`, "").trim(); } else if (node.nodeName === "DD") { chapterNumber++; sectionChapterNumber++; const a = node.firstElementChild; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); chapters.push(chapter); } } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim(); const content = dom.querySelector("#content"); const ad = '
章节错误,点此举报(免注册),举报后维护人员会在两分钟内校正章节内容,请耐心等待,并刷新页面。
'; content.innerHTML = content.innerHTML .replace(ad, "") .replace(/http:\/\/www.shuquge.com\/txt\/\d+\/\d+\.html/, ""); if (content) { let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.dingdiann = dingdiann; class gebiqu { constructor() { this.imageMode = "TM"; this.concurrencyLimit = 5; } async bookParse(chapterParse) { const bookUrl = document.location.href; const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim(); const author = (document.querySelector("#info > p:nth-child(2)")).innerText .replace(/作(\s+)?者[::]/, "") .trim(); let introduction; const introDom = document.querySelector("#intro"); if (introDom === null) { introduction = null; } else { introDom.innerHTML = introDom.innerHTML.replace(/如果您喜欢.+,别忘记分享给朋友/, ""); lib_1.rm('a[href^="http://down.gebiqu.com"]', false, introDom); let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = document.querySelector("#fmimg > img") .src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const dl = document.querySelector("#list>dl"); if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) { const dlc = Array.from(dl.children); if (dlc[0].nodeName === "DT" && dlc[0].innerText.includes("最新的八个章节")) { for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) { if (i !== 0 && dlc[i].nodeName === "DT") { delete dlc[0]; break; } delete dlc[i]; } } const chapterList = dlc.filter((obj) => obj !== undefined); let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (let i = 0; i < chapterList.length; i++) { const node = chapterList[i]; if (node.nodeName === "DT") { sectionNumber++; sectionChapterNumber = 0; sectionName = node.innerText.replace(`《${bookname}》`, "").trim(); } else if (node.nodeName === "DD") { chapterNumber++; sectionChapterNumber++; const a = node.firstElementChild; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); chapters.push(chapter); } } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim(); const content = dom.querySelector("#content"); content.innerHTML = content.innerHTML.replace("www.gebiqu.com", ""); if (content) { let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.gebiqu = gebiqu; class c226ks { constructor() { this.imageMode = "TM"; } async bookParse(chapterParse) { const bookUrl = document.location.href.replace(/index_\d+\.html/, "index_1.html"); const bookname = (document.querySelector(".info > .top > h1")).innerText.trim(); const author = (document.querySelector(".info > .top > .fix > p:nth-child(1)")).innerText .replace(/作(\s+)?者[::]/, "") .trim(); let introduction; const introDom = document.querySelector(".desc"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = document.querySelector(".imgbox > img") .src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const indexUrls = Array.from(document.querySelectorAll('[name="pageselect"] > option')).map((opt) => document.location.origin + opt.getAttribute("value")); let lis = []; for (const indexUrl of indexUrls) { const dom = await lib_1.getHtmlDOM(indexUrl, "UTF-8"); const ul = dom.querySelector("div.row.row-section > div > div:nth-child(4) > ul"); if (ul === null || ul === void 0 ? void 0 : ul.childElementCount) { lis = lis.concat(Array.from(ul.children)); } } const chapterList = lis.filter((obj) => obj !== undefined); let chapterNumber = 0; for (let i = 0; i < chapterList.length; i++) { const node = chapterList[i]; chapterNumber++; const a = node.firstElementChild; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8"); chapters.push(chapter); } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = dom.querySelector("h1.title").innerText.trim(); const content = dom.querySelector("#content"); const ad = '
章节错误,点此举报(免注册),举报后维护人员会在两分钟内校正章节内容,请耐心等待,并刷新页面。
'; content.innerHTML = content.innerHTML.replace(ad, ""); if (content) { let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.c226ks = c226ks; class zwdu { constructor() { this.imageMode = "TM"; this.charset = "GBK"; } async bookParse(chapterParse) { const bookUrl = document.location.href; const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim(); const author = (document.querySelector("#info > p:nth-child(2)")).innerText .replace(/作(\s+)?者[::]/, "") .trim(); let introduction; const introDom = document.querySelector("#intro"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = document.querySelector("#fmimg > img") .src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const dl = document.querySelector("#list>dl"); if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) { const dlc = Array.from(dl.children); if (dlc[0].nodeName === "DT" && dlc[0].innerText.includes("最新章节")) { for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) { if (i !== 0 && dlc[i].nodeName === "DT") { delete dlc[0]; break; } delete dlc[i]; } } const chapterList = dlc.filter((obj) => obj !== undefined); let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (let i = 0; i < chapterList.length; i++) { const node = chapterList[i]; if (node.nodeName === "DT") { sectionNumber++; sectionChapterNumber = 0; sectionName = node.innerText.replace(`《${bookname}》`, "").trim(); } else if (node.nodeName === "DD") { chapterNumber++; sectionChapterNumber++; const a = node.firstElementChild; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK"); chapters.push(chapter); } } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim(); const content = dom.querySelector("#content"); if (content) { let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.zwdu = zwdu; /***/ }), /***/ 444: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ciweimao = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class ciweimao { constructor() { this.imageMode = "TM"; this.concurrencyLimit = 1; this.maxRunLimit = 1; } async bookParse(chapterParse) { var _a, _b; const bookid = unsafeWindow.HB.book.book_id; const bookUrl = `https://www.ciweimao.com/book/${bookid}`; const bookname = (document.querySelector(".book-catalog .hd h3")).innerText.trim(); const author = (document.querySelector(".book-catalog .hd > p > a")).innerText.trim(); let introduction; const dom = await lib_1.getHtmlDOM(bookUrl, undefined); const introDom = dom.querySelector(".book-intro-cnt .book-desc"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = dom.querySelector(".cover > img").src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); additionalMetadate.tags = Array.from(dom.querySelectorAll(".label-box > .label")).map((span) => span.innerText.trim()); const chapters = []; const sections = document.querySelectorAll(".book-chapter > .book-chapter-box"); const cos = []; for (let i = 0; i < sections.length; i++) { const s = sections[i]; const sectionNumber = i + 1; const sectionName = s.querySelector(".sub-tit").innerText; const cs = s.querySelectorAll(".book-chapter-list > li > a"); for (let j = 0; j < cs.length; j++) { const c = cs[j]; const chapterName = c.innerText.trim(); const chapterUrl = c.href; let isVIP = false; let isPaid = false; if (c.childElementCount) { isVIP = true; if (((_a = c.firstElementChild) === null || _a === void 0 ? void 0 : _a.className) === "icon-unlock") { isPaid = true; } } const co = { bookUrl: bookUrl, bookname: bookname, chapterUrl: chapterUrl, chapterName: chapterName, isVIP: isVIP, isPaid: isPaid, sectionName: sectionName, sectionNumber: sectionNumber, sectionChapterNumber: j, }; cos.push(co); } } cos.sort(lib_1.cosCompare); for (let i = 0; i < cos.length; i++) { const chapterNumber = i + 1; let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i]; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); const isLogin = ((_b = document.querySelector(".login-info.ly-fr")) === null || _b === void 0 ? void 0 : _b.childElementCount) === 1 ? true : false; if (isVIP && !(isLogin && isPaid)) { chapter.status = main_1.Status.aborted; } chapters.push(chapter); } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { function decrypt(item) { let message = item.content; let keys = item.keys; let len = item.keys.length; let accessKey = item.accessKey; let accessKeyList = accessKey.split(""); let charsNotLatinNum = accessKeyList.length; let output = new Array(); output.push(keys[accessKeyList[charsNotLatinNum - 1].charCodeAt(0) % len]); output.push(keys[accessKeyList[0].charCodeAt(0) % len]); for (let i = 0; i < output.length; i++) { message = atob(message); let data = output[i]; let iv = btoa(message.substr(0, 16)); let keys255 = btoa(message.substr(16)); let pass = CryptoJS.format.OpenSSL.parse(keys255); message = CryptoJS.AES.decrypt(pass, CryptoJS.enc.Base64.parse(data), { iv: CryptoJS.enc.Base64.parse(iv), format: CryptoJS.format.OpenSSL, }); if (i < output.length - 1) { message = message.toString(CryptoJS.enc.Base64); message = atob(message); } } return message.toString(CryptoJS.enc.Utf8); } async function getChapterAuthorSay() { const doc = await lib_1.getHtmlDOM(chapterUrl, undefined); const _chapter_author_says = doc.querySelectorAll("#J_BookCnt .chapter.author_say"); let div_chapter_author_say; if (_chapter_author_says.length !== 0) { let hr = document.createElement("hr"); div_chapter_author_say = document.createElement("div"); div_chapter_author_say.appendChild(hr); for (let _chapter_author_say of Array.from(_chapter_author_says)) { lib_1.rm("i", true, _chapter_author_say); div_chapter_author_say.appendChild(_chapter_author_say); } } return div_chapter_author_say; } const chapter_id = chapterUrl.split("/").slice(-1)[0]; async function publicChapter() { async function chapterDecrypt(chapter_id, refererUrl) { const rootPath = "https://www.ciweimao.com/"; const access_key_url = rootPath + "chapter/ajax_get_session_code"; const chapter_content_url = rootPath + "chapter/get_book_chapter_detail_info"; console.debug(`[Chapter]请求 ${access_key_url} Referer ${refererUrl}`); const access_key_obj = await lib_1.gfetch(access_key_url, { method: "POST", headers: { Accept: "application/json, text/javascript, */*; q=0.01", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", Referer: refererUrl, Origin: "https://www.ciweimao.com", "X-Requested-With": "XMLHttpRequest", }, data: `chapter_id=${chapter_id}`, responseType: "json", }).then((response) => response.response); const chapter_access_key = access_key_obj .chapter_access_key; console.debug(`[Chapter]请求 ${chapter_content_url} Referer ${refererUrl}`); const chapter_content_obj = await lib_1.gfetch(chapter_content_url, { method: "POST", headers: { Accept: "application/json, text/javascript, */*; q=0.01", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", Referer: refererUrl, Origin: "https://www.ciweimao.com", "X-Requested-With": "XMLHttpRequest", }, data: `chapter_id=${chapter_id}&chapter_access_key=${chapter_access_key}`, responseType: "json", }).then((response) => response.response); if (chapter_content_obj.code !== 100000) { console.error(chapter_content_obj); throw new Error(`下载 ${refererUrl} 失败`); } return decrypt({ content: chapter_content_obj.chapter_content, keys: chapter_content_obj.encryt_keys, accessKey: chapter_access_key, }); } const div_chapter_author_say = await getChapterAuthorSay(); let content = document.createElement("div"); let decryptDate = await chapterDecrypt(chapter_id, chapterUrl); content.innerHTML = decryptDate; lib_1.rm(".chapter span", true, content); if (div_chapter_author_say) { content.appendChild(div_chapter_author_say); } let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } async function vipChapter() { var _a; const isLogin = ((_a = document.querySelector(".login-info.ly-fr")) === null || _a === void 0 ? void 0 : _a.childElementCount) === 1 ? true : false; if (isLogin && isPaid) { async function vipChapterDecrypt(chapter_id, refererUrl) { const HB = unsafeWindow.HB; const parentWidth = 871; const setFontSize = "14"; const image_session_code_url = HB.config.rootPath + "chapter/ajax_get_image_session_code"; console.debug(`[Chapter]请求 ${image_session_code_url} Referer ${refererUrl}`); const image_session_code_object = await lib_1.gfetch(image_session_code_url, { method: "POST", headers: { Accept: "application/json, text/javascript, */*; q=0.01", Referer: refererUrl, Origin: "https://www.ciweimao.com", "X-Requested-With": "XMLHttpRequest", }, responseType: "json", }).then((response) => response.response); if (image_session_code_object.code !== 100000) { console.error(image_session_code_object); throw new Error(`下载 ${refererUrl} 失败`); } const imageCode = decrypt({ content: image_session_code_object .image_code, keys: image_session_code_object .encryt_keys, accessKey: image_session_code_object .access_key, }); const vipCHapterImageUrl = HB.config.rootPath + "chapter/book_chapter_image?chapter_id=" + chapter_id + "&area_width=" + parentWidth + "&font=undefined" + "&font_size=" + setFontSize + "&image_code=" + imageCode + "&bg_color_name=white" + "&text_color_name=white"; return vipCHapterImageUrl; } const div_chapter_author_say = await getChapterAuthorSay(); const vipCHapterImageUrl = await vipChapterDecrypt(chapter_id, chapterUrl); console.debug(`[Chapter]请求 ${vipCHapterImageUrl} Referer ${chapterUrl}`); const vipCHapterImageBlob = await lib_1.gfetch(vipCHapterImageUrl, { method: "GET", headers: { Referer: chapterUrl, Accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", }, responseType: "blob", }).then((response) => response.response); const vipCHapterName = `vipCHapter${chapter_id}.png`; const vipCHapterImage = new main_1.attachmentClass(vipCHapterImageUrl, vipCHapterName, "TM"); if (vipCHapterImageBlob) { vipCHapterImage.imageBlob = vipCHapterImageBlob; vipCHapterImage.status = main_1.Status.finished; } const contentImages = [vipCHapterImage]; let ddom, dtext, dimages; if (div_chapter_author_say) { let { dom, text, images } = lib_1.cleanDOM(div_chapter_author_say, "TM"); [ddom, dtext, dimages] = [dom, text, images]; } const img = document.createElement("img"); img.src = vipCHapterName; img.alt = vipCHapterImageUrl; const contentHTML = document.createElement("div"); contentHTML.appendChild(img); if (ddom) { contentHTML.appendChild(ddom); } let contentText = `VIP章节,请打开HTML文件查看。\n![${vipCHapterImageUrl}](${vipCHapterName})`; if (dtext) { contentText = contentText + "\n\n" + dtext; } return { chapterName: chapterName, contentRaw: contentHTML, contentText: contentText, contentHTML: contentHTML, contentImages: contentImages, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } if (isVIP) { return vipChapter(); } else { return publicChapter(); } } } exports.ciweimao = ciweimao; /***/ }), /***/ 161: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.hetushu = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class hetushu { constructor() { this.imageMode = "TM"; } async bookParse(chapterParse) { var _a; const bookUrl = document.location.href; const bookname = (document.querySelector(".book_info > h2")).innerText.trim(); const author = (document.querySelector(".book_info > div:nth-child(3) > a:nth-child(1)")).innerText.trim(); let introduction; const introDom = document.querySelector(".intro"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = (document.querySelector(".book_info > img")).src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const chapterList = ((_a = document.querySelector("#dir")) === null || _a === void 0 ? void 0 : _a.childNodes); if (chapterList && chapterList.length !== 0) { let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (let i = 0; i < chapterList.length; i++) { const node = chapterList[i]; if (node.nodeName === "DT") { sectionNumber++; sectionChapterNumber = 0; sectionName = node.innerText.trim(); } else if (node.nodeName === "DD") { chapterNumber++; sectionChapterNumber++; const a = node.firstElementChild; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); chapters.push(chapter); } } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = (dom.querySelector("#content .h2")).innerText.trim(); const content = dom.querySelector("#content"); if (content) { lib_1.rm("h2", true, content); lib_1.rm("tt", true, content); let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.hetushu = hetushu; /***/ }), /***/ 217: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.jjwxc = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); const rules_1 = __webpack_require__(489); class jjwxc { constructor() { this.imageMode = "TM"; this.concurrencyLimit = 5; this.charset = "GB18030"; } async bookParse(chapterParse) { var _a; const bookUrl = document.location.href; const bookname = (document.querySelector('h1[itemprop="name"] > span')).innerText.trim(); let introduction; const author = (document.querySelector("td.sptd h2 a span")).innerText .replace(/作\s+者:/, "") .trim(); const introDom = document.querySelector("#novelintro"); if (introDom === null) { introduction = null; } else { lib_1.rm("img", true, introDom); let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; let coverUrl = (document.querySelector(".noveldefaultimage")).src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const cos = []; const trList = document.querySelectorAll("#oneboolt > tbody > tr"); let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (let i = 0; i < trList.length; i++) { const tr = trList[i]; if (tr.getAttribute("bgcolor")) { sectionNumber++; sectionChapterNumber = 0; sectionName = (_a = (tr.querySelector("b.volumnfont"))) === null || _a === void 0 ? void 0 : _a.innerText.trim(); } else if (tr.getAttribute("itemprop")) { chapterNumber++; sectionChapterNumber++; const td = tr.querySelector("td:nth-child(2)"); const a = td === null || td === void 0 ? void 0 : td.querySelector("a:nth-child(1)"); const isLocked = () => { var _a; if (((_a = td) === null || _a === void 0 ? void 0 : _a.innerText.trim()) === "[锁]") { return true; } else { return false; } }; const isVIP = () => { if (a === null || a === void 0 ? void 0 : a.getAttribute("onclick")) { return true; } else { return false; } }; if (!isLocked()) { if (isVIP()) { const chapterName = a.innerText.trim(); const chapterUrl = a.getAttribute("rel"); if (chapterUrl) { const co = { bookUrl: bookUrl, bookname: bookname, chapterUrl: chapterUrl, chapterName: chapterName, isVIP: isVIP(), isPaid: null, sectionName: sectionName, sectionNumber: sectionNumber, sectionChapterNumber: sectionChapterNumber, }; cos.push(co); } } else { const chapterName = a.innerText.trim(); const chapterUrl = a.href; const co = { bookUrl: bookUrl, bookname: bookname, chapterUrl: chapterUrl, chapterName: chapterName, isVIP: isVIP(), isPaid: null, sectionName: sectionName, sectionNumber: sectionNumber, sectionChapterNumber: sectionChapterNumber, }; cos.push(co); } } } } cos.sort(lib_1.cosCompare); for (let i = 0; i < cos.length; i++) { const chapterNumber = i + 1; let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i]; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GB18030"); const isLogin = () => { if (document.getElementById("jj_login")) { return false; } else { return true; } }; if (isVIP && !isLogin()) { chapter.status = main_1.Status.aborted; } chapters.push(chapter); } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { async function publicChapter() { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); const chapterName = (dom.querySelector("div.noveltext h2")).innerText.trim(); const content = dom.querySelector("div.noveltext"); if (content) { lib_1.rm("div", true, content); content.innerHTML = content.innerHTML.replace("@无限好文,尽在晋江文学城", ""); let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } async function vipChapter() { async function getFont() { function getFontInfo() { var _a; const s = dom.querySelectorAll("body > style")[1]; let fontName, fontUrl; if (s.sheet) { const f = s.sheet.cssRules[s.sheet.cssRules.length - 2]; const m1 = f.cssText.match(/jjwxcfont_[\d\w]+/); const m2 = f.cssText.match(/{(.*)}/); if (m1 && m2) { fontName = m1[0]; const ft = m2[1]; for (const k of ft.split(",")) { if (k.includes('format("woff2")')) { const m3 = k.match(/url\("(.*)"\)\s/); if (m3) { fontUrl = document.location.protocol + m3[1]; return [fontName, fontUrl]; } } } } } const _fontName = (_a = document.querySelector("div.noveltext")) === null || _a === void 0 ? void 0 : _a.classList[1]; if (_fontName) { fontName = _fontName; fontUrl = document.location.protocol + `//static.jjwxc.net/tmp/fonts/${fontName}.woff2?h=my.jjwxc.net`; return [fontName, fontUrl]; } return [null, null]; } let retryTime = 0; function fetchFont(fontUrl) { console.debug(`[Chapter]请求 ${fontUrl} Referer ${chapterUrl} 重试次数 ${retryTime}`); return lib_1.gfetch(fontUrl, { headers: { accept: "*/*", Referer: chapterUrl, }, responseType: "blob", }).then((response) => { if (response.status >= 200 && response.status <= 299) { return response.response; } else { console.error(`[Chapter]请求 ${fontUrl} 失败 Referer ${chapterUrl}`); if (retryTime < rules_1.retryLimit) { retryTime++; return fetchFont(fontUrl); } else { return null; } } }); } const [fontName, fontUrl] = getFontInfo(); if (fontName && fontUrl) { const fontBlob = await fetchFont(fontUrl); const fontFileName = `${fontName}.woff2`; if (fontBlob) { const fontClassObj = new main_1.attachmentClass(fontUrl, fontFileName, "TM"); fontClassObj.imageBlob = fontBlob; fontClassObj.status = main_1.Status.finished; const fontStyleDom = document.createElement("style"); fontStyleDom.innerHTML = `.${fontName} { font-family: ${fontName}, 'Microsoft YaHei', PingFangSC-Regular, HelveticaNeue-Light, 'Helvetica Neue Light', sans-serif !important; } @font-face { font-family: ${fontName}; src: url('${fontFileName}') format('woff2'); }`; return [fontName, fontClassObj, fontStyleDom]; } } return [null, null, null]; } const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset); const isPaid = () => { if (!dom.querySelector("#buy_content") && dom.querySelector("div.noveltext")) { return true; } else { return false; } }; if (isPaid()) { const chapterName = (dom.querySelector("div.noveltext h2")).innerText.trim(); const content = dom.querySelector("div.noveltext"); if (content) { lib_1.rm("div", true, content); content.innerHTML = content.innerHTML.replace("@无限好文,尽在晋江文学城", ""); let { dom: cdom, text, images } = lib_1.cleanDOM(content, "TM"); let [fontName, fontClassObj, fontStyleDom] = await getFont(); if (fontName && fontClassObj && fontStyleDom) { images.push(fontClassObj); cdom.appendChild(fontStyleDom); cdom.className = fontName; } return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: cdom, contentImages: images, }; } } return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } if (isVIP) { return vipChapter(); } else { return publicChapter(); } } } exports.jjwxc = jjwxc; /***/ }), /***/ 158: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.meegoq = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class meegoq { constructor() { this.imageMode = "TM"; this.concurrencyLimit = 3; } async bookParse(chapterParse) { const bookUrl = document.location.href.replace("/book", "/info"); const bookname = (document.querySelector("article.info > header > h1")).innerText.trim(); const dom = await lib_1.getHtmlDOM(bookUrl, "GBK"); const author = (dom.querySelector("article.info > p.detail.pt20 > i:nth-child(1) > a")).innerText.trim(); let introduction; const introDom = dom.querySelector("article.info > p.desc"); if (introDom === null) { introduction = null; } else { lib_1.rm("b", false, introDom); let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = (dom.querySelector("article.info > div.cover > img")).src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const ul = document.querySelector("ul.mulu"); if (ul === null || ul === void 0 ? void 0 : ul.childElementCount) { const ulc = Array.from(ul.children); if (Array.from(ulc[0].classList).includes("volumn") && ulc[0].innerText.match(/最新.章/)) { for (let i = 0; i < (ul === null || ul === void 0 ? void 0 : ul.childElementCount); i++) { if (i !== 0 && Array.from(ulc[i].classList).includes("volumn") && ulc[i].innerText.trim() !== "全部章节") { delete ulc[0]; break; } delete ulc[i]; } } const chapterList = ulc.filter((obj) => obj !== undefined); let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (let i = 0; i < chapterList.length; i++) { const li = chapterList[i]; if (Array.from(li.classList).includes("volumn")) { sectionNumber++; sectionChapterNumber = 0; sectionName = li.innerText.trim(); } else { chapterNumber++; sectionChapterNumber++; const a = li.firstElementChild; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK"); chapters.push(chapter); } } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = (dom.querySelector("article > header > h1")).innerText.trim(); const content = dom.querySelector("#content"); if (content) { let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.meegoq = meegoq; /***/ }), /***/ 839: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.qidian = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class qidian { constructor() { this.imageMode = "TM"; this.concurrencyLimit = 5; } async bookParse(chapterParse) { const bookUrl = document.location.href; const bookname = (document.querySelector(".book-info > h1 > em")).innerText.trim(); let introduction; const author = (document.querySelector(".book-info .writer")).innerText .replace(/作\s+者:/, "") .trim(); const introDom = document.querySelector(".book-info-detail .book-intro"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; let coverUrl = document.querySelector("#bookImg > img") .src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); additionalMetadate.tags = Array.from(document.querySelectorAll(".tag-wrap>.tags")).map((a) => a.innerText.trim()); const chapters = []; const liLength = document.querySelectorAll("#j-catalogWrap li").length; const getChapterTotalNumber = () => { const span = (document.querySelector("#J-catalogCount")).innerText.match(/\d+/); if (span) { return Number(span[0]); } }; if (!(liLength && getChapterTotalNumber() === liLength)) { await lib_1.sleep(3000); } const sections = document.querySelectorAll("#j-catalogWrap > .volume-wrap > .volume"); const cos = []; for (let i = 0; i < sections.length; i++) { const s = sections[i]; const sectionNumber = i + 1; const sectionName = s.querySelector("h3").innerText .trim() .split("·")[0]; const cs = s.querySelectorAll("ul.cf > li"); for (let j = 0; j < cs.length; j++) { const c = cs[j]; const a = c.firstElementChild; const chapterName = a.innerText.trim(); const chapterUrl = a.href; const isVIP = () => { const host = new URL(chapterUrl).host; if (host === "vipreader.qidian.com") { return true; } return false; }; const isPaid = () => { if (isVIP()) { if (c.childElementCount === 2) { return false; } else { return true; } } return false; }; const co = { bookUrl: bookUrl, bookname: bookname, chapterUrl: chapterUrl, chapterName: chapterName, isVIP: isVIP(), isPaid: isPaid(), sectionName: sectionName, sectionNumber: sectionNumber, sectionChapterNumber: j, }; cos.push(co); } } cos.sort(lib_1.cosCompare); for (let i = 0; i < cos.length; i++) { const chapterNumber = i + 1; let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i]; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); const isLogin = () => { const sign_in_dom = document.querySelector(".sign-in"); const sign_out_dom = document.querySelector(".sign-out"); if (sign_in_dom && sign_out_dom) { if (Array.from(sign_out_dom.classList).includes("hidden")) { return true; } } return false; }; if (isVIP && !(isLogin() && chapter.isPaid)) { chapter.status = main_1.Status.aborted; } chapters.push(chapter); } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { async function publicChapter() { const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset); const chapterName = (dom.querySelector(".j_chapterName > .content-wrap")).innerText.trim(); const content = dom.querySelector(".read-content"); const author_say_wrap = (dom.querySelector(".author-say-wrap")); if (content) { if (author_say_wrap) { const author_say = author_say_wrap.querySelector("div.author-say > p:nth-child(3)"); const hr = document.createElement("hr"); content.appendChild(hr); content.appendChild(author_say); } let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } async function vipChapter() { var _a; const _csrfToken = unsafeWindow.jQuery.ajaxSettings.data ._csrfToken; const bookId = document.location.pathname.split("/").slice(-1)[0]; const authorId = (_a = document .querySelector("#authorId")) === null || _a === void 0 ? void 0 : _a.getAttribute("data-authorid"); const chapterId = chapterUrl.split("/").slice(-1)[0]; async function getChapterInfo() { const baseUrl = "https://vipreader.qidian.com/ajax/chapter/chapterInfo"; const search = new URLSearchParams({ _csrfToken: _csrfToken, bookId: bookId, chapterId: chapterId, authorId: authorId, }); const url = baseUrl + "?" + search.toString(); console.debug(`[Chapter]请求 ${url} Referer ${chapterUrl}`); return lib_1.gfetch(url, { headers: { accept: "application/json, text/javascript, */*; q=0.01", "x-requested-with": "XMLHttpRequest", Referer: chapterUrl, }, responseType: "json", }).then((response) => response.response); } if (isPaid) { const chapterInfo = await getChapterInfo(); if (chapterInfo.code === 0) { const authorSay = chapterInfo.data.chapterInfo.authorSay; const _content = chapterInfo.data.chapterInfo.content; const content = document.createElement("div"); content.innerHTML = _content; if (authorSay) { const hr = document.createElement("hr"); content.appendChild(hr); const authorSayDom = document.createElement("p"); authorSayDom.innerHTML = authorSay; content.appendChild(authorSayDom); } const { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } } return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } if (isVIP) { return vipChapter(); } else { return publicChapter(); } } } exports.qidian = qidian; /***/ }), /***/ 116: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.sfacg = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); const rules_1 = __webpack_require__(489); class sfacg { constructor() { this.imageMode = "TM"; this.concurrencyLimit = 1; } async bookParse(chapterParse) { var _a, _b, _c; const bookUrl = document.location.href.replace("/MainIndex/", ""); const bookname = (document.querySelector("h1.story-title")).innerText.trim(); let introduction; const dom = await lib_1.getHtmlDOM(bookUrl, undefined); const author = (dom.querySelector(".author-name")).innerText.trim(); const introDom = dom.querySelector(".introduce"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; let coverUrl = (dom.querySelector("#hasTicket div.pic img")).src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); additionalMetadate.tags = Array.from(dom.querySelectorAll("ul.tag-list > li.tag > a")).map((a) => a.innerText.trim()); const chapters = []; const sections = document.querySelectorAll(".story-catalog"); const cos = []; for (let i = 0; i < sections.length; i++) { const s = sections[i]; const sectionNumber = i + 1; const sectionName = (s.querySelector(".catalog-title")).innerText .replace(`【${bookname}】`, "") .trim(); const cs = s.querySelectorAll(".catalog-list > ul > li > a"); for (let j = 0; j < cs.length; j++) { const c = cs[j]; const _chapterName = (_a = c.getAttribute("title")) === null || _a === void 0 ? void 0 : _a.trim(); const chapterName = _chapterName ? _chapterName : ""; const chapterUrl = c.href; let isVIP = false; let isPaid = null; if (c.childElementCount && ((_b = c.firstElementChild) === null || _b === void 0 ? void 0 : _b.getAttribute("class")) === "icn_vip") { isVIP = true; } const co = { bookUrl: bookUrl, bookname: bookname, chapterUrl: chapterUrl, chapterName: chapterName, isVIP: isVIP, isPaid: isPaid, sectionName: sectionName, sectionNumber: sectionNumber, sectionChapterNumber: j, }; cos.push(co); } } let chapterNumber = 0; cos.sort(lib_1.cosCompare); for (let i = 0; i < cos.length; i++) { chapterNumber++; let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i]; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); const isLogin = ((_c = document.querySelector(".user-bar > .top-link > .normal-link")) === null || _c === void 0 ? void 0 : _c.childElementCount) === 3 ? true : false; if (isVIP && !isLogin) { chapter.status = main_1.Status.aborted; } chapters.push(chapter); } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const chapter_id = chapterUrl.split("/").slice(-2, -1)[0]; async function publicChapter() { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); const chapterName = (dom.querySelector("h1.article-title")).innerText.trim(); const content = dom.querySelector(".article-content"); if (content) { let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } async function vipChapter() { var _a; async function getvipChapterImage(vipChapterImageUrl, vipChapterName) { let retryTime = 0; function fetchVipChapterImage(vipChapterImageUrl) { console.debug(`[Chapter]请求 ${vipChapterImageUrl} Referer ${chapterUrl} 重试次数 ${retryTime}`); return fetch(vipChapterImageUrl, { headers: { accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", }, referrer: chapterUrl, body: null, method: "GET", mode: "cors", credentials: "include", }) .then((response) => response.blob()) .then((blob) => { if (blob.size === 53658 || blob.size === 42356) { console.error(`[Chapter]请求 ${vipChapterImageUrl} 失败 Referer ${chapterUrl}`); if (retryTime < rules_1.retryLimit) { retryTime++; return fetchVipChapterImage(vipChapterImageUrl); } else { return null; } } else { return blob; } }); } const vipChapterImageBlob = await fetchVipChapterImage(vipChapterImageUrl); const vipChapterImage = new main_1.attachmentClass(vipChapterImageUrl, vipChapterName, "naive"); if (vipChapterImageBlob) { vipChapterImage.imageBlob = vipChapterImageBlob; vipChapterImage.status = main_1.Status.finished; } else { vipChapterImage.status = main_1.Status.failed; } return vipChapterImage; } const isLogin = ((_a = document.querySelector(".user-bar > .top-link > .normal-link")) === null || _a === void 0 ? void 0 : _a.childElementCount) === 3 ? true : false; if (isLogin) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); const chapterName = (dom.querySelector("h1.article-title")).innerText.trim(); const isPaid = dom.querySelector(".pay-section") === null; if (isPaid) { const vipChapterDom = (dom.querySelector(".article-content > #vipImage")); if (vipChapterDom) { const vipChapterImageUrl = vipChapterDom.src; const vipChapterName = `vipCHapter${chapter_id}.gif`; const vipChapterImage = await getvipChapterImage(vipChapterImageUrl, vipChapterName); const contentImages = [vipChapterImage]; const img = document.createElement("img"); img.src = vipChapterName; img.alt = vipChapterImageUrl; const contentHTML = document.createElement("div"); contentHTML.appendChild(img); const contentText = `VIP章节,请打开HTML文件查看。\n![${vipChapterImageUrl}](${vipChapterName})`; return { chapterName: chapterName, contentRaw: contentHTML, contentText: contentText, contentHTML: contentHTML, contentImages: contentImages, }; } else { return publicChapter(); } } } return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } if (isVIP) { return vipChapter(); } else { return publicChapter(); } } } exports.sfacg = sfacg; /***/ }), /***/ 382: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.shouda8 = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class shouda8 { constructor() { this.imageMode = "TM"; } async bookParse(chapterParse) { const bookUrl = document.location.href; const bookname = (document.querySelector(".bread-crumbs > li:nth-child(4)")).innerText.trim(); const author = (document.querySelector("div.bookname > h1 > em")).innerText .replace("作者:", "") .trim(); let introduction; const introDom = document.querySelector(".intro"); if (introDom === null) { introduction = null; } else { lib_1.rm(".book_keywords", false, introDom); lib_1.rm("script", true, introDom); lib_1.rm("#cambrian0", false, introDom); let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = (document.querySelector(".pic > img:nth-child(1)")).src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const chapterList = document.querySelectorAll(".link_14 > dl dd a"); for (let i = 0; i < chapterList.length; i++) { const a = chapterList[i]; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, i + 1, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8"); chapters.push(chapter); } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = (dom.querySelector(".kfyd > h2:nth-child(1)")).innerText.trim(); const content = dom.querySelector("#content"); if (content) { lib_1.rm("p:last-child", false, content); let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.shouda8 = shouda8; /***/ }), /***/ 113: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.shuhai = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class shuhai { constructor() { this.imageMode = "TM"; this.concurrencyLimit = 5; this.charset = "GBK"; } async bookParse(chapterParse) { var _a; const bookUrl = document.location.href; const bookname = (document.querySelector("div.book-info-bookname > span:nth-child(1)")).innerText.trim(); let introduction; const author = (document.querySelector("div.book-info-bookname > span:nth-child(2)")).innerText .replace("作者: ", "") .trim(); const introDom = document.querySelector("div.book-info-bookintro") || document.querySelector("div.book-info-bookintro-all"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; let coverUrl = (document.querySelector(".book-cover-wrapper > img")).getAttribute("data-original"); if (coverUrl) { additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); } additionalMetadate.tags = Array.from(document.querySelectorAll(".book-info-bookstate > .tag")).map((span) => span.innerText.trim()); const chapters = []; if (document.querySelectorAll("#catalog > .chapter-item").length === 0) { await lib_1.sleep(3000); } const cos = []; const dsList = document.querySelectorAll("#catalog > .chapter-item"); let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (let i = 0; i < dsList.length; i++) { const node = dsList[i]; if (node.nodeName === "SPAN") { sectionNumber++; sectionChapterNumber = 0; sectionName = (_a = node) === null || _a === void 0 ? void 0 : _a.innerText.trim(); } else if (node.nodeName === "DIV") { chapterNumber++; sectionChapterNumber++; const a = node.querySelector("a"); const isVIP = () => { if (node.childElementCount === 2) { return true; } else { return false; } }; const isPaid = () => { return false; }; const chapterName = a.innerText.trim(); const chapterUrl = a.href; const co = { bookUrl: bookUrl, bookname: bookname, chapterUrl: chapterUrl, chapterName: chapterName, isVIP: isVIP(), isPaid: isPaid(), sectionName: sectionName, sectionNumber: sectionNumber, sectionChapterNumber: sectionChapterNumber, }; cos.push(co); } } cos.sort(lib_1.cosCompare); for (let i = 0; i < cos.length; i++) { const chapterNumber = i + 1; let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i]; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK"); const isLogin = () => { return false; }; if (isVIP && !(isLogin() && chapter.isPaid)) { chapter.status = main_1.Status.aborted; } chapters.push(chapter); } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { async function publicChapter() { const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset); const chapterName = (dom.querySelector("div.chapter-name")).innerText .replace("正文 ", "") .trim(); const content = (dom.querySelector("#reader-content > div:nth-child(1)")); if (content) { lib_1.rm("div.chaper-info", false, content); let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } async function vipChapter() { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } if (isVIP) { return vipChapter(); } else { return publicChapter(); } } } exports.shuhai = shuhai; /***/ }), /***/ 623: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.uukanshu = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class uukanshu { constructor() { this.imageMode = "TM"; this.charset = "GBK"; } async bookParse(chapterParse) { var _a; const bookUrl = document.location.href; const bookname = (document.querySelector("dd.jieshao_content > h1 > a")).innerText .replace("最新章节", "") .trim(); const author = (document.querySelector("dd.jieshao_content > h2 > a")).innerText.trim(); let introduction; const introDom = (document.querySelector("dd.jieshao_content > h3")); if (introDom === null) { introduction = null; } else { introDom.innerHTML = introDom.innerHTML .replace(/^.+简介:\s+www.uukanshu.com\s+/, "") .replace(/\s+https:\/\/www.uukanshu.com/, "") .replace(/-+/, ""); let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = (document.querySelector("a.bookImg > img")).src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const button = (document.querySelector('span[onclick="javascript:reverse(this);"]')); const reverse = unsafeWindow.reverse; if (button.innerText === "顺序排列") { reverse(button); } const chapterList = ((_a = document.getElementById("chapterList")) === null || _a === void 0 ? void 0 : _a.childNodes); if (chapterList && chapterList.length !== 0) { let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (let i = 0; i < chapterList.length; i++) { const li = chapterList[i]; if (li.className === "volume") { sectionNumber++; sectionChapterNumber = 0; sectionName = li.innerText; } else { chapterNumber++; sectionChapterNumber++; const a = li.firstElementChild; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK"); chapters.push(chapter); } } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = dom.querySelector("#timu").innerText.trim(); const content = dom.querySelector("#contentbox"); if (content) { lib_1.rm(".ad_content", true, content); const contentReplace = [ /[UuUu]+看书\s*[ww]+.[UuUu]+[kk][aa][nn][ss][hh][UuUu].[nn][ee][tt]/g, /[UuUu]+看书\s*[ww]+.[UuUu]+[kk][aa][nn][ss][hh][UuUu].[cCc][oOo][mMm]/g, /[UU]*看书[(\\(].*?[)\\)]文字首发。/, "请记住本书首发域名:。", "笔趣阁手机版阅读网址:", "小说网手机版阅读网址:", "https://", "http://", ]; for (let r of contentReplace) { content.innerHTML = content.innerHTML.replace(r, ""); } let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.uukanshu = uukanshu; /***/ }), /***/ 678: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.xiaoshuodaquan = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class xiaoshuodaquan { constructor() { this.imageMode = "TM"; this.charset = "GBK"; this.concurrencyLimit = 5; } async bookParse(chapterParse) { var _a, _b; const ccount = (_a = document.querySelector(".crumbswrap")) === null || _a === void 0 ? void 0 : _a.childElementCount; let bookUrl = document.location.href; if (ccount) { bookUrl = (document.querySelector(`.crumbswrap > a:nth-child(${ccount - 2})`)).href; } const bookname = (document.querySelector("div.dirwraps > h1")).innerText .replace("《", "") .replace("》", "") .trim(); const author = (document.querySelector(".smallcons > span:nth-child(1) > a:nth-child(1)")).innerText.trim(); let introduction; const introDom = document.querySelector(".bookintro"); if (introDom === null) { introduction = null; } else { introDom.innerHTML = introDom.innerHTML.replace("内容简介:", ""); let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; let coverUrl; if (ccount) { const dom = await lib_1.getHtmlDOM(bookUrl, "GBK"); coverUrl = dom.querySelector(".con_limg > img").src; } if (coverUrl) { additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); } const chapters = []; const sectionNames = document.querySelectorAll(".dirwraps > div.dirtitone"); const sections = document.querySelectorAll(".dirwraps > div.clearfix.dirconone"); let chapterNumber = 0; for (let i = 0; i < sections.length; i++) { const sectionNameObj = sectionNames[i]; const sectionObj = sections[i]; const sectionNumber = i + 1; const sectionName = (_b = (sectionNameObj.firstElementChild)) === null || _b === void 0 ? void 0 : _b.innerText.replace(bookname, "").trim(); let sectionChapterNumber = 0; const cos = sectionObj.querySelectorAll("ul>li>a"); for (let j = 0; j < cos.length; j++) { chapterNumber++; sectionChapterNumber++; const a = cos[j]; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK"); chapters.push(chapter); } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = (dom.querySelector(".page-body > h1:nth-child(4)")).innerText.trim(); const _content = dom.querySelector("#content"); if (_content) { lib_1.rm("div", true, _content); lib_1.rm("script", true, _content); const content = document.createElement("div"); content.innerHTML = _content.innerHTML.replace(/\n/g, "
"); let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.xiaoshuodaquan = xiaoshuodaquan; /***/ }), /***/ 441: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.xkzw = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class xkzw { constructor() { this.imageMode = "TM"; } async bookParse(chapterParse) { const bookUrl = document.location.href; const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim(); const author = (document.querySelector("#info > p:nth-child(2)")).innerText .replace(/作(\s+)?者[::]/, "") .trim(); let introduction; const introDom = document.querySelector("#intro"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = document.querySelector("#fmimg > img") .src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); const chapters = []; const bookid = unsafeWindow.bookId; const siteChapterList = await fetch("http://www.xkzw.org/action.php", { headers: { accept: "application/json, text/javascript, */*", "content-type": "application/x-www-form-urlencoded", "x-requested-with": "XMLHttpRequest", }, body: `action=clist&bookid=${bookid}`, method: "POST", mode: "cors", credentials: "include", }).then((response) => response.json()); const dl = document.querySelector("#wrapper > div.box_con:nth-child(7) > div:nth-child(1) > dl:nth-child(1)"); let tmpColumnName = ""; let tmpColumnList = []; let tmpChapterList = []; if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) { const dlc = Array.from(dl.children); for (let i = 0; i < dl.childElementCount; i++) { const node = dlc[i]; if (i !== 0) { if (node.nodeName === "DD") { const a = node.firstElementChild; const chapterName = a.innerText; const chapterUrl = a.href; const chapterid = chapterUrl .split("/") .slice(-1)[0] .replace(".html", ""); tmpChapterList.push({ chapterid: Number(chapterid) - bookid * 11, chaptername: chapterName, isempty: 0, originalurl: "", currenturl: "", }); } else if (node.nodeName === "DT") { const tmpColumnObj = { columnname: tmpColumnName, columnid: 0, chapterlist: tmpChapterList, }; tmpColumnList.push(tmpColumnObj); tmpColumnName = node.innerText .replace(`《${bookname}》`, "") .trim(); tmpChapterList = []; } } else { tmpColumnName = node.innerText .replace(`《${bookname}》`, "") .trim(); } } } const tcl = tmpChapterList.length; for (let i = 0; i < tcl; i++) { const tmpChapterObject = tmpChapterList.pop(); if (tmpChapterObject) { siteChapterList.columnlist[0].chapterlist.unshift(tmpChapterObject); } } if (tmpColumnList.length !== 0) { const tmpColumnListLenght = tmpColumnList.length; for (let i = 0; i < tmpColumnListLenght; i++) { const tmpColumnObject = tmpColumnList.pop(); if (tmpColumnObject) { siteChapterList.columnlist.unshift(tmpColumnObject); } } } let chapterNumber = 0; let sectionNumber = 0; let sectionName = null; let sectionChapterNumber = 0; for (const column of siteChapterList.columnlist) { sectionNumber++; sectionName = column.columnname; for (const sitechapter of column.chapterlist) { chapterNumber++; sectionChapterNumber++; const chapterName = sitechapter.chaptername; const chapterUrl = bookUrl + (sitechapter.chapterid + bookid * 11) + ".html"; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); chapters.push(chapter); } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { function runEval(CryptoJS) { function gettt1(str, keyStr, ivStr) { let key = CryptoJS.enc.Utf8.parse(keyStr); let iv = CryptoJS.enc.Utf8.parse(ivStr); let encryptedHexStr = CryptoJS.enc.Hex.parse(str); let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr); let decrypt = CryptoJS.DES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); return decryptedStr.toString(); } function gettt2(str, keyStr, ivStr) { let key = CryptoJS.enc.Utf8.parse(keyStr); let iv = CryptoJS.enc.Utf8.parse(ivStr); let encryptedHexStr = CryptoJS.enc.Hex.parse(str); let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr); let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); return decryptedStr.toString(); } function gettt3(str, keyStr, ivStr) { let key = CryptoJS.enc.Utf8.parse(keyStr); let iv = CryptoJS.enc.Utf8.parse(ivStr); let encryptedHexStr = CryptoJS.enc.Hex.parse(str); let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr); let decrypt = CryptoJS.RC4.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); return decryptedStr.toString(); } function getttn(str, keyStr, ivStr) { let key = CryptoJS.enc.Utf8.parse(keyStr); let iv = CryptoJS.enc.Utf8.parse(ivStr); let encryptedHexStr = CryptoJS.enc.Hex.parse(str); let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr); let decrypt = CryptoJS.TripleDES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); return decryptedStr.toString(); } function showttt1(dom) { let obj = dom.getElementById("other"); let objTips = dom.getElementById("contenttips"); if (obj) { let content = obj.innerHTML.trim(); let type = parseInt(content.substring(0, 1)); let key; let iv; if (type === 1) { key = content.substring(1, 9); iv = content.substring(9, 17); content = content.substring(17); obj.innerHTML = gettt1(content, key, iv); obj.style.display = "block"; if (objTips) { objTips.remove(); } } else if (type === 2) { key = content.substring(1, 33); iv = content.substring(33, 49); content = content.substring(49); obj.innerHTML = gettt2(content, key, iv); obj.style.display = "block"; if (objTips) { objTips.remove(); } } else if (type === 3) { key = content.substring(1, 9); iv = content.substring(9, 17); content = content.substring(17); obj.innerHTML = gettt3(content, key, iv); obj.style.display = "block"; if (objTips) { objTips.remove(); } } else { key = content.substring(1, 25); iv = content.substring(25, 33); content = content.substring(33); obj.innerHTML = getttn(content, key, iv); obj.style.display = "block"; if (objTips) { objTips.remove(); } } } } showttt1(dom); } const dom = await lib_1.getHtmlDOM(chapterUrl, charset); runEval(CryptoJS); chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim(); const content = dom.querySelector("#content"); if (content) { let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.xkzw = xkzw; /***/ }), /***/ 514: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.yrun = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class yrun { constructor() { this.imageMode = "naive"; } async bookParse(chapterParse) { const bookUrl = document.location.href; const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim(); const author = (document.querySelector("#info > p:nth-child(2)")).innerText .replace(/作(\s+)?者[::]/, "") .trim(); let introduction; const introDom = document.querySelector("#intro > p"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "naive"); introduction = introCleantext; } const additionalMetadate = {}; const coverUrl = document.querySelector("#fmimg > img") .src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "naive"); additionalMetadate.cover.init(); const chapters = []; const chapterList = document.querySelectorAll("#list>dl>dd>a"); if (chapterList && chapterList.length !== 0) { for (let i = 0; i < chapterList.length; i++) { const a = chapterList[i]; const chapterName = a.innerText; const chapterUrl = a.href; const isVIP = false; const isPaid = false; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, i, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8"); chapters.push(chapter); } } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { const dom = await lib_1.getHtmlDOM(chapterUrl, charset); chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim(); const content = dom.querySelector("#content"); if (content) { let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } } exports.yrun = yrun; /***/ }), /***/ 862: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.zongheng = void 0; const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); class zongheng { constructor() { this.imageMode = "TM"; this.concurrencyLimit = 5; } async bookParse(chapterParse) { const bookUrl = document.location.href.replace("/showchapter/", "/book/"); const bookname = (document.querySelector("div.book-meta > h1")).innerText.trim(); const author = (document.querySelector("div.book-meta > p > span:nth-child(1) > a")).innerText.trim(); const doc = await lib_1.getHtmlDOM(bookUrl, undefined); let introduction; const introDom = doc.querySelector("div.book-info > div.book-dec"); if (introDom === null) { introduction = null; } else { let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM"); introduction = introCleantext; } const additionalMetadate = {}; let coverUrl = doc.querySelector("div.book-img > img") .src; additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM"); additionalMetadate.cover.init(); additionalMetadate.tags = Array.from(doc.querySelectorAll(".book-info>.book-label a")).map((a) => a.innerText.trim()); const chapters = []; const sections = document.querySelectorAll(".volume-list"); const cos = []; for (let i = 0; i < sections.length; i++) { const s = sections[i]; const sectionNumber = i + 1; const sectionLabel = s.querySelector("div.volume"); Array.from(sectionLabel.children).forEach((ele) => ele.remove()); const sectionName = sectionLabel.innerText.trim(); const cs = s.querySelectorAll("ul.chapter-list > li"); for (let j = 0; j < cs.length; j++) { const c = cs[j]; const a = c.querySelector("a"); const chapterName = a.innerText.trim(); const chapterUrl = a.href; const isVIP = () => { if (c.className.includes("vip")) { return true; } else { return false; } }; const isPaid = () => { return false; }; const co = { bookUrl: bookUrl, bookname: bookname, chapterUrl: chapterUrl, chapterName: chapterName, isVIP: isVIP(), isPaid: isPaid(), sectionName: sectionName, sectionNumber: sectionNumber, sectionChapterNumber: j, }; cos.push(co); } } cos.sort(lib_1.cosCompare); for (let i = 0; i < cos.length; i++) { const chapterNumber = i + 1; let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i]; const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8"); const isLogin = () => { return false; }; if (isVIP && !(isLogin() && chapter.isPaid)) { chapter.status = main_1.Status.aborted; } chapters.push(chapter); } return { bookUrl: bookUrl, bookname: bookname, author: author, introduction: introduction, additionalMetadate: additionalMetadate, chapters: chapters, }; } async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) { async function publicChapter() { const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset); const chapterName = (dom.querySelector("div.title_txtbox")).innerText.trim(); const content = dom.querySelector("div.content"); if (content) { let { dom, text, images } = lib_1.cleanDOM(content, "TM"); return { chapterName: chapterName, contentRaw: content, contentText: text, contentHTML: dom, contentImages: images, }; } else { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } } async function vipChapter() { return { chapterName: chapterName, contentRaw: null, contentText: null, contentHTML: null, contentImages: null, }; } if (isVIP) { return vipChapter(); } else { return publicChapter(); } } } exports.zongheng = zongheng; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. (() => { var exports = __webpack_exports__; var __webpack_unused_export__; __webpack_unused_export__ = ({ value: true }); const rules_1 = __webpack_require__(489); const main_1 = __webpack_require__(519); const lib_1 = __webpack_require__(563); function printEnvironments() { if (lib_1._GM_info) { console.log(`开始载入小说下载器…… 当前浏览器UA:${navigator.userAgent} 当前脚本管理器:${lib_1._GM_info.scriptHandler} 当前脚本管理器版本:${lib_1._GM_info.version} 当前脚本名称:${lib_1._GM_info.script.name} 当前脚本版本:${lib_1._GM_info.script.version} 当前脚本最后更新时间:${lib_1._GM_info.script.lastModified} 是否处于隐私模式:${lib_1._GM_info.isIncognito} 是否启用调试:${enaleDebug}`); } } async function initBook(rule) { console.log(`[initBook]开始初始化图书`); const bookParse = rule.bookParse; const chapterParse = rule.chapterParse; return bookParse(chapterParse).then((obj) => { const { bookUrl, bookname, author, introduction, additionalMetadate, chapters, } = obj; const book = new main_1.Book(bookUrl, bookname, author, introduction, additionalMetadate, chapters); return book; }); } async function initChapters(rule, book) { console.log(`[initChapters]开始初始化章节`); let concurrencyLimit = 10; if (rule.concurrencyLimit !== undefined) { concurrencyLimit = rule.concurrencyLimit; } const chapters = book.chapters.filter((chapter) => chapter.status === main_1.Status.pending); if (chapters.length === 0) { console.error(`[initChapters]初始化章节出错,未找到需初始化章节`); return []; } if (concurrencyLimit === 1) { for (let chapter of chapters) { const obj = await chapter.init(); if (obj.contentHTML !== undefined) { finishedChapterNumber++; updateProgress(finishedChapterNumber, totalChapterNumber, null); } } } else { await lib_1.concurrencyRun(chapters, concurrencyLimit, (curChapter) => { return curChapter.init().then((obj) => { if (obj.contentHTML !== undefined) { finishedChapterNumber++; updateProgress(finishedChapterNumber, totalChapterNumber, null); } return obj; }); }); } console.log(`[initChapters]章节初始化完毕`); return chapters; } function save(book) { function chapterSort(a, b) { if (a.chapterNumber > b.chapterNumber) { return 1; } if (a.chapterNumber === b.chapterNumber) { return 0; } if (a.chapterNumber < b.chapterNumber) { return -1; } return 0; } function addImageToZip(image, zip) { if (image.status === main_1.Status.finished && image.imageBlob) { console.debug(`[save]添加附件,文件名:${image.name},对象`, image.imageBlob); zip.file(image.name, image.imageBlob); } else { console.error("[save]附件下载失败!"); console.error(image); } } function genSectionText(sectionName) { return `${"=".repeat(20)}\n\n\n\n# ${sectionName}\n\n\n\n${"=".repeat(20)}`; } function genChapterText(chapterName, contentText) { return `## ${chapterName}\n\n${contentText}\n\n`; } function genSectionHtmlFile(sectionName) { let htmlFile = new DOMParser().parseFromString(`${sectionName}

${sectionName}

`, "text/html"); return new Blob([htmlFile.documentElement.outerHTML], { type: "text/html; charset=UTF-8", }); } function genHtmlFile(chapterName, DOM, chapterUrl) { var _a; let htmlFile = new DOMParser().parseFromString(`${chapterName}

${chapterName}

`, "text/html"); (_a = htmlFile.querySelector(".main")) === null || _a === void 0 ? void 0 : _a.appendChild(DOM); return new Blob([htmlFile.documentElement.outerHTML], { type: "text/html; charset=UTF-8", }); } console.log("[save]开始保存"); console.debug("book Object:", book); const chapters = book.chapters; chapters.sort(chapterSort); let savedTextArray = []; let savedZip = new JSZip(); let infoText = `题名:${book.bookname}\n作者:${book.author}\n简介:${book.introduction}\n来源:${book.bookUrl}\n下载时间:${new Date().toISOString()}\n本文件由小说下载器生成,软件地址:https://github.com/yingziwu/novel-downloader\n\n`; savedTextArray.push(infoText); if (book.additionalMetadate.cover) { const cover = book.additionalMetadate.cover; if (cover.imageBlob) { console.debug(`[save]添加封面图片,文件名:${`cover.${cover.imageBlob.type.split("/").slice(-1)[0]}`},对象`, cover.imageBlob); savedZip.file(`cover.${cover.imageBlob.type.split("/").slice(-1)[0]}`, cover.imageBlob); } else { console.error("[save]图片下载失败!"); console.error(cover); } } savedZip.file("info.txt", new Blob([infoText], { type: "text/plain;charset=utf-8" })); const styleCSS = `body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div.main { width: 900px; margin: 5em auto; padding: 2em; background-color: #fdfdff; border-radius: 0.5em; box-shadow: 2px 3px 7px 2px rgba(0, 0, 0, 0.02); } @media (max-width: 700px) { div.main { margin: 0 auto; width: auto; } } h1 { line-height: 130%; text-align: center; font-weight: bold; font-size: xxx-large; margin-top: 3.2em; margin-bottom: 3.3em; } h2 { line-height: 130%; text-align: center; font-weight: bold; font-size: x-large; margin-top: 1.2em; margin-bottom: 2.3em; } div { margin: 0px; padding: 0px; text-align: justify; } p { text-indent: 2em; display: block; line-height: 1.3em; margin-top: 0.4em; margin-bottom: 0.4em; }`; savedZip.file("style.css", new Blob([styleCSS], { type: "text/css;charset=utf-8" })); let preSectionName = ""; for (const c of chapters) { if (c.status === main_1.Status.finished) { const sectionName = c.sectionName; const chapterNumber = c.chapterNumber; const chapterUrl = c.chapterUrl; const chapterName = c.chapterName ? c.chapterName : chapterNumber.toString(); const contentText = c.contentText; const contentHTML = c.contentHTML; const contentImages = c.contentImages; const fileNameBase = `${"0".repeat(chapters.length.toString().length - chapterNumber.toString().length)}${chapterNumber.toString()}.html`; if (sectionName && contentText && sectionName !== preSectionName) { savedTextArray.push(genSectionText(sectionName)); const sectionHTMLBlob = genSectionHtmlFile(sectionName); if (sectionHTMLBlob) { console.debug(`[save]添加卷HTML,文件名:${"Section" + fileNameBase},对象`, sectionHTMLBlob); savedZip.file(`Section${fileNameBase}`, sectionHTMLBlob); } } preSectionName = sectionName; if (contentText) { savedTextArray.push(genChapterText(chapterName, contentText)); } if (contentHTML) { const chapterHTMLBlob = genHtmlFile(chapterName, contentHTML, chapterUrl); if (chapterHTMLBlob) { console.debug(`[save]添加章节HTML,文件名:${"Chapter" + fileNameBase},对象`, chapterHTMLBlob); savedZip.file(`Chapter${fileNameBase}`, chapterHTMLBlob); } } if (contentImages !== null) { for (const image of contentImages) { addImageToZip(image, savedZip); } } } } console.log("[save]开始生成下载文件"); const saveFileNameBase = `[${book.author}]${book.bookname}`; console.debug("[save]开始保存TXT文件"); const savedText = savedTextArray.join("\n"); saveAs(new Blob([savedText], { type: "text/plain;charset=utf-8" }), `${saveFileNameBase}.txt`); console.debug("[save]保存TXT文件完毕"); console.debug("[save]开始生成ZIP文件"); savedZip .generateAsync({ type: "blob", compression: "DEFLATE", compressionOptions: { level: 6, }, }, (metadata) => updateProgress(finishedChapterNumber, totalChapterNumber, metadata.percent)) .then((blob) => { console.debug("[save]ZIP文件生成完毕,开始保存ZIP文件"); saveAs(blob, `${saveFileNameBase}.zip`); }) .then(() => { var _a; console.debug("[save]保存ZIP文件完毕"); finishedChapterNumber = 0; (_a = document.querySelector("#nd-progress")) === null || _a === void 0 ? void 0 : _a.remove(); }) .catch((err) => console.error("saveZip: " + err)); } function setTabMark() { return new Promise((resolve, reject) => { GM_getTab((curTabObject) => { curTabObject.novel_downloader = document.location.href; GM_saveTab(curTabObject); resolve(curTabObject); }); }); } function getNowRunNumber() { return new Promise((resolve, reject) => { GM_getTabs((curTabObjects) => { let nowRunNumber = 0; for (let i in curTabObjects) { const novel_downloader_url = curTabObjects[i] .novel_downloader; if (novel_downloader_url !== undefined && new URL(novel_downloader_url).hostname === document.location.hostname) { nowRunNumber++; } } resolve(nowRunNumber); }); }); } function removeTabMark() { return new Promise((resolve, reject) => { GM_getTab((curTabObject) => { if (curTabObject.novel_downloader) { delete curTabObject.novel_downloader; } GM_saveTab(curTabObject); resolve(curTabObject); }); }); } let totalChapterNumber; let finishedChapterNumber = 0; function updateProgress(finishedChapterNumber, totalChapterNumber, zipPercent) { if (!document.querySelector("#nd-progress")) { console.debug("[progress]初始化进度条"); let progress = document.createElement("div"); progress.id = "nd-progress"; progress.innerHTML = `
`; let progressStyle = document.createElement("style"); progressStyle.innerHTML = `#nd-progress { position: fixed; bottom: 8%; right: 3%; z-index: 99; border-style: none; text-align: center; vertical-align: baseline; background-color: rgba(210, 210, 210, 0.2); padding: 6px; border-radius: 12px; } #chapter-progress{ --color:green; --position:0%; width:200px; height:10px; border-radius:30px; background-color:#ccc; background-image:radial-gradient(closest-side circle at var(--position),var(--color),var(--color) 100%,transparent),linear-gradient(var(--color),var(--color)); background-image:-webkit-radial-gradient(var(--position),circle closest-side,var(--color),var(--color) 100%,transparent),-webkit-linear-gradient(var(--color),var(--color)); background-size:100% ,var(--position); background-repeat: no-repeat; } #zip-progress{ --color:yellow; --position:0%; width:200px; height:10px; border-radius:30px; background-color:#ccc; background-image:radial-gradient(closest-side circle at var(--position),var(--color),var(--color) 100%,transparent),linear-gradient(var(--color),var(--color)); background-image:-webkit-radial-gradient(var(--position),circle closest-side,var(--color),var(--color) 100%,transparent),-webkit-linear-gradient(var(--color),var(--color)); background-size:100% ,var(--position); background-repeat: no-repeat; margin-top: 5px; }`; document.head.appendChild(progressStyle); document.body.appendChild(progress); } let pagePercent = `${(finishedChapterNumber / totalChapterNumber) * 100}%`; document.querySelector("#chapter-progress").style.cssText = `--position:${pagePercent};`; if (zipPercent) { document.querySelector("#zip-progress").style.cssText = `--position:${zipPercent}%;`; } else { document.querySelector("#zip-progress").style.cssText = "display:none;"; } } async function run() { console.log(`[run]下载开始`); const rule = rules_1.getRule(); console.log(`[run]获取规则成功`); let maxRunLimit = null; let nowRunNumber; if (lib_1._GM_info.scriptHandler === "Tampermonkey") { console.log(`[run]添加运行标志`); await setTabMark(); nowRunNumber = await getNowRunNumber(); if (rule.maxRunLimit !== undefined && nowRunNumber !== undefined) { maxRunLimit = rule.maxRunLimit; if (nowRunNumber > maxRunLimit) { const alertText = `当前网站目前已有${nowRunNumber - 1}个下载任务正在运行,当前站点最多允许${maxRunLimit}下载任务同时进行。\n请待其它下载任务完成后,再行尝试。`; alert(alertText); console.log(`[run]${alertText}`); return; } } } const book = await initBook(rule); totalChapterNumber = book.chapters.filter((chapter) => chapter.status === main_1.Status.pending).length; await initChapters(rule, book); save(book); if (lib_1._GM_info.scriptHandler === "Tampermonkey") { console.log(`[run]移除运行标志`); await removeTabMark(); } console.log(`[run]下载完毕`); return book; } function catchError(error) { var _a, _b; downloading = false; if (lib_1._GM_info.scriptHandler === "Tampermonkey") { removeTabMark(); } finishedChapterNumber = 0; (_a = document.querySelector("#nd-progress")) === null || _a === void 0 ? void 0 : _a.remove(); (_b = document.getElementById("novel-downloader")) === null || _b === void 0 ? void 0 : _b.remove(); console.error("运行过程出错,请附上相关日志至支持地址进行反馈。\n支持地址:https://github.com/yingziwu/novel-downloader"); console.error(error); } function addButton() { let button = document.createElement("button"); button.id = "novel-downloader"; button.style.cssText = `position: fixed; top: 15%; right: 5%; z-index: 99; border-style: none; text-align:center; vertical-align:baseline; background-color: rgba(128, 128, 128, 0.2); padding: 5px; border-radius: 12px;`; let img = document.createElement("img"); img.src = rules_1.icon0; img.style.cssText = "height: 2em;"; button.onclick = function () { if (downloading) { alert("正在下载中,请耐心等待……"); } else { downloading = true; img.src = rules_1.icon1; try { run() .then((book) => { downloading = false; img.src = rules_1.icon0; }) .catch(catchError); } catch (error) { catchError(error); } } }; button.appendChild(img); document.body.appendChild(button); } async function debug() { const rule = rules_1.getRule(); const book = await initBook(rule); unsafeWindow.rule = rule; unsafeWindow.book = book; unsafeWindow.save = save; unsafeWindow.saveAs = saveAs; return; } let downloading = false; const enaleDebug = false; window.addEventListener("DOMContentLoaded", () => { printEnvironments(); addButton(); if (enaleDebug) { debug(); } }); })(); /******/ })() ;