Greasy Fork is available in English.

斗鱼自动回复,可重复回复(刷屏)

斗鱼自动回复,自定义时间,次数,回复内容!

// ==UserScript==
// @name         斗鱼自动回复,可重复回复(刷屏)
// @namespace    http://tampermonkey.net/
// @version      1.3.7
// @description  斗鱼自动回复,自定义时间,次数,回复内容!
// @author       Pi7bo1
// @match        https://www.douyu.com/*
// @match        https://www.douyu.com/*/*
// @grant        none
// @supportURL   woxianshouboxian@163.com
// ==/UserScript==

(function () {
  "use strict";

  // Your code here...

  // 定义初始变量
  var dySendMsg = function (text, maxCount, stime) {
    this.dySendTextArr = [
      "黄初三年",
      "余朝京师",
      "还济洛川",
      "古人有言",
      "斯水之神",
      "名曰宓妃",
      "感宋玉对楚王神女之事",
      "遂作斯赋",
      "其辞曰:余从京域",
      "言归东藩",
      "背伊阙",
      "越轘辕",
      "经通谷",
      "陵景山",
      "日既西倾",
      "车殆马烦",
      "尔乃税驾乎蘅皋",
      "秣驷乎芝田",
      "容与乎阳林",
      "流眄乎洛川",
      "于是精移神骇",
      "忽焉思散",
      "俯则未察",
      "仰以殊观",
      "睹一丽人",
      "于岩之畔",
      "乃援御者而告之曰:“尔有觌于彼者乎?彼何人斯?若此之艳也!”御者对曰:“臣闻河洛之神",
      "名曰宓妃",
      "然则君王所见",
      "无乃是乎?其状若何?臣愿闻之",
      "余告之曰:“其形也",
      "翩若惊鸿",
      "婉若游龙",
      "荣曜秋菊",
      "华茂春松",
      "髣髴兮若轻云之蔽月",
      "飘飖兮若流风之回雪",
      "远而望之",
      "皎若太阳升朝霞;迫而察之",
      "灼若芙蕖出渌波",
      "秾纤得衷",
      "修短合度",
      "肩若削成",
      "腰如约素",
      "延颈秀项",
      "皓质呈露",
      "芳泽无加",
      "铅华弗御",
      "云髻峨峨",
      "修眉联娟",
      "丹唇外朗",
      "皓齿内鲜",
      "明眸善睐",
      "靥辅承权",
      "瑰姿艳逸",
      "仪静体闲",
      "柔情绰态",
      "媚于语言",
      "奇服旷世",
      "骨像应图",
      "披罗衣之璀粲兮",
      "珥瑶碧之华琚",
      "戴金翠之首饰",
      "缀明珠以耀躯",
      "践远游之文履",
      "曳雾绡之轻裾",
      "微幽兰之芳蔼兮",
      "步踟蹰于山隅",
      "于是忽焉纵体",
      "以遨以嬉",
      "左倚采旄",
      "右荫桂旗",
      "壤皓腕于神浒兮",
      "采湍濑之玄芝",
      "余情悦其淑美兮",
      "心振荡而不怡",
      "无良媒以接欢兮",
      "托微波而通辞",
      "愿诚素之先达兮",
      "解玉佩以要之",
      "嗟佳人之信修",
      "羌习礼而明诗",
      "抗琼珶以和予兮",
      "指潜渊而为期",
      "执眷眷之款实兮",
      "惧斯灵之我欺",
      "感交甫之弃言兮",
      "怅犹豫而狐疑",
      "收和颜而静志兮",
      "申礼防以自持",
      "于是洛灵感焉",
      "徙倚彷徨",
      "神光离合",
      "乍阴乍阳",
      "竦轻躯以鹤立",
      "若将飞而未翔",
      "践椒涂之郁烈",
      "步蘅薄而流芳",
      "超长吟以永慕兮",
      "声哀厉而弥长",
      "尔乃众灵杂沓",
      "命俦啸侣",
      "或戏清流",
      "或翔神渚",
      "或采明珠",
      "或拾翠羽",
      "从南湘之二妃",
      "携汉滨之游女",
      "叹匏瓜之无匹兮",
      "咏牵牛之独处",
      "扬轻袿之猗靡兮",
      "翳修袖以延伫",
      "体迅飞凫",
      "飘忽若神",
      "凌波微步",
      "罗袜生尘",
      "动无常则",
      "若危若安",
      "进止难期",
      "若往若还",
      "转眄流精",
      "光润玉颜",
      "含辞未吐",
      "气若幽兰",
      "华容婀娜",
      "令我忘餐",
      "于是屏翳收风",
      "川后静波",
      "冯夷鸣鼓",
      "女娲清歌",
      "腾文鱼以警乘",
      "鸣玉鸾以偕逝",
      "六龙俨其齐首",
      "载云车之容裔",
      "鲸鲵踊而夹毂",
      "水禽翔而为卫",
      "于是越北沚",
      "过南冈",
      "纡素领",
      "回清阳",
      "动朱唇以徐言",
      "陈交接之大纲",
      "恨人神之道殊兮",
      "怨盛年之莫当",
      "抗罗袂以掩涕兮",
      "泪流襟之浪浪",
      "悼良会之永绝兮",
      "哀一逝而异乡",
      "无微情以效爱兮",
      "献江南之明珰",
      "虽潜处于太阴",
      "长寄心于君王",
      "忽不悟其所舍",
      "怅神宵而蔽光",
      "于是背下陵高",
      "足往神留",
      "遗情想像",
      "顾望怀愁",
      "冀灵体之复形",
      "御轻舟而上溯",
      "浮长川而忘返",
      "思绵绵而增慕",
      "夜耿耿而不寐",
      "沾繁霜而至曙",
      "命仆夫而就驾",
      "吾将归乎东路",
      "揽騑辔以抗策",
      "怅盘桓而不能去",
    ]; // 默认为空时候喊话内容
    this.lastMsg = ""; // 上次喊话内容
    this.count = 0; // 当前喊话次数
    this.stext = localStorage.getItem("dyFunctionSend_textArr");
    this.stime = localStorage.getItem("dyFunctionSend_time") || 30; // 间隔时间 单位/秒
    this.auto = ""; //自动变量,用来定义/清除定时器
    this.maxCount = localStorage.getItem("dyFunctionSend_count") || 10; //最大喊话次数
    this.status = "stop"; //当前状态
  };

  //初始化发送模板
  dySendMsg.prototype.init = function () {
    var othis = this;

    var jsSendMsg = document.getElementById("js-chat-speak");

    //添加自定义定义样式
    var _styleElement = document.createElement("style");
    var _css =
      ".dyFunctionSend{background: #fff;width:100%;box-sizing: border-box;position:absolute;padding:5px 6px;z-index: 999;border: 1px solid #d2d2d2;bottom: 90px;left: 0;}";
    _css +=
      ".dyFunctionSend .form-control{box-sizing: border-box;background-color: #FFFFFF;resize:vertical;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;display: block;padding: 6px 12px;transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;width: 100%;}";
    _css += ".dyFunctionSend .form_item{margin:5px 0;font-size:14px}";
    _css += ".dyFunctionSend .form-control:focus{border-color: #1ab394;}";
    _css += ".dyFunctionSend_hide {display: none;}";
    _css +=
      ".dySend_btn {margin:5px;display: inline-block;height: 33px;line-height: 33px;padding: 0 18px;background-color: #009688;color: #fff;white-space: nowrap;text-align: center;font-size: 14px;border: none;border-radius: 2px;cursor: pointer;}";
    _css += ".dySend_btn:hover {opacity: 0.8}";
    _css += ".dySend_btn:active {opacity: 1}";
    _css +=
      ".dyFunctionSend .w50 {width:50%;display: inline-block;display: inline-block;box-sizing: border-box;}";
    _css +=
      ".dySend_start_btn,.dySend_stop_btn{background-color: #1E9FFF;display:none}";
    _css +=
      ".dySend_start_btn.show_d,.dySend_stop_btn.show_d{display:inline-block}";
    _css +=
      ".ChatSendMsgBtn {display: inline-block;vertical-align: middle;width: 22px;height: 22px;margin-right: 8px;cursor: pointer;}";
    _css +=
      ".ChatSendMsgBtn .laba{background:url('https://pic.superbed.cn/item/5cc178563a213b0417e51cc7') no-repeat;background-position: 2px 2px;}";
    _css += ".ChatSendMsgBtn.active .laba{background-position-x: -18px;}";
    _css += ".dySend_count {position:absolute;bottom: 8px;left: 15px;}";

    _styleElement.innerHTML = _css;
    document.getElementsByTagName("head")[0].appendChild(_styleElement);

    var fill_text = this.switchJsonToHtml(
      JSON.parse(localStorage.getItem("dyFunctionSend_textArr"))
    );

    //添加点击的弹框模板
    var dyFunctionSend = document.createElement("div");
    var _html = "";
    _html +=
      '<div class="form_item"><div class="col-100-w"><label>文本内容:</label></div>';
    _html +=
      '<div class="col-100-w"><textarea class="form-control"  placeholder="支持多条文本导入,文本之间使用回车隔开" name="" id="dyFunctionSend_text" rows="3">' +
      fill_text +
      "</textarea></div></div>";
    _html +=
      '<div class="form_item w50"><div class="col-100-w"><label>喊话次数:</label></div>';
    _html +=
      '<div class="col-100-w"><input class="form-control" placeholder="默认喊话喊话次数为 10" value="' +
      (localStorage.getItem("dyFunctionSend_count") || this.maxCount) +
      '" oninput="javascript:$dy.InputTextFilter.bind(this)()" type="text" name="" id="dyFunctionSend_count"></div></div>';
    _html +=
      '<div class="form_item w50"><div class="col-100-w"><label>喊话时间间隔:</label></div>';
    _html +=
      '<div class="col-100-w"><input class="form-control" placeholder="默认喊话时间间隔为 30" value="' +
      (localStorage.getItem("dyFunctionSend_time") || this.stime) +
      '" oninput="javascript:$dy.InputTextFilter.bind(this)()"  type="text" name="" id="dyFunctionSend_time"></div></div>';
    _html +=
      '<div class="col-100-w"><span style="color:#FF5722;padding-left: 5px" id="dyFunctionSend_error">设置需要保存才能生效</span></div>';
    _html +=
      '<div class="col-100-w" style="text-align: center;"><span onclick="javascript:$dy.save()" class="dySend_save_btn dySend_btn">保存</span><span onclick="javascript:$dy.start()" class="dySend_start_btn show_d dySend_btn">开始</span><span onclick="javascript:$dy.stop()" class="dySend_stop_btn dySend_btn">停止</span></div>';
    _html +=
      '<div style="top:-4px" onclick="javascript:$dy.changeDySendPanel()" class="PrivateLetter-close"><i></i></div>';
    _html +=
      '<div class="dySend_count"><p style="color:#009688" id="dySend_Num">已发送:0</p><p style="color:#01AAED" id="dySend_remainder">剩余次数:0</p></div>';

    dyFunctionSend.classList.add("dyFunctionSend", "dyFunctionSend_hide");
    dyFunctionSend.innerHTML = _html;
    dyFunctionSend.id = "dyFunctionSend";

    var chatMsgBox =
      document.querySelectorAll(".layout-Player-aside")[0] ||
      document.querySelectorAll("#js-live-room-normal-right .chat")[0];

    let loading_status = 0;

    // 斗鱼按钮栏插入按钮
    var timer = setInterval(function () {
      try {
        // 斗鱼ChatToolBar加载完成会覆盖掉添加的按钮   添加检查状态loading_status 如果被覆盖则重新添加按钮
        if (loading_status == 7) {
          return clearInterval(timer);
        }

        // 判断按钮是否已添加 定时器会再次判断是否已覆盖
        if (document.querySelector(".ChatSendMsgBtn")) {
          console.log(loading_status);
          return (loading_status += 1);
        } else {
          loading_status = 0;
        }

        var sendMsgBtn = document.createElement("div");
        sendMsgBtn.onclick = othis.changeDySendPanel;
        sendMsgBtn.classList.add("ChatSendMsgBtn");

        if (document.getElementById("js-chat-speak")) {
          sendMsgBtn.style.marginLeft = "5px";
          sendMsgBtn.innerHTML = `<div title="喊话设置" style="height:100%;margin-top:5px;" class="Horn4Category-btn laba"></div>`;
        } else {
          sendMsgBtn.innerHTML = `<div title="喊话设置" style="height:100%" class="Horn4Category-btn laba"></div>`;
        }

        var btnBox =
          document.querySelectorAll(".ChatToolBar")[0] ||
          document
            .getElementById("js-chat-speak")
            .querySelectorAll(".speak-up")[0];

        btnBox.appendChild(sendMsgBtn);
        chatMsgBox.appendChild(dyFunctionSend);
      } catch (err) {}
    }, 300);

    // if (document.querySelector(".ChatSendMsgBtn")) {

    // }
  };

  //localStorage 存储的文本转换填充
  dySendMsg.prototype.switchJsonToHtml = function (arr) {
    if (arr == null) {
      return "";
    }
    if (arr.length > 0) {
      return arr.join("\n");
    } else {
      return "";
    }
  };

  //输入框非数字过滤
  dySendMsg.prototype.InputTextFilter = function (d) {
    this.value = this.value.replace(/[^0-9]/g, "");
  };

  //开关面板
  dySendMsg.prototype.changeDySendPanel = function () {
    document
      .getElementById("dyFunctionSend")
      .classList.toggle("dyFunctionSend_hide");
    document.querySelectorAll(".ChatSendMsgBtn")[0].classList.toggle("active");
  };

  // 设置发送次数统计  已发送/未完成
  dySendMsg.prototype.setSendCount = function (sendCount, unfinishedCount) {
    document.getElementById("dySend_Num").innerText = "已发送:" + sendCount;
    document.getElementById("dySend_remainder").innerText =
      "剩余次数:" + unfinishedCount;
  };

  // 设置发送次数统计  已发送/未完成
  dySendMsg.prototype.setSendCount = function (sendCount, unfinishedCount) {
    document.getElementById("dySend_Num").innerText = "已发送:" + sendCount;
    document.getElementById("dySend_remainder").innerText =
      "剩余次数:" + unfinishedCount;
  };

  // 保存当前设置
  dySendMsg.prototype.save = function () {
    if (this.status == "start") {
      document.getElementById("dyFunctionSend_error").innerText =
        "需要先停止喊话才能进行修改";
      return;
    }

    var _stext = this.clearArrayTrim(
      document.getElementById("dyFunctionSend_text").value.split("\n")
    );

    this.stext = _stext;
    this.maxCount = document.getElementById("dyFunctionSend_count").value || 10;
    this.stime = document.getElementById("dyFunctionSend_time").value || 30;

    this.setSendCount(this.count, this.maxCount);

    document.getElementById("dyFunctionSend_error").innerText = "保存成功";

    // 保存当前设置
    localStorage.setItem("dyFunctionSend_textArr", JSON.stringify(_stext));
    localStorage.setItem("dyFunctionSend_count", this.maxCount);
    localStorage.setItem("dyFunctionSend_time", this.stime);

    setTimeout(this.resetTipText, 2000);
  };

  dySendMsg.prototype.resetTipText = function () {
    document.getElementById("dyFunctionSend_error").innerText =
      "设置需要保存才能生效";
  };

  // 开始
  dySendMsg.prototype.start = function () {
    this.autoSend();
    this.status = "start";
    document
      .querySelectorAll(".dySend_start_btn")[0]
      .classList.toggle("show_d");
    document.querySelectorAll(".dySend_stop_btn")[0].classList.toggle("show_d");
  };

  // 停止 清除定时器
  dySendMsg.prototype.stop = function () {
    this.count = 0;
    this.status = "stop";

    this.setSendCount(0, this.maxCount);
    clearTimeout(this.auto);
    setTimeout(this.resetTipText, 500);

    document
      .querySelectorAll(".dySend_start_btn")[0]
      .classList.toggle("show_d");
    document.querySelectorAll(".dySend_stop_btn")[0].classList.toggle("show_d");
  };

  // 等待发言cd
  dySendMsg.prototype.wait = function (timer) {
    var othis = this;
    return new Promise(function (resolve) {
      setTimeout(function () {
        resolve("true");
      }, (Number(othis.stime) + Math.random()) * 1000);
    });
  };

  // 等待发言cd
  dySendMsg.prototype.clearArrayTrim = function (array) {
    for (var i = 0; i < array.length; i++) {
      if (array[i] == "" || typeof array[i] == "undefined") {
        array.splice(i, 1);
        i = i - 1;
      }
    }
    return array;
  };

  // 自动发送
  dySendMsg.prototype.autoSend = function () {
    // this.changeDySendPanel();
    var jsSend =
      document.querySelectorAll(".ChatSend")[0] ||
      document.getElementById("js-send-msg");

    var currentMsg = "";

    // 文本数组循环
    var arr = JSON.parse(
      localStorage.getItem("dyFunctionSend_textArr") || "[]"
    );
    arr = arr.length < 1 ? this.dySendTextArr : arr;

    currentMsg = arr[this.count % arr.length];

    // 如果相同
    if (this.lastMsg === currentMsg) {
      currentMsg = "‍" + currentMsg;
    }

    //输入框赋值
    document.querySelectorAll(".ChatSend-txt ")[0].value = currentMsg;

    var e = document.createEvent("MouseEvents");
    e.initEvent("click", true, true);

    var sendBtn =
      document.querySelectorAll(".ChatSend-button")[0] ||
      jsSend.querySelectorAll(".ChatSend-button")[0] ||
      jsSend.querySelectorAll(".b-btn")[0];

    var _enentBtnText = sendBtn.innerText;

    if (_enentBtnText != "开火" && _enentBtnText != "发送") {
      document.getElementById("dyFunctionSend_error").innerText =
        "等待发言CD" + _enentBtnText + "秒";
      (async function () {
        var state = this.wait(_enentBtnText);
      }.bind(this)());
    } else {
      document.getElementById("dyFunctionSend_error").innerText =
        "弹幕发送中...";

      sendBtn.dispatchEvent(e);
      // 变量信息修改
      this.count += 1;
      this.lastMsg = currentMsg;

      this.setSendCount(this.count, this.maxCount - this.count);

      console.log("当前共发送" + this.count + "条弹幕");

      if (this.count >= this.maxCount) {
        document.getElementById("dyFunctionSend_error").innerText =
          "弹幕发送完成";
        this.stop();
        return;
      }
    }

    this.auto = setTimeout(
      this.autoSend.bind(this),
      (Number(this.stime) + Math.random()) * 1000
    );
  };

  window.$dy = new dySendMsg();
  $dy.init();
})();