Recent in Recipes

[奇怪的案例怪談2]使用C#抓取股市資料(內涵VB寫法)

趁現在過年時間比較沒事的時候整理一下筆記,因為最近開始在研究Python的關係,爬資料的東西又開始出現啦!記得之前有寫過Java使用Jsoup套件來抓取資料[文章在這],當時是因為寫java寫到一個愛不釋手境界,那這次是用C#的方式來爬資料,原因是因為...工作再碰C#跟VB...(哀...嘆氣,所以就廢話不多說我就來開始進入正題囉!
我們要使用HtmlAgilityPack這個程式庫來完成這次抓取資料的功能,其實各位可以上他的官網來瞭解: https://html-agility-pack.net/,其實網站有似乎更新所以提供許多範例可以參考,但載點好像沒有單獨dll檔提供下載有點可惜QQ,而要使用這套件有兩種方式來Import:
  1. 載入外部dll檔(提供檔案載點:
https://www.dllme.com/dll/files/htmlagilitypack_dll.html )
  1. 使用NuGet套件管理員Import(適用Visual Studio 2013之後版本)
這次的環境是2013版本,所以我用的是第1種方式(咦!?怎麼不是第二種XD),因為我有前人所留下的dll檔所以我就直接Import啦!這裡先解說如何加入dll檔,首先把注意力移到右邊專案中尋找參考後點擊右鍵有個加入參考如圖一所示,點擊後會顯示圖二的畫面,將dll檔案瀏覽選取後即可加入。

P3
※圖一 加入參考

P4
※圖二 加入本機端的dll檔

 而第二種方法是給2013版本後的做參考,這方法其實更方便,那就是直接去套件管理員尋找並安裝如圖三與圖四,這樣可以省去搜尋dll檔的時間!
P1
※圖三 開啟套件管理員

P2
※圖四 搜尋HtmlAgilityPack 套件並安裝

倘若把套件Import好後,就可以開始打程式囉!關於程式的部分也可以參考:
  1. https://dotblogs.com.tw/jackbgova/2014/06/10/145471
  2. https://dotblogs.com.tw/shadow/2011/12/12/61598
第一篇是我在整理文章內容找到的,老實說有點可惜,因為我的問題都解決才找到的,第二篇是我覺得可以先看的,我覺得觀念的東西可以先看這個,然後看第一篇,因為兩個寫法不一樣可以學習到很多。
首先先貼上畫面與C#的程式碼

 
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CshapClimbDemo.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style type="text/css">
        #stock {
            text-align: left;
        }
    </style>
</head>
<body style="text-align: center">
    <form id="form1" runat="server">
    <div id="stock">
        <span id="title-stock">&nbsp;&nbsp;
        台積電(
    <asp:Label ID="Label01" runat="server"></asp:Label>) &nbsp;&nbsp;&nbsp;
        時間 :
        <asp:Label ID="Label03" runat="server"></asp:Label>&nbsp; &nbsp;&nbsp; </span><br />
        <span style ="padding-left :20px;">成交價 :<asp:Label ID="Label07" runat="server" Font-Bold="True" Font-Size="15pt"></asp:Label></span> <br />
        <span style ="padding-left :20px;">成交量 :<asp:Label ID="Label08" runat="server"></asp:Label></span><br />
        <span style ="padding-left :20px;">最高價 :<asp:Label ID="Label05" runat="server"></asp:Label>&nbsp;&nbsp; &nbsp;
        最低價 :<asp:Label ID="Label06" runat="server"></asp:Label></span> <br />
        <span style ="padding-left :20px; text-align: left;">開盤價 :<asp:Label ID="Label04" runat="server"></asp:Label>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
        <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="WebForm1.aspx" Target="_self">Refresh</asp:HyperLink>
        <br />
        <br />
        <asp:Label ID="Label9" runat="server" Text="Label"></asp:Label>
        </span></div>
    </form>
</body>
</html>

 
using HtmlAgilityPack; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace CshapClimbDemo { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Getstock(); } private void Getstock() { //int i = 0; try { //1.指定要開啟的網站,然後使用MemoryStream暫存 此範例為奇摩台積電股票 WebClient climb = new WebClient(); MemoryStream ms = new MemoryStream(climb.DownloadData("http://tw.stock.yahoo.com/q/q?s=2330")); //2.使用HtmlDocument載入第一層網頁資料 HtmlDocument doc = new HtmlDocument(); doc.Load(ms, Encoding.Default); HtmlDocument docStockContext = new HtmlDocument(); docStockContext.LoadHtml(doc.DocumentNode.SelectSingleNode("html[1]/body[1]/center[1]/table[2]/tr[1]/td[1]/table[1]").InnerHtml); //3.根據資料在哪個標籤就讀取標籤的內容 我這裡使用陣列儲存讀到的資料 HtmlNodeCollection nodeHeaders = docStockContext.DocumentNode.SelectNodes("./tr[1]/th"); String[] sValues = docStockContext.DocumentNode.SelectSingleNode("./tr[2]").InnerText.Trim().Split(' '); //※可以使用這個迴圈觀察資料的內容以及分割情況 /*foreach(String s in sValues){ this.Label9.Text += s +" "+i++ +" "; }*/ //4.最後顯示資料 可以使用我存取的陣列來呈現 或是把剛剛讀取標籤的內容轉成字串來呈現 this.Label01.Text = docStockContext.DocumentNode.SelectSingleNode("./tr[2]/td[1]").InnerText.Trim().ToString().Substring(0,4); this.Label03.Text = sValues[16].Trim(); this.Label04.Text = sValues[128].Trim(); this.Label05.Text = sValues[144].Trim(); this.Label06.Text = sValues[160].Trim(); this.Label07.Text = sValues[32].Trim() + " ( " + sValues[80].Trim() + " )"; this.Label08.Text = sValues[96].Trim(); //※顏色編輯如果漲停就紅色 跌就綠色 if (sValues[80].Trim().IndexOf('△') > -1) { Label07.ForeColor = System.Drawing.Color.Red; } else { Label07.ForeColor = System.Drawing.Color.Green; } } catch (Exception e) { this.Label9.Text = e.Message.ToString(); } } } }
最後呈現的結如下圖五,我選了台積電當這次的範例,哇!!!!是紅字喲!如果有人買他們的股票我會含淚幫你們鼓掌的!(因為我買不起阿~~)...... 我稍微解說一下我程式的寫法,我寫一個方法然後透過Page_Load來呼叫他,然後用例外框架來顯示如果發生錯誤是如何發生的,可能有些人不習慣用例外直接寫也是可以的,不過還是要養成良好的習慣比較好喲!再來是解析標籤,他的路徑表示是XPath,大家可以參考微軟官網的資料 https://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx ,然後解析出來的資料用Split('')來存到陣列裡,其實也可以直接解析轉字串,但陣列真的方便許多!

P5
※圖五 顯示結果

 那如果是VB怎麼打呢?我就不多說直接貼給大家程式碼

 
Imports System.IO Imports System.Net Imports HtmlAgilityPack Imports System.Text Partial Class Stock2330 Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load GetData2330() End Sub Private Sub GetData2330 () Try Dim client As WebClient = New WebClient() Dim ms As MemoryStream = New MemoryStream(client.DownloadData("http://tw.stock.yahoo.com/q/q?s=2330")) ' Dim doc As HtmlDocument = New HtmlDocument() doc.Load(ms, Encoding.Default) Dim docStockContext As HtmlDocument = New HtmlDocument() '因錯誤訊息顯示無法讀取網站資料 XPath路徑做更改 docStockContext.LoadHtml(doc.DocumentNode.SelectSingleNode("html[1]//body[1]//center[1]//table[2]/tr[1]/td[1]/table[1]").InnerHtml) ' Dim nodeHeaders As HtmlNodeCollection = docStockContext.DocumentNode.SelectNodes("./tr[1]/th") Dim sValues() As String = docStockContext.DocumentNode.SelectSingleNode("./tr[2]").InnerText.Trim().Split(" ") ''輸出資料() 'Dim i As Integer = 0 'For Each nodeHeader As HtmlNode In nodeHeaders ' txtMsg.Text = txtMsg.Text + nodeHeader.InnerText + ":" + nodeData(i).InnerText ' i += 1 'Next Me.Label01.Text = sValues(0).Trim.Substring(0, 4) Me.Label03.Text = sValues(16).Trim Me.Label04.Text = sValues(128).Trim Me.Label05.Text = sValues(144).Trim Me.Label06.Text = sValues(160).Trim Me.Label07.Text = sValues(32).Trim + " ( " + sValues(80).Trim + " ) " Me.Label08.Text = sValues(96).Trim If sValues(80).Trim.IndexOf("△") > -1 Then Me.Label07.ForeColor = Drawing.Color.Red ElseIf sValues(80).Trim.IndexOf("▽") > -1 Then Me.Label07.ForeColor = Drawing.Color.Green End If Catch ex As Exception Me.Label01.Text = " " Me.Label03.Text = " " Me.Label04.Text = " " Me.Label05.Text = " " Me.Label06.Text = " " Me.Label07.Text = " " Me.Label08.Text = " " End Try End Sub

如果各位有感覺的話可以發現,其實兩個程式碼是差不多的(邏輯上)所以如果是寫VB的朋友也不用擔心,前面的套件也是一樣的做法,請大家安心服用!

最後要跟各位分享這次的奇怪案例,因為我們公司爬資料這塊是用VB來爬的,其實這是前人寫好的功能,我也沒有理他,好死不死去年12月底的時候這個功能給我掛掉了,然後內網網站呈現紅通通的錯誤訊息讓我差點嚇到100天才能回去過年!!於是我看來看去發現他的程式首先沒有用例外框架來包覆,所以我補上例外框架讓可以用的功能能正常運作,在來就是看為什麼會突然失效,我查了一下判定是沒讀到股市資料,這就表示XPath的抓取位置是有問題的,於是我就看了半天再"html[1]/body[1]/center[1]/table[2]/tr[1]/td[1]/table[1]"這個路徑補了一些東西那就是
"html[1]//body[1]//center[1]//table[2]/tr[1]/td[1]/table[1]" 大家有看出來嗎?我在table之前都多加了一個斜線,兩條斜線表示抓取所有那個標籤的資料,我就想一條抓不到我就設兩條就跑不了了吧!結果一更新上去後...沒錯...,他好了...所以為什麼會突然失效呢?我也是不知道,不過還好解決了這個問題,另外我在例外處裡的地方如果這功能有錯誤就顯示無資料,其實眼尖的朋友可以看一下我VB的程式碼就知道標籤的例外處裡就是空白,其實美觀以外就是跟我說這功能有問題了,也不會馬上被其他單位的主管發現(噓!~~~~)
好的!以上是我這次分享的奇怪案例

[奇怪的案例怪談1]如何使用PHP寄送郵件

哈囉!我又出現了!非常非常久沒有打文章了,因為這兩年其實小弟我有一些原因所以比較沒有時間碰,現在可以好好的來介紹一些功能與案例,之後也會介紹一些容易上手的東西,希望大家對於資訊,尤其是程式設計更有興趣。

今天要介紹的是如何使用PHP來寄送郵件,這個功能我覺得對於網站設計應該是很實用的,近期正好有架設網站的需求,以及維護的案例,有幸來跟大家介紹一下,我們使用的套件為PHPMailer,主要架構為PHP撰寫,其實也爬了許多網站這裡來做個統整,首先來先下載PHPMailer套件,提供Github的網址https://github.com/Synchro/PHPMailer
接下來要做的就是些設定,首先打開要設定轉寄寄信的Gmail然後進去後到右上角的齒輪如下圖,然後點下去之後選擇設定

1
※Gmail設定

之後會顯示一些選項,選擇轉寄和POP/IMAP,然後將POP功能與IMAP功能打開如下圖所示

2
※打開POP/IMAP功能

關於POP/IMAP與SMTP呢…還是稍微稍微的介紹一下,先附上資料連結
  1. https://support.office.com/zh-hk/article/imap-%E5%92%8C-pop-%E6%98%AF%E4%BB%80%E9%BA%BC%EF%BC%9F-ca2c5799-49f9-4079-aefe-ddca85d5b1c9
  2. https://blog.xuite.net/cyclone/blog/56713570-%E4%B8%80%E6%AC%A1%E6%90%9E%E6%87%82SMTP%E3%80%81POP3%E3%80%81IMAP%E6%98%AF%E4%BB%80%E9%BA%BC
P.S.因為我也是查了資料才知道XD
SMTP是規範在RFC 821,其Port為25,當初是給公司內部郵件傳遞,隨著時間的演進現今的規範比較完整統一了電子郵件的規格。
POP與IMAP的不同為POP為一次下載郵件後刪除,也就是說只有一台能夠讀取郵件資料,IMAP則是在線上讀取資料,不做下載的動作,如果根據現今的要求來看,IMAP是比較符合使用者需求的,因為使用者不可能永遠只用一種裝置看郵件。
PS.其實我有事過沒有設定也可以寄送XD 但是我覺得搞不好是之前有設定然後網頁瀏覽器有記錄到,所以還是乖乖設定比較保險
好的!其實我扯遠了,Gmail的部分還有一個東西要設定,開啟安全性設定開啟允許較低安全性的應用程式將他打開,如下圖所示

3
※允許較低安全性的應用程式

關於Gmail已經設定完成了,還有一個東西要設定(還來啊!=口=’’’) ,既然是PHP當然少不了Web server囉,因為小弟是使用XAMPP來設定,所以我這裡教的是XAMPP的修改,如果是使用AppServ可以參考這篇非常詳細的文章,這篇也解決了我許多問題
http://edu.unethost.com/%E4%B8%BB%E6%A9%9F%E7%9B%B8%E9%97%9C/phpmailer-%E9%81%8B%E7%94%A8gmail%E4%BE%86%E5%AF%84%E4%BF%A11/
打開XAMPP,在Apache中點選PHP.ini 如下圖

4
※XAMPP Apache php.ini

終於我們把需要設定的都設定完了!再來是將套件與程式碼放置Web server中(htdocs資料夾裡),程式碼雖然Github內文中有解說如何使用,不過還是要提供一下程式碼啦!

 
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer-master/src/Exception.php';
require 'PHPMailer-master/src/PHPMailer.php';
require 'PHPMailer-master/src/SMTP.php';
$content="<p style='color:#F00'>訪客: "."test".", 於官方網站內發出一則詢問信件, 請您務必盡快與他(她)聯絡或回覆詢問!! </p>姓名:"."test"."<br />"."電話:"."0955555555"."<br />"."E-MAIL:"."test@test.org"."<br />"."公司:"."test"."<br />"."<br />"." "."意見或詢問:"."test"."<br/><br/><h4 style='color:#F00'>< 本信件為系統寄發,請勿直接回覆 ></h4>";
$mail= new PHPMailer(); //建立新物件
$mail->IsSMTP(); //使用SMTP方式寄信
$mail->SMTPAuth = true; //設定SMTP需要驗證
$mail->SMTPSecure = "ssl"; // Gmail的SMTP主機需要使用SSL連線
$mail->Host = "smtp.gmail.com"; //Gamil的SMTP主機
$mail->Port = 465; //SMTP預設為25 Gamil的SMTP主機的埠號。
$mail->CharSet = "utf-8"; //郵件編碼
$mail->Username = "XXXX@gmail.com"; //Gamil帳號
$mail->Password = "XXXX"; //Gmail密碼
$mail->From = "epaper@test.com"; //寄件者信箱
$mail->FromName = "TEST Technology Corp."; //寄件者姓名
$mail->Subject ="這是SMTP測試信"; //郵件標題
$mail->Body =$content; //郵件內容
$mail->IsHTML(true); //郵件內容為html
$mail->AddAddress("OOO@gmail.com"); //收件者郵件及名稱
$mail->AddBCC(" "); //設定 密件副本收件者
if(!$mail->Send()){
echo "Fail: " . $mail->ErrorInfo;
}else{
echo "<b>您好!已收到您的留言,會盡快回覆</b>";
}
?>
如果執行以後顯示如下圖就表示成功寄出信件囉!
6
※郵件成功寄出(上為網頁顯示  下為Gmail的執行情況)


 [奇怪的案例怪談1]
最後分享一段奇怪的案例,小弟公司的網站也是用這個功能寄送郵件,而且是2013年的時候就有了(小弟那時候還沒來哈哈哈哈),往後基本上那台server就沒有去動了 (寄送信件php檔最後修改日期是2013年…)。

而故事就發生在2018年11月7號的時候,有其他單位的同人跟我反應說郵件功能有問題,因為我們網站有做一個功能叫”聯絡我們”,這個功能是負責收客戶的信,而我們公司會接許多國外客戶的案子所以這個功能無形中扮演了重要的腳色。

結果我去看錯誤訊息,顯示為SMTP Error: Could not authenticate.,這個訊息我爬了許多文跟改了一堆程式 (就是拿掉後再放回去的循環),搞了我一天的時間,Could not authenticate 我就是要寄信阿,信件為什麼驗證不過呢?它就是信嗎?驗證什麼?...咦!?驗證信件?,於是我隔天把”$mail->SMTPAuth = true; ”這行註解以後…就好了!...見鬼啦!!怎麼回事啊!!怎麼原本沒事的功能突然就掛了!?...算了…已經解決了這個問題可喜可賀!

其實在工作或是研究上都會遇到突然凸槌的問題,自己研究的問題發生影響比較小,因為所有東西是一手掌握,但是工作時候就不一樣,你面對的是前人或是現在的同事一起合作的程式,有時候需要了解對方的邏輯就要一段時間了,以後有機會在分享一些奇怪的案例,那就跟各位介紹到這裡囉!

如何在ubuntu安裝java與netbeans


   小弟很久沒有打文章了,話說最近需要再linux ubuntu上開發java程式,所以編譯器小弟選擇使用netbeans來開發,不過在正常情況下,linux預設的java是OpenJdk(有些連這個都沒有),跟一般的java(這裡稱之為oracle-java)是不一樣的,使用OpenJdk是不能使用一般的java api的,因此需要安裝oracle-java才能正常編譯java,其實安裝方法爬文應該有很多資料,為了方便就稍微整理一下(避免下次安裝忘記要重新爬哈哈哈哈!!),以下就開始介紹如何在linux ubuntu安裝oracle-java。
  首先說明安裝oracle-java有兩種方法,第一種為官網https://www.java.com/zh_TW/download/help/linux_install.xml提供的套件,下載套件並使用rpm安裝,官方網站已經有說明所以這裡節錄官網之教學:

如何下載並安裝 Linux 適用的 32 位元 Java?
1.移至 http://java.com 並按一下下載按鈕
2.有兩種類型的安裝套裝軟體。

  • Linux 平台適用的 Java

這會使用存檔二進位檔案 (.tar.gz) 安裝 Linux 適用的 32 位元 Java Runtime Environment (JRE),而且任何人 (不只限於 root 使用者) 都能在本身可以寫入的位置進行安裝。但是,只有 root 使用者可以將 Java 安裝至系統位置。

  • 以 RPM 為基礎之 Linux 平台適用的 Java

這會使用系統位置中的 RPM 二進位檔案 (.rpm),安裝以 RPM 為基礎之 Linux 平台 (例如 Red Hat 和 SuSE) 適用的 32 位元 Java Runtime Environment (JRE)。您必須以 root 身分執行此安裝。

請下載最符合您需要的套裝軟體。您可將檔案下載到系統的任何目錄中。

3.您必須先接受授權合約條款後,才能夠下載檔案。
4.下載並檢查下載檔案大小,確定您已下載完整、未損毀的套裝搭售。在下載檔案之前,請注意網站下載頁面上提供的該檔案位元組大小。一旦完成下載,請比較該檔案大小和下載的檔案大小,確定二者相等。


  • Linux 平台適用的 Java

變更至要在其中執行安裝的目錄。鍵入:
cd directory_path_name
例如,若要將軟體安裝到 /usr/java/ 目錄中,請鍵入:
cd /usr/java/

將 .tar.gz 存檔二進位檔案移至目前的目錄。
解壓縮 tarball 並安裝 Java
tar zxvf jre-8u73-linux-i586.tar.gz

Java 檔案會安裝到目前目錄中名為 jre1.8.0_73 的目錄內。
本範例中會安裝到 /usr/java/jre1.8.0_73 目錄。
如果要節省磁碟空間,請刪除 .tar.gz 檔案。

  • 以 RPM 為基礎之 Linux 平台適用的 Java

成為 root 的方法是執行 su 並輸入超級使用者密碼。
解除安裝較早安裝的 Java 套裝軟體。
rpm -e package_name
變更至要在其中執行安裝的目錄。鍵入:
cd directory_path_name
例如,若要將軟體安裝到 /usr/java/ 目錄中,請鍵入:
cd /usr/java

安裝套裝軟體。
rpm -ivh jre-8u73-linux-i586.rpm

若為升級套裝軟體:
rpm -Uvh jre-8u73-linux-i586.rpm

如果要節省磁碟空間,請刪除 .rpm 檔案。
結束 root shell。不必重新開機。
至此安裝完成。移至啟用與設定區域。

第二種是小弟覺得最簡單的方式,打開終端機並輸入以下指令:
1. sudo add-apt-repository ppa:webupd8team/java
2. sudo app-get update
//更新並載入套件
3. sudo apt-get install oracle-java8-installer
//使用apt-get安裝 Oracle JAVA  &&  JRE
當安裝完成後,可以在終端機下達java –version,即可看到相關資訊如下圖


Java –version資訊

  不過大家應該很好奇,這樣安裝java他的資料夾會在哪裡吧…!?
其實他的安裝路徑為\usr\lib\jvm\java-8-oracle如下圖紅色框號的地方所示


JDK資料夾安裝路徑

  不過有些Linux原本就有預設OpenJDK,倘若不小心的中獎或是不小心的安裝到,有兩種方式可以解決:
1. 移除OpenJDK,可以下指令:sudo apt-get autoremove [openjdk(根據系統版本下指令)]
2. 將JDK的權限順序調整一下即可
   這部分我嘗試了很久,最後找到https://dotblogs.com.tw/jhsiao/archive/2013/09/03/116186.aspx這篇文章,裡面有教如何條權限,這裡就帶著大家設定權限指令:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-oracle/bin/java 300
1. sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-8-oracle /bin/javac 300
2. sudo update-alternatives --config java
3. sudo update-alternatives --config javac

  到這裡,oracle-java的佈署就大功告成了,希望隊在linux上開發java的人有
所幫助。
   最後稍微介紹一下netbeans安裝,首先需要先去官網下載所需要的版本(建議下載EE的即可),這裡附上連結:https://netbeans.org/downloads/
   載下來後將下載的檔案放置你想安裝的位置,接下來開啟終端機至剛剛將檔案移動的地方,然後下達以下指令:
1. sudo chmod +x [檔案檔名]
2. sudo ./ [檔案檔名]
倘若看到以下畫面表示成功;終端機有安裝等訊息及netbeans安裝視窗


   差不多就完成了,那小弟解說到此,有任何問題歡迎來發問及討論!最後祝大家coding Java愉快 =D


如何使用bot framework來建造多平台的ChatBot

前幾天稍微打了一個關於.net部屬在AWS的文章其實是在研究是否AWS會
"無痛"支援Microsoft一些服務(我似乎聽到笑聲了)!別這樣!部屬網站或是架虛擬機器當然是可以的啦!但是要做一些會使用不同廠商的平台功能就有可能吃閉門羹,所以今天要大家分享以及當作學習的筆記囉!。
今天要分享的是使用Microsoft 提供的bot framework來建造多平台的ChatBot,Microsoft建置了bot framework提供使用者簡單製造自己的機器人,大家要先到他的官網: https://dev.botframework.com/
※先註冊Microsoft帳號喔!

其中可以看看他的documentation詳細說明了使用方法,如果要看寫得很好的網站我推薦http://aihelpwebsite.com/Blog/EntryId/6/Creating-a-Hello-World-Bot-Using-The-Microsoft-Bot-Framework
這網站寫得很清楚,可能比官網還清楚...噓!!!,那小弟就稍微介紹一下Bot Framework:
11
※Bot Framework圖
Bot Builder是說我們可以透過一些開發者元件與人家寫好的工具來撰寫你的機器人,可以使用C#、Node.js...等等來開發
Developer Portal這裡是說明撰寫好的機器人,透過他來跟使用者端做溝通,現在的Bot Framework:並不是所有平台都支援,而現在有哪些平台有支援呢?如下圖所示囉!
12

※Bot Framework所支援的平台
Bot Directory是指你有那些機器人並做管理。
簡單介紹完之後我們開始先準備工具吧!
首先我們要準備的工具有:
  1. Virtual Studio 2015(建議使用 不建議2013)因為小弟是2013所以有些問題
  2. 下載Bot Builder SDK 網址: https://github.com/Microsoft/BotBuilder
  3. 模擬器 網址: https://github.com/Microsoft/BotFramework-Emulator#download
  4. 準備一個Web server(不強制 如果只想在本機試試的話就不用了)

假設現在你的本機已經有了Virtual Studio,我們把下載下來的Bot Builder SDK解壓縮至%USERPROFILE%\Documents\Visual Studio 2015
(按照使用的版本)\Templates\ProjectTemplates\Visual C#

接下來打開你的Virtual Studio會發現你多了一個機器人開發選項如下圖所示
13
※機器人開發選項

建立完以後來檢視一下裡面有什麼東西吧!
其實裡面最重要的兩個檔案是MessagesController.cs Web.config如下兩張圖
14
Web.config
15
MessagesController.cs

  Web.config 是用來設定機器人使用的,MessagesController.cs是機器人程式端,也就是說你想要機器人說什麼做什麼事都是在這裡做的。

其實你什麼都不做這個程式就可以跑囉!(小弟有做一個小小的修改,activity.CreateReply(Hello!);)接著打開模擬器與執行專案,並在模擬器的網址列輸入http://localhost:3979/api/messages 然後就可以跟他說話囉!!如下圖所示:
16
因為小弟的Port3979所以就輸入3979!但是如果要上線的話,網址的協定要從http改成https!

接下來要說明如何部屬與設定你的專案為機器人所使用首先先建立一個機器人
進入
https://dev.botframework.com/之後點選Register a bot,然後進入頁面如下圖所示:
17
Name是機器人名稱,可以自己取名,但是Bot handle必須要記一下,設完他以後他是唯一值,接下來要創建Bot ID 與 password,如下圖:
18
點選create Microsoft app id and password,進來以後會出現以下頁面:
19
這裡要注意一下,密碼要記起來,因為他只出現這一次爾以,而且找不到喔! 好了以後按Finish按鈕如下所示:
20
好的!這裡初步的都設定好囉!
接下來回到主頁面看看
21
剛剛所設定的資訊,除了密碼以外都在上面了!
接下來就是部屬你的機器人專案囉!回到Web.config頁面如下:
22
我們把剛剛的資料都打上去:BotId 就是Bot handle,AppId跟AppPassword就是剛剛按鈕生成的資訊,隨後把資訊Key上。 在來就是要部屬發行了不過要有Microsoft Azure的帳號如果大家想試試的話可以申請一個試用版的(有一個月的6300額度)
我們在專案右方點右建按發行,如下圖所示:
23

進入選後Microsoft Azure Web應用程式,接下來就是設定一些東西囉!如下圖:
24

設定完成後會載入帳號以及網域的資訊按下發行,如下圖
25
之後輸入網域後結果如下:
26

表示我們機器人專案已經部屬成功了!再來回到機器人管理頁面點開編輯,如下圖所示:
27
點擊後在下圖地方填上網域,以下圖範例:https://botkevintest01.azurewebsites.net/api/messages
28
與測試不一樣的點是http要改成https

最後到機器人頁面之後點擊Test後看到是Endpoint authorization succeeded,表示你的機器人可以測試了!如下圖
29
30
大致上差不多是這樣子,其實沒有想像中的複雜,接下來就可以玩玩看裡面的平台囉!

如何使用Vistual Studio上傳至AWS部屬

小弟最近想研究一些東西的緣故,先寫這篇當作前導文吧,雖然是小東西但是當個筆記用吧!
在這篇開始之前先貼上參考網站,謝謝這個網站!
這網站已經幫我解決大部分的問題了,雖然是外國網站但是有圖片交著做,所以蠻好懂的,那開始進入正題囉!
首先我們要先有以下幾個準備工作:
1.準備AWS(amazon web server)帳號
3.Vistual Studio(小弟是2013版)
 1
(AWS Toolkit)下載頁面圖

 下載完AWS Toolkit後執行安裝,位置可以自己決定,安裝完成後打開Vistual Studio會發現多了一些選項如下圖:17092861_1870096956609196_424950151_o
 表示安裝成功了!基本的前置作業完成了就開始打開Vistual Studio選取想要上傳的檔案,小弟就來這幾天做的範例來示範一下:
 17035966_1870101506608741_1144997101_o
打開以後先測試一下可不可以執行如下圖所示:
17035847_1870119949940230_1087128344_o

  這個表示本機端的網址,如果沒有顯示錯誤資訊可以顯示程式結果,表示程式的部分是沒問題的,檢查完之後就要上傳AWS囉!
 首先在專案上點右鍵,找到 Publish to AWS Elastic Benstalk...
17036530_1870103533275205_787940386_o

點擊後如下圖,按下框起來的按鈕:
17091321_1870114476607444_634470123_o
點擊後再紅色框號地方打DeploymentProf
17035847_1870114996607392_1233584617_o
下面就是要打AWS金鑰資訊,我們先暫停一下,回到AWS中有個IAM,點擊後到Users畫面接著點選Add user如下:
17036715_1753798761300819_83054215_o
進入新增的程序頁面後,輸入自訂的User name以及勾選第一個存去型態
17036726_1753799151300780_2139580131_o
下一頁有一個大圖示的選項Attach existing policies directly,這是要增加一些權限的地方,我們需要以下兩個權限
( AmazonEC2FullAccess 和AWSElasticBeanstalkFullAccess)如下圖:
17016631_1753802094633819_1847820155_o
17016298_1753820094632019_667805886_o選擇完連續下一步兩次到最後一個步驟如下:
17093228_1753803214633707_1474743236_o
會顯示與下載金鑰密碼(公開鑰與私密鑰),記得要載下來,之後回到Vistual studio
補上金鑰資訊後按確定後按確定,下一頁會顯示環境設定如下圖所示:
17036544_1870118366607055_1055416147_o
如果顯示綠色的表示設定成功了!如果不是可能需要回到AWS看看權限是否設定正確。

接下來就可以設定你的Server硬體需求,小弟選了一個小一點的如下圖:
17091302_1870118636607028_135198886_o


接下來可以持續下一步到最後一步
17015118_1870119019940323_1253747376_o
17093227_1870118993273659_1498247266_o
17091086_1870119116606980_1493600057_o
底下是勾選只要server停止後就會自動重建,因為網站的的服務不能中斷,所以當server有問題時自動重建。

最後按下部屬後顯示資訊如下圖:
17016185_1870119649940260_101407653_o
框起來的地方就是server提供的網址囉!這時候輸入網址看看:
17036976_1870121166606775_1564821793_o
我們之前測試的網站就上架囉!!

最後如果不想要繼續部屬要怎麼取消呢?
這裡要回到AWS到EC2選單,在左邊尋找Auto Scaling Group刪除剛建的群組即可(找時間最近的就是了)
17036591_1753836431297052_1715541809_o
好囉!筆記就到這邊結束囉!如果有不清楚的地方歡迎留言討論一下喔!!