👏
Slack のチャンネルを Teams のチームに移行した
はじめに
Slack のチャンネルを Teams に移行しようとしていろいろハマったのでメモ。
移行計画
目的
- Slack 全体ではなく特定のチャンネルのみ移行
- Slack で過去やり取りした情報を参照する必要があるもの
- Slack の 1 チャンネルに対して Teams の新規チーム内の 1 チャンネルにマッピング
対象
- 移行対象
- メッセージ(一部メタデータを除く)
- スレッド
- 添付ファイル
- 対象外
- 各種メタデータ(投稿時刻のみ移行対象)
- リアクション
- メンション
- サムネイル
- 編集履歴
- 投稿者(すべてシステムユーザーが投稿した扱いにする)
- 各種メタデータ(投稿時刻のみ移行対象)
移行方法概要
- Slack API でチャンネルのログを取得
- Slack App の作成と設定
- アクセストークンの取得
- チャンネルの取得
- メッセージの取得
- スレッドメッセージの取得
- 添付ファイルの取得
- Microsoft Graph API で Slack のログを移行
- Azure AD でアプリの作成と設定
- 移行チームの作成
- 移行チャンネルの作成
- ファイルのアップロード
- メッセージの投稿
- リプライの投稿
- 移行チャンネルの完了
- 移行チームの完了
- 移行チームのオーナーの追加
移行方法詳細
1. Slack API でチャンネルのログを取得
1.1. Slack App の作成と設定
- https://api.slack.com/apps から新規アプリを作成
- OAuth & Permissions でスコープを追加
- 今回は自分が所属しているプライベートチャンネルが移行対象のため User Token Scopes で対応
- 必要なトークンは使う API のリファレンスページに記載(今回使った API は下記)
- Redirect URLs に適当なローカルホストの URL(例えば https://localhost:8080)を指定する
1.2. アクセストークンの取得
UI を作るのが面倒だったので、以下の方法でアクセストークンを取得
- 作成したアプリの Basic Information から Client ID と Client Secret を取得
- ローカルでアクセスログが取得可能な HTTPS サーバーを立てる
-
https://api.slack.com/authentication/oauth-v2 の "Create an Add to Slack button" で HTML ボタンを作るか、 https://slack.com/oauth/v2/authorize エンドポイントにリクエストを飛ばして返ってくる HTML を開く
curl "https://slack.com/oauth/v2/authorize?scope=&user_scope=channels%3Ahistory%2Cchannels%3Aread%2C<中略>&redirect_uri=https%3A%2F%2Flocalhost%3A8080&client_id=<Client ID>" >www/index.html
- Redirect URL に飛ばされ、サーバーのアクセスログに
/?code=XXXXXXXXXX
のようなコードが返ってくる - Slack の oauth.v2.access エンドポイントにリクエストを飛ばす。
curl -F code=<取得したコード> -F client_id=<Client ID> -F client_secret=<Client Secret> https://slack.com/api/oauth.v2.access | jq
1.3. チャンネルの取得
-
conversations.list からチャンネル一覧を取得し、目的とするチャンネルの ID で絞り込む
- デフォルトがパブリックチャンネルのみなのでプライベートチャンネルを指定する場合は
type
パラメーターを指定する。
- デフォルトがパブリックチャンネルのみなのでプライベートチャンネルを指定する場合は
1.4. メッセージの取得
- conversations.history からメッセージを取得する
- レスポンスで以下のものは移行対象外として除く
-
subtype
があるもの(メンバー参加メッセージ等) -
root
があるもの(スレッドのリプライでチャンネルにも投稿されたもの)
-
1.5. スレッドメッセージの取得
- 取得したメッセージのうち、
thread_ts
があるものはスレッドメッセージがあるため取得する - conversations.replies からメッセージを取得する
1.6. 添付ファイルの取得
- メッセージに
files
があるものは添付ファイルがあるため取得する -
url_private_download
の URL に Authorization ヘッダーをつけてファイルをダウンロードする
2. Microsoft Graph API で Slack のログを移行
2.1. Azure AD でアプリの作成と設定
- Azure AD のアプリの登録から新規アプリを作成
- API のアクセス許可から必要な Microsoft Graph のスコープを追加
- 「アプリケーションの許可」で追加
- API のリファレンスページから必要なスコープを確認して追加
- 組織の管理者の同意を与える
2.2. 移行チームの作成
-
移行モードでチームを作成する
- チームの作成時刻は過去時刻にする必要あり
.NET ユーザー向け
2.3. 移行チャンネルの作成
-
移行モードでチャネルを作成する
- チャンネルの作成時刻は過去時刻にする必要あり
- 移行モードでチャンネルを作成することにより他のユーザーとして投稿したり過去時刻での投稿ができる
- 逆に言えば投稿者や投稿時刻が気にならなければ移行モードである必要はない
2.4. ファイルのアップロード
-
filesFolder を取得するでチャンネルのフォルダーを取得する
- チームを作成してすぐだとフォルダーが存在しない場合があるため、リトライが必要
-
サイズの小さいファイルをアップロードするではファイルサイズ 4 MB があるため、 常に createUploadSession を利用すればよい
- createUploadSession はファイル ID が必要なので、サイズの小さいファイルをアップロードする API で 0 バイトのファイルを作成し、その ID を利用してアップロードすれば OK
- フォルダーに移行モードの概念がないため、タイムスタンプは移行不可
.NET ユーザー向け
2.5. メッセージの投稿
-
チャネルで chatMessage を送信するでメッセージを投稿
- Slack のメッセージから Teams へのメッセージの変換はがんばる
- HTML にする
- 投稿者は任意の Azure AD 内のユーザー ID が指定可能
- Slack のメッセージから Teams へのメッセージの変換はがんばる
- 添付ファイルがある場合は、アップロードしたファイルを attachments(chatMessageAttachment)に追加する
- id はアップロードしたファイルの ETag から抽出した GUID を利用する(そうしないと Teams のメッセージの添付ファイルをクリックしても not found になる)
- 添付したファイルの分だけ本文の末尾に
<attachment id="<ファイルID>"></attachment>
をつける
2.6. リプライの投稿
-
チャネル内のメッセージに返信を送信するで作成したメッセージに返信する
- メッセージ ID を指定するエンドポイントを利用する以外は通常のメッセージの投稿と同じ
2.7. 移行チャンネルの完了
- channel: completeMigration でチャンネルの移行を完了する
2.8. 移行チームの完了
-
team: completeMigration でチームの意向を完了する
- チーム内の全チャンネルの移行が完了している必要がある
2.9. 移行チームのオーナーの追加
-
チームにメンバーを追加するで所有者アカウントをチームに追加する
- それ以外のユーザーも必要であれば追加する
結果イメージ
移行前 Slack
移行後 Teams
移行後の番号付きリストのインデントがずれているのは凡ミス。
Discussion