公交餘額查詢(深圳通)

關於公交餘額查詢

現在有一些公交卡支持網餘額查詢了,雖然支持的不多,但是不得不說,深圳通的餘額還是很好查的。因爲是匿名的公交卡,所以輸入用戶名、身份證之類的事沒用的,需要輸入的只是公交卡的號碼即可。

深圳通的餘額查詢網站是:深圳通網上查詢,輸入號碼即可查詢出卡的餘額信息等,如下所示:


還是很簡單的,沒有萬惡的廣告、沒有萬惡的驗證碼!!

這篇文章講得是如何根據這個網頁編寫自己的程序實現公交卡的餘額查詢的。方法是:C++的Curl庫+WireShark


獲取驗證查詢餘額的API接口

像現在好多類似的公開API一樣,我們可以通過API請求的方式獲取公交卡的餘額信息,那麼這個查詢餘額的API接口是什麼呢?

好吧,網站不是我寫的,對網頁也幾乎是一竅不通,可是我會一丟丟的WireShark,拿這個工具抓取試試。

因爲查詢公交卡餘額的時候需要輸入公交卡號,所以,可以通過過濾Http關鍵字內容來獲取我們所需要的數據包。好了,打開WireShark,啓動抓包監聽,然後輸入過濾條件,最後在瀏覽器裏面查一個卡號試試。查詢條件是

http contains "294798454"
表示過濾出包含294798454的Http包,查詢結果如下所示:


查詢後發現WireShark抓取到了兩個數據包(其實一個是請求包,一個是應答包),可以從上面的包內容看出,API的請求方式是POST,爲了看得更相信一點,可以Fllow Tcp Stream進去看看,結果如下所示:(紅色的表示請求內容,藍色的表示應答內容)



可以上圖中看出收集一些數據:POST,cardno=294798458,http://query.shenzhentong.com:8080/sztnet/qryCard.do等,於是不妨猜猜API接口!API接口中肯定是要包括公交卡號的,所以cardno=294798458是有用的,同時我們可以發現往常參數是在鏈接後面使用如下方式傳參的

http://write.blog.csdn.net/postedit?ref=toolbar
通過?+參數,所以不妨猜一下API接口是
http://query.shenzhentong.com:8080/sztnet/qryCard.do?cardno=294798458
要驗證我們的猜想是否正確,可以直接把該地址輸入到瀏覽器試試即可。

事實上,我們所需要的API接口正好是上述的地址+卡號的方式。到此,我們可以知道深圳通的餘額查詢API接口了,下面需要編程來查詢了,使用到的事curl庫,還是很簡單的。


使用curl編程查詢深圳通餘額

這個很簡單,使用C++開源庫之Curl這裏封裝的Post即可,代碼如下:

// 深圳通查詢
void BusPassCheckShenZhen( const string& strCardNo, vector<string>& result )
{
	CHttpClient http;
	string strResult;
	char  szValue[128] = "cardno=";

	// 查詢餘額信息
	strcat_s(szValue, sizeof(szValue), strCardNo.c_str());
	http.Post("http://query.shenzhentong.com:8080/sztnet/qryCard.do", szValue, strResult);
	
	// 從查詢結果的網頁中解析出餘額信息
	if(strstr(strResult.c_str(), "不合法") == NULL)
	{
		const char* pStart = strstr(strResult.c_str(), "class='tableact'");
		const char* pEnd = strstr(pStart, "</table>");

		const char* psd = NULL;

		for( pStart = strstr(pStart, "<td"); pStart && pStart < pEnd ; pStart = strstr(pStart, "<td"))
		{
			memset(szValue, 0, sizeof(szValue));
			pStart = strstr(pStart, ">");
			psd = strstr(pStart, "</td>");
			memcpy(szValue, pStart+1, psd-pStart-1);
			result.push_back(szValue);
		}
	}
	else
	{
		result.push_back("查詢條件不合法!");
	}
}

關於其他公交卡

上述公交卡餘額查詢還是很簡單的,一下就找到了API接口了。但是其他的就不容易了,我試了試北京的,不但要驗證碼,而且找到後輸入鏈接居然說沒權限,我只能說我太年輕了!!!還有其他的,甚至都不支持網上餘額查詢的~

找了幾個大城市的,目前我只找到了深圳和上海的API接口,其他的要麼是沒有查詢功能,要麼就是我沒去試,要麼丫的我找不到!

附上上海的查詢代碼:

void BusPassCheckShanghai( const string& strCardNo, vector<string>& result )
{
	CHttpClient http;
	string strResult;
	char  szValue[258] = {0};

	sprintf_s(szValue, sizeof(szValue), "http://220.248.75.36/handapp/PGcardAmtServlet?arg1=%s&callback=jQuery18307201102350372821_1422865576701&_=1422865584833", strCardNo.c_str());
	http.Get(szValue, strResult);

	result.push_back("餘額:");

	const char* ps = strstr(strResult.c_str(), "'");
	const char* pe = strstr(ps+1, "'");
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, ps+1, pe-ps-1);
	result.push_back(szValue);

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章