我正在尝试将松弛的每个成员添加到我正在创建的新频道中。 (因为有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);
正如您在代码中看到的那样,尽管我能够找到适当的模态并设法更改了搜索字段中的输入值,但我目前实际上无法轻松地检索匹配的过滤后的轻松名称。我认为我只是错过了某些东西的触发,但是我不知道是什么。
在确定我缺少的步骤以便访问选项列表并使其正常工作方面,将有什么帮助。
答案 0 :(得分:1)
继@SeanKilleen之后,我实际上最近不得不这样做,并决定尝试使用他的方法将1530个用户从一个频道复制到另一个频道。
我已经记录了以下要点中使用的方法和脚本:
https://gist.github.com/norganna/12686901c0d802ed112d911ee24bc68c
答案 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
通过使用这些功能(以及在吸引所有用户的部分上可能使用一些分页循环),我想这会为您做到的。
(编辑:我意识到这会为您的方法提供一些可能并不实际的方法,并且假定您愿意适应它。如果您对此路线感兴趣,我很乐意为您提供支持它。可以在Twitter上直接发送DM @sjkilleen。)