作者 主題: 使用 PHP 發送 MSN 訊息  (閱讀 161438 次)

0 會員 與 1 訪客 正在閱讀本文。

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 於: 2007-03-11 19:00 »
最近有個自動發送 MSN 訊息的需求, 是在系統有異常時, 希望可以發送 MSN 訊息通知相關人員 (一般還是發 email, 只是, 多數人並不是隨時都在檢查並讀取 email, 並沒有 IM 的即時效果). 我記得在 Study Area 有看過類似的作法, 找到了這一篇文章 , 打算照著做就可以了, 可惜... 怎麼試都不成功.

首先, 裝了 tmsnc 這套軟體, 結果, 似乎是新版本介面改變, 所以不能使用. 就自己抓了舊的版本回來, 結果... 一樣不能使用. 我試著直接去跑 tmsnc, 是可以正確的登入到  MSN 中, 不過... 當我要傳訊息時, 馬上就跳出這個訊息:
代碼: [選擇]
Use an Unicode compitable terminal such as rxvt-unicode or uxterm. 接著就結束程式了. 問題是... 我是用 PieTTY 連線, 使用 UTF-8 編碼, 應該也算是 unicode 的 terminal 吧. 而且, 傳的訊息只是一些英文字, 怎麼不行呢? 試著把程式的這個地方改成忽略這個錯誤, 結果, 一樣無法正確的把訊息送出. 試了幾次, 就決定放棄這個軟體了. (奇怪, 怎麼別人用都沒問題?)

上網找了一下, 發現了這一個討論 MSN 協定的網站 (雖然好像很久沒更新? 討論區的資料也好像很舊?), 也找到了這個別人寫的 php MSN class, 抓回來自己用了一下, 果然, 在接收到別人傳入的訊息後, 可以把相同的訊息再傳回去.

因為並沒有直接傳送訊息的功能, 所以我就照著網站上頭的協定, 改了一下程式, 在登入之後, 就送出 XFR 指令取得一個新的 SwitchBoard 伺服器, 然後用一個新的連線到 SB 伺服器, 送出 USR 指令後.... 接著就被斷線了 (奇怪... 看別人寫的怎麼都正常?). 多試了幾次, 發現約 5 次會成功一次, 可是接著的 CAL 指令, 又會被斷線 (這個就完全沒成功過).

試了一下午, 找不出原因. 就打算看別人怎麼寫的. 抓了 qmsn (在 debian 中, 如果 session 不是用 /tmp, 會不能用, 不過... 我改掉這個問題後, 還是不能用?), amsn, gaim 等回來看... 沒什麼特別的啊. 怎麼大家都可以做到. 我的程式就做不到? 後來, 加上一堆除錯的訊息, 才發現我在 XFR 指令取得的 CKI 碼後頭, 還有換行字元存在, 所以我送出的指令, 等於多了一組換行字元, 就被伺服器給斷線了 (果然年紀大了, 寫程式的功力退步不少, 這種小問題, 居然花了快一天才發現). 改了之後, 就可以正確的發送訊息了.

原本打算這樣子就弄好了, 結果... 上線一跑, 如果對方有上線, 是可以正確的收到訊息. 但是如果對方沒有上線, 就完全收不到訊息了. 也就是離線訊息是無法正確使用的.

上網再找了一下, 發現了另一個討論 MSN 協定的網站, 這一個網站看起來有持續的更新中,  上頭還有新的 WLM 8.1 所用的 MSNP15 協定. 由於 MSNP13 開始有支援離線訊息. 所以就把我的程式就照 MSNP13 的內容來改. 也加上了 OIM 的支援. 不過, 怎麼試都不成功. 後來看到 MSNP15 中, 對於 OIM 的傳送方式有些更改, 想說會不會之前 MSNP13 的就不能用了呢 (我覺得可能是我那兒又寫錯了吧, 不然... 總不會之前的舊版 MSN 也不能發離線訊息了嗎?) ?

再把程式改成支援 MSNP15. 這次改的就多了...  因為登入的方式由 TWN 改成  SSO, 且 challenge 檢查碼的計算又改的很複雜 (用到一些平常不常用的  mhash, mcrypt, bcmath 等模組, 所以... 如果你要用 OIM 的話, 你使用的 PHP 就必須加上這些模組的支援), 花了快一天才全部改好. 不過... 辛苦是有代價的, 這次果然可以正確的發送出離線訊息了. (該網站上頭對於 OIM 的 XML 內容, 似乎還是舊的, 有些內容和我自己用 WLM 8.1 把除錯功能打開所取得的記錄內容似乎不太一樣, 我是用我由 WLM 中抓到的那個 XML 才能正確傳送 OIM. 也許之前用 MSNP13 無法傳送也是類似的問題, 不過, 我這兒沒有使用 MSNP13 的 WLM 8.0 版本, 所以, 不確定是否是因為這個原因才不能使用)

整理了一下, 我把這個程式放在這兒 (使用 GPL 授權方式):  http://www.teatime.com.tw/~tommy/files/msnclass.7z

你只要寫一個小程式, 就可以用來發送 MSN 訊息了, 如:
代碼: [選擇]
#!/usr/bin/php -Cq
<?php

error_reporting
&#40;E_ALL&#41;;
include_once&#40;'msn.class.php'&#41;;

// force to use MSNP9, without debug information
// $msn = new MSN&#40;'MSNP9'&#41;;

// force to use MSNP9, with debug information
// $msn = new MSN&#40;'MSNP9', true&#41;;

// force to use MSNP15, without debug information
// $msn = new MSN&#40;'MSNP15'&#41;;

// force to use MSNP15, with debug information
// $msn = new MSN&#40;'MSNP15', true&#41;;

// auto detect MSN protocol, without debug information
// $msn = new MSN;

// auto detect MSN protocol, with debug information
$msn = new MSN&#40;'', true&#41;;

if &#40;!$msn->connect&#40;'YOUR_ID', 'YOUR_PASSWORD'&#41;&#41; &#123;
    
echo "Error for connect to MSN network\n";
    echo 
"$msn->error\n";
    exit;
&
#125;

$msn->sendMessage&#40;'Now&#58; '.strftime&#40;'%D %T'&#41;."\nTesting\nSecond Line\n\n\n\nand Empty Line",
                  
array&#40;
                    
'somebody1@hotmail.com',
                    
'somebody2@hotmail.com'
                       
&#41;
                 
&#41;;
echo "Done!\n";
exit;

?>
建議先用 $msn = new MSN('', true) 的方式跑一次, 確定沒有問題後, 再把除錯的功能關閉.

再提醒一次, 你的系統用的 PHP 至少要有 curl, pcre 這兩個模組才能使用 MSNP9. 如果要發送 OIM, 就得使用 MSNP15, 這時, 還要有 mhash, mcrypt, bcmath 等模組才可以.

補充一下, 那個傳送的訊息, 如果不是英文, 請使用 UTF-8 編碼才能正確的傳送. 因為 MSN 在傳送的訊息, 是使用 UTF-8 編碼的.

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
使用 PHP 發送 MSN 訊息
« 回覆 #1 於: 2007-03-12 00:50 »
太棒了!~...
這篇一定要置頂..
感謝 twu2 大大的貢獻...
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

sakana

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 2582
  • 性別: 男
    • 檢視個人資料
    • sakananote
使用 PHP 發送 MSN 訊息
« 回覆 #2 於: 2007-03-12 00:54 »
感謝 twu2大大 ^^
真是獲益良多
專心投入研究才是王道!!
http://sakananote2.blogspot.com

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
在 shell script 中發送 MSN 訊息
« 回覆 #3 於: 2007-03-12 08:39 »
有了之前用 PHP 寫的 MSN class 之後, 要在一般的 shell script 中來發送 MSN 的訊息就不是件難事了.

首先, 最好每一台機器都去申請一個新的 MSN 帳號 (因為同一個帳號不能同時在兩台機器上登入, 先進去的好像會被後進去的踢出去), 反正申請帳號也不用什麼費用. 當然, 要收這個訊息的帳號, 記得要允許由這個新的帳號發送訊息才可以.

然後, 寫一個小的 php script 如下:
代碼: [選擇]
#!/usr/bin/php -Cq
<?php

error_reporting
&#40;0&#41;;

if &#40;!isset&#40;$argc&#41;&#41; $argc = $_SERVER['argc'&#93;;
if &#40;!isset&#40;$argv&#41;&#41; $argv = $_SERVER['argv'&#93;;

if &#40;$argc != 3&#41; &#123;
    
echo "Syntax&#58; $argv[0&#93; to msg\n";
    exit;
&
#125;

$aTo explode&#40;',', $argv[1&#93;&#41;;
$sMsg $argv[2&#93;;

$msn_acct 'YOUR_MSN_ACCOUNT';
$msn_password 'YOUR_MSN_PASSWORD';

include_once&
#40;'msn.class.php'&#41;;

$msn = new MSN;

if &
#40;!$msn->connect&#40;$msn_acct, $msn_password&#41;&#41; &#123;
    
echo "Error for connect to MSN network\n";
    echo 
"$msn->error\n";
    exit;
&
#125;

$msn->sendMessage&#40;$sMsg, $aTo&#41;;
if &#40;$msn->error != ''&#41;
    
echo "Error&#58; $msn->error\n";

exit;

?>

上頭的 YOUR_MSN_ACCOUNT, YOUR_MSN_PASSWORD 設好後, 把這個檔案存成 msnsendmsg.php, 連同 msn.class.php 放到 /usr/local/bin 下頭. 記得把 msnsendmsg.php 加上可執行的屬性.

這樣子處理之後, 我們只要執行 msnsendmsg.php, 第一個參數是要接收這個訊息的使用者 (如果有多個, 以逗號分隔), 第二個參數就是要傳送的訊息 (用 UTF-8 編碼).  例如:
代碼: [選擇]
#!/bin/sh

msnsendmsg.php "user_a@hotmail.com,user_b@hotmail.com" "Date: $(date)
Subject: Test
=================================================
測試 line 1
line 2
line 3
以下空白


結束
================================================="

exit

當然, 要送什麼內容就由你自己決定吧. 這樣子, 是不是很方便呢?

上頭的文章, 同步發表於我的 blog:
http://blog.teatime.com.tw/1/post/200
http://blog.teatime.com.tw/1/post/201

LPJ

  • 懷疑的國中生
  • **
  • 文章數: 81
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #4 於: 2007-03-12 09:01 »
感謝twu2提供!!
並應用於 http://gm5.cc/msn

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #5 於: 2007-03-12 09:08 »
引述: "LPJ"
感謝twu2提供!!
並應用於 http://gm5.cc/msn


沒輸入密碼的地方? 這樣子登入會失敗, 應該不能送出吧.
我剛試著送了一個給自己, 並沒有收到.

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #6 於: 2007-03-12 09:12 »
我個人的經驗, msn server 會判斷你的進出如果太頻繁
(logout/login) ,它會 block 你一陣子

以前用的那個tmsnc 我很早就放棄了,現在用的是 perl 的版本
(主要是用 expect 真不是一個好用的方法),用高度可用的程式語言
來開發彈性才會高 (雖然  expect 是 py 路線,但我實在是不熟)

這些東西其實有很大的延伸空間,除了傳訊外

代碼: [選擇]

abel@xyz.net.tw (電子郵件地址尚未確認) 說:
Abel 您好:
abel@xyz.net.tw (電子郵件地址尚未確認) 在此為您服務
使用 help 指令查詢使用方式

Abel 說:
?
abel@xyz.net.tw (電子郵件地址尚未確認) 說:
無效指令: ?
請使用 help 查看詳細說明

Abel 說:
dir
abel@xyz.net.tw (電子郵件地址尚未確認) 說:
asterisk-1.2.13.tar.gz
bind-9.3.0_abel.tar.gz

Abel 說:
get asterisk-1.2.13.tar.gz
abel@xyz.net.tw (電子郵件地址尚未確認) 傳送:
 
接受(Alt+C)  另存新檔...(Alt+S)  拒絕(Alt+D)
Abel 說:
help

abel@xyz.net.tw (電子郵件地址尚未確認) 說:
可使用之指令如下(使用 'help 指令' 可查詳細說明):
  dir  get  delete  msg  dict  ping  share  sms  status

Abel 說:
ping log.xyz.net.tw

abel@xyz.net.tw (電子郵件地址尚未確認) 說:
PING log.xyz.net.tw (211.72.210.251) 56(84) bytes of data.
64 bytes from eai2.xyz.tw (211.72.210.251): icmp_seq=0 ttl=64 time=0.514 ms
64 bytes from eai2.xyz.tw (211.72.210.251): icmp_seq=1 ttl=64 time=0.187 ms
64 bytes from eai2.xyz.tw (211.72.210.251): icmp_seq=2 ttl=64 time=0.167 ms
64 bytes from eai2.xyz.tw (211.72.210.251): icmp_seq=3 ttl=64 time=0.159 ms
64 bytes from eai2.xyz.tw (211.72.210.251): icmp_seq=4 ttl=64 time=0.149 ms

--- log.xyz.net.tw ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 836ms
rtt min/avg/max/mdev = 0.149/0.235/0.514/0.140 ms, pipe 2, ipg/ewma 209.077/0.369 ms

Abel 說:
help msg

abel@xyz.net.tw (電子郵件地址尚未確認) 說:
msg USER MESSAGE
  留 MESSAGE 給 USER (即使 user 不在線上也可以)


paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #7 於: 2007-03-12 17:54 »
實在是太棒了, 我使用 sample.php 來試
要使用 MSNP15 就要先裝 mhash, mcrypt, 我是用 CentOS 4.4 的

引用


Site:
http://phprpms.sourceforge.net/mhash
http://phprpms.sourceforge.net/mcrypt
http://rpmfind.net/linux/rpm2html/search.php?query=libmcrypt.so.4

wget http://jaist.dl.sourceforge.net/sourceforge/phprpms/mhash-0.9.2-1.i386.rpm
wget http://jaist.dl.sourceforge.net/sourceforge/phprpms/php-mhash-4.3.9-3.2.1.i386.rpm

rpm -ivh *.rpm

wget ftp://rpmfind.net/linux/PLD/dists/ac/ready/i386/libmcrypt-2.5.7-6.i386.rpm
wget http://nchc.dl.sourceforge.net/sourceforge/phprpms/php-mcrypt-4.3.9-3.2.1.i386.rpm

rpm -ivh libmcrypt-2.5.7-6.i386.rpm
rpm -ivh php-mcrypt-4.3.9-3.2.1.i386.rpm


引述: "sample.php"

$msn = new MSN('MSNP15', true);


使用 MSNP15

成功, 不過離線訊息不成功 :[

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #8 於: 2007-03-12 18:16 »
要不要把不成功的那一個畫面最後幾頁丟來看看? 就是用來傳送 OIM 那一段 (那兒只有 from/to 的資料, 沒有密碼, 放上來應該不會有什麼安全問題.).

我自己試幾個帳號都是可以正常傳送 OIM 的. (只是收的那方還是要用 WLM 8.x 才能收到)

比較有可能是 mcrypt 不對吧, 也許沒支援 DES3 的加密吧. 在算 challenge code 的時候, 會用到 MD5, MHASH_SHA1 與 DES3.

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #9 於: 2007-03-12 19:09 »
剛剛在 CentOS 4.4 上頭試了一下, 除了 libmcrypt 是用 DAG 的版本外, 其他的與你上頭裝的一樣. (不過是 x86-64 的版本)
可以正常的發送 OIM, 並不會有什麼問題.

LPJ

  • 懷疑的國中生
  • **
  • 文章數: 81
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #10 於: 2007-03-13 02:50 »
引述: "twu2"
引述: "LPJ"
感謝twu2提供!!
並應用於 http://gm5.cc/msn


沒輸入密碼的地方? 這樣子登入會失敗, 應該不能送出吧.
我剛試著送了一個給自己, 並沒有收到.


已將if (!$msn->connect('xxx@hotmail.com', 'xxxx')) {
程式碼專門用另外一個MSN帳號取代(ROBOT),所以不需要密碼.

可以離線傳送!本站使用FreeBSD 6.2

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #11 於: 2007-03-13 11:56 »
修改之前發送 MSN 的 php calss . 主要是加上 timeout 的設計, 以避免在 MSN protocol 修改之後, 程式可能會有無法結束的情形.

預設的 timeout 時間是 15 秒. 如果要修改, 可以直接改 msn.class.php 中 MSN ()的第三個參數的預設值, 或在使用 MSN 這個 class 時, 設定第三個參數值.

另外, 把除錯訊息的部份, 統一由一個函式處理, 並允許在設定是否除錯時, 直接把 $debug 設成一個字串 (檔名), 則這些除錯訊息就不會顯示出來, 而是寫到該檔案中.

檔案放於: http://www.teatime.com.tw/~tommy/files/msnclass11.7z
或者抓最新的版本: http://www.teatime.com.tw/~tommy/files/msnclass.7z

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #12 於: 2007-03-13 17:03 »
引述: "twu2"
要不要把不成功的那一個畫面最後幾頁丟來看看? 就是用來傳送 OIM 那一段 (那兒只有 from/to 的資料, 沒有密碼, 放上來應該不會有什麼安全問題.).

我自己試幾個帳號都是可以正常傳送 OIM 的. (只是收的那方還是要用 WLM 8.x 才能收到)

比較有可能是 mcrypt 不對吧, 也許沒支援 DES3 的加密吧. 在算 challenge code 的時候, 會用到 MD5, MHASH_SHA1 與 DES3.


感謝大大的支持, 現在可以了, 原來是因為沒裝 bcmath 的關係
因為訊息出得太快看不到第一行的:

引述: "error_log"

PHP Warning:  Unknown(): Unable to load dynamic library '/usr/lib/php4/bcmath.so' - /usr/lib/php4/bcmath.so: cannot open shared ob
ject file: No such file or directory in Unknown on line 0


引述: "my action"

wget ftp://rpmfind.net/linux/PLD/current/dists/ra/PLD/i386/PLD/RPMS/php-bcmath-4.2.3-8.i386.rpm
rpm -ivh --nodeps php-bcmath-4.2.3-8.i386.rpm


site: http://rpmfind.net/linux/rpm2html/search.php?query=bcmath.so

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #13 於: 2007-03-13 17:23 »
奇怪, 我在 CentOS 4 上頭, 並沒有另外裝 bcmath, 並不會有問題啊. 你的 php 是自己編的嗎?

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #14 於: 2007-03-13 17:25 »
引述: "twu2"
奇怪, 我在 CentOS 4 上頭, 並沒有另外裝 bcmath, 並不會有問題啊. 你的 php 是自己編的嗎?


不是啊, 是預設的 rpm php

# rpm -q php
php-4.3.9-3.22

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #15 於: 2007-03-13 17:32 »
當我打算再試的時候, 竟然失敗了

不好意思, 要貼訊息出來, 很多 >"<

代碼: [選擇]
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
  <soap:Fault>
    <faultcode xmlns:q0="http://messenger.msn.com/ws/2004/09/oim/">      q0:AuthenticationFailed</faultcode>
    <faultstring>Exception of type 'System.Web.Services.Protocols.SoapException' was thrown.</faultstring>
    <faultactor>https://ows.messenger.msn.com/OimWS/oim.asmx</faultactor>
    <detail>
      <LockKeyChallenge xmlns="http://messenger.msn.com/ws/2004/09/oim/">389889063</LockKeyChallenge>
    </detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
*** OIM need new challenge (389889063) for paulso43737@hotmail.com

PS. 整理一下, 上頭也有密碼的部份移除. by twu2

其中有一行是

*** SB: no any use online! skip to send message!

不知道有沒有關係

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #16 於: 2007-03-13 17:37 »
代碼: [選擇]
[twu@www ~]$ rpm -qa | grep php
php-xmlrpc-4.3.9-3.18
php-pgsql-4.3.9-3.18
php-devel-4.3.9-3.18
php-mysql-4.3.9-3.18
php-snmp-4.3.9-3.18
php-odbc-4.3.9-3.18
php-gd-4.3.9-3.18
php-mbstring-4.3.9-3.18
php-domxml-4.3.9-3.18
php-ncurses-4.3.9-3.18
php-imap-4.3.9-3.18
php-ldap-4.3.9-3.18
php-pear-4.3.9-3.18
php-4.3.9-3.18


找了一台 32bit 的 CentOS 4 來看, 沒裝 php-bcmath, 不過, 應該是有編在裡頭, 因為這個結果都是有的:
代碼: [選擇]
<?php

if &#40;function_exists&#40;'bcmod'&#41;&#41;
  
echo "yes for bcmod!\n";

if &
#40;extension_loaded&#40;'bcmath'&#41;&#41;
  
echo "yes for bcmath!\n";

?>


twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #17 於: 2007-03-13 17:51 »
那個訊息是因為你要收訊息的使用者不在線上, 就會回 217.
因為沒有人在線上, 所以就沒送出. 而會試著送 OIM.

後面是去試著送 OIM, 結果都是:
代碼: [選擇]
*** OIM need new challenge (389889063)
看起來是算出來的 lockkey 不對. 也就是 challenge 的算法不對吧.

我剛剛在我家唯一一台的 32 位元機器上 (debian) 試了一下, 果然不對... 回家再看看那兒算錯了. (64 bits 的機器是對的, 應該是 sign/unsign 或 overflow 造成的吧...)

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #18 於: 2007-03-13 18:37 »
msn.class.php v1.2 (修正 32 位元機器 OIM 問題)

修改之前發送 MSN 的 php calss. 修正在 32 位元的機器上, 無法計算出正確的 challenge code, 因此無法正確發送離線訊息的問題.

在使用 base_convert() 轉換出來的值, 是一個字串, 如果直接拿來做 AND/XOR 之類的位元運算, 在 32 位元的機器上頭, 會傳回 -1. (奇怪, 在 64 位元的機器上頭就是正常的)

檔案放於: http://www.teatime.com.tw/~tommy/files/msnclass12.7z
或者抓最新的版本: http://www.teatime.com.tw/~tommy/files/msnclass.7z

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #19 於: 2007-03-19 11:44 »
引述: "twu2"
msn.class.php v1.2 (修正 32 位元機器 OIM 問題)

修改之前發送 MSN 的 php calss. 修正在 32 位元的機器上, 無法計算出正確的 challenge code, 因此無法正確發送離線訊息的問題.

在使用 base_convert() 轉換出來的值, 是一個字串, 如果直接拿來做 AND/XOR 之類的位元運算, 在 32 位元的機器上頭, 會傳回 -1. (奇怪, 在 64 位元的機器上頭就是正常的)

檔案放於: http://www.teatime.com.tw/~tommy/files/msnclass12.7z
或者抓最新的版本: http://www.teatime.com.tw/~tommy/files/msnclass.7z


嘗試了, ok 了 ;)

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #20 於: 2007-03-27 11:59 »
為了不上線太過頻繁,所以程式不能老在登入
但是如果被在其它地方登出、斷線,好像還不能偵測是不是還在線上?
有沒有辦法確認線上狀態。來決定要不要重新執行登入啊?

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #21 於: 2007-03-27 18:36 »
可以考慮寫成 daemon, login 之後, 沒必要就不要 logout 了. 用另外的方式來讀取要傳送的資料. 這樣子應該就可以避免這個問題了.

等有空再來改看看好了.

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #22 於: 2007-03-27 19:35 »
引述: "twu2"
可以考慮寫成 daemon, login 之後, 沒必要就不要 logout 了. 用另外的方式來讀取要傳送的資料. 這樣子應該就可以避免這個問題了.

等有空再來改看看好了.


我的程式本來就不會主動登出
是考慮當不正常登出後(像MSN Server有問題時)
沒有辦法偵測連線狀態~~

不過現在的板本好像是出傳一次就登入登出一次?
好像很容易被封索的樣子

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #23 於: 2007-03-27 19:41 »
不正常? 送出指令後如果沒有回覆 (斷線應該 feof() 就會知道), 或回覆錯誤碼, 就當做已經被登出, 然後再登入一次就可以.

正常情形下, 不會有 feof(), 也應該隔一段時間會收到一次 challenge.

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #24 於: 2007-03-29 11:58 »
修改之前發送 MSN 的 php calss. 加入一些小功能, 可以做成簡單的 msnbot.

檔案放於: http://www.teatime.com.tw/~tommy/files/msnclass13.7z
或者抓最新的版本: http://www.teatime.com.tw/~tommy/files/msnclass.7z

主要是加入一個 doLoop() 用來接收訊息並檢查 spool 內是否有訊息要送出. 另外寫一個 msnbot.php, 用來常駐執行.

安裝說明:

    * 建立下面的目錄:
代碼: [選擇]
mkdir /var/spool/msnbot
mkdir /var/spool/msnbot/log
mkdir /var/spool/msnbot/spool
chmod 777 /var/spool/msnbot/spool
chmod o+t /var/spool/msnbot/spool


    * 把 msnbot.php 與 msn.class.php 放到 /var/spool/msnbot 的目錄下頭, 把 msnbot.php 設成可執行:
代碼: [選擇]
chmod +x /var/spool/msnbot/msnbot.php

    * 修改 msnbot.php 的內容, 如果有必要, 可以修改 processMsg() 的內容, 改成你自訂的處理方式.
    * 使用 msnbot.sh 做成啟動的 script, 讓 msnbot.php 程式在開機之後就執行.
    * 如果有需要傳送訊息, 直接在 /var/spool/msnbot/spool 目錄下, 產生一個副檔名為 .msn 的文字檔, 第一行的內容是:
代碼: [選擇]
TO: email1,email2

    表示要接受訊息的使用者列表. 第二行之後是所要送出的訊息. 然後把檔案的屬性改成 0666. 可以參考 msnsendmsg.php 的做法.

詳細的內容... 請自行參考程式碼吧.

本文同步發表於: http://blog.teatime.com.tw/1/post/218

pank

  • 懷疑的國中生
  • **
  • 文章數: 84
    • 檢視個人資料
    • http://pank.org
使用 PHP 發送 MSN 訊息
« 回覆 #25 於: 2007-03-29 14:35 »
應該是 chmod 777 /var/spool/msnbot/spool
感謝 twu2 的程式!
ttp://pank.org

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #26 於: 2007-03-29 15:51 »
補充一下, 如果用 MSNP15, 我試過 MSNP13 所用的 SOAP, 會有問題. 而該網站上頭在 MSNP15 的 contacts.msn.com 認證 policy 設定並不太對, 至少我試都會失敗. 我自己抓我用的 WLM 8.1 的記錄, 後來是可以正確的登入, 不過仍然無法取得 contact list. 而 MSNP15 中, 要使用 ADL 針對 contact list 送出指令, 對方才會看到你的上線狀態. 這一點在 MSNP9 中, 可以由  SYN 指令取得 contact list, 且, 只要 CHG 做 NLN 的指令, 對方就會看到這個帳號是 online 了. 因此.... msnbot.php 對於 MSNP15 的處理上頭, 會再產生一個 MSNP9 的 object, 去取得 contact list 後再使用 MSNP15 登入.

另外, 1.3a 修正被斷線後無法再次登入的問題. 檔名沒改, 如果你抓的還是 1.3 版的, 就麻煩再抓一次吧.

pank

  • 懷疑的國中生
  • **
  • 文章數: 84
    • 檢視個人資料
    • http://pank.org
使用 PHP 發送 MSN 訊息
« 回覆 #27 於: 2007-03-30 00:56 »
用這個程式做了一個 WEB2MSN http://pank.org/msn/
Source http://pank.org/msn/web2msn.tgz
建議再加一個功能, 當 user 新加入 MSN bot 為連絡人時,
MSN bot 應該會收到一個確認的訊息, 若能自動回應, 就很讚了
ttp://pank.org

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5365
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
使用 PHP 發送 MSN 訊息
« 回覆 #28 於: 2007-03-30 10:13 »
有人加入或移除時, 是會收到 ADL/RML 指令 (ADD/REM 在 MSNP9 中).
不過... 好像並不用回應對方就可以正確的加入了. (這個與 MSN 的運作一樣嗎? 我記得好像要同意才能加入? 還是那個同意是指加到自己的 contact list?)

在 MSNP15 中, 好像加入後, 還要送個 ADL 回給 NS 才會看到上線的狀態. (不過... 因為是由 MSNP9 抓 list, 所以, 如果重跑這個程式也會出現...)

另外, 就算沒把對方加入到自己的 contact list 中, 並不會妨礙傳送訊息給對方. 只要對方有把你加到他的 contact list, 允許你送訊息過去, 就可以收到訊息.

所以, 看不到上線的狀態, 只會影響對方送訊息給你 (因為要上線才允許送訊息... 如果是 OIM, 這個 bot 會不管...), 不過目前的作法, 只要重跑就會出現在 contact list 中了 (不太確定, 因為這點與實際 MSN 運作好像不同, 不過我測的結果是這樣).

需要有這功能, 急的話就自己加吧. 不急的話... 我是有寫這部份... 等下一次改版再丟出來吧.

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
使用 PHP 發送 MSN 訊息
« 回覆 #29 於: 2007-03-30 12:17 »
twu2 你真猛! 呵呵