Unityで files.getUploadURLExternal と files.completeUploadExternal を使ってSlackにファイルをアップロードする
files.uploadが廃止になると聞いたので。
SendToSlack.cs
try
{
const string fileName = "log.txt";
var initialComment = "コメント";
var logBytes = Encoding.UTF8.GetBytes(logText.ToString());
string uploadUrl;
string fileId;
{
using var request = UnityWebRequest.Get($"https://slack.com/api/files.getUploadURLExternal?filename={fileName}&length={logBytes.Length}&snippet_type=text");
request.SetRequestHeader("Authorization", $"Bearer {BotUserOAuthToken}");
var response = await request.SendWebRequest();
var temp = JsonUtility.FromJson<FilesGetUploadURLExternalResponse>(response.downloadHandler.text);
if (!temp.ok)
{
UnityEngine.Debug.LogError("files.getUploadURLExternal failed");
return;
}
uploadUrl = temp.upload_url;
fileId = temp.file_id;
}
{
var form = new WWWForm();
form.AddBinaryData("file", logBytes, fileName);
using var request = UnityWebRequest.Post(uploadUrl, form);
await request.SendWebRequest();
}
{
var wwwForm = new WWWForm();
wwwForm.AddField("initial_comment", initialComment);
wwwForm.AddField("channel_id", SlackChannelId);
wwwForm.AddField("files", $"[{{\"id\":\"{fileId}\"}}]");
using var request = UnityWebRequest.Post("https://slack.com/api/files.completeUploadExternal", wwwForm);
request.SetRequestHeader("Authorization", $"Bearer {BotUserOAuthToken}");
var response = await request.SendWebRequest();
var temp = JsonUtility.FromJson<FilesCompleteUploadExternalResponse>(response.downloadHandler.text);
if (!temp.ok)
{
UnityEngine.Debug.LogError("files.completeUploadExternal failed");
return;
}
}
UnityEngine.Debug.Log("Send success!");
}
catch (Exception e)
{
UnityEngine.Debug.LogError($"Send failed {e}");
}
// ===== //
[Serializable]
private class FilesGetUploadURLExternalResponse
{
// ReSharper disable InconsistentNaming
public bool ok;
public string upload_url;
public string file_id;
// ReSharper restore InconsistentNaming
}
[Serializable]
private class FilesCompleteUploadExternalResponse
{
// ReSharper disable InconsistentNaming
public bool ok;
// ReSharper restore InconsistentNaming
}