第一篇博客,無聊地嘗試了一下利用C#來發送飛信。
2012.09.29 現在這種方式由於加了驗證碼,所以要想方法繞過。。。所以,蛋疼。。
- 實現的原理
參考了一篇博客:用PHP模擬登錄WAP飛信實現飛信發送,地址:http://blog.quanhz.com/archives/118。其中詳細地介紹了如何使用模擬WAP的方式,實現了飛信登陸,發送飛信,退出等功能。根據其找到的Post與Get的鏈接地址,同時,利用C#的HttpWebRequest和HttpWebResponse這兩個類,可以很容易就實現出一個能夠發送飛信的客戶端。
- 登陸飛信(代碼實現詳看注釋)
1 public static String Login(String mStr, String pwdStr)
2 {
3 // 需要Post的字段:其中,mStr為手機號,pwdStr為密碼,loginstatus為登陸狀態
4 String args = "m=" + mStr + "&pass=" + pwdStr + "&loginstatus=4";
5 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://f.10086.cn/im/login/inputpasssubmit1.action");
6 HttpWebResponse response = null;
7 Encoding encoding = System.Text.Encoding.UTF8;
8 byte[] argsBytes = encoding.GetBytes(args); // 編碼轉換,UTF-8
9 request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
10 request.ContentType = "application/x-www-form-urlencoded";
11 request.Method = "Post"; // 設置Http請求的方法為Post
12 request.Timeout = 1000;
13 request.CookieContainer = cc; // 實現后續操作關鍵所在,保存Cookies,其中cc = new CookieContainer(),是我實現的一個類的中靜態成員變量;
14
15 Stream outStream = request.GetRequestStream();
16 outStream.Write(argsBytes, 0, argsBytes.Length);
17 response = (HttpWebResponse)request.GetResponse();
18 String resultStr = streamToString(response.GetResponseStream()); // 從返回的響應流中轉換成String
19 outStream.Close();
20
21 return resultStr;
22 }
- 發送飛信給自己
1 public static String SendMsg(String msgStr)
2 {
3 String msg = "msg=" + msgStr; // msgStr為發送的內容
4 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://f.10086.cn/im/user/sendMsgToMyselfs.action");
5 HttpWebResponse response = null;
6 Encoding encoding = System.Text.Encoding.UTF8; // 注意要采用UTF-8的編碼
7 byte[] argsBytes = encoding.GetBytes(msg);
8 request.Accept = "*/*";
9 request.Timeout = 1000;
10 request.ContentType = "application/x-www-form-urlencoded";
11 request.Method = "Post";
12 request.CookieContainer = cc;
13 Stream outStream = request.GetRequestStream();
14 outStream.Write(argsBytes, 0, argsBytes.Length);
15 response = (HttpWebResponse)request.GetResponse();
16 String resultStr = streamToString(response.GetResponseStream());
17 outStream.Close();
18
19 return resultStr;
20 }
實現了登陸之后,發送飛信是一個很簡單實現的過程,只需要往特定的URL地址POST短信內容就可以實現。注意點:中文的編碼問題以及Cookie的問題。
- 總結
通過模擬Http的方式實現了飛信的登陸與發送功能,通過對3G飛信的數據抓取與分析,可以由此基礎實現很多功能:比如獲取天氣情況,發送給飛信好友;比如實現遠程關機等等應用;又比如我前陣子實現的中大教務系統客戶端,原理與這個也很類似,這兩者結合起來,就可以實現一個當成績一公布就用飛信通知相應的同學。