Greasy Fork

Greasy Fork is available in English.

妖火网增强脚本Plus

让妖火再次变得伟大(手动狗头.jpg)

当前为 2025-01-04 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name            妖火网增强脚本Plus
// @namespace       https://www.yaohuo.me/
// @version         1.5.4
// @description     让妖火再次变得伟大(手动狗头.jpg)
// @author          柠檬没有汁@27894
// @match           *://yaohuo.me/*
// @match           *://*.yaohuo.me/*
// @icon            https://yaohuo.me/css/favicon.ico
// @run-at          document-body
// @license         MIT
// @grant           none
// @noframes
// @homepage        https://www.yaohuo.me/bbs/userinfo.aspx?touserid=27894
// @supportURL      https://www.yaohuo.me/bbs/userinfo.aspx?touserid=27894
// ==/UserScript==

/* ================================================== 变量开始 ================================================== */

// 脚本默认设置
const defaultSetting = {
  version: "1.5.4", // 脚本版本
  checkVersion: true, // 检查更新

  firstLoadScript: true, // 第一次加载脚本
  showSettingIcon: true, // 显示设置 logo
  settingIconSize: 50, // 设置 logo 大小
  showTopAndDownBtn: true, // 显示一键回到顶部/底部
  hideXunzhang: false, // 隐藏勋章

  showBookViewUbb: false, // 发帖 ubb 展开
  showBookViewEmoji: false, // 发帖表情展开
  showHuifuUbb: false, // 回帖 ubb 展开
  showHuifuEmoji: false, // 回帖表情展开

  imgThumbWidth: 200, // 图片缩小后显示宽度
  useRight: false, // 下一页显示在右边
  autoLoadMoreBookList: false, // 帖子列表自动加载更多
  autoLoadMoreHuifuList: false, // 回复列表自动加载更多
  openLayerForBook: false, // pc 端帖子在弹窗中打开

  imgUploadApiUrl: ["https://aapi.helioho.st/upload.php", "https://img.ink/api/upload"],
  imgUploadSelOpt: 0, // 使用图床
  suimoToken: "", // 水墨图床 token

  showMoreSetting: true, // 高级设置
  oneClickCollectMoney: false, // 一键吃肉
  showChuiniuHistory: false, // 显示吹牛发布者历史
  showHuifuCopy: false, // 复读机(回复+1)
  huifuCopyAutoSubmit: false, // 复读机自动提交
};
// 自定义样式
const customCSS = `
  .reset{
    margin:0;
    padding:0;
  }
  /* 设置弹出框 样式 */
  .setting-div ul li{
    display:flex;
    margin:10px auto;
    justify-content: center;
    align-items: center;
  }
  .setting-div ul li + .setting-li-between{
    padding:0 10px;
    justify-content: space-between;
  }
  .setting-div ul li + .setting-li-tips{
    font-size: 12px;
    line-height: 14px;
    display: block;
    padding: 0 10px;
    margin: -10px 0 0;
    color: red;
    text-align: left;
  }
  .setting-li-title hr{
    flex:1;
  }
  .setting-li-title hr:nth-of-type(1){
    margin-right:10px;
  }
  .setting-li-title hr:nth-of-type(2){
    margin-left:10px;
  }
  .setting-cancel-btn {
    background-color: #999;
    color: #fff;
    border-radius:5px;
    padding: 5px 10px;
  }
  .setting-confirm-btn {
    background-color: #1677ff;
    color: #fff;
    border-radius:5px;
    padding: 5px 10px;
    margin-left: 10px;
  }
  .setting-li-input{
    width:50px;
    padding-left:10px;
    height:15px;
  }
  ::-webkit-input-placeholder {
    font-size:12px;
  }
  ::-moz-placeholder {
    font-size:12px;
  }

  /* 开关 样式 */
  .switch {
    position: relative;
    float: left;
    width: 60px;
    margin: 0;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
  }
  .switch-checkbox {display: none;}
  .switch-label {
    display: block;
    overflow: hidden;
    cursor: pointer;
    border: 2px solid #999999;
    border-radius: 20px;
  }
  .switch-inner {
    display: block;
    width: 200%;
    margin-left: -100%;
  }
  .switch-inner::before,
  .switch-inner::after {
    display: block;
    float: right;
    width: 50%;
    height: 20px;
    line-height: 20px;
    padding: 0;
    font-size: 14px;
    color: white;
    font-family: Trebuchet, Arial, sans-serif;
    font-weight: bold;
    box-sizing: border-box;
  }
  .switch-inner::after {
    content: attr(data-on);
    padding-left: 10px;
    background-color: #00e500;
    color: #FFFFFF;
    text-align:left;
  }
  .switch-inner::before {
    content: attr(data-off);
    padding-right: 10px;
    background-color: #EEEEEE;
    color: #999999;
    text-align: right;
  }
  .switch-switch {
    position: absolute;
    top: 0;
    bottom: 0;
    /*right: 72px;*/
    display: block;
    width: 14px;
    height: 14px;
    margin: 3px;
    background: #FFFFFF;
    border: 2px solid #999999;
    border-radius: 50%;
  }
  .switch-checkbox:checked + .switch-label .switch-inner {
    margin-left: 0;
  }
  .switch-checkbox:checked + .switch-label .switch-switch {
    right: 0px;
  }
  /* 复读机按钮 样式 */
  .huifu-copy{
    padding:5px 10px;
    text-align:center;
    color:#fff;
    margin-left:20px;
    background-color: #407088;
    border-radius: 5px;
    white-space:nowrap;
  }

  .custom-toggle-btn{
    background-image: linear-gradient(#f4f4f4,#ececec);
    display: inline-block;
    overflow: visible;
    margin: 0 5px 7px;
    padding: .5em 1em;
    outline: 0;
    border: 1px solid #d4d4d4;
    color: orangered;
    text-decoration: none;
    white-space: nowrap;
    font: 11px/normal sans-serif;
    cursor: pointer;
    border-radius: 5px;
  }
  /* 表情增强 样式 */
  .emojilist-div{
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(50px, 1fr));
    grid-gap: 2px;
    /*display: flex;
    justify-content: space-between;
    flex-wrap: wrap;*/
    padding: 5px;
    margin-bottom:5px;
    font-size: 12px;
    border: 1px solid #eee;
    border-radius: 5px;
  }
  .emojilist-img{
    width:50px;
    height:50px;
  }
  .huifu-emoji{
    margin:0 1% 5px;
    border-color:#d4d4d4;
  }
  /* ubb 增强 样式 */
  .ubblist-div{
    display:flex;
    flex-wrap: wrap;
    gap: 4px 4px;
    justify-content: space-between;
    margin-bottom:5px;
    padding:5px;
    font-size:12px;
    border: 1px solid #eee;
    border-radius: 5px;
  }
  .ubb-item{
    height:25px;
    line-height:25px;
    /*margin:0 5px 5px 0;*/
    padding:0 10px;
    display:inline-block;
    border: 1px solid #1abc9c;
    color: #333;
    text-decoration: none;
    border-radius:30px;
  }
  .huifu-ubb{
    margin:0 1% 5px;
    border-color:#d4d4d4;
  }

  .clear-setting{
    color:#3d68a8;
    margin-left:-4px;
  }

  /* 等待提示框 样式 */
  .wait-box-overlay {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background: rgba(0, 0, 0, 0.6);
      display: flex;
      justify-content: center;
      align-items: center;
      z-index: 1000;
  }
  .wait-box-modal {
    background: white;
    padding: 20px 20px 10px;
    border-radius: 10px;
    text-align: center;
  }
  .wait-box-spinner {
    border: 4px solid rgba(0, 0, 0, 0.1);
    width: 36px;
    height: 36px;
    border-radius: 50%;
    border-left-color: #09f;
    animation: spin 1s linear infinite;
    margin: 0 auto;
  }
  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }

  .huifu-ubb-list-div{
    margin: 0 1%;
    padding:10px;
    font-size:12px;
    border: 1px solid #d4d4d4;
    border-radius: 8px;
  }
  .huifu-ubb-list-title{
    height:14px;
    display:flex;
    justify-content: center;
    align-items: center;
    color:red;
  }
  .huifu-ubb-list-title hr{
    flex:1;
  }
  .huifu-ubb-list-title hr:nth-of-type(1){
    margin-right:10px;
  }
  .huifu-ubb-list-title hr:nth-of-type(2){
    margin-left:10px;
  }
  .huifu-ubb-box{
    display:flex;
    flex-wrap: wrap;
    gap: 4px 4px;
    justify-content: space-between;
    margin:6px 0;
  }

  .input-popup-mask {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 9999;
  }
  .input-popup {
    background-color: white;
    padding: 20px;
    border-radius: 5px;
    width: 600px;
    max-width:80%;
  }
  .input-popup-label {
    display: block;
    font-weight: bold;
  }
  .input-popup-textarea {
    width: 100%;
    min-height: 40px;
    resize: vertical;
  }
  .input-popup-buttons {
    text-align: center;
  }
  .input-popup-submit-btn, .input-popup-cancel-btn {
    margin: 0 10px;
    border:0;
  }
  .input-popup-submit-btn{
    background-color: #1677ff;
    color: #fff;
    border-radius: 5px;
    padding: 5px 10px;
    margin-left: 10px;
  }
  .input-popup-cancel-btn {
    background-color: #999;
    color: #fff;
    border-radius: 5px;
    padding: 5px 10px;
  }
`;
// 表情
const emojiList = [
  // 论坛自带表情
  "face/踩.gif",
  "face/狂踩.gif",
  "face/淡定.gif",
  "face/囧.gif",
  "face/不要.gif",
  "face/重拳出击.gif",
  "face/砳砳.gif",
  "face/滑稽砳砳.gif",
  "face/沙发.gif",
  "face/汗.gif",
  "face/亲亲.gif",
  "face/太开心.gif",
  "face/酷.gif",
  "face/思考.gif",
  "face/发呆.gif",
  "face/得瑟.gif",
  "face/哈哈.gif",
  "face/泪流满面.gif",
  "face/放电.gif",
  "face/困.gif",
  "face/超人.gif",
  "face/害羞.gif",
  "face/呃.gif",
  "face/哇哦.gif",
  "face/要死了.gif",
  "face/谢谢.gif",
  "face/抓狂.gif",
  "face/无奈.gif",
  "face/不好笑.gif",
  "face/呦呵.gif",
  "face/感动.gif",
  "face/喜欢.gif",
  "face/疑问.gif",
  "face/委屈.gif",
  "face/你不行.gif",
  "face/流口水.gif",
  "face/潜水.gif",
  "face/咒骂.gif",
  "face/耶耶.gif",
  "face/被揍.gif",
  "face/抱走.gif",

  // 自定义表情
  "https://pic2.ziyuan.wang/2022/6b2857ec93b23.gif",
  "https://pic2.ziyuan.wang/2022/3d176931b571d.gif",
  "https://pic2.ziyuan.wang/2022/23dbe8320804b.gif",
  "https://pic2.ziyuan.wang/2022/85c0f23af52f8.gif",
  "https://pic2.ziyuan.wang/2022/30146c4263f7f.gif",
  "https://pic2.ziyuan.wang/2022/13647c01da5c7.gif",
  "https://pic2.ziyuan.wang/2022/c31080af1c609.gif",
  "https://pic2.ziyuan.wang/2022/d6dec6e4b4604.gif",
  "https://pic2.ziyuan.wang/2022/719048ed3ab42.gif",
  "https://pic2.ziyuan.wang/2022/f45c0bd755356.gif",
  "https://pic2.ziyuan.wang/2022/faa0d0cfff161.gif",
  "https://pic2.ziyuan.wang/2022/27cee304cda79.gif",
  "https://pic2.ziyuan.wang/2023/10/05/yaohuo007_6d248534e18f5.gif",
  "https://pic2.ziyuan.wang/2023/05/02/17a86bd7372d8.GIF",
  "https://pic2.ziyuan.wang/2023/05/17/177e4e0e2f28d.gif",
  "https://pic2.ziyuan.wang/2023/06/19/f50dc2fbf34ac.gif",
  "https://pic2.ziyuan.wang/user/13530769942/2023/12/yaohuo.me_694810949_5f454a4387b2d.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/FkyiMRaJI1BfuA6T3w4Z9mJh1qbg_3e38409950af1.gif",
  "https://pic2.ziyuan.wang/2023/05/16/5152d0749ff41.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/FpZEifxiFGs1BWtHjFsk5tJJNKSE_8b6f63437539d.gif",
  "https://pic2.ziyuan.wang/2023/06/15/5640689a44056.GIF",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/FvMXbnIX8RavSBAhflxf1zomD1ov_902abba24378b.gif",
  "https://pic2.ziyuan.wang/2023/07/11/30aff1eed1845.GIF",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/FkeVK5icB5-Pc7mbZitDTX1AqfNO_3a687a8c7683f.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/Fit100hjJ-T5RwQxeNdoVWplvNvU_96758df767a69.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/v2-568bb2311e00c3ecbc4dd49ab0709f09_b_5215574668d2f.gif",
  "https://pic2.ziyuan.wang/user/sub/2024/04/458ed8da862d4a71bc5ab4c2435711fd_088c2fc6f5680.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_76964470c8b1b.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_0318a6f925fbc.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_4629d7fff2f0a.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_99ab94aa14e58.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_4917d00f77b70.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_7b42669bad9e0.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_3cb79bd54abd2.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_ae29120dd414c.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_d729e16f5178a.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_f17b227dc0b65.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_32ca0d60dcdcc.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_f524ab469146c.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_f72a3922675d8.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_a1114209167b6.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_91e15b0079ada.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_38a61440b1cd3.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_933c24257fae8.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_f0f73185a8b01.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_a56ac656a1148.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_f0562dacf1bfd.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_eff33afa00163.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_070ec2f5a6118.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_dc0b98359052f.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_163be41a06cf1.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_fa50e82d42778.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_4b51d01f83ef7.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_a14862d0f2c7d.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_34e4ae7e3abeb.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_c42a350bb7511.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_846823994eb82.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_b166edaec1bc4.png",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_e22a601c90e31.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_233e5e38d4d5d.png",
  "https://pic2.ziyuan.wang/2023/06/15/fb73ec52bc113.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_6453568bc84d7.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_609d4a06138ec.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_59e60f0a98da8.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_6723d2f29219d.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_0c538a929de62.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2024/12/webwxgetmsgimg_05208a26bf538.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_80e3cbbc106d8.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_7a85e377185b6.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_17024a36c62c1.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_aa11042623721.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_0b17ce20017e5.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_0b3366c8e4f2c.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_f5e49c8b9fb10.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_d7784aa75cade.png",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_da4d598a0038a.jpg",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_e1edb813037b0.gif",
  "https://pic2.ziyuan.wang/user/v2jun/2025/01/webwxgetmsgimg_acce220dbe392.gif",
];
// ubb
const ubbList = [
  {
    name: "超链接",
    inputTitle: ["网址", "网址说明"],
    ubbHandle: (inputValues) => `[url=${inputValues[0]}]${inputValues[1]}[/url]`,
  },
  {
    name: "红字",
    inputTitle: ["红字内容"],
    ubbHandle: (inputValues) => `[forecolor=red]${inputValues[0]}[/forecolor]`,
  },
  {
    name: "加粗",
    inputTitle: ["加粗内容"],
    ubbHandle: (inputValues) => `[b]${inputValues[0]}[/b]`,
  },
  {
    name: "斜体",
    inputTitle: ["斜体内容"],
    ubbHandle: (inputValues) => `[i]${inputValues[0]}[/i]`,
  },
  {
    name: "下划线",
    inputTitle: ["下划线内容"],
    ubbHandle: (inputValues) => `[u]${inputValues[0]}[/u]`,
  },
  {
    name: "删除线",
    inputTitle: ["删除线内容"],
    ubbHandle: (inputValues) => `[strike]${inputValues[0]}[/strike]`,
  },
  {
    name: "分割线",
    inputTitle: ["不需要输入内容,直接点击确定即可"],
    ubbHandle: (inputValues) => `[hr]`,
  },
  {
    name: "代码",
    inputTitle: ["代码内容"],
    ubbHandle: (inputValues) => `[code]${inputValues[0]}[/code]`,
  },
  { name: "拨号", inputTitle: ["手机号码"], ubbHandle: (inputValues) => `[call]${inputValues[0]}[/call]` },
  {
    name: "发短信",
    inputTitle: ["手机号码", "短信内容"],
    ubbHandle: (inputValues) => `[url=sms:${inputValues[0]}?body=${inputValues[0]}]点此发送[/url]`,
  },
  {
    name: "当前时间",
    inputTitle: ["不需要输入内容,直接点击确定即可"],
    ubbHandle: (inputValues) => `[now]`,
  },
  {
    name: "倒计时天数",
    inputTitle: ["需要倒计时的日期(格式:2030-01-01)"],
    ubbHandle: (inputValues) => `[codo]${inputValues[0]}[/codo]`,
  },
  {
    name: "QQ音乐",
    inputTitle: ["QQ音乐歌曲链接或ID"],
    ubbHandle: (inputValues) => `[qqmusic]${inputValues[0]}[/qqmusic]`,
  },
  {
    name: "网易云音乐",
    inputTitle: ["网易云音乐歌曲链接或ID"],
    ubbHandle: (inputValues) => `[wymusic]${inputValues[0]}[/wymusic]`,
  },
  {
    name: "图片(外链)",
    inputTitle: ["图片链接"],
    ubbHandle: (inputValues) => `[img]${inputValues[0]}[/img]`,
  },
  // { name: "短链生成" },
  {
    name: "图片(上传)",
    ubbHandle: (inputValues) => `[img]${inputValues[0]}[/img]`,
    upload: {
      type: "img",
      accept: "image/*",
    },
  },
  {
    name: "视频",
    inputTitle: ["视频外链(未能找到合适的文件站,如有可提供给我)"],
    ubbHandle: (inputValues) => `[movie]${inputValues[0]}[/movie]`,
    upload: {
      type: "movie",
      accept: "video/*",
    },
  },
  {
    name: "音频",
    inputTitle: ["音频外链(未能找到合适的文件站,如有可提供给我)"],
    ubbHandle: (inputValues) => `[movie]${inputValues[0]}[/movie]`,
    upload: {
      type: "audio",
      accept: "audio/*",
    },
  },
  // {
  //   name: "抖音解析",
  //   inputTitle: ["链接(不需要去除中文和多余字符)"],
  //   apiUrl: "https://v.695402.xyz/dyzl",
  //   ubbHandle: (inputValues) => `[movie]${inputValues[0]}[/movie]`,
  // },
  // { name: "快手解析", inputTitle: ["链接(不需要去除中文和多余字符)"], jxApiUrl: "", ubbHandle: (inputValues) => `[movie]${inputValues[0]}[/movie]` },
  // { name: "B站解析", inputTitle: ["链接(不需要去除中文和多余字符)"], jxApiUrl: "", ubbHandle: (inputValues) => `[movie]${inputValues[0]}[/movie]` },
  // { name: "皮皮虾解析", inputTitle: ["链接(不需要去除中文和多余字符)"], jxApiUrl: "", ubbHandle: (inputValues) => `[movie]${inputValues[0]}[/movie]` },
  // { name: "屋舍文件" },
];
// 设置图标
const settingIconBase64 =
  "data:image/png;base64,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";
/* ================================================== 变量结束 ================================================== */

(async function () {
  "use strict";

  if (!checkLocation()) return;

  const jqueryIsLoad = await loadAndExecuteScript("https://code.jquery.com/jquery-3.7.1.min.js", "jquery-3.7.1.min");
  if (!jqueryIsLoad) return;

  const setttingIsInit = await initSetting();
  if (!setttingIsInit) return;

  const userSetting = JSON.parse(localStorage.getItem("yaohuoBetterPlusSetting"));

  if (userSetting["firstLoadScript"]) {
    alert("请合理/合法使用本脚本,不要影响论坛正常看帖/回帖!!!如因使用本脚本而被封号/小黑屋,雨我无瓜(免责声明.jpg)");
    saveUserSetting("firstLoadScript", false);
  }

  addCustomStyle();
  // 页面解析完成后再执行代码,否则 jquery 可能会获取不到 document 内容导致脚本执行失败
  $(document).ready(() => {
    createScriptSetting();
    userSetting["showTopAndDownBtn"] && addTopAndDown();
    userSetting["showChuiniuHistory"] && executeFunctionForURL("/games/chuiniu/doit.aspx", chuiniuHistory);
    userSetting["oneClickCollectMoney"] && executeFunctionForURL(/^\/bbs-.*\.html$/, speedEatMoney, true);
    userSetting["hideXunzhang"] && executeFunctionForURL(/^\/bbs-.*\.html$/, hideXunzhang, true);
    userSetting["showHuifuCopy"] && executeFunctionForURL(/^\/bbs-.*\.html$/, huifuCopy, true);
    executeFunctionForURL(/^\/bbs\/book_view_.*\.aspx$/, bookViewBetter, true);
    executeFunctionForURL(/^\/bbs-.*\.html$/, huifuBetter, true);
    userSetting["useRight"] && executeFunctionForURL("/bbs/book_list.aspx", useRightNextBtn);
  });
  // 页面加载完成后再执行代码,否则页面资源可能会获取不到,导致玄学bug,比如图片等
  $(window).on("load", () => {
    executeFunctionForURL(/^\/bbs-.*\.html$/, changeImgSize, true);
    userSetting["autoLoadMoreBookList"] && executeFunctionForURL("/bbs/book_list.aspx", autoLoadMoreBookList);
    userSetting["autoLoadMoreHuifuList"] && executeFunctionForURL(/^\/bbs-.*\.html$/, autoLoadMoreHuifuList, true);
    userSetting["openLayerForBook"] && executeFunctionForURL("/bbs/book_list.aspx", openLayer);
  });

  checkVersion();
})();
// 检查更新
function checkVersion() {
  sessionStorage.removeItem("canUpdate");
  myAjax("http://greasyfork.icu/scripts/504289.json").then((data) => {
    console.log("%c ===> [ data ] <===", "font-size:13px; background:pink; color:#bf2c9f;", data);
    const { version } = data;
    if (version == getUserSetting("version")) return;
    notifyBox("已有新版本,请自行更新。如不需要更新,可在设置里关闭", false, 3000);
    sessionStorage.setItem("canUpdate", true);
  });
}
// PC端点击帖子弹窗打开
function openLayer(url) {
  if (!isPC()) return;
  // 监听点击事件
  $(document)
    .off("click", ".listdata .topic-link")
    .on("click", ".listdata .topic-link", function (event) {
      event.preventDefault(); // 阻止默认链接行为
      const url = $(this).attr("href"); // 获取链接的 href 属性
      openLayer(url);
    });
  if (!url || url.length < 1) return;
  // 创建背景层
  let background_layer = $("<div>").css({
    display: "none",
    position: "fixed",
    top: "0",
    left: "0",
    width: "100%",
    height: "100%",
    backgroundColor: "gray",
    zIndex: "1001",
    opacity: "0.8",
  });
  // 创建弹出层
  let open_layer = $("<div>").css({
    display: "none",
    position: "fixed",
    top: "50%",
    left: "50%",
    transform: "translate(-50%, -50%)",
    width: "80%",
    maxWidth: "720px",
    height: "96%",
    border: "1px solid lightblue",
    borderRadius: "10px",
    boxShadow: "4px 4px 10px #171414",
    backgroundColor: "white",
    zIndex: "1002",
    overflow: "auto",
    margin: "0",
    padding: "0",
  });
  // 创建 iframe
  let iframe = $("<iframe>")
    .attr("src", url || "")
    .css({
      width: "100%",
      height: "100%",
      border: "0",
      display: "block",
    });

  // 将 iframe 添加到弹出层
  open_layer.append(iframe);
  // 将弹出层和背景层添加到 body
  $("body").append(open_layer).append(background_layer);
  // 显示弹出层和背景层
  open_layer.show();
  background_layer.show();
  // 点击背景层时关闭弹出层
  background_layer.on("click", function () {
    open_layer.remove();
    background_layer.remove();
  });
}
// 回复列表自动加载更多
function autoLoadMoreHuifuList() {
  // 获取加载更多按钮
  const loadMoreButton = $(".viewContent .more a:contains('加载更多')");
  // 设置一个标志位,用于判断是否已经触发过点击事件
  let hasTriggered = false;

  // 监听滚动事件
  $(window).scroll(function () {
    // 获取页面滚动的位置和文档高度
    const scrollTop = $(this).scrollTop();
    const windowHeight = $(this).height();
    const documentHeight = $(document).height();
    // 检查是否滚动到距离底部400px,并且还没有触发过点击事件
    if (documentHeight - (scrollTop + windowHeight) <= 500 && !hasTriggered) {
      // 自动点击加载更多按钮
      console.log("%c ===> [ 自动点击加载回复 ] <===", "font-size:13px; background:pink; color:#bf2c9f;");
      loadMoreButton.click();
      // 设置标志位为已触发
      hasTriggered = true;
    } else if (documentHeight - (scrollTop + windowHeight) > 500) {
      // 如果滚动距离超过200px,重置标志位
      hasTriggered = false;
    }
  });
}
// 帖子列表自动加载更多
function autoLoadMoreBookList() {
  // 获取加载更多按钮
  const loadMoreButton = $(".btBox .bt1 a:contains('加载更多')");
  // 设置一个标志位,用于判断是否已经触发过点击事件
  let hasTriggered = false;

  // 监听滚动事件
  $(window).scroll(function () {
    // 获取页面滚动的位置和文档高度
    const scrollTop = $(this).scrollTop();
    const windowHeight = $(this).height();
    const documentHeight = $(document).height();
    // 检查是否滚动到距离底部200px,并且还没有触发过点击事件
    if (documentHeight - (scrollTop + windowHeight) <= 500 && !hasTriggered) {
      // 自动点击加载更多按钮
      console.log("%c ===> [ 自动点击加载帖子 ] <===", "font-size:13px; background:pink; color:#bf2c9f;");
      loadMoreButton.click();
      // 设置标志位为已触发
      hasTriggered = true;
    } else if (documentHeight - (scrollTop + windowHeight) > 500) {
      // 如果滚动距离超过200px,重置标志位
      hasTriggered = false;
    }
  });
}
// 帖子页面上一页,下一页按钮互换位置
function useRightNextBtn() {
  // 获取上一页和下一页的按钮
  const prevLink = $('.btBox .bt2 a:contains("上一页")');
  const nextLink = $('.btBox .bt2 a:contains("下一页")');

  // 交换位置
  prevLink.after(nextLink.clone());
  nextLink.after(prevLink.clone());
  prevLink.remove();
  nextLink.remove();
}
// 回帖 增强
function huifuBetter() {
  // 移除帖子快速回复旁“文件回帖”按钮
  $(".kuaisuhuifu a").remove();
  // 移除默认表情展开按钮及弹出内容区域
  $(".viewContent .ulselect").remove();
  $(".viewContent .emoticon-popup").remove();

  createToggleEle();

  $(".viewContent .centered-container").before('<div class="emojilist-div huifu-emoji"></div>');
  createEmojiHtml(".viewContent .sticky [name='content']");
  $(".viewContent .sticky").after('<div class="ubblist-div huifu-ubb"></div>');
  createUbbHtml(".viewContent .sticky [name='content']");

  !getUserSetting("showHuifuEmoji") && $(".emojilist-div.huifu-emoji").hide();
  !getUserSetting("showHuifuUbb") && $(".ubblist-div.huifu-ubb").hide();

  function createToggleEle() {
    const toggleEle = $(`<span class="custom-toggle-btn">${getUserSetting("showHuifuUbb") ? "UBB 折叠" : "UBB 展开"}</span>`);
    toggleEle.click(function () {
      $(".ubblist-div").toggle();
      const showHuifuUbb = getUserSetting("showHuifuUbb");
      if (showHuifuUbb) {
        saveUserSetting("showHuifuUbb", false);
        $(this).text("UBB 展开");
      } else {
        saveUserSetting("showHuifuUbb", true);
        $(this).text("UBB 折叠");
      }
    });
    $(".viewContent .kuaisuhuifu").append(toggleEle);

    const vSpan = $(`<span class='custom-toggle-btn'>${getUserSetting("showHuifuEmoji") ? "表情 折叠" : "表情 展开"}</span>`);
    vSpan.css({
      "margin-left": "10px",
      "padding": "2px 10px",
    });
    vSpan.insertBefore(".viewContent .tongzhi");
    vSpan.click(function () {
      $(".emojilist-div").toggle();
      const showHuifuEmoji = getUserSetting("showHuifuEmoji");
      if (showHuifuEmoji) {
        saveUserSetting("showHuifuEmoji", false);
        $(this).text("表情 展开");
      } else {
        saveUserSetting("showHuifuEmoji", true);
        $(this).text("表情 折叠");
      }
    });
  }
}
// 发帖/修改帖 增强
function bookViewBetter() {
  createToggleEle();

  let contentHeader = $(".upload-container .form-group .content-header").eq(1); // 发布帖子
  if (window.location.pathname != "/bbs/book_view_add.aspx") {
    contentHeader = $(".upload-container .form-group .content-header"); // 修改帖子
  }
  contentHeader.after('<div class="emojilist-div bookview-emoji"></div>');
  createEmojiHtml(".upload-container .form-group [name='book_content']");
  contentHeader.after('<div class="ubblist-div bookview-ubb"></div>');
  createUbbHtml(".upload-container .form-group [name='book_content']");

  // 读取设置,当折叠时隐藏
  !getUserSetting("showBookViewEmoji") && $(".emojilist-div.bookview-emoji").hide();
  !getUserSetting("showBookViewUbb") && $(".ubblist-div.bookview-ubb").hide();

  // 生成按钮
  function createToggleEle() {
    const toggleEle = $(
      `<span class="custom-toggle-btn ubb-btn" style="font-size:10px;margin-right:0;">${
        getUserSetting("showBookViewUbb") ? "UBB 折叠" : "UBB 展开"
      }</span>
      <span class="custom-toggle-btn emoji-btn" style="font-size:10px;margin-left:0;">${
        getUserSetting("showBookViewEmoji") ? "表情 折叠" : "表情 展开"
      }</span>
      `
    );
    if (window.location.pathname === "/bbs/book_view_mod.aspx") {
      // 修改帖子
      $("label").each(function () {
        const labelContent = $(this).html();
        if (labelContent == "内容") {
          $(this).replaceWith(`
            <div class="content-header"><label>内容</label><div class="textarea-actions"></div>
          `);
        }
      });
      $(".upload-container .form-group .textarea-actions").append(toggleEle);
    } else {
      // 发布帖子
      $(".content .textarea-actions #saveDraftButton").before(toggleEle);
    }
    // ubb 展开按钮
    $(".custom-toggle-btn.ubb-btn").click(function () {
      $(".ubblist-div").toggle();
      const showBookViewUbb = getUserSetting("showBookViewUbb");
      if (showBookViewUbb) {
        saveUserSetting("showBookViewUbb", false);
        $(this).text("UBB 展开");
      } else {
        saveUserSetting("showBookViewUbb", true);
        $(this).text("UBB 折叠");
      }
    });
    // 表情展开按钮
    $(".custom-toggle-btn+.emoji-btn").click(function () {
      $(".emojilist-div").toggle();
      const showBookViewEmoji = getUserSetting("showBookViewEmoji");
      if (showBookViewEmoji) {
        saveUserSetting("showBookViewEmoji", false);
        $(this).text("表情 展开");
      } else {
        saveUserSetting("showBookViewEmoji", true);
        $(this).text("表情 折叠");
      }
    });
  }
}
// ubb 节点
function createUbbHtml(insertEle) {
  // 生成 ubb 按钮
  const ubbListHtml = [];
  ubbList.forEach((ubbItem) => {
    const { name, upload } = ubbItem;
    let ubbSpanEle = null;
    if (upload?.type?.length > 0) {
      ubbSpanEle = $(`
            <input type="file" id="upload-${upload.type}" style="display: none;" accept="${upload.accept}" multiple/>
            <span class="ubb-item">${name}</span>
        `);
    } else {
      ubbSpanEle = $(`<span class="ubb-item">${name}</span>`);
    }
    ubbListHtml.push(ubbSpanEle);
  });
  $(".ubblist-div").append(ubbListHtml);
  // 设置 ubb 点击功能,生成时设置会导致某些ubb点击无法生效
  ubbList.forEach((ubbItem) => {
    const { name, inputTitle, ubbHandle, upload, jxApiUrl } = ubbItem;
    $(`.ubblist-div .ubb-item:contains("${name}")`).click(() => {
      if (inputTitle?.length > 0 && !jxApiUrl) {
        // 输入域
        showInputPopup(inputTitle, (inputResult) => inputResult && insetCustomContent(ubbHandle(inputResult), insertEle, true));
      } else if (inputTitle?.length > 0 && jxApiUrl?.length > 0) {
        // 外链解析
        showInputPopup(inputTitle, async (inputResult) => {
          const targetUrl = /https:\/\/v\.d.+?\/\w+/.exec(inputResult[0]);
          await getVideoPlayUrl(targetUrl[0]);
        });
      } else if (upload) {
        // 点击隐藏的上传选择文件按钮
        $(`.ubblist-div #upload-${upload.type}`).click();
        // 文件选择回调事件
        $(`.ubblist-div #upload-${upload.type}`)
          .off("input")
          .on("input", function () {
            const fileInput = this;
            const tempFiles = this.files;
            if (tempFiles.length == 0) {
              notifyBox("请选择文件", false);
              return;
            }
            if (tempFiles.length > 10) {
              notifyBox("一次最多选择 10 个文件", false);
              return;
            }

            showWaitBox("上传中…"); // 上传等待提示
            const uploadCount = { success: 0, fail: 0 }; // 存储上传结果数量
            for (const file of tempFiles) {
              switch (upload.type) {
                case "img":
                  const url = defaultSetting.imgUploadApiUrl[getUserSetting("imgUploadSelOpt")];
                  const options = {};
                  if (getUserSetting("imgUploadSelOpt") == 1) {
                    // 水墨图床添加 token
                    options.headers = { token: getUserSetting("suimoToken") };
                  }
                  const data = new FormData();
                  data.append("image", file);
                  uploadFiles(url, data, options, (response) => {
                    const { code, msg, data } = response;
                    if (code == 200) {
                      insetCustomContent(ubbHandle([data.url]), insertEle, true);
                      uploadCount.success++;
                    } else {
                      uploadCount.fail++;
                      // notifyBox(msg, false);
                    }
                    if (uploadCount.success + uploadCount.fail == tempFiles.length) {
                      $(".wait-box-overlay").remove(); // 关闭等待提示
                      setTimeout(() => notifyBox(`已成功上传 ${uploadCount.success} 个文件,失败 ${uploadCount.fail} 个文件`), 300);
                      $(fileInput).val(""); // 上传完成后清空文件选择,解决某些浏览器上出现的重复上传及选择相同文件时不上传问题
                    }
                  });
                  break;
                case "movie":
                  $(".wait-box-overlay").remove();
                  break;
                case "audio":
                  $(".wait-box-overlay").remove();
                  break;
                default:
                  notifyBox(`非法选择`);
                  $(".wait-box-overlay").remove();
                  break;
              }
            }
          });
      }
    });
  });
}
// 表情 节点
function createEmojiHtml(insertEle) {
  const emojiListHtml = [];
  emojiList.forEach((faceitem) => {
    const img = $("<img/>", {
      class: "emojilist-img",
      src: faceitem,
    });
    $(img).click(() => insetCustomContent(`[img]${faceitem}[/img]`, insertEle, true));
    emojiListHtml.push(img);
  });
  $(".emojilist-div").append(emojiListHtml);
}
// 修改图片大小
function changeImgSize() {
  setBbsContentImg();
  setReContentImg();

  function setReContentImg() {
    $(".recontent img").each(function () {
      if (this.complete) {
        handleImageLoad(this);
      } else {
        $(this).on("load", function () {
          handleImageLoad(this);
        });
      }
    });
    $("body").on("load", "img", function () {
      handleImageLoad(this);
    });
    function handleImageLoad(img) {
      if ($(img).width() <= 120) return; // 排除论坛自带表情,不缩放

      $(img).css({
        width: "100px",
        height: "auto", // 按比例缩放
        display: "block", // 设置为 block
      });
    }
  }
  function setBbsContentImg() {
    // 监测已有图片
    $(".bbscontent img").each(function () {
      if (this.complete) {
        handleImageLoad(this); // 如果图片已经加载完成
      } else {
        $(this).on("load", function () {
          handleImageLoad(this);
        });
      }
    });
    // 监测新增图片
    $("body").on("load", "img", function () {
      handleImageLoad(this);
    });
    $("body").on("click", "img", function (e) {
      e.preventDefault(); // 取消默认点击行为,避免进入预览窗口
      $(this).toggleClass("img-thumb"); // 给图片添加点击事件,添加/移除指定class,以实时修改图片大小
    });

    function shouldExclude(img) {
      const excludedClasses = []; // 需要排除的 class
      const excludedIds = ["settingICon"]; // 需要排除的 id

      // 判断是否包含排除的 class 或 id
      return excludedClasses.some((cls) => $(img).hasClass(cls)) || excludedIds.includes($(img).attr("id"));
    }
    // 图片加载完成
    function handleImageLoad(img) {
      // console.log("图片加载完成:", img.src);
      const imgThumbWidth = getUserSetting("imgThumbWidth");
      if (!imgThumbWidth) return; // 防止设置为0时依旧添加点击事件,导致点击后页面内图片丢失
      if ($(img).width() <= 120) return; // 排除论坛自带表情,不缩放
      if (shouldExclude(img)) return; // 跳过指定 class 或 id 的图片

      $("head").append(`<style>.img-thumb{max-width:${imgThumbWidth}px;display: block;}`); // 将图片缩小样式添加到页面中
      $(img).addClass("img-thumb"); // 为页面内所有img标签添加class,修改显示大小
    }
  }
}
// 复读机(回帖+1)
function huifuCopy() {
  const customLayoutEnabled = JSON.parse(localStorage.getItem("customLayoutEnabled"));
  if (customLayoutEnabled) {
    // 新版回帖
    $(".forum-post .post-content .retext").each(function () {
      const spanEle = $("<span class='huifu-copy'>+1</span>");
      $(this).append(spanEle);
      spanEle.click((e) => {
        e.stopPropagation();
        const parentText = $(this).clone().children(".huifu-copy").remove().end().text().trim();
        insetCustomContent(parentText, ".centered-container .retextarea");
        scrollToEle(".centered-container .retextarea", 80);
        setTimeout(() => {
          getUserSetting("huifuCopyAutoSubmit") && $(".kuaisuhuifu input").trigger("click");
        }, 150);
      });
    });
  } else {
    // 旧版回帖
    $(".reline.list-reply .retext").each(function () {
      const spanEle = $("<span class='huifu-copy'>+1</span>");
      $(this).append(spanEle);
      spanEle.click((e) => {
        e.stopPropagation();
        const parentText = $(this).clone().children(".huifu-copy").remove().end().text().trim();
        insetCustomContent(parentText, ".centered-container .retextarea");
        scrollToEle(".centered-container .retextarea", 80);
        setTimeout(() => {
          getUserSetting("huifuCopyAutoSubmit") && $(".kuaisuhuifu input").trigger("click");
        }, 150);
      });
    });
  }
}
// 隐藏楼主勋章
function hideXunzhang() {
  $(".xunzhang").remove();
}
// 一键吃肉
function speedEatMoney() {
  const vBtn = $("<span class='custom-toggle-btn'>一键吃肉</span>");
  vBtn.click(() => {
    const isPaibi = $("div").hasClass("paibi");
    if (isPaibi) {
      const shengyuNum = $(".paibi .yushuzi").text();
      if (shengyuNum > 0) {
        const eatWordsArr = [
          "吃",
          "吃吃",
          "吃吃.",
          "吃吃。",
          "吃吃..",
          "吃吃。。",
          "吃了",
          "吃肉",
          "来吃肉",
          "吃.",
          "吃。",
          "吃了.",
          "吃了。",
          "吃肉.",
          "吃肉。",
          "来吃肉.",
          "来吃肉。",
          "吃..",
          "吃。。",
          "吃了..",
          "吃了。。",
          "吃肉..",
          "先吃肉",
        ];
        const index = Math.floor(Math.random() * eatWordsArr.length);
        insetCustomContent(eatWordsArr[index], ".centered-container .retextarea");
        setTimeout(() => {
          $(".kuaisuhuifu input").trigger("click");
        }, 300);
      } else {
        notifyBox("已经没有肉了,错过了一个亿~", false);
      }
    } else {
      notifyBox("不是派币贴,你吃个 der", false);
    }
  });
  $(".viewContent .kuaisuhuifu").append(vBtn);
}
// 查询吹牛发布者历史大话选项
async function chuiniuHistory() {
  const elementsWithText = $("body").find(":contains('自己挑战的只能由其它友友应战!')");
  if (elementsWithText.length > 0) return;

  // 创建胜率结果显示容器,写入提示信息
  $(
    `<p id="chuiniuWinningEle" style="background:#f0f9eb;color:gray;text-align:center;margin:0 auto;padding:0 20px;">历史记录获取中...</p>`
  ).insertBefore($(".subtitle"));

  const userinfoEle = $('a[href*="userinfo.aspx"]');
  const chuiniuQueUserId = getUrlParam("touserid", userinfoEle.attr("href")); // 发布者ID
  const chuiniuQueUserNickname = userinfoEle.text(); // 发布者昵称
  const queHistoryArr = Array.from(await getQueUserHistoryArr(chuiniuQueUserId)); // 发布者历史大话ID

  if (queHistoryArr.length > 0) {
    //  获取成功
    const queHistoryAnswers = await Promise.all(queHistoryArr.map(getChuiniuAnswer));
    const countAnswer1 = queHistoryAnswers.filter((v) => v === "1").length;
    const countAnswer2 = queHistoryAnswers.filter((v) => v === "2").length;
    $("#chuiniuWinningEle")
      .css({
        "text-align": "left",
      })
      .html(
        `“<span style="color:#3d68a8;">${chuiniuQueUserNickname}</span>”最近<span style="color:blue;font-weight:bold;">${queHistoryAnswers.length}</span>次已完成大话选项:答案<span style="color:blue;font-weight:bold;">1</span>次数:<span style="color:red;font-weight:bold;">${countAnswer1}</span>,答案<span style="color:blue;font-weight:bold;">2</span>次数: <span style="color:red;font-weight:bold;">${countAnswer2}</span>`
      );
  } else {
    // 获取失败
    $("#chuiniuWinningEle").html(`<span style="color:red;">未知错误,获取历史数据失败,请私信反馈</span>`);
  }

  // 获取指定大话答案
  async function getChuiniuAnswer(chuiniuId) {
    const chuiniuRes = await getPageContent(`/games/chuiniu/book_view.aspx?id=${chuiniuId}`);
    const ansRule1 = chuiniuRes.match(/挑战方出的是\[答案1\]/);
    const ansRule2 = chuiniuRes.match(/挑战方出的是\[答案2\]/);
    if (ansRule1) return "1";
    if (ansRule2) return "2";
  }
  // 获取对方大话指定条数历史记录ID
  async function getQueUserHistoryArr(toUserId, computeTotal = 15) {
    return new Promise(async (resolve, reject) => {
      const idArr = new Set(); // 存放大话ID,利用Set特性去重(翻页时会有重复项出现,非本脚本bug)
      let historyPage = 1; // 翻页,达到预设值时停止

      const historyText = await getPageContent(`/games/chuiniu/book_list.aspx?type=0&touserid=${toUserId}`);
      const userHistoryTotal = historyText.slice(historyText.indexOf("页,共 ") + 4, historyText.indexOf(" 条")); // 吹牛历史总条数

      const getQueUserHistoryid = async () => {
        const tempElements = $(historyText).filter(".line1, .line2");
        for (const line of tempElements) {
          const idLink = line.querySelector('a[href*="book_view.aspx"]');
          if (idLink && !line.textContent.includes("进行中")) {
            const dahuaId = getUrlParam("id", idLink.href);
            if (dahuaId) idArr.add(dahuaId);
            if (idArr.length >= computeTotal) break;
          }
        }
        if (idArr.length < 15 && userHistoryTotal > 15) {
          historyPage++;
          getQueUserHistoryid();
        } else {
          resolve(idArr);
        }
      };
      getQueUserHistoryid();
    });
  }
}
// 一键回到顶部/底部,在原作者基础上做了删减、改动,原作者发布地址:http://greasyfork.icu/zh-CN/scripts/38899-回到顶部-底部
function addTopAndDown() {
  if (window.self != window.top) return;
  function ce(n) {
    return document.createElement(n);
  }

  function addStyle(css) {
    let head = document.head || document.getElementsByTagName("head")[0];
    if (head) {
      let style = ce("style");
      style.type = "text/css";
      style.appendChild(document.createTextNode(css));
      head.appendChild(style);
    }
  }

  let el = navigator.userAgent.indexOf("Firefox") != -1 || navigator.userAgent.indexOf("MSIE") != -1 ? document.documentElement : document.body,
    t1,
    t2,
    speed_by_click = 200,
    zIindex = 1001;

  function getDocumentHeight() {
    return document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight;
  }
  function get_scroll(a) {
    let d = document,
      b = d.body,
      e = d.documentElement,
      c = "client" + a,
      f = "scroll" + a;
    return /CSS/.test(d.compatMode) ? e[c] < e[f] : b[c] < b[f];
  }
  function scrollTo(element, to, duration) {
    (start = document.documentElement.scrollTop || document.body.scrollTop),
      (change = to - start),
      (currentTime = 0),
      (increment = 20),
      (newDuration = typeof duration === "undefined" ? 500 : duration);

    let animateScroll = function () {
      currentTime += increment;
      let val = Math.easeInOutQuad(currentTime, start, change, newDuration);
      window.scrollTo(0, val);
      if (currentTime < newDuration) {
        setTimeout(animateScroll, increment);
      }
    };
    animateScroll();
  }

  Math.easeInOutQuad = function (t, b, c, d) {
    t /= d / 2;
    if (t < 1) return (c / 2) * t * t + b;
    t--;
    return (-c / 2) * (t * (t - 2) - 1) + b;
  };

  function shareCSS() {
    let s = "",
      img_up,
      img_dn;

    img_up =
      "data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAUCAYAAACAl21KAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB+SURBVDhPY1i1atV/amAGahgCMoNhaIGlS5cKAp19BoRBbLJcj2QILDJINwzoAmMgfoclIkBixkS5DI8hMJcRNgxoSBoOl6CnNZBhaVhdBjWE1MSJahjQkA4KEmYH2GUrV66cSYEhYB+AzKBtFiHkQqKiH6Ro1CDCQTWgYQQAs81DU0G/83sAAAAASUVORK5CYII=";
    img_dn =
      "data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAUCAYAAACAl21KAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACPSURBVDhPY2DAAlatWvUfH8amB6vYqEGEg2pgw4iQ7cTKM6xcuXImsYpxqQOZAQ4woIIOCgzrQAl1oEFpZBiWhitFgwx7R4SBIDXYDYGZDFRgTMAwkCHGhBMRJMxwGUa8ITCbli5dKgg08AySN8+AxIhyCboiJMPIN4Qsm6miiYioxltawvSDYogohYTUAQC80UNTOht/YwAAAABJRU5ErkJggg==";
    s +=
      "#play_btn_up { position:fixed; right:0; top:54%;z-index:" +
      zIindex +
      "; height:40px; width:36px; cursor:pointer; background:url(" +
      img_up +
      ") no-repeat scroll 50% 50% rgba(0, 0, 0, 0.7); border-radius:5px 0 0 5px; margin-top:-24px; }";
    s +=
      "#play_btn_dn { position:fixed; right:0; top:60%;   z-index:" +
      zIindex +
      "; height:40px; width:36px; cursor:pointer; background:url(" +
      img_dn +
      ") no-repeat scroll 50% 50% rgba(0, 0, 0, 0.7); border-radius:5px 0 0 5px; margin-top:-24px; }";

    s +=
      ".play_btn { -webkit-transition-duration:0.5s linear; -o-transition-duration:0.5s linear; -moz-transition-duration:0.5s linear; transition-duration:0.5s linear; opacity:0.65; }";
    s += ".play_btn:hover { opacity:1; }";

    addStyle("" + s);
  }

  function create_btn_element() {
    let up,
      dn,
      scrolled,
      h = get_scroll("Height");
    if (!h) {
      return;
    }
    shareCSS();

    if (el) {
      up = ce("span");
      dn = ce("span");
      up.setAttribute("id", "play_btn_up");
      dn.setAttribute("id", "play_btn_dn");
      up.className = "play_btn";
      dn.className = "play_btn";
      document.body.appendChild(up);
      document.body.appendChild(dn);

      scrolled = window.pageYOffset || document.documentElement.scrollTop;
      up.style.display = scrolled > 0 ? "" : "none";

      up.addEventListener(
        "mouseout",
        function () {
          clearTimeout(t1);
        },
        false
      );
      dn.addEventListener(
        "mouseout",
        function () {
          clearTimeout(t2);
        },
        false
      );
      up.addEventListener(
        "click",
        function () {
          scrollTo(el, 0, speed_by_click);
        },
        false
      );
      dn.addEventListener(
        "click",
        function () {
          scrollTo(el, getDocumentHeight(), speed_by_click);
        },
        false
      );

      window.onscroll = function () {
        let scrolled = document.documentElement.scrollTop,
          diffHeight = document.body.scrollHeight - window.innerHeight;
        up.style.display = scrolled > 0 ? "" : "none";
        dn.style.display = diffHeight > scrolled ? "" : "none";
      };
    }
  }

  create_btn_element();
}

// 生成设置相关内容
function createScriptSetting() {
  createIcon();

  // 关闭设置弹框
  function closePopupContainer() {
    // 恢复body内容滚动
    $("body").css("overflow", "auto");
    // 移除蒙版和弹出内容容器
    $(".popup-overlay").remove();
  }
  // 设置弹框
  function createPopupContainer() {
    // 蒙版
    const overlay = $("<div>").addClass("popup-overlay").appendTo("body").click(closePopupContainer);
    // 弹出内容容器
    const container = $("<div>")
      .addClass("popup-container")
      .appendTo(overlay)
      .click((event) => {
        event.stopPropagation(); // 阻止事件冒泡
      });

    // 设置蒙版的样式
    overlay.css({
      "background-color": "rgba(0, 0, 0, 0.6)",
      "position": "fixed",
      "top": 0,
      "left": 0,
      "width": "100%",
      "height": "100%",
      "z-index": 9999,
      "display": "flex",
      "justify-content": "center",
      "align-items": "center",
    });

    // 设置弹出内容容器的样式
    container.css({
      "background-color": "white",
      "width": "80%",
      "max-width": "400px",
      "max-height": "80%",
      "overflow-y": "auto",
      "padding": "20px",
      "text-align": "center",
      "border-radius": "5px",
    });

    // 添加弹出内容
    const vSettingEle = `
      <form name="settingForm">
      <div class="setting-div">
        <h2 class="reset setting-title">妖火增强插件Plus</h2>
        <p class="reset" style="font-size:12px;">
          Author:<a href="/bbs/userinfo.aspx?touserid=27894" style="font-size:12px;">柠檬没有汁@27894</a>
        </p>
        <p class="reset" style="font-size:12px;margin-top:-15px;">
          Version:${getUserSetting("version")}
        </p>
        <p style="font-size:12px;margin-top:-15px;color:red;${sessionStorage.getItem("canUpdate") ? "" : "display:none;"}">
          已有新版本,请及时更新
        </p>
        <ul style="margin:0;padding:0;">
          <li class="setting-li-title"><hr><b>关于脚本</b><hr></li>
          <li class="setting-li-between">
            <span>脚本安装/升级</span>
            <span>
              <a href="http://greasyfork.icu/zh-CN/scripts/504289-妖火网增强脚本plus" target="_blank">GreasyFork 直达</a>
            </span>
          </li>
          <li class="setting-li-between">
            <span>开源地址</span>
            <span>
              <a href="https://github.com/v2jun/yaohuo_better_plus" target="_blank">Github</a>
            </span>
          </li>
          <li class="setting-li-between">
            <span>重置设置</span>
            <span class='clear-setting'>点击运行</span>
          </li>
          <li class="setting-li-tips">
            <span>如出现玄学bug,可尝试重置脚本设置</span>
          </li>

          <li class="setting-li-title"><hr><b>设置</b><hr></li>
          <li class="setting-li-between">
            <span>设置图标大小(px)</span>
            <input name="settingIconSize" class="setting-li-input" type="number" value="${getUserSetting("settingIconSize")}"/>
          </li>
          <li class="setting-li-tips">
            <span>设置入口图标大小,设置为 0 时不显示</span>
          </li>
          <li class="setting-li-between">
            <span>检查更新</span>
            <div class="switch">
              <input name="checkVersion" value="true" ${
                getUserSetting("checkVersion") ? "checked" : ""
              }  class="switch-checkbox" id="checkVersion" type="checkbox">
              <label class="switch-label" for="checkVersion">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>一键回到顶部/底部</span>
            <div class="switch">
              <input name="showTopAndDownBtn" value="true" ${
                getUserSetting("showTopAndDownBtn") ? "checked" : ""
              }  class="switch-checkbox" id="showTopAndDownBtn" type="checkbox">
              <label class="switch-label" for="showTopAndDownBtn">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>隐藏楼主勋章</span>
            <div class="switch">
              <input name="hideXunzhang" value="true" ${
                getUserSetting("hideXunzhang") ? "checked" : ""
              }  class="switch-checkbox" id="hideXunzhang" type="checkbox">
              <label class="switch-label" for="hideXunzhang">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>图片宽度(px)</span>
            <input name="imgThumbWidth" class="setting-li-input" type="number" value="${getUserSetting("imgThumbWidth")}"/>
          </li>
          <li class="setting-li-tips">缩放页面中图片到指定宽度,设置为 0 时不缩放</li>
          <li class="setting-li-between">
            <span>图床选择</span>
            <select name='imgUploadSelOpt' class="reset" style="font-size: 12px;width:116px;padding-left:8px;height:25px;">
              <option value="0" ${getUserSetting("imgUploadSelOpt") == 0 ? "selected" : ""}>美团</option>
              <option value="1" ${getUserSetting("imgUploadSelOpt") == 1 ? "selected" : ""}>水墨</option>
            </select>
          </li>
          <li class="setting-li-between sel-suimo">
            <span><a href="https://img.ink/user/settings.html" target="_blank">水墨图床token</a></span>
            <input style="width:100px;" class="setting-li-input" value="${getUserSetting(
              "suimoToken"
            )}" name="suimoToken" id="suimoToken" type="text" placeholder="为空则不会上传…"/>
          </li>
          <li class="setting-li-between">
            <span>我要用右手</span>
            <div class="switch">
              <input name="useRight" value="true" ${
                getUserSetting("useRight") ? "checked" : ""
              }  class="switch-checkbox" id="useRight" type="checkbox">
              <label class="switch-label" for="useRight">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-tips">将帖子列表的下一页按钮显示在右边</li>
          <li class="setting-li-between">
            <span>帖子自动加载</span>
            <div class="switch">
              <input name="autoLoadMoreBookList" value="true" ${
                getUserSetting("autoLoadMoreBookList") ? "checked" : ""
              }  class="switch-checkbox" id="autoLoadMoreBookList" type="checkbox">
              <label class="switch-label" for="autoLoadMoreBookList">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>回复自动加载</span>
            <div class="switch">
              <input name="autoLoadMoreHuifuList" value="true" ${
                getUserSetting("autoLoadMoreHuifuList") ? "checked" : ""
              }  class="switch-checkbox" id="autoLoadMoreHuifuList" type="checkbox">
              <label class="switch-label" for="autoLoadMoreHuifuList">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between">
            <span>帖子在弹窗中打开</span>
            <div class="switch">
              <input name="openLayerForBook" value="true" ${
                getUserSetting("openLayerForBook") ? "checked" : ""
              }  class="switch-checkbox" id="openLayerForBook" type="checkbox">
              <label class="switch-label" for="openLayerForBook">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-tips">仅在PC端生效,且弹窗中无法使用脚本</li>

          <li class="setting-li-title more-setting more-setting-click" style="margin-bottom:0;"><hr><b>高级设置</b><hr></li>
          <li class="more-setting" style="font-size:12px;text-align:center;margin:-16px 0;color:red;">使用以下功能前请先熟读并背诵版规(手动狗头.jpg)</li>
          <li class="setting-li-between more-setting">
            <span>一键吃肉</span>
            <div class="switch">
              <input name="oneClickCollectMoney" value="true" ${
                getUserSetting("oneClickCollectMoney") ? "checked" : ""
              }  class="switch-checkbox" id="oneClickCollectMoney" type="checkbox">
              <label class="switch-label" for="oneClickCollectMoney">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between more-setting">
            <span>吹牛历史查询</span>
            <div class="switch">
              <input name="showChuiniuHistory" value="true" ${
                getUserSetting("showChuiniuHistory") ? "checked" : ""
              }  class="switch-checkbox" id="showChuiniuHistory" type="checkbox">
              <label class="switch-label" for="showChuiniuHistory">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between extra-setting" style="display:none;">
            <span>复读机(回帖+1)</span>
            <div class="switch">
              <input name="showHuifuCopy" value="true" ${
                getUserSetting("showHuifuCopy") ? "checked" : ""
              }  class="switch-checkbox" id="showHuifuCopy" type="checkbox">
              <label class="switch-label" for="showHuifuCopy">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
          <li class="setting-li-between extra-setting" style="display:none;">
            <span>复读机自动提交</span>
            <div class="switch">
              <input name="huifuCopyAutoSubmit" value="true" ${
                getUserSetting("huifuCopyAutoSubmit") ? "checked" : ""
              }  class="switch-checkbox" id="huifuCopyAutoSubmit" type="checkbox">
              <label class="switch-label" for="huifuCopyAutoSubmit">
                <span class="switch-inner" data-on="开" data-off="关"></span>
                <span class="switch-switch"></span>
              </label>
            </div>
          </li>
        </ul>
        <footer>
          <hr>
          <span class="setting-cancel-btn">取消</span>
          <span class="setting-confirm-btn">保存</span>
        </footer>
      </form>
      </div>
    `;
    container.append(vSettingEle);
    // 监听下拉选择,改变其他元素状态
    $('form[name="settingForm"]')
      .find("select")
      .on("change", function () {
        const selectName = $(this).attr("name");
        const selectedValue = $(this).val();

        if (selectName === "imgUploadSelOpt") {
          if (selectedValue == 0) $(".setting-div .sel-suimo").hide();
          else if (selectedValue == 1) $(".setting-div .sel-suimo").show();
        }
      });
    // 禁止蒙版下的body内容滚动
    $("body").css("overflow", "hidden");
    // 高级设置——额外设置
    $(".setting-div .more-setting-click").click(
      clickCounter(
        ".setting-div .more-setting-click",
        () => {
          $(".setting-div .extra-setting").toggle();
        },
        3,
        3
      )
    );
    // 清除缓存
    $(".setting-div .clear-setting").click((e) => {
      localStorage.removeItem("yaohuoBetterPlusSetting");
      setTimeout(() => {
        window.location.reload();
      }, 300);
    });
    // 取消按钮
    $(".setting-div .setting-cancel-btn").click(closePopupContainer);
    // 提交按钮
    $(".setting-div .setting-confirm-btn").click(() => {
      const formData = {};
      $('form[name="settingForm"]')
        .find("input, select")
        .each(function () {
          // 根据不同输入方式格式化值,否则全部为字符串
          if ($(this).is(":checkbox")) {
            formData[this.name] = this.checked;
          } else if ($(this).is(":radio")) {
            const checkedValue = $('form[name="settingForm"]')
              .find('[name="' + this.name + '"]:checked')
              .val();
            formData[this.name] = checkedValue !== undefined ? checkedValue : null;
          } else if ($(this).attr("type") === "number") {
            formData[this.name] = parseFloat(this.value);
          } else if ($(this).attr("type") === "date") {
            formData[this.name] = new Date(this.value);
          } else if ($(this).is("select")) {
            formData[this.name] = parseFloat(this.value);
          } else {
            formData[this.name] = this.value;
          }
        });

      const cacheSetting = JSON.parse(localStorage.getItem("yaohuoBetterPlusSetting"));
      for (const key of Object.keys(formData)) {
        cacheSetting[key] = formData[key];
      }
      console.log("%c ===> [ cacheSetting ] <===", "font-size:13px; background:pink; color:#bf2c9f;", cacheSetting);
      try {
        localStorage.setItem("yaohuoBetterPlusSetting", JSON.stringify(cacheSetting));
        notifyBox("保存成功");
      } catch (error) {
        notifyBox("保存失败", false);
      }
      // 刷新页面以应用新设置
      setTimeout(() => {
        window.location.reload();
      }, 300);
    });
    // 根据用户设置决定是否显示水墨图床 token 设置
    if (getUserSetting("imgUploadSelOpt") != 1) $(".setting-div .sel-suimo").hide();
  }
  // 设置 icon
  function createIcon() {
    // 页面内设置按钮,避免icon被设置为 0 时无法重置设置
    $(".subtitle2")
      .append("<span style='color:red;margin-left:15px;font-weight:bold;'>脚本设置</span>")
      .find("span")
      .click(() => {
        createPopupContainer();
      });

    const windowWidth = $(window).width();
    const bodyContentWidth = $("body").width();
    const iconSize = getUserSetting("settingIconSize") + "px";
    $("<img>")
      .attr("id", "settingICon")
      .attr("src", `${settingIconBase64}`)
      .css({
        "position": "fixed",
        "top": "10px",
        "right": "10px",
        "width": iconSize,
        "height": iconSize,
        "z-index": 9998,
      })
      .appendTo("body")
      .click(() => {
        createPopupContainer();
      });
    // PC端设置右偏移量
    if (windowWidth > bodyContentWidth) {
      const rightOffset = (windowWidth - bodyContentWidth) / 2 + 10;
      $("#settingICon").css("right", rightOffset + "px");
    }
  }
}

// 初始化本地设置文件(存放于localStorage,清除浏览器缓存会让设置失效)
function initSetting() {
  return new Promise((resolve, reject) => {
    const localSetting = JSON.parse(localStorage.getItem("yaohuoBetterPlusSetting")) || {};
    const saveSetting = { ...defaultSetting, ...localSetting }; // 合并设置,自定义项覆盖默认选项,避免添加新功能时已缓存设置没有新功能相关从而产生bug
    try {
      localStorage.setItem("yaohuoBetterPlusSetting", JSON.stringify(saveSetting));
      console.log("======> [ 已成功初始化设置 ]");
      resolve(true);
    } catch (error) {
      notifyBox("未知错误,初始化设置失败,请联系作者反馈bug…");
      reject(false);
    }
  });
}

// 判断是否是在网站中(有些手机端浏览器无法识别油猴 @match 标识,导致在所有网站都会执行脚本)
function checkLocation() {
  const currentHost = window.location.host;
  const targetHostArr = ["yaohuo.me", "www.yaohuo.me"];

  if (targetHostArr.includes(currentHost)) return true;
  else return false;
}

/* ================================================== 自定义方法开始 ================================================== */

// 加载并执行远程js文件,将其存入 localstorage
function loadAndExecuteScript(url, loaclStorageKey) {
  return new Promise((resolve, reject) => {
    const cacheScript = localStorage.getItem(loaclStorageKey);
    if (cacheScript && cacheScript.length > 0) {
      executeScript(cacheScript); // 执行缓存 js
      resolve(true);
    } else {
      fetch(url) // 加载远程 js
        .then((response) => response.text())
        .then((fetchScriptContent) => {
          executeScript(fetchScriptContent);
          localStorage.setItem(loaclStorageKey, fetchScriptContent);
          resolve(true);
        })
        .catch((err) => {
          notifyBox("未知错误,Jquery 加载失败,请刷新重试…", false);
          reject(false);
        });
    }
  });
}
// 执行指定内容 js 代码
function executeScript(scriptContent) {
  const script = document.createElement("script"); // 创建script元素
  script.text = scriptContent; // 设置脚本内容
  document.head.appendChild(script); // 执行脚本
}
// 解析各大视频平台url
function getVideoPlayUrl(url) {
  return new Promise((resolve, reject) => {
    if (url.includes("douyin")) {
      resolve(dy());
    } else if (url.includes("kuaishou")) {
    } else if (url.includes("bilibili")) {
    } else {
      reject();
    }
  });
  function dy() {
    const dyData = myAjax(url, { url }, "post", { headers: { "Access-Control-Allow-Origin": "*" } });
    console.log("%c ===> [ dyData ] <===", "font-size:13px; background:pink; color:#bf2c9f;", dyData);
  }
}

/**
 * 上传文件到指定api
 * @param {*} url api地址
 * @param {*} data 数据
 * @param {*} options 附加请求数据
 * @param {*} callback 回调函数
 * @param {*} type 请求方法
 */
function uploadFiles(url, data, options = {}, callback, type = "POST") {
  $.ajax({
    url,
    type,
    data,
    contentType: false,
    processData: false,
    dataType: "json", // 期望返回的数据格式
    ...options,
    success: (response) => {
      callback(response);
    },
    error: (error) => {
      console.error("未知错误,上传失败", error);
    },
  });
}

// 生成输入内容域
function showInputPopup(inputTitle, callback) {
  // 创建蒙版
  const mask = $('<div class="input-popup-mask"></div>');
  mask.click(function (event) {
    if (event.target === mask[0]) {
      mask.remove();
      callback(null);
    }
  });
  // 创建弹出框
  const popup = $('<div class="input-popup"></div>');
  // 创建输入框
  for (let i = 0; i < inputTitle.length; i++) {
    const inputBox = $(
      '<div class="input-popup-input"><label class="input-popup-label">' +
        inputTitle[i] +
        ':</label><textarea class="input-popup-textarea" rows="2" placeholder="请输入..."></textarea></div>'
    );
    popup.append(inputBox);
  }
  // 创建按钮容器
  const buttonsContainer = $('<div class="input-popup-buttons"></div>');
  // 创建取消按钮
  const cancelBtn = $('<button class="input-popup-cancel-btn">取消</button>');
  cancelBtn.click(function () {
    mask.remove();
    callback(null);
  });
  // 创建确定按钮
  const submitBtn = $('<button class="input-popup-submit-btn">确定</button>');
  submitBtn.click(function () {
    const inputs = $(".input-popup-textarea");
    const inputValues = [];
    inputs.each(function () {
      inputValues.push($(this).val());
    });
    mask.remove();
    callback(inputValues);
  });
  // 将按钮添加到按钮容器
  buttonsContainer.append(cancelBtn);
  buttonsContainer.append(submitBtn);
  // 将按钮容器添加到弹出框
  popup.append(buttonsContainer);
  // 将弹出框添加到蒙版
  mask.append(popup);

  // 将蒙版添加到页面
  $("body").append(mask);
}

// 判断是否为pc端浏览器打开
function isPC() {
  let userAgentInfo = navigator.userAgent;
  let mobileAgents = ["Android", "iPhone", "iPad", "iPod", "Windows Phone"];
  let isPC = true;
  for (let i = 0; i < mobileAgents.length; i++) {
    if (userAgentInfo.indexOf(mobileAgents[i]) > -1) {
      isPC = false;
      break;
    }
  }
  return isPC;
}

// 滚动页面到指定标签,并显示在屏幕中间
function scrollToEle(toEle, animateTime = 500) {
  const targetElement = $(toEle); // 使用适当的选择器选择目标元素
  const windowHeight = $(window).height(); // 获取窗口的高度
  const elementOffset = targetElement.offset().top; // 获取目标元素相对于文档顶部的偏移量
  const offset = elementOffset - windowHeight / 2; // 计算滚动的偏移量

  $("html, body").animate(
    {
      scrollTop: offset,
    },
    animateTime
  ); // 平滑滚动到计算的偏移量位置
}

// Ajax 请求
function myAjax(url, data, method = "Get", options) {
  return new Promise((resolve, reject) => {
    $.ajax({
      url,
      method,
      data,
      success: (response) => {
        resolve(response);
      },
      error: (error) => {
        reject(error);
      },
      ...options,
    });
  });
}

// 生成指定长度随机字符串
function generateRandomString(length) {
  let characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  let randomString = "";

  for (let i = 0; i < length; i++) {
    let randomIndex = Math.floor(Math.random() * characters.length);
    randomString += characters[randomIndex];
  }

  return randomString;
}

/**
 * 指定元素被点击*次后执行指定函数
 * @param {*} clickEle 指定元素
 * @param {*} callback 回调函数
 * @param {*} clickLimit 点击次数
 * @param {*} timeLimit 连续点击限制时间,单位/s
 */
function clickCounter(clickEle, callback, clickLimit = 3, timeLimit = 1) {
  $(clickEle).on("click", function () {
    let $button = $(this);
    let clickCount = $button.data("clickCount") || 0; // 获取点击次数,如果不存在则默认为0
    clickCount++; // 点击次数加1
    $button.data("clickCount", clickCount); // 存储点击次数

    if (clickCount === 1) {
      // 如果是第一次点击
      $button.data(
        "timeout",
        setTimeout(function () {
          $button.removeData("clickCount"); // 超时后移除点击次数数据
        }, timeLimit * 1000)
      ); // 设置时间窗口,单位为毫秒
    } else if (clickCount === clickLimit) {
      // 如果点击次数达到设定的限制
      clearTimeout($button.data("timeout")); // 清除超时
      $button.removeData("clickCount"); // 清除点击次数数据
      callback(); // 执行指定的回调函数
    }
  });
}
// 向页面中添加指定样式
function addCustomStyle() {
  // console.log("%c ===> [ 添加自定义样式 ] <===", "font-size:13px; background:pink; color:#bf2c9f;");
  $("<style>").text(customCSS).appendTo("head");
}
/**
 * 防抖
 * @param {*} func
 * @param {*} delay
 * @returns
 */
function debounce(func, delay = 800) {
  console.log("%c ===> [ 节流函数开始运行 ] <===", "font-size:13px; background:pink; color:#bf2c9f;");
  let timeoutId;

  return function () {
    clearTimeout(timeoutId);

    timeoutId = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  };
}

/**
 * 在指定textarea/input当前光标处插入内容
 * @param {*} content 插入内容
 * @param {String} targetEle 插入目标 element(jquery可使用的选择器)
 * @param {Boolean} autoFocus 是否自动获取输入焦点
 */
function insetCustomContent(content, targetEle, autoFocus = false) {
  const textarea = $(targetEle); // 获取目标元素
  if (autoFocus) {
    const cursorPosition = textarea[0].selectionStart; // 获取当前光标位置
    const currentValue = textarea.val(); // 当前内容
    const newValue = currentValue.slice(0, cursorPosition) + content + currentValue.slice(cursorPosition); // 将内容插入当前光标处。如果未选择输入框则插入最后
    textarea.val(newValue); // 写入完整内容
    // 将光标移到插入内容的最后
    textarea[0].selectionStart = cursorPosition + content.length;
    textarea[0].selectionEnd = cursorPosition + content.length;
    textarea.focus();
  } else {
    textarea.val(content);
  }
}

/**
 * 当前页面为指定 url 时执行函数
 * @param {*} targetPath 指定 url,可为正则表达式
 * @param {Function} executeFunction 执行函数
 * @param {Boolean} isRegex 是否使用正则判断 url
 */
function executeFunctionForURL(targetPath, executeFunction, isRegex = false) {
  if (isRegex) {
    targetPath.test(window.location.pathname) && executeFunction();
  } else {
    if (typeof targetPath !== "string" || typeof executeFunction !== "function") {
      throw new Error("参数无效!");
    }
    window.location.pathname === targetPath && executeFunction();
  }
}

// 从指定url获取get参数`
function getUrlParam(paramName, targetUrl = window.location.href) {
  try {
    let urlObj = new URL(targetUrl, window.location.origin);
    return urlObj.searchParams.get(paramName);
  } catch (error) {
    console.error("无效的URL:", targetUrl, error);
    return null;
  }
}
// 获取指定页面内容
function getPageContent(path, method = "GET") {
  const url = `${window.location.origin}${path}`;
  return new Promise((resolve, reject) => {
    $.ajax({
      url,
      method,
      dataType: "html",
      success: (response) => {
        resolve(response);
      },
      error: (error) => {
        reject(error);
      },
    });
  });
}

// 设置保存
function saveUserSetting(setName, setValue) {
  let cacheSetting = JSON.parse(localStorage.getItem("yaohuoBetterPlusSetting"));
  cacheSetting[setName] = setValue;
  try {
    localStorage.setItem("yaohuoBetterPlusSetting", JSON.stringify(cacheSetting));
    // notifyBox(successMsg);
  } catch (error) {
    // notifyBox(errorMsg, false);
    throw new Error("未知错误,保存设置失败");
  }
}
// 设置获取
function getUserSetting(name) {
  // let cacheSetting = JSON.parse(localStorage.getItem("yaohuoBetterPlusSetting"));
  // console.log("%c ===> [ cacheSetting ] <===", "font-size:13px; background:pink; color:#bf2c9f;", cacheSetting);
  // return cacheSetting[name];
  try {
    return JSON.parse(localStorage.getItem("yaohuoBetterPlusSetting"))[name];
  } catch (error) {
    throw new Error("未知错误,获取设置失败");
  }
}
// 等待提示框
function showWaitBox(msg) {
  const overlay = $('<div class="wait-box-overlay"></div>');
  const modal = $('<div class="wait-box-modal"></div>');
  modal.append('<div class="wait-box-spinner"></div>');
  modal.append(`<span class="wait-box-text">${msg}</span>`);
  overlay.append(modal);
  $("body").append(overlay);
  overlay.on("click", function (e) {
    e.stopPropagation();
  });
  return overlay;
}

/**
 * 弹出提示
 * @param {String} message 提示内容
 * @param {Boolean} status 提示状态,true成功,false失败,默认true
 * @param {Number} delayTime 提示时间/ms,默认1500ms
 */
let offsetY = 0; // 消息框初始垂直偏移量
function notifyBox(message, status = true, delayTime = 1500) {
  // 消息父容器
  const containerDiv = $("<div>")
    .css({
      "position": "fixed",
      "top": `calc(100px + ${offsetY}px)`,
      "left": "50%",
      "transform": "translateX(-50%)",
      "width": "350px",
      "max-width": "80%",
      "text-align": "center",
      "z-index": 9999,
    })
    .appendTo("body");
  // 消息框创建
  const messageDiv = $("<div>")
    .text(message)
    .css({
      "background": status ? "#f0f9eb" : "#fef0f0",
      "color": status ? "#67c23a" : "#f56c6c",
      "padding": "5px 20px",
      "box-shadow": "0 2px 4px rgba(0, 0, 0, 0.2)",
      "white-space": "normal",
      "wordWrap": "break-word",
      "overflowWrap": "break-word",
      "hyphens": "auto",
      "border-radius": "5px",
      "max-width": "100%", // 设置消息框的最大宽度
    })
    .appendTo(containerDiv);
  // 延迟后消息框销毁
  messageDiv
    .fadeIn()
    .delay(delayTime)
    .fadeOut(function () {
      containerDiv.remove();
      offsetY -= 50; // 删除后减少50px的垂直偏移量
    });

  offsetY += 50; // 增加消息框的高度和间距
}

/* ================================================== 自定义方法结束 ================================================== */