邀请所有团队成员加入新的Slack频道的脚本

问题描述 投票:0回答:1

我正在尝试将松弛的每个成员添加到我正在创建的新频道中。 (因为有7k +成员,所以每次出现此操作时,我都不想要手动执行此操作。)有许多关于如何执行此操作的旧示例,但是由于松弛,它们都已过时,不再包含jQuery。他们的数据库以及一些类和id的更改。我非常接近使代码正常工作,但是缺少一个关键步骤,因此需要寻求解决的帮助。

我首先研究了这篇非常老的文章中提供的最后一个解决方案:https://gist.github.com/YitzhakAndrade/1c7c2f7ac98520c9c84d536880f96770

原始代码(但很旧的代码)在这里(注意:说明是在浏览器中浏览到适当的松弛通道,并将脚本粘贴到Chrome / Firefox开发者控制台中,然后按Enter。):

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
var letters = 'abcdefghijklmnopqrstuvwxyz';
async function inviteAllUsers() {      
   for(var i = 0; i < letters.length; i++){
      await sleep(300);
    $('#channel_actions_toggle').click();
      await sleep(300);
    $('#channel_invite_item').click();
      await sleep(300);
     for(var k = 0; k < letters.length; k++){
        var word = letters[i] + letters[k];
        await sleep(300);
        $("#channel_invite_filter").val(word).trigger("input");
        $(".channel_invite_member:not(hidden)").each(function(i, obj) {
            foundAny=true;
            this.click();
        });
      }
      await sleep(300);
      $('.invite_go').click()
    }
}

inviteAllUsers(); 
setInterval(inviteAllUsers,600*1000);

如上所述,jQuery不再包括在松弛数据库中,因此代码不再起作用。

这是我当前的重写版本,详细内容内联:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

var simulateClick = function(elem) {
  // Create our event (with options)
  var evt = new MouseEvent("click", {
    bubbles: true,
    cancelable: true,
    view: window
  });
  // If cancelled, don't dispatch our event
  var canceled = !elem.dispatchEvent(evt);
};

// var letters = "abcdefghijklmnopqrstuvwxyz";
var letters = "ab";
async function inviteAllUsers() {
  for (var i = 0; i < letters.length; i++) {
    await sleep(300);
    // Opens up the settings menu
    simulateClick(document.querySelector(".c-icon--cog-o"));
    await sleep(300);
    // Selects the "Add People to Channel" selection
    simulateClick(
      document.querySelectorAll(".c-menu__items .c-menu_item__li button")[1]
    );
    await sleep(300);
    for (var k = 0; k < letters.length; k++) {
      var word = letters[i] + letters[k];
      console.log(word);
      await sleep(300);
      // Inputs current word into the search field
      simulateClick(document.querySelector(".c-multi-select input"));
      document.querySelector(".c-multi-select input").value = word;
      // document.querySelector(".c-multi-select input").value = 'a';
      document
        .querySelector("#channel_invite_modal_select")
        .setAttribute("value", word);
      // document.querySelector("#channel_invite_modal_select").setAttribute('value', 'a');

      // THIS IS WHERE MY ISSUE LIES
      // By just adjusting the value in this way, I'm unable to actually have slack retrieve the matching filtered slack names.
      // When interacting with slack normally, the filtered list is shown upon typing in a letter.
      // With the script, although the letter will populate and the value will change to what's passed in,
      // it's as though something just isn't being triggered.

      // Once I get it so that the options will populate, I'll want to add the list provided.

      // I'm thinking something like below should work:
      document
        .querySelectorAll(".c-select_options_list__option")
        .forEach(function(option) {
          simulateClick(option)
        });
    }

    // Then, once all the names are selected, click the "Add" button.
    simulateClick(
      document.querySelectorAll(
        ".c-button[data-qa='invite_to_workspace_submit_button']"
      )
    );

    await sleep(300);
  }
}

inviteAllUsers();
setInterval(inviteAllUsers, 600 * 1000);

您可以看到与代码内联的代码,尽管我能够找到合适的模态并设法更改了搜索字段中的输入值,但我目前无法真正让松弛来检索匹配的已过滤松弛名称。我认为我只是错过了某些东西的触发,但我不知道是什么。

希望您能帮助我确定缺少的步骤,以便访问选项列表并使其正常工作。

javascript console slack
1个回答
0
投票

为简短起见,很抱歉-目前还不太热-但我想我可以为您指明正确的方向。

[这里有一个JS的松弛API客户端:https://www.npmjs.com/package/@slack/web-api,我相信该站点上的参考。它似乎得到很好的支持/维护。

我想您会使用users.list吸引所有用户:https://api.slack.com/methods/users.list

然后使用channel.invite将它们添加到通道:https://api.slack.com/methods/channels.invite

通过使用这些功能(以及在吸引所有用户的部分上使用一些分页循环,我认为这可以为您完成。

(编辑:我意识到这提供的内容可能并不适合您的方法,并且假定您愿意适应它。如果您对此路线感兴趣,我将很乐意为您提供支持。请随时在DM @sjkilleen上使用DM。)

© www.soinside.com 2019 - 2024. All rights reserved.