2016年6月25日 星期六

關於Telegram bot

最近telegram很紅,有興趣的話可以google一下,特別是有人拿Telegram與Line做了一個比較: https://blog.birkhoff.me/move-to-telegram-from-line/

對Telegram有興趣,是因為聽說它整個open source,除此之外API也是最開放的,由於最近幾個案子要做bot,但對於自己寫一個IM Client敬謝不敏,因此Telegram是一個很可以考慮的選擇。

Telegram的API分為兩種,主要的資訊可以參考這邊: https://core.telegram.org/

Telegram API : 讓你可以做一個自己的Telegram Client
Bot API : 讓你可以控制一個Telegram Bot

我們先來看Bot API,要玩Bot API,你得先有一個Telegram Bot,如何產生一個Telegram Bot呢? 得透過一個Bot,你沒聽錯,要建立Telegram Bot,你得跟BotFather這個bot打交道。(Telegram是透過bot產生一個bot,順帶一提,整個Telegram API文件當中,非常多搞幽默的冷笑話,和一般你看MSDN文件的精準風格很是不同)

當然,跟BotFahter溝通,你得先申請一個Telegram帳號並安裝Telegram Client,它是一個IM,所以當然有iOS/Android的版本,也有Desktop的版本。你可以在底下找到Client的下載位置:
https://telegram.org/apps

Telegram主要是用電話號碼來驗證身分和申請帳號,建議你申請完帳號之後,建立一個Telegram ID,如同Line/Skype ID一樣,以後這ID就代表你了。

我們先來看如何建立一個Bot,首先,你可以透過搜尋功能找到BotFather:

找到之後就可以跟他對談,Telegram的通訊和其他IM不同,沒有什麼加入好友的,你可以和找到的任何人通話。當你點選BotFather之後,會看到:

你可以對BotFather下/newbot的指令來建立一個bot,BotFather會問你該bot要叫什麼名字,以及該bot的Username,注意username必須包含bot,bot和一般帳號的區隔,可以參考底下文件:
https://core.telegram.org/bots#4-how-are-bots-different-from-humans

建立完成之後,你會取得該bot的token,格式類似底下這樣:
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

取得該Token之後,你就可以用HTTP API了,在Nuget上有些其他開發人員已經整理好的sdk,你可以考慮用底下這套: (請留意,我沒法擔保這個套件沒有問題,請自行留意使用)

Telegram API挺有趣,和其他SDK需要建立一個http服務或WebAPI不用,Telegram可以接透過Events來監聽傳送給bot的訊息,參考底下程式碼(留意這是一個Windows Application,而非WebSite):

private async void  button1_Click(object sender, EventArgs e)
{
    Telegram.Bot.TelegramBotClient tc =
        new Telegram.Bot.TelegramBotClient("bot的token");

    tc.MessageReceived += Tc_MessageReceived;
    tc.StartReceiving();
}

private void Tc_MessageReceived(object sender, Telegram.Bot.Args.MessageEventArgs e)
{
    MessageBox.Show(e.Message.Text);
}

上面這段程式碼,讓你建立一個BotClient,接著hook MessageReceieved事件,只要bot收到任何訊息,就會觸發這個事件,然後我們把事件中抓取到的訊息顯示出來,執行結果如下:

如果要做一個Echo Bot,也很簡單,只需要把程式碼改成:

        private void Tc_MessageReceived(object sender, Telegram.Bot.Args.MessageEventArgs e)
        {
            tc.SendTextMessageAsync(e.Message.Chat.Id, "你剛才說:" + e.Message.Text);
            //MessageBox.Show(e.Message.Text);
        }

執行結果如下:

坦白說,Telegram的bot寫法是最近測過的幾種裡面最簡單單純的了…再加上他整個open source,不失為企業應用的理想選擇…有興趣的朋友可以試試看。

2016年6月7日 星期二

關於Azure Subscription的Directory(目錄)問題

這個主題應該不是很多用戶會碰到,但因為連續幾次我都忘記了怎麼設定,因此還是稍微紀錄一下。

現在應該越來越多用戶在使用Azure了,而Azure基本的計費單位是Subscription(訂閱),用戶的訂閱可以從很多管道而來,一般用戶,每註冊一個Microsoft帳號,就可以在該帳號底下新增多個訂閱。例如,大多數的用戶可能是從底下的Free Trial網址新增的訂閱:
https://azure.microsoft.com/zh-tw/pricing/free-trial/ 

但問題來了,企業應用的時候不太容易使用員工的Microsoft帳號來管理Azure訂閱,況且,企業有Directory的需求(例如企業內的AD),會希望用類似AD這樣的機制來管理帳號,因此Azure也有個Azure上的AD,一般叫AAD。

而Azure Subscription則可以歸屬於特定的Azure AD,以便於企業用Azure AD上的帳號(人員)來進行統籌的管理,除此之外,AAD很有很多用途,我自己覺得AAD是微軟想要實現SSO與indetity management的一個重要步伐。

回到我們先前的主題,AAD的出現,使得Azure Subscription的管理模式有了一個改變,早期沒有AAD的時候,一個Microsoft帳號底下所能夠管理的訂閱,是依照該帳號是否為該訂閱的Service admin或co-admin來決定(下圖中的角色):

而AAD加入之後,其實,也是。

但差別在於,Portal在選擇某管理帳號所能管理的Subscription時,從原本的『帳號—>訂閱』這樣的關係,變成『帳號—>目錄—>訂閱』:

也就是說,如果你有某個帳號(不管是Microsoft Account或AAD的組織Account),只要該帳號是多個Azure Subscription的Service Admin或Co-Admin,而該帳號所能管理的訂閱,又分散在多個不同的AAD目錄底下時,就會出現上面這樣的畫面,你必須先選擇帳號,再選擇目錄,然後再從目錄選擇訂閱。而管理帳號在同一個畫面上,只能看到同一個目錄下的所有訂閱<--這是重點,這時候,想要同時管理多個不在同一個目錄下的訂閱,就非常的令人困擾。你必須常常在portal右上角的目錄清單間切來換去,而這目錄之間每次切換整個畫面都得Refresh,甚至SSO需要重新登入。

而且,為了符合『帳號—>目錄—>訂閱』這樣的管理階層與架構,哪怕你的Aure Subscription根本沒有企業使用的需求,Microsoft依舊幫你強迫自動建立了一個目錄,那些xxxxx.onmicrosoft.com的目錄就是這樣來的。

如果你有多個來源的Azure Subscription,例如MSDN、BizSpark、MVP、DreamSpark、Office 365、Free Trial...etc.你的訂閱目錄會非常可怕可觀...

所以,當你的公司建立了一個主要的AAD(directory)之後,應該盡可能把多個分散在不同目錄底下的訂閱,移動到同一個AAD底下。

接下來才是我們要講的重點,怎麼移呢?

請先到將要被移動的訂閱的帳號管理畫面,選擇Edit Subscription Details:

出現底下畫面後,將該訂閱的Service Admin改成目標AAD的Service Admin:

你做了上面這個動作之後,由於Service Admin已經被修改,因此你會在舊的帳號的Azure Portal管理站台中暫時看不到這個訂閱,別擔心,這其實也是我們的目的,我們希望用新設定的Service Admin帳號來統籌管理該訂閱(並且把所有的訂閱放在同一個目錄中)。

接著,請登出,用剛該才你設定的新的Service Admin的帳號登入Azure Management Portal,會看到該訂閱出現了(但目前還在不同的目錄中),接著,請在該訂閱的設定畫面中,選擇變更關聯的AAD(只要你設定正確,應該會發現可以變更關聯的目錄到你公司的主要目錄):

完成之後,你就可以在目的目錄的訂閱清單中,看到這個訂閱了:

從此之後,你可以在新設定的(也就是AAD的)管理帳號的Azure Management Portal中看到並管理這個訂閱。

azure的管理有三種不同的admin,分別是:

  • Account Admin: 你用哪一個帳號註冊(建立)的訂閱,該帳號就是Account Admin,這個無法調整,帳號的付費,信用卡綁定,都跟著這個帳號。
  • Service Admin: 這個可以調整,上面我們在過程中,就是調整這個Service Admin,以便於用同一個帳號來做管理,當你的訂閱調整了Service Admin,該帳號就是該訂閱的當然管理員。
  • Co-Admin: 一個訂閱可以新增多個Co-Admin,具有Co-admin權限的帳號,都可以管理該訂閱。

有沒有很複雜? 我覺得,其實,有。

有沒有更簡單的方式,有的,請撥 0800-008833