我的雲端生活網 - Life+

Tuesday, November 25, 2008

3分鐘學會使用程式發送msn訊息, ASP篇(六)

<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞


ASP 的範例我們使用ADO介面來處理,其他語言也可以這樣做,可參考文件(文末提供下載處),另外;下面的程式碼重要的部份只有參數不同,其他大同小異,可參考紅字部分


ps.也請參考 msnSDK的使用流程

(抱歉!太久沒碰ASP,不過基本上;下面這個範例可正確發送MSN訊息)
<%
'--
'---STEP1 取得API 使用權限
'--

on error resume next
Set xmlHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
'如果遇到中文,請使用Server.URLEncode 來處理
'比如 : ...&pname=Server.URLEncode("中文姓名")&...

URL= "http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=GETSPID&USERID=apiblogt6&PASSWD=msnsdkt&RETTYPE=ADO"

xmlHTTP.open "GET", URL, false
xmlHTTP.send()

if err.description <>"" then
Set xmlHTTP= Nothing
response.write "無法連接遠端伺服器," & err.description
response.end
end if

'--
'將得到的訊息存入 myRS_....xml
'--
set myStream = Server.CreateObject("ADODB.Stream")
myStream.Open
myStream.Charset = "big5"
myStream.WriteText xmlHTTP.ResponseText
myStream.Position = 0

'---
'防止重複的process 存取xml
'---
Febber = Split("1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",")
For I = 0 To 3
Randomize
keychar = keychar & Febber(Int((62 * Rnd) + 1) - 1)
next
myXMLfile = Server.Mappath("./myRS_" & keychar & ".xml")
myStream.SaveToFile myXMLfile
myStream.Close

'--
'取得myRS_$random.xml 的結果
'--
set rs = server.createobject("adodb.recordset")
rs.Open myXMLfile
Do While Not (rs.EOF)
if (rs(0)=1) then
spid=rs(1)
response.write "取得SPID=" & rs(1) & "
"
else
response.write "認證失敗=" & rs(0)& "," & rs(1) & "
"
response.end
end if
rs.MoveNext
Loop
rs.Close


'--
'刪除暫存檔
'--
set FSO = Server.Createobject("Scripting.FileSystemObject")
Fso.DeleteFile myXMLfile

'--
'釋放使用的物件
'--
set FSO = Nothing
Set myStream = Nothing
Set rs = Nothing
Set xmlHTTP= Nothing
'--

'--
'---STEP2 邀請聯絡人
'--
Set xmlHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
'如果遇到中文,請使用Server.URLEncode 來處理
'比如 : ...&pname=Server.URLEncode("中文姓名")&...
'請注意!
'邀請聯絡人 XXXXXXXX@hotmail.com 請填正確的聯絡人,執行此SUB 後
'msnSDK 會邀請這個人加入聯絡人,必須加入聯絡人後才能發送訊息
'session 由GETSPID 所取得的 spid

URL= "http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=REGISTER&UIDS=XXXXXXXX@hotmail.com&SESSION=" & spid & "&RETTYPE=ADO"

xmlHTTP.open "GET", URL, false
xmlHTTP.send()

if err.description <>"" then
Set xmlHTTP= Nothing
response.write "無法連接遠端伺服器," & err.description
response.end
end if

'--
'將得到的訊息存入 myRS_....xml
'--
set myStream = Server.CreateObject("ADODB.Stream")
myStream.Open
myStream.Charset = "big5"
myStream.WriteText xmlHTTP.ResponseText
myStream.Position = 0

'---
'防止重複的process 存取xml
'---
Febber = Split("1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",")
For I = 0 To 3
Randomize
keychar = keychar & Febber(Int((62 * Rnd) + 1) - 1)
next
myXMLfile = Server.Mappath("./myRS_" & keychar & ".xml")
myStream.SaveToFile myXMLfile
myStream.Close

'--
'取得myRS_$random.xml 的結果
'--
set rs = server.createobject("adodb.recordset")
rs.Open myXMLfile
Do While Not (rs.EOF)

response.write "邀請聯絡人回應=" & rs(0) & "," & rs(1) & "," & rs(2) & "
"

rs.MoveNext
Loop
rs.Close

'--
'刪除暫存檔
'--
set FSO = Server.Createobject("Scripting.FileSystemObject")
Fso.DeleteFile myXMLfile

'--
'釋放使用的物件
'--
set FSO = Nothing
Set myStream = Nothing
Set rs = Nothing
Set xmlHTTP= Nothing
'--

'--
'---STEP3 發送訊息
'--
Set xmlHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
'如果遇到中文,請使用Server.URLEncode 來處理
'比如 : ...&pname=Server.URLEncode("中文姓名")&...
'請注意!
'傳送訊息給 XXXXXXXX@hotmail.com 請填正確的聯絡人,執行此SUB 後
'msnSDK 會邀請這個人加入聯絡人,必須加入聯絡人後且這個人在線上才能
'發送訊息,如要傳離線訊息請參考文件
'session 由GETSPID 所取得的 spid
msg=Server.URLEncode("測試")

URL= "http://59.120.234.84:8082/msnSDK/msn_cgi-win32?UIDS=XXXXXXXX@hotmail.com&MSG=" & msg &"&flags=0&FUNC=SENDMSG&ENCODING=BIG5&RETTYPE=ADO&SESSION=" & spid

xmlHTTP.open "GET", URL, false
xmlHTTP.send()

if err.description <>"" then
Set xmlHTTP= Nothing
response.write "無法連接遠端伺服器," & err.description
response.end
end if

'--
'將得到的訊息存入 myRS_....xml
'--
set myStream = Server.CreateObject("ADODB.Stream")
myStream.Open
myStream.Charset = "big5"
myStream.WriteText xmlHTTP.ResponseText
myStream.Position = 0

'---
'防止重複的process 存取xml
'---
Febber = Split("1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",")
For I = 0 To 3
Randomize
keychar = keychar & Febber(Int((62 * Rnd) + 1) - 1)
next
myXMLfile = Server.Mappath("./myRS_" & keychar & ".xml")
myStream.SaveToFile myXMLfile
myStream.Close

'--
'取得myRS_$random.xml 的結果
'--
set rs = server.createobject("adodb.recordset")
rs.Open myXMLfile
Do While Not (rs.EOF)

response.write "傳送訊息回應=" & rs(0) & "," & rs(1) & "," & rs(2) & "
"

rs.MoveNext
Loop
rs.Close

'--
'刪除暫存檔
'--
set FSO = Server.Createobject("Scripting.FileSystemObject")
Fso.DeleteFile myXMLfile

'--
'釋放使用的物件
'--
set FSO = Nothing
Set myStream = Nothing
Set rs = Nothing
Set xmlHTTP= Nothing
'--


%>

其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

Sunday, November 23, 2008

函數語言版本的費氏數列程式

費氏數列 (Fibonacci's numbers) 是 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 這樣的數列,其中每個數為前二個數的和,除了最前面的底數 0, 1 外。

小小的費氏數列程式很好寫,看起來也很好執行,以 C 語言為例:

n_2 = 0; n_1 = 1;
if (n == 0)
fn = n_2;
else if (n == 1)
fn = n_1;
else
for (i=2; i<n; i++) {
fn = n_2 + n_1;
n_2 = n_1;
n_1 = fn;
}

最後 fn 為答案。但 C 程式版本其實不好執行,若指定的費氏項數稍大,而程式中的變數是整數或長整數,就會溢位。

函數語言 Haskell 寫出來的比較可愛:

fibNum :: (Integral a) => a -> a
fibNum 0 = 0
fibNum 1 = 1
fibNum (n+1) = fibNum (n-1) + fibNum n

雖然沒有溢位問題了,但是打個 fibNum 100 跑得真久,因為遞迴的計算量很大。

但函數語言的好處是,許多程式可用累積變數 (aggregating parameters) 改寫成線性版本,改善計算效率。在此,例如:

fib :: (Integral a) => a -> a
fib n = fib1 n 0 1

fib1 :: (Integral a) => a -> a -> a -> a
fib1 0 x _ = x
fib1 1 _ y = y
fib1 (n+1) x y = fib1 n y (x+y)

打個 fib 100 很快就跑出答案為: 354224848179261915075 。漂亮!

在此可見程式語言的特性,除了語法可愛和簡潔之外,在可優化的容易程度是特別有價值的。

想要探索更深入的價值,請積極參與微程式資訓技術研討會1並參閱投影片。


1微程式資訊技術研討會微程式資訊股份有限公司的內部會議。

Tuesday, November 18, 2008

關於msnSDK 使用上的問題,特此說明

http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=3056858&SiteID=14
這篇文章有提到關於msnSDK 產品使用的問題,因為個人疏忽沒有特別提出這個問題,特此說明

API 使用權限的帳號密碼,直接寫在範例程式裡,所以;個人使用確實是免費的,而此API 同時支援MSN/YAHOO即時通,如果有需要使用非程式範例內的帳號密碼,也可以跟我索取(sonet.all@gmail.com),至少以上這些都是免費提供使用,文件也可以自行參考下載,個人使用與商業版功能完全一致;沒有差異,唯一的差異是商業版會安裝在購買的使用者機器上,且依照販售合約提供相關維護保固...,而個人使用則不提供這些服務或保證

Sunday, November 16, 2008

3分鐘學會使用程式發送msn訊息, VB6.0篇(五)








<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>





msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞



VB6.0 的範例我們使用ADO介面來處理,其他語言也可以這樣做,可參考文件(文末提供下載處),另外;下面的程式碼重要的部份只有參數不同,其他大同小異,可參考紅字部分





ps.也請參考 msnSDK的使用流程

================================







Dim RS As New ADODB.Recordset

Dim URL As String

Dim Session As String '授權碼



'取得API 的使用權利

Private Sub GETSPID_Click()

Dim RET As String

On Error GoTo ErrHandle



'API 連接位置

URL = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32"

'apiblogt5/msnsdkt 取得API 使用權限的帳號/密碼


RS.Open URL & "?FUNC=GETSPID&USERID=apiblogt5&PASSWD=msnsdkt&RETTYPE=ADO"


Do While Not (RS.EOF)



'查詢回應

'RS(0) 0 認證失敗 1認證成功

'RS(1) 失敗傳回 失敗原因 / 成功傳回 SESSION

'

If (RS(0) = 0) Then

MsgBox "認證失敗,無法使用API"

Else

'取得認證授權使用API

'授權碼

Session = RS(1)

End If

RS.MoveNext

Loop

RS.Close

Exit Sub

ErrHandle:

MsgBox "無法連接伺服器,或是參數不正確"



End Sub



'邀請聯絡人

Private Sub REGISTER_Click()



Dim RET As String

On Error GoTo ErrHandle



'API 連接位置

URL = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32"



'邀請聯絡人 XXXXXXXX@hotmail.com 請填正確的聯絡人,執行此SUB 後

'msnSDK 會邀請這個人加入聯絡人,必須加入聯絡人後才能發送訊息

'session 由GETSPID 所取得的session


RS.Open URL & "?UIDS=XXXXXXXX@hotmail.com&FUNC=REGISTER&RETTYPE=ADO&SESSION=" &
Session


Do While Not (RS.EOF)



'查詢回應

'RS(0) 0 邀請失敗 1邀請成功

'RS(1) 失敗傳回 失敗原因 / 成功訊息

'

If (RS(0) = 0) Then

MsgBox "邀請失敗"

Else

MsgBox RS(1)

End If

RS.MoveNext

Loop

RS.Close

Exit Sub

ErrHandle:

MsgBox "無法連接伺服器,或是參數不正確"



End Sub



'發送MSN/YAHOO即時通訊息

Private Sub SENDMSG_Click()

Dim RET As String

On Error GoTo ErrHandle



'API 連接位置

URL = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32"



'傳送訊息(MSG)給 XXXXXXXX@hotmail.com(必須是此聯絡人已接受邀請)

'flags 1 當聯絡人不在線上則依據系統設定處理(系統設定為傳送離線訊息) 0 當連絡人不在線上,則不送任何訊息

'encoding 標示目前傳送訊息的中文編碼

'rettype 設定為使用ADO

'session 由GETSPID 所取得的session


RS.Open URL & "?UIDS=XXXXXXXX@hotmail.com&MSG=測試&flags=0&FUNC=SENDMSG&ENCODING=BIG5&RETTYPE=ADO&SESSION=" & Session


Do While Not (RS.EOF)



'查詢回應

'RS(0) 0 傳送失敗 1傳送成功

'RS(1) 失敗傳回 失敗原因 / 成功訊息

'

If (RS(0) = 0) Then

MsgBox "傳送失敗"

Else

MsgBox RS(1)

End If

RS.MoveNext

Loop

RS.Close

Exit Sub

ErrHandle:

MsgBox "無法連接伺服器,或是參數不正確"

End Sub



其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

Friday, November 14, 2008

MSN機器人開發套件 demo篇

MSN機器人開發套件影片,msnSDK本身可以同時支援MSN/YAHOO即時通,影片中for MSN的字樣指的是這個影片展示的是MSN部分,另外這個影片沒有展示與msn互動的部份,msnSDK本身能夠做到MSN/YAHOO互動雙向訊息的應用;若有公司企業欲洽談合作,不論合作方式的大或小,可洽sonet.all@gmail.com

http://tw.youtube.com/watch?v=hbQ1Va_IqzM

Thursday, November 13, 2008

3分鐘學會使用程式發送msn訊息, Perl篇(四)

<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞

perl 的範例我們使用soap 介面來處理,其他語言也可以這樣做,可參考文件(文末提供下載處)
wsdl位置:http://59.120.234.84:8082/msnSDK/genwsdl-win32

ps.也請參考 msnSDK的使用流程
================================
#!/usr/bin/perl
use SOAP::Lite;

#取得使用api 的權限
sub setspid
{
my $session_ret=SOAP::Lite->uri('http://59.120.234.84:8082/MSN')
->proxy('http://59.120.234.84:8082/msnSDK/msn_soap-win32')
->GETSPID('apiblogt4','msnsdkt')->result;
my ($code,$session)=split("\t",$session_ret);
$session=~tr/\r\n //d;
return $session;
}

#註冊聯絡人
sub register
{
my $sret= setspid();
my $session_ret=SOAP::Lite->uri('http://59.120.234.84:8082/MSN')
->proxy('http://59.120.234.84:8082/msnSDK/msn_soap-win32')
->REGISTER('要加入聯絡人的msn/yahoo帳號',$sret)->result;
print $session_ret;
}

#傳送訊息
sub sendmsg
{
my $sret= setspid();
my $msg_ret = SOAP::Lite->uri('http://59.120.234.84:8082/MSN')->
proxy('http://59.120.234.84:8082/msnSDK/msn_soap-win32')->
SENDMSG( '要傳送訊息聯絡人的msn/yahoo帳號', '欲傳送的訊息', 'utf-8','1',$sret)->result;
print $msg_ret;
}

其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

Wednesday, November 12, 2008

ALE middleware 架構布局


目前正在思考 Application Level Events 介面 [1,2] 如何整併入系統中。我的構想如右圖。 Middleware 為 ALE 介面的實作,處理讀寫命令呼叫及程序觸發與控制,可能是獨立 server 、或是 DLL 、 local services 或 Web services 形式。一件 middleware server 可以管理許多台 readers 。 Middleware 對應用系統提供介面做讀取 (pooling) 。

Middleware 對 readers 以低層 reader 協定 (LLRP) 溝通,對應用系統則以 SOAP (簡單物件存取協定) 溝通。 Readers 的設定表可能離線備份在 middleware ,使上下二端讀取設定比較簡單。每一台 reader 只和少數一件 middleware(或二件,包含備援機)溝通,不同步的問題會比較少。應用系統的開發人員則呼叫 middleware 的 ALE 介面,傳 SOAP 參數或訊息,讓程式比較好寫。不過,少數的 middleware 會是效能關卡,這方面還要思考解決方案。


Middleware 做成獨立模組,內涵物可以有許多故事。例如 [4] 的處理方式。

SOAP 效能問題則可以參考 [3] 的處理方式(參左圖):應用系統送出訊息(由路線 2 )都由 client 代理,處理每一串 SOAP 訊息都先找 cache 有沒有舊的相同資料(由路線 3 ),若有則發送舊的訊息(由路線 5 ),或者若沒有則發送新訊息(由路線 5 )。

參考資料

[1] EPCglobal Inc. The EPCglobal architecture framework, EPCglobal final version 1.2 approved 10 September 2007. http://www.epcglobalinc.org/standards/architecture/architecture_1_2-framework-20070910.pdf , Sep. 10, 2007 (referred at August 2008).

[2] EPCglobal Inc. The Application Level Events (ALE) specification, version 1.1: Part I: Core specification. http://www.epcglobalinc.org/standards/ale/ale_1_1-standard-core-20080227.pdf , Feb. 27, 2008 (referred at September 2008).

[3] K. Devaram and D. Andresen. SOAP optimization via client-side caching. Proceedings of the First International Conference on Web Services (ICWS'03), pp. 520-524, Las Vegas, NV, June 24-27, 2003.

[4] J. Song, T. Kim, S. Lee, and H. Kim. Security enhanced RFID middleware system. Procedings of World Academy of Science, Engineering and Technology, v.10, pp.79-82, Dec. 10, 2005.

msnSDK的使用流程說明

<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



3分鐘學會使用程式發送系列文章所使用的流程

STEP1:
取得SPID: GETSPID請參考各種語言所使用的帳號/密碼(每篇文章的程式碼內有),取得SPID以取得使用API 的權力

STEP2:
註冊聯絡人: 要發訊息給別人,需要先讓他成為聯絡人,因此這必須要是合法聯絡人(msn/yahoo帳號),而此時這個帳號會收到邀請通知(請見下圖)

STEP3:
傳送MSN/YAHOO訊息: SENDMSG(uids傳遞訊息的目的MSN/YAHOO帳號,msg欲傳遞的訊息內容,encoding傳遞的訊息中文編碼(utf-8/big5/gbk/gb2312),flags 0 對方離線則不送訊息 1對方離線則訊息是否傳送由系統決定,session GETSPIS得到的session值)

msnSDK擁有非常多的FUNCTION,也包含互動式的機器人選單,其他功能可參考msnSDK訊息控制開發套件程式介面說明書

Monday, November 10, 2008

3分鐘學會使用程式發送msn訊息, Java篇(三)

<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞
ps.也請參考 msnSDK的使用流程
================================
public class clsMsnSDK {
public static void main(String[] args) throws Exception {
String UserName = "apiblogt3";
String Password = "msnsdkt";
//取得SPID
String strRet = GETSPID(UserName,Password);
String[]tmp = strRet.split("1\t");
String strValue = tmp[1].replace('\n',' ').trim();

String SPID = strValue;
System.out.println(SPID);
//註冊聯絡人
String Email = "xxxxx@hotmail.com"; //填入msn/yahoo聯絡人,勿使用這個預設值
String ret = Register(Email,SPID);
System.out.println(ret);
//發訊息
String strMsg = "Hello_World!"; //輸入訊息 (未做 Url EnCoded)
String MsgRet = SendMsg(Email,strMsg,SPID);
System.out.println(MsgRet);
}


//取得SPID
public static String GETSPID(String UserName,String Password) throws Exception {

String strUrl = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
String strValue ="?FUNC=GETSPID&USERID=" + UserName + "&PASSWD=" + Password;
java.net.HttpURLConnection urlConnection= null;//定義一個HTTP連線
java.net.URL url= new java.net.URL(strUrl + strValue);//定義一串URL
urlConnection=(java.net.HttpURLConnection)url.openConnection();//將URL餵給HttpURLConnection
urlConnection.setRequestMethod("POST");//設定參數傳遞方式(GET or POST)
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();//開啟連線
java.io.InputStream GetHTML=urlConnection.getInputStream();//內容儲存下來
int leng =0;
byte[] Data = new byte[100];
byte[] totalData = new byte[0];
int totalLeg =0;
do{
leng = GetHTML.read(Data);//(Data);
if(leng>0){
totalLeg += leng;
byte[] temp = new byte[totalLeg];
System.arraycopy(totalData, 0, temp, 0, totalData.length);
System.arraycopy(Data, 0, temp, totalData.length, leng);
totalData = temp;
}
}while(leng>0);
String tmp = new String(totalData,"UTF-8");
urlConnection.disconnect();
return tmp;
}

//註冊
public static String Register(String UIDS,String SPID) throws Exception{
String strUrl = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
String strValue = "?FUNC=REGISTER&UIDS=" + UIDS + "&SESSION="+ SPID;
java.net.HttpURLConnection urlConnection= null;//定義一個HTTP連線
java.net.URL url= new java.net.URL(strUrl + strValue);//定義一串URL
urlConnection=(java.net.HttpURLConnection)url.openConnection();//將URL餵給HttpURLConnection
urlConnection.setRequestMethod("POST");//設定參數傳遞方式(GET or POST)
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();//開啟連線
java.io.InputStream GetHTML=urlConnection.getInputStream();//內容儲存下來
int leng =0;
byte[] Data = new byte[100];
byte[] totalData = new byte[0];
int totalLeg =0;
do{
leng = GetHTML.read(Data);//(Data);
if(leng>0){
totalLeg += leng;
byte[] temp = new byte[totalLeg];
System.arraycopy(totalData, 0, temp, 0, totalData.length);
System.arraycopy(Data, 0, temp, totalData.length, leng);
totalData = temp;
}
}while(leng>0);
String tmp = new String(totalData,"UTF-8");
urlConnection.disconnect();
return tmp;

}

//傳送MSN 訊息
public static String SendMsg(String UIDS,String MSG,String SPID) throws Exception{
String strUrl = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
String strValue ="?FUNC=SENDMSG&UIDS=" + UIDS + "&MSG=" + MSG +"&Encoding=BIG5&flag=0&Session=" + SPID;
java.net.HttpURLConnection urlConnection= null;//定義一個HTTP連線
java.net.URL url= new java.net.URL(strUrl + strValue);//定義一串URL
urlConnection=(java.net.HttpURLConnection)url.openConnection();//將URL餵給HttpURLConnection
urlConnection.setRequestMethod("POST");//設定參數傳遞方式(GET or POST)
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();//開啟連線
java.io.InputStream GetHTML=urlConnection.getInputStream();//內容儲存下來
int leng =0;
byte[] Data = new byte[100];
byte[] totalData = new byte[0];
int totalLeg =0;
do{
leng = GetHTML.read(Data);//(Data);
if(leng>0){
totalLeg += leng;
byte[] temp = new byte[totalLeg];
System.arraycopy(totalData, 0, temp, 0, totalData.length);
System.arraycopy(Data, 0, temp, totalData.length, leng);
totalData = temp;
}
}while(leng>0);

String tmp = new String(totalData,"UTF-8");
urlConnection.disconnect();
return tmp;
}

}

其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

3分鐘學會使用程式發送msn訊息,dotNet C#篇(二)








<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞

ps.也請參考 msnSDK的使用流程

================================



全域的物件及變數

WebClient wc = new WebClient();

string SPID = "";



步驟一:取得SPID(GETSPID)

private void button1_Click(object sender, EventArgs e)

{

string url="http://59.120.234.84:8082/msnSDK/msn_cgi-win32";

string method="POST";

string postdata = "FUNC=GETSPID&USERID=apiblogt2&PASSWD=msnsdkt";

byte[] postbyte=Encoding.UTF8.GetBytes(postdata);

byte[] resb = wc.UploadData(url, method, postbyte);

string resmsg = Encoding.UTF8.GetString(resb);

resmsg = resmsg.Replace("\n", "");

string[] arrstr = resmsg.Split('\t');

if (arrstr[0] == "1")

{

SPID = arrstr[1];

MessageBox.Show("取得SPID成功: SPID= " + SPID);

}

else

{

SPID = "";

MessageBox.Show("取得SPID失敗: " + resmsg);

}

}



步驟二:將帳號註冊為msn機器人的連絡人(REGISTER)

下述: txtmsnacc.Text 為msn/yahoo帳號



private void button2_Click(object sender, EventArgs e)

{

string url = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";

string method = "POST";

string postdata = "FUNC=REGISTER&uids=" + txtmsnacc.Text + "&session=" + SPID;

byte[] postbyte = Encoding.UTF8.GetBytes(postdata);

byte[] resb = wc.UploadData(url, method, postbyte);

string resmsg = Encoding.UTF8.GetString(resb);

resmsg = resmsg.Replace("\n", "");

string[] arrstr = resmsg.Split('\t');

if (arrstr[0] == "1")

{

MessageBox.Show("註冊成功: " + resmsg);

}

else

{

MessageBox.Show("註冊失敗: " + resmsg);

}

}



步驟三:發送訊息(SENDMSG)

private void button3_Click(object sender, EventArgs e)

{

string msg = "msnSDK測試訊息";

string url = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";

string method = "POST";

string postdata = "FUNC=SENDMSG&uids=" + txtmsnacc.Text + "&msg=" + msg + "&encoding=utf-8&flags=0&session=" + SPID;

byte[] postbyte = Encoding.UTF8.GetBytes(postdata);

byte[] resb = wc.UploadData(url, method, postbyte);

string resmsg = Encoding.UTF8.GetString(resb);

resmsg = resmsg.Replace("\n", "");

string[] arrstr = resmsg.Split('\t');

if (arrstr[0] == "1")

{

MessageBox.Show("發送訊息成功: " + resmsg);

}

else

{

MessageBox.Show("發送訊息失敗: " + resmsg);

}

}



其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

Sunday, November 9, 2008

3分鐘學會使用程式發送msn訊息,php篇(一)

---電子發票整合方案 http://rd-program.blogspot.com/2012/03/blog-post.html ---




<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞



ps.也請參考 msnSDK的使用流程

================================



步驟一:取得api 使用的權限(GETSPID)



$file="http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=GETSPID&USERID=apiblogt1&PASSWD=msnsdkt" ;

$myArray='';

$mySession='';

$myResult='';

$getline='';



if (!($fp = fopen($file, "r"))) {

die("could not open XML input");

}

while ($getline = fgets($fp, 4096)) {

$myArray=explode("\t",$getline);

$myResult=$myArray[0];

$mySession= $myArray[1];

}

fclose($fp);

if ($myResult=="0")

{

echo "get session fail...

";

exit();

}

else

{

//$_SESSION["mySession"]= $mySession;

echo "get session=".$mySession."

";

}

echo "<a href='REGISTER.php?uids=".$_GET["uids"]."&session=".$mySession."'>go register page</a>";

?>



步驟二: 邀請聯絡人(REGISTER)



$myArray='';

$mySession='';

$myResult='';

$getline='';

//register:

$file="http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=REGISTER&uids=".$_GET["uids"]."&session=".$_GET["session"] ;

echo $file."

";



if (!($fp = fopen($file, "r"))) {

die("could not open XML input");

}

while ($getline = fgets($fp, 4096)) {

$myArray=explode("\t",$getline);

$myResult=$myArray[0];

}

fclose($fp);



if ($myResult=="0")

{

echo "register fail... ".$myArray[1]."

";

//exit();

}

else

{

echo "register ok. account=".$myArray[2]."

";

}

echo "<a href='SENDMSG.php?uids=".$_GET["uids"]."&msg=hello&encoding=utf-8&flags=0&session=".$_GET["session"]."'>go SENDMSG page</a>";

?>



步驟三:發送訊息(SENDMSG)



$myArray='';

$mySession='';

$myResult='';

$getline='';



//send message:

$file="http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=SENDMSG&uids=".$_GET["uids"]."&msg=".$_GET["msg"]."&encoding=utf-8&flags=0&session=".$_GET["session"] ;

if (!($fp = fopen($file, "r"))) {

die("could not open XML input");

}

while ($getline = fgets($fp, 4096)) {

$myArray=explode("\t",$getline);

$myResult=$myArray[0];

}

fclose($fp);

if ($myResult=="0")

{

echo "send message fail... ".$myArray[1]."

";

exit();

}

else

{

echo "send message ok. message=".$myArray[2]."

";

}

?>



其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

Tuesday, November 4, 2008

msnSDK 釋出支援YAHOO即時通的版本

msnSDK 經過適當的改寫後,已支援Yahoo 即時通

1.新增/刪除 聯絡人的處理
2.發送訊息
3.查詢暱稱
4.查詢個人資訊
5.傳送震動訊息
6.傳送離線訊息

Yahoo 再收送資訊的部份與既有MSN 使用不同的指令;但在msnSDK 裡,機器人會自動判斷發送的對象是使用哪種IM,所以使用同一個函式名稱不需變換

請參考其他相關文章
msnSDK文件下載
http://rd-program.blogspot.com/2008/10/msnsdk.html

函數語言處理氣泡排序法

在碩士班期間擔任幾年的大學基礎程式設計課程的實習助教,在講台上解題,講了氣泡排序法幾乎有十次(對不同班、不同年級)。

for (i=0; i<N; i++)
for (j=0; j<N-i-1; j++)
if (A[j] > A[j+1]) {
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}

二個迴圈洽好代表二層次的工作:裏層負責排列順序、外層負責控制執行次數和調整排序範圍。

用 Haskell 函數語言寫氣泡排序,是將二個層次功能做好,然後組合起來。首先是氣泡調整的部份(如下方的 bubble), bubble 函數要將一列資料由小(左)排到大(右),而且要從右邊開始向左調整順序,將較小的數字往左邊推。這和上述的普通程式處理方向相反。

bubble :: (Ord a) => [a] -> [a]
bubble [x] = [x]
bubble (x:xs)
| x > y = y:x:ys
| otherwise = x:y:ys
where (y:ys) = bubble xs


次數控制的部份(如下方的 loop), loop 函數一方面要先將某個 f 函數套到一串數列(xs)上、取回的結果(y:ys)再將 f 函數套上去;另一方面, loop 函數控制執行次數,藉由將 f 函數再次套到上次已經套過 f 函數的結果(y:ys)時,是將第一個數字(y)取出,將 f 函數套在剩餘的數列(ys)上。每次套上 f 函數之後,就取出數列的一個數字,於是剩下的數列越來越小,直到剩下空數列([])。

loop :: (Ord a) => ([a] -> [a]) -> [a] -> [a]
loop f [] = []
loop f xs = y : loop f ys
where (y:ys) = f xs


接下來,氣泡排序程式(如下方的 bubbleSort),是將 loop 函數和 bubble 函數放在一起。

bubbleSort :: (Ord a) => [a] -> [a]
bubbleSort = loop bubble


執行情況:

GHCi, version 6.8.3: http://www.haskell.org/ghc/ :? for help
Loading package base ... linking ... done.
Prelude> :load "d:/code/hsBubbleSort/bubbleSort.hs"
[1 of 1] Compiling Main ( d:/code/hsBubbleSort/bubbleSort.hs, interpreted )
Ok, modules loaded: Main.
*Main> bubbleSort [3,2,9,7,8,5,4]
[2,3,4,5,7,8,9]
*Main> bubbleSort [5]
[5]
*Main> bubbleSort []
[]
*Main>

Monday, November 3, 2008

SOAP訊息的重用

SOAP是使用XML的通訊協議,傳遞的訊息有相當結構性質。而SOAP一般的缺點是,將程式物件的結構(圖結構或樹結構)拼合為訊息的線狀結構非常耗時。這種特性可以理解,例如 ASP 的 VBScript 字串連接符號 & ,與 Haskell 的字串附加運算符號 ++ ,都是惡名昭彰地拖延效率。

有研究指出, SOAP 所傳輸的訊息經常重複,因此只要將舊訊息多多重用,就能夠加強效率。考慮二則訊息的比對,結果是以下四種情況的其中一種:

  1. 完全符合:內容直接符合。
  2. 良好的符合:結構與長度符合,但資料有些不同。
  3. 部份符合:結構符合,但長度和資料不同。
  4. 不符合:結構不符合。

完全符合的訊息可 100% 重用,而不符合則必須照舊建立新訊息。而前後二訊息有資料和長度的若干不同,則可藉由將長度補足為相同,在將差異的局部加以修改,就能節省若干重建結構的時間。

程式細節上,要將一段 SOAP 訊息作大小幅度修改,有若干技巧如劃塊預存(chunking)、平移(shifting)與偷遞(steeling)等等,進而作聰明的編輯距離(editing distance)規劃,實作者必須多研究、演練並加強。

相關文獻

  1. Suhyun Kim, Daeyoung Kim, Jongwoo Sung and Tomas Sanchez Lopez. Template based high performance ALE-TSOAP message communication. Fifth International Conference on Software Engineering Research, Management and Applications, pp.534-541, 2007.
  2. Nayef Abu-Ghazaleh, Michael J. Lewis, Madhusudhan Govindaraju. Differential serialization for optimized SOAP performance. Proceedings of 13th International Symposium on High Performance Distributed Computing, pp.55-64, 2004.
  3. Nayef Abu-Ghazaleh, Michael J. Lewis, Madhusudhan Govindaraju. Performance of dynamic resizing of message fields for differential serialization of SOAP messages. Proceedings of the International Symposium on Web Services and Applications, pp.783-789, 2004.

Blog Archive