[小菜一碟] 如何將 LINE 會議室的連結分享到 LINE 社群?

自從 2020 年疫情大爆發以來,如果要票選疫情期間的關鍵字,「居家上班(Work From Home - WFH)」絕對是榜上有名,而各家即時通訊廠商為了 WFH 這件事情,無不卯足全力調整自家軟體功能,希望在這個特殊的時期能夠跟得上使用者的需求,其中在台灣擁有大量用戶的 LINE 就將其群組通話功能獨立出來做成「LINE 會議室」,使用者只要經由會議室連結就能直接進行群組通話,不需要是同一個群組內的成員,但是這個會議室連結無法分享在 LINE 社群,這篇文章就來說明要怎麼讓 LINE 會議室連結分享在 LINE 社群?

縮網址(已失效)

如果我們直接將會議室的連結貼到社群裡面,就會收到一個訊息「無法將會議室的邀請連結分享至社群」。

在約莫一個月前,縮網址大法還能逃過檢查,但是現在已經不行了,貼上縮網址後的會議室連結就會發現,訊息會被刪掉,即使把會議室連結貼到記事本去,也會被刪掉。

自架轉址服務

既然路不通了,我們就開路吧!合理推論,檢查機制應該是在「預覽超連結內容」的過程當中執行的,因此邏輯上我們只要騙過預覽機制就行了,我先寫了一支 Web Api 部署在 Azure App Service 上,來看看預覽機制發了什麼 Request 內容過來?

HomeController.cs

public class HomeController : Controller
{
    public IActionResult Index(string id)
    {
        var userAgent = this.Request.Headers[HeaderNames.UserAgent];

        this.ViewBag.Title = "Line 會議室";
        this.ViewBag.Description = userAgent;

        return this.View();
    }
}

Index.cshtml

@{
    Layout = null;
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewBag.Title - LineMeetingRoom</title>
    <meta name="description" content="@ViewBag.Description">
</head>
<body>
</body>
</html>

我先從 User-Agent 這個指標性的 Request Header 開始觀察,我將 User-Agent 的資訊放在 <meta name="description" content=""> 裡面,看看它跟一般瀏覽器的 User-Agent 有沒有差別?

從上圖得知,LINE 的預覽機制是把自己偽裝成 facebookexternalhit,然後在後面補上 line-poker 以示區別,所以我們可以嘗試針對這一個 User-Agent 回應 HTML 內容給它,其他的一律回應 302 轉址到會議室連結,看看這樣騙不騙得過預覽機制?

public class HomeController : Controller
{
    public IActionResult Index(string id)
    {
        var userAgent = this.Request.Headers[HeaderNames.UserAgent];
        var redirect = $"https://line.me/R/meeting/{id}";

        if (Regex.IsMatch(userAgent, "(?:facebook|line-poker)", RegexOptions.IgnoreCase))
        {
            this.ViewBag.Title = "Line 會議室";
            this.ViewBag.Description = redirect;

            return this.View();
        }

        if (string.IsNullOrEmpty(id)) return this.StatusCode(200);

        return this.Redirect(redirect);
    }
}

我們的運氣不錯,騙過預覽機制了,預覽機制收到的是我們回應給它的 HTML 內容,而使用者點擊連結則是跳出加入 LINE 會議室的提示。

我是不曉得為什麼 LINE 要限制會議室連結分享到社群?可能有我想不到的考量,不過 LINE 這麼做只能防止一般的使用者,程式設計師想弄還是有辦法的,如果有了解內情的朋友,方便的話,歡迎留言分享給我們知道。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學