MSN 通常是用來交談的, Liunx 下最有名的 MSN Client 當屬 gaim,
不過因為它是 GUI 的環境,要以 shell 來應用實在不容易
(如果你能用 shell 控制 mouse 點在那裏就可以做到,但你能嗎 ? ()
1. 安裝 tmsnc (http://tmsnc.sourceforge.net/download.html)
我的例子是用 0.1.1 版本,你可以找別的版本自己開發,或參考我的例子也可以
$>wget http://unc.dl.sourceforge.net/sourceforge/tmsnc/tmsnc-0.1.1.tar.gz
$>tar -zxvf tmsnc-0.1.1.tar.gz
$>cd tmsnc-0.1.1
# 看一下 Makefile , 裏面的 openssl 路徑是否符合你的環境
$>make
$>make install
$>tmsnc (啟動的樣子)
.........
.'------.' |
| .-----. | |
| |TMSNC| | |;.
|*`-----'.|.' `;
`---------' .;'
.''''////////;'
/ ######### /;/ The
/ ######### // textbased
`-----------' alternative!
Login: abel@twnic.net.tw
Your login-address is abel@twnic.net.tw
Enter password:
2.TMSNC 的指令說明
# tmsnc 的 command 說明 (Readme),如果你要完善你的功能,就要詳讀任何的說明
Availible commands in TMSNC are:
* help show a list of availible commands
* clear clear the screen
* nick <name> set your nickname to <name>
* status <string> where <string> is online, busy, brb,
* away, phone, lunch or hidden
* quit logout from server and quit TMSNC
* add <address> add <address> to the contact-list
* block <address> prevent <address> from obtaining your status
* unblock <address> reverse the block
* remove <address> remove <address> from contact-list
* window <n> or TAB change current window to <n>
* window close or F7 close current window and conversation
* chat <address> or Enter start a new conversation with <address>
由以上我們可以知道, tmsnc 我們巳經裝好了,所以就可以來做 shell 發送 msn 的工作了!
用 shell 來發,最好的工具是 expect , 這個工具的說明,你可以在 man page 中找到詳細
解說
3.
3.1
範例一(簡單版):
#!/usr/bin/expect
# filename=send.exp
log_file ./exp.log
spawn tmsnc -l 你申請的MSN帳號
expect "Enter password:"
send "你的密碼\r"
expect -re ".* can't control me*"
sleep 5
send "/chat [lindex $argv 0]\n"
expect -re ".*!.*"
sleep 1
send "Now: [exec date]\n"
sleep 1
send "[lindex $argv 1]\n"
sleep 3
send "/window close\r"
send "/quit\r"
用法:
#請注意, MSN訊息需為 UTF-8 encoding
$>./send.exp MSN連絡人 MSN訊息
3.1
範例二(稍複雜版):
#!/usr/bin/expect
# log file , for debug
log_file ./exp.log
#設定訊息路經
set workdir "/www/htdocs/html/msn/msg"
# -l 指定 MSN contact, 你可以 tmsnc -h 來了解參數
spawn tmsnc -l 你申請的MSN帳號
sleep 1
# 出現 password 時,送出密碼
expect "Enter password:"
send "你的密碼\r"
sleep 1
# 出現 control me 時,表示 tmsnc 載入完成
expect -re ".* can't control me*"
sleep 3
# 無限迴圈,讀取訊息檔
while {1} {
sleep 1
#取得 訊息檔中第一行,我個人的定義是 MSN addr
set msn_addr [ exec cat $workdir/msg.utf8 | head -1 ]
#如果]有第一行,則回到 loop
if {$msn_addr!=""} {
#對誰發送說明,指令請看 Readme
send "/chat $msn_addr\n"
sleep 1
#出現對話視窗後
expect -re ".*!.*"
#發送現在時間
send "Now: [exec date ]\n"
sleep 1
#發送該檔案的第二行起的訊息,請注意,訊息需為 UTF-8 的 encoding ,您可使用 iconv 來轉換
send "[exec cat $workdir/msg.utf8 | sed -e 1d ] \n"
sleep 1
#關]對話
send "/window close\n"
sleep 1
#清除訊息檔
set cmd [exec echo -n "" > $workdir/msg.utf8]
}
}
send "/quit\r"
現在,我們可以來寫一個網頁程式,來做上例中的 msg.utf8 的處理
<?php
while ( list($key,$val)=each($_GET))
$$key=$val;
if (isset($smt1)) {
$msn=iconv("GB2312","UTF-8",$msg);
$fp=fopen("/www/htdocs/html/msn/msg/msg.utf8",'w');
fwrite($fp,"$txt1\n$msn");
fflush($fp);
fclose($fp);
system("cat ./msg/msg.utf8");
echo " ;\n";
}
?>
<html><body>您要加我才能送訊息給你, 請新增 MSN 連絡人: abel@twnic.net.tw ;
測試完後再把我刪了即可, 非常感謝! ;
<form method=GET>
我要傳送給 msn:<input type=text value="<?php echo $txt1;?>" name=txt1>
<input type=text name=msg value="<?php echo $msg;?>" maxlength=255>訊息
<input type=submit value=send name=smt1>
</form> </body></html>
嗯... Good, 如此,你就可以用
$>wget http://你的url/msn.php?smt1=send&txt1=MSN連絡人&msg=MSN訊息
來發放訊息了,實際的例子,您可參考
http://211.72.210.251/msn/msn.php
5.
實用範例(mrtg)
WorkDir: /www/htdocs/html/mrtg
Refresh: 300
Interval: 5
Language: Big5
Options[_]: growright, noinfo, gauge
#LogFormat: rrdtool
#PathAdd: /usr/bin/
#LibAdd: /usr/lib/perl/
#-----------------------Target Begin------------------------------------
Target[localhost-mysql]:`check_mysqlsh localhost `
MaxBytes1[localhost-mysql]:200
MaxBytes2[localhost-mysql]: 100
Title[localhost-mysql]: 211.72.210.251 MYSQL Threads/Qps Stat
Legend1[localhost-mysql]: 行程數
Legend2[localhost-mysql]: 秒查詢量
LegendI[localhost-mysql]: Threads
LegendO[localhost-mysql]: Qps
YLegend[localhost-mysql]: Threads/Qps
PageTop[localhost-mysql]: <h1>211.72.210.251 MYSQL Threads/Qps Stat</h1>
ThreshMaxI[procmail-mysql]: 30
ThreshMinI[procmail-mysql]: 1
ThreshMaxO[procmail-mysql]: 50
ThreshProgI[procmail-mysql]:/www/htdocs/html/mrtg/alert/mysql_alert.sh
ThreshProgO[procmail-mysql]:/www/htdocs/html/mrtg/alert/mysql_alert.sh
以上的例子是我在監控 mysql 的行程式及查詢量,若行程數超過 30 個,或<=1 個時,或是mysql 每秒
查詢超過 50 個 query, 啟動 mysql_alrtt.sh 程式,而 mysql_alert.sh 程式如下
#!/bin/sh
# mrtg 會傳送三個參數給 ProgI/ProgO , 以利 alert 程式處理
# 分於為 Target name/所設定的警告值/現在的值
target=$1
alert_val=$2
curr_val=$3
wget "http://211.72.210.251/msn/msn.php?smt1=&txt1=MSN連絡人&msg=MRTG 所監測的\
$target,發生問},您所設的現在值 $curr_val 超過您所設的 $alert_val\
\n請您參考 http://你的網頁/$target.html" -O /tmp/msn.log
4. 結語
我個人目前系統的 Alert 都是透過 MSN 來做即時發放的,你可以寫一個檢查系統的程式, check 到有
alert 狀況時,就可以用 wget .... 來送出訊息給很多相關人員,只要您想送什麼,就可以送什麼,透過
shell 放送,更增您的方便性(當然,也可以送病毒)
註:如果您充份了解 expect 的字串處理,可以反過來,讓 tmsnc + expect 幫您做事哦, 例如和他交談
"exec ls -la /tmp" , 這個 exec 是 prefix, 你只要能拆解出 "ls -la /tmp", 就可以在 msn 中看
到 /tmp 下的檔案列表了 ! 這絕對是真的, 就看你的能力囉
(以上所出現的 email 或 msn address 皆是假的,不要寄信來,不然你會被列入 RBL)
sollinux 回复于:2005-07-11 19:01:26
参考!
初学vb 回复于:2005-07-12 00:00:11
非常不错,值得学习。
redhat2005 回复于:2005-07-12 15:45:43
我在linux 安装tmsnc ,改的openssl的地址是/usr/include/openssl,
make是提示有错误,那位大哥可以帮助下嘛?还有那位大哥在linux试验成功过啊
abel 回复于:2005-07-12 16:14:43
Makefile 中的
LIB= -L/usr/lib -lssl -lcrypto -lpanel -lncurses
INC= -I/usr/local/include -I/usr/local/ssl/include -I/usr/include/ssl
改成
LIB= -L/usr/lib -L/usr/local/openssl/lib -lssl -lcrypto -lpanel -lncurses
INC= -I/usr/local/include -I/usr/local/ssl/include -I/usr/include/ssl -I/usr/local/openssl/include
不然你就在裝一次 openssl 在 /usr 下,就不用改 makefile
glider126 回复于:2005-07-22 09:58:33
要是能发短消息到手机就好了,呵呵
不过发到msn也是不错的,谢谢你的分享!!
abel 回复于:2005-07-22 10:14:32
引用:原帖由 "glider126" 发表: 要是能发短消息到手机就好了,呵呵
不过发到msn也是不错的,谢谢你的分享!!
發到手機簡單的很,你只要買點數就好了
廠商會給你 帳號/密碼及相關 api
b2linux 回复于:2005-07-28 20:55:43
有心人啊,顶下先!
joecen 回复于:2005-07-29 12:29:27
最好还是装新版的openssl吧,编译一定没有问题.
每次看abel兄的文章总有大的收获!非常感谢你.
simonat 回复于:2005-11-23 17:48:55
有没有办法获得 contact list?
archangle 回复于:2005-11-24 09:52:33
用centericq来做更简单.
comerwang 回复于:2007-01-16 17:24:30
学习,学习!!!!
新杂人 回复于:2007-01-16 20:06:05
没介绍错, 很好
|