回答:
実際にチャネルを「スラックアーカイブ」するには、つまり、各チャネル内で「/ archive」を実行するのと同じように、APIの魔法が必要になります。
まず、https://api.slack.com/custom-integrations/legacy-tokensの関連チームでユーザーのAPIトークンを設定してから、https://api.slack.com/methods/channelsにアクセスします。 list / testを使用して、チャネルIDとともにチャネルのjsonリストを取得します。
次に、これらのチャネルIDを使用して、アーカイブするチャネルに対してhttps://api.slack.com/methods/channels.archive/testを実行します。
これは、チャンネル名に「sk-」が含まれている何百ものチャンネルをアーカイブするために、最近Macで実行した(jqを使用する)高速でダーティなbashスクリプトです。
TOKEN="replace-this-with-your-user-api-token-in-the-relevant-team"
curl "https://slack.com/api/channels.list?token=$TOKEN&exclude_archived=true&pretty=1" > /tmp/channels.list
IDS=$(cat /tmp/channels.list | jq '.channels[] | select(.name | contains("sk-")) | .id' | sed -e 's/"//g')
for ID in $IDS; do
URL="https://slack.com/api/channels.archive?token=$TOKEN&channel=$ID&pretty=1"
echo $URL
curl "$URL"
done
1秒あたり約2〜3チャネルをアーカイブして、仕事を完了しました。
channels.list
から新しいものに切り替えconversations.list
てparamを使用する必要がありました&types=private_channel
。同上変更channels.archive
へconversations.archive
[チームの設定]> [メッセージアーカイブ]に移動します。[エクスポート]タブを選択し、[エクスポートを開始]を選択します。このページの情報に従って、「一連のJSONファイル:アクティビティを含むチャネルごとに1つ、およびチームのすべてのメンバーに関する情報を含むファイル」で構成されるファイルが作成されます。
特にチャンネルに大量のメッセージトラフィックとメディアがある場合は、Slackがこのエクスポートを準備するのに少し時間がかかります(画像もエクスポートされます)。しばらくすると、エクスポートをダウンロードする準備ができたことを知らせるメールが送信されます。
これは、すべてのskチャネルをクリアするために使用する簡単なPHPスクリプトです
<?php
$json_url = "https://slack.com/api/channels.list?token=YOURTOKEN&pretty=1";
$json = file_get_contents($json_url);
$data = json_decode($json);
$m=count($data->channels);
echo "total channels:".$m."<br>";
$k=0;
for($i=0; $i<$m; $i++) {
//echo $data->channels[$i]->name."<br>";
$cn=$data->channels[$i]->name;
$cn2=$data->channels[$i]->is_archived;
if (strpos($cn, 'sk-') !== false and $cn2==0) {
echo $data->channels[$i]->name."(".$cn2.") (id=";
$cid=$data->channels[$i]->id;
echo $cid.');<br>';
$json_url2 = "https://slack.com/api/channels.archive?token=YOURTOKEN&channel=".$cid."&pretty=1";
$json2 = file_get_contents($json_url2);
++$k;
}
}
echo "total sk channels archived:".$k."<br>";
?>
3か月間に新しいメッセージが届かなかったすべてのチャンネルをアーカイブするために最近書いたkotlinスクリプトを次に示します。
注:ログのAPI制限に達した場合は、2分間待ってから再度実行してください。
import com.squareup.moshi.Moshi
import khttp.get
import java.time.ZonedDateTime
data class JsonChannelsList(
val channels: List<JsonChannel>
)
data class JsonChannel(
val id: String,
val name_normalized: String,
val is_archived: Boolean,
val is_private: Boolean
)
data class JsonMessages(
val messages: List<JsonMessage>
)
data class JsonMessage(
val username: String,
val text: String,
val ts: String
)
data class ArchiveableChannel(
val id: String,
val name: String
)
/**
* Arg 0 is your slack api token with user access (to be able to read channels)
*/
fun main(args: Array<String>) {
val moshi = Moshi.Builder().build()
val jsonChannelsAdapter = moshi.adapter(JsonChannelsList::class.java)
val jsonMessagesAdapter = moshi.adapter(JsonMessages::class.java)
val slackToken = args[0]
val list = get("https://slack.com/api/channels.list?token=$slackToken&exclude_archived=true&pretty=1")
val jsonChannelsList: JsonChannelsList = jsonChannelsAdapter.fromJson(list.jsonObject.toString()) as JsonChannelsList;
println("${list.statusCode} - ${list.jsonObject}")
val channels = jsonChannelsList.channels
val archivable = arrayListOf<ArchiveableChannel>()
println("Finding Archiveable Channels")
for (c in channels) {
println("Channel ${c.name_normalized} ")
if (c.is_private) {
println("private, skipped.")
continue
}
if (c.is_archived) {
println("archived already.")
continue
}
val channelId = c.id;
val THREE_MONTHS_AGO = ZonedDateTime.now().minusMonths(3).toEpochSecond()
val msgs = get("https://slack.com/api/channels.history?token=$slackToken&channel=$channelId&oldest=$THREE_MONTHS_AGO&count=1")
// print("messages ")
// println(msgs.jsonObject)
val jsonMessages: JsonMessages = jsonMessagesAdapter.fromJson(msgs.jsonObject.toString()) as JsonMessages
if (jsonMessages.messages.isEmpty()) {
archivable.add(ArchiveableChannel(c.id, c.name_normalized))
}
}
println("Archive Channels")
for (archiveChannel in archivable) {
println(archiveChannel)
val archivedResult = get("https://slack.com/api/channels.archive?token=$slackToken&channel=${archiveChannel.id}&pretty=1")
print("${archivedResult.statusCode} ")
print("${archiveChannel.name} ")
print("${archivedResult.jsonObject}.")
}
println("done.")
println("Archived ${archivable.size} channels.")
println("Archived $archivable")
}
必要な依存関係:
compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.3"
compile 'khttp:khttp:0.1.0'
compile("com.squareup.moshi:moshi-kotlin:1.8.0")
ここにソースプロジェクト:https : //github.com/novoda/spikes/tree/master/slackdeath