Скрипт для приглашения всех членов команды на новый канал Slack - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь добавить каждого участника в новый канал, который я создаю. (Поскольку есть член 7k +, это не то, что я хочу делать вручную каждый раз, когда это происходит.) Есть много старых примеров того, как это сделать, но все они устарели из-за слабости, больше не включающей jQuery вих база данных, а также некоторые изменения классов и идентификаторов. Я очень близок к тому, чтобы заставить код работать, но пропустил один ключевой шаг, поэтому ищу помощь в разрешении.

Я начал с отработки последнего решения, представленного в этом очень старом посте: https://gist.github.com/YitzhakAndrade/1c7c2f7ac98520c9c84d536880f96770

Оригинальный (но очень старый код) код здесь (Примечание. Инструкции должны состоять в том, чтобы перейти к соответствующему слабому каналу в браузере, вставить скрипт в консоль разработчика Chrome / Firefox и нажать клавишу ввода.):

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 больше не включается в базу данных slack, поэтому код больше не работает.

Это моя текущая версия переписывания с подробным описанием проблем:

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);

Как видно из кода, встроенного в код, хотя я могу перейти к соответствующему модальному режиму и мне удалось изменить значение ввода в поле поиска, в настоящее время я не могу получить слабое извлечениесоответствующие отфильтрованные слабые имена. Я предполагаю, что мне просто не хватает срабатывания чего-либо, но я не знаю, что.

Буду рад любой помощи в определении того, какой шаг мне не хватает, чтобы получить доступ к списку опций и получить эту работу. .

1 Ответ

0 голосов
/ 12 октября 2019

Извините за краткость - на данный момент не слишком жарко - но я думаю, что смогу указать вам верное направление.

Здесь есть слабый клиент API для JS: 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 в Twitter.)

...