👏

Slack のチャンネルを Teams のチームに移行した

2022/08/07に公開

はじめに

Slack のチャンネルを Teams に移行しようとしていろいろハマったのでメモ。

移行計画

目的

  • Slack 全体ではなく特定のチャンネルのみ移行
    • Slack で過去やり取りした情報を参照する必要があるもの
  • Slack の 1 チャンネルに対して Teams の新規チーム内の 1 チャンネルにマッピング

対象

  • 移行対象
    • メッセージ(一部メタデータを除く)
    • スレッド
    • 添付ファイル
  • 対象外
    • 各種メタデータ(投稿時刻のみ移行対象)
      • リアクション
      • メンション
      • サムネイル
      • 編集履歴
      • 投稿者(すべてシステムユーザーが投稿した扱いにする)

移行方法概要

  1. Slack API でチャンネルのログを取得
    1. Slack App の作成と設定
    2. アクセストークンの取得
    3. チャンネルの取得
    4. メッセージの取得
    5. スレッドメッセージの取得
    6. 添付ファイルの取得
  2. Microsoft Graph API で Slack のログを移行
    1. Azure AD でアプリの作成と設定
    2. 移行チームの作成
    3. 移行チャンネルの作成
    4. ファイルのアップロード
    5. メッセージの投稿
    6. リプライの投稿
    7. 移行チャンネルの完了
    8. 移行チームの完了
    9. 移行チームのオーナーの追加

移行方法詳細

1. Slack API でチャンネルのログを取得

1.1. Slack App の作成と設定

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 でアプリの作成と設定

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 が指定可能
  • 添付ファイルがある場合は、アップロードしたファイルを attachments(chatMessageAttachment)に追加する
    • id はアップロードしたファイルの ETag から抽出した GUID を利用する(そうしないと Teams のメッセージの添付ファイルをクリックしても not found になる)
    • 添付したファイルの分だけ本文の末尾に <attachment id="<ファイルID>"></attachment> をつける

2.6. リプライの投稿

2.7. 移行チャンネルの完了

2.8. 移行チームの完了

  • team: completeMigration でチームの意向を完了する
    • チーム内の全チャンネルの移行が完了している必要がある

2.9. 移行チームのオーナーの追加

結果イメージ

移行前 Slack

移行後 Teams

移行後の番号付きリストのインデントがずれているのは凡ミス。

Discussion