现在有一些公交卡支持网余额查询了,虽然支持的不多,但是不得不说,深圳通的余额还是很好查的。因为是匿名的公交卡,所以输入用户名、身份证之类的事没用的,需要输入的只是公交卡的号码即可。
深圳通的余额查询网站是:深圳通网上查询,输入号码即可查询出卡的余额信息等,如下所示:
还是很简单的,没有万恶的广告、没有万恶的验证码!!
这篇文章讲得是如何根据这个网页编写自己的程序实现公交卡的余额查询的。方法是:C++的Curl库+WireShark。
像现在好多类似的公开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库,还是很简单的。
这个很简单,使用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); }
原文地址:http://blog.csdn.net/arbboter/article/details/43502081