使用xmlhttp为网站增加股市行情查询功能

来源:互联网 发布:京东火牛软件 编辑:程序博客网 时间:2024/06/09 23:57

 一般情况下,如果我们想了解股市行情,必须登录专业股票网站,输入公司代码才能看到具体股价。其实,利用XMLHTTP协议,我们每个人都可以在自己的个人网站中提供股市行情详细情况查询服务,本文介绍了如何使用ASP、VbScript结合xmlhttp编程来实现这个功能。

一、原理
原理非常简单,在很多大型网站上都有实时更新的股市行情信息,我们通过自己的WEB服务器发送出XMLHTTP命令访问雅虎财经站点的股市行情数据库服务器,从数据库中查询我们所需要的内容,然后通过ASP组合成网页回送给客户端。
同时,我们使用XmlHttp协议实现客户端网页无刷新效果以及向服务端提出检索数据的要求。
XMLHTTP允许你打开一个到任意服务器上的HTTP连接,发送一些数据和取回一些数据。并且所有的这一切都是在很少的几段脚本中就能够实现。使用XMLHTTP对象通常是进行XML数据交换,但其他格式的数据也是允许的。
在商业程序中的运用这种交换类型的标准模式是客户端发送一个文本字符串到服务端,然后服务端将这个字符串装载入一个XMLDOM对象中并且解释它,然后返回一段HTML给客户端,或则是另外一段XML代码给客户端让客户端的浏览器自己解释。在这种方式下,对于信息的传递来说是非常有效的形式,尤其是当你使用DHTML允许你根据返回信息动态显示时。
具体流程为:客户端通过xmlhttp提出股票行情查询要求--〉WEB服务器中的ASP侦听页接受请求后使用xmlhttp向股市行情数据库服务器发送检索命令--〉数据库执行查询操作,返回结果给我们自己的WEB服务器(html形式)--〉WEB服务器接收到内容后,过滤掉HTML多余部分,挑选出纯股票数据,组合后将结果传送给客户端-〉客户端浏览器使用vbscript显示出来。

二、ASP XmlHttp编程简述
1、客户端dns2.htm页面:
〈script language="vbscript"〉
Sub submit1_onmouseup
Dim objXML, objXSL, objFSO,strFile, strFileName, strXSL,strURL, theString,TheForm
Set TheForm = Document.wordfind
window.status="正在检索数据???"
strURL="dns2.asp" ' 服务器侦听页地址
Set objXML = CreateObject("Microsoft.XMLHTTP") '创建MS的XMLHTTP组件
stra = "submit=submit&fqdn="&TheForm.webname.value
objXML.Open "post",strURL,false '采用Post提交方式;
objXML.setrequestheader "content-length",len(stra)
objXML.setrequestheader "content-type","application/x-www-form-urlencoded"
objXML.send stra ' 发送信息
xmlGet = objXML.responsebody '稍等片刻后,得到服务器端传回来的结果;
xmlGet = bytes2bstr(xmlGet) '将单字节转换成文本格式函数,源程序可以下面的dns2.asp程序中找到;
TheForm.comments.value=xmlGet
Set objXML = Nothing
end sub
〈/script〉

〈html〉〈head〉〈title〉XMLHTTP之股票行情篇〈/title〉〈meta http-equiv="Content-Type" content="text/html;; charset=gb2312"〉
〈/head〉
〈body bgColor=#a1bae6〉
〈table border="0" cellpadding="0" cellspacing="0" width="100%"〉
〈tr〉
〈td width="100%" align=center〉
〈form method="post" name=wordfind onsubmit="javascript:return false"〉
〈FONT color=#002e5b face=geneva,arial,sans-serif size=2〉
〈B〉请选择股票名称(美国纳斯达克)〈/B〉〈/FONT〉
〈FONT color=#002e5b face=geneva,arial,sans-serif size=2〉〈B〉:chr(13)&Chr(10)
〈select name=webname style="HEIGHT: 22px;; WIDTH: 80px"〉
〈option value="^IXIC"〉纳斯达克〈/option〉〈option value="ASIA"〉亚信〈/option〉
〈option value="CHINA"〉中华网〈/option〉 〈option value="NTES"〉网易〈/option〉
〈option value="SINA"〉新浪网〈/option〉 〈option value="SOHU"〉搜狐〈/option〉
〈/select〉〈input type="submit" value="查询" id=Submit1 name=Submit1〉〈/B〉
〈TEXTAREA name=comments readonly rows=10 cols=76 〉〈/TEXTAREA〉
〈/form〉〈/td〉〈/tr〉〈/table〉〈/body〉〈/html〉
2、服务器端dns2.asp程序:
〈%
dim xmlGet
xmlGet=""
if len(trim(Request.form("fqdn"))) 〉 1 then
Dim objXML, objXSL, objFSO
Dim strFile, strFileName, strXSL
Dim strURL, theString

'股市行情数据库服务器的地址
strURL="http://cn.finance.yahoo.com/q?s="+trim(Request.form("fqdn"))+"&d=2b"
Set objXML = CreateObject("Microsoft.XMLHTTP") '创建MS的XMLHTTP组件
objXML.Open "get", strURL, False
objXML.Send ' 发送信息
xmlGet = objXML.responsebody '稍等片刻后,得到股市行情数据服务器端传回来的结果;
xmlGet = bytes2bstr(xmlGet) '转换成文本格式函数,可以源程序中找到;

'过滤无用的HTML成分,挑选出股票具体信息;
strFind1 = instr(1,xmlGet,"最後交易",1)+8
strFind2 = instr(strFind1,xmlGet,"〈b〉",1)+3
strFind3 = instr(strFind2,xmlGet,"〈/b〉〈/td〉",1)
xmlGet1="最后交易:"+mid(xmlGet,strFind2,strFind3-strFind2)+chr(13)+chr(10) '最后交易价

strFind1 = instr(1,xmlGet,"涨跌",1)+4
strFind2 = instr(strFind1,xmlGet,"〈font color=",1)+19
strFind3 = instr(strFind2,xmlGet,"〈/font〉",1)
xmlGet2="涨跌:"+mid(xmlGet,strFind2,strFind3-strFind2)+chr(13)+chr(10) '涨跌

Set objXML = Nothing
end if
response.write trim(Request.form("fqdn"))+"的股市行情:"+chr(13)+chr(10)+xmlGet1+xmlGet2
function bytes2bstr(vin)
strreturn = ""
for i = 1 to lenb(vin)
thischarcode = ascb(midb(vin,i,1))
if thischarcode 〈 &h80 then
strreturn = strreturn & chr(thischarcode)
else
nextcharcode = ascb(midb(vin,i+1,1))
strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
i = i + 1
end if
next
bytes2bstr = strreturn
end function
%〉


在上述过程中,可以发现我们自己的WEB服务器中的ASP程序其实只起到一个中间传递的作用,在实际应用中,也可以省去这个中间层,使用vbscript通过xmlhttp直接向股市行情数据库发送和接收数据。不过这样的话,可能会因为IE中;通过(其它)域访问数据资源”被禁用(默认)而引起权限不够导致无法执行,所以该省去ASP中间层的方法并不太通用。

本程序在基于Windows2000平台的IIS5.0和IE6.0上运行通过。实际使用过程中,可以把上述代码拷贝到自己网页中,经过简单的页面编辑,就可在自己的网页中增加在页面无闪烁情况下的股票信息查询功能了,初看上去,还真的有点象专业的证券服务商网站提供的服务了。

附:
dns2.htm源程序如下:

<script language="vbscript">
Sub submit1_onmousedown
Layer2.style.visibility="hidden"
Layer4.style.visibility="visible"
Document.wordfind.comments2.value="  纳斯达克(NASDAQ)是美国全国证券交易商协会于1968年着手创建的自动报价系统名称的英文简称。纳斯达克的特点是收集和发布场外交易非上市股票的证券商报价。它现已成为全球最大的证券交易市场。目前的上市公司有5200多家。纳斯达克又是全世界第一个采用电子交易的股市,它在55个国家和地区设有26万多个计算机销售终端。"+chr(13)+chr(10)+chr(13)+chr(10)+"    正在检索数据,请等待···"
end sub

Sub submit1_onmouseup
Dim objXML, objXSL, objFSO
Dim strFile, strFileName, strXSL
Dim strURL, theString


Dim TheForm
Set TheForm = Document.wordfind
window.status="正在检索数据···"


' 得到域名的地址
'strURL="http://www.domainbank.net/whoisresults_gen.cfm?show=1"
strURL="dns2.asp"


'创建MS的XMLHTTP组件
Set objXML = CreateObject("Microsoft.XMLHTTP")

' 发送信息

stra = "submit=submit&fqdn="&TheForm.webname.value
objXML.Open "post",strURL,false
objXML.setrequestheader "content-length",len(stra)
objXML.setrequestheader "content-type","application/x-www-form-urlencoded"
objXML.send stra


'xmlGet = objXML.responseText
xmlGet = objXML.responsebody
xmlGet = bytes2bstr(xmlGet)

TheForm.comments.value=xmlGet

Set objXML = Nothing
Layer2.style.visibility="visible"
Layer4.style.visibility="hidden"
window.status=""
end sub 

function bytes2bstr(vin)
strreturn = ""
for i = 1 to lenb(vin)
thischarcode = ascb(midb(vin,i,1))
if thischarcode < &h80 then
strreturn = strreturn & chr(thischarcode)
else
nextcharcode = ascb(midb(vin,i+1,1))
strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
i = i + 1
end if
next
bytes2bstr = strreturn
end function
</script>

<html><head><title>XMLHTTP之股票行情篇</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgColor=#a1bae6>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="100%" align=center>
<form method="post" name=wordfind onsubmit="javascript:return false">
<FONT color=#002e5b face=geneva,arial,sans-serif size=2>
<B>请选择股票名称</B></FONT>
<FONT color=#002e5b face=geneva,arial,sans-serif size=2>
<B>,然后用鼠标单击“查询”按钮即可。</B></FONT>
<FONT color=#002e5b face=geneva,arial,sans-serif size=2><B>:<br>
<select name=webname style="HEIGHT: 22px; WIDTH: 80px">
<option value="^IXIC">纳斯达克</option>
<option value="ASIA">亚信</option>
<option value="CHINA">中华网</option>
<option value="NTES">网易</option>
<option value="SINA">新浪网</option>
<option value="SOHU">搜狐</option>
<option value="^DJI">道 琼 斯</option>
<option value="^SSEC">上海证交</option> 
<option value="^SZSC1">深圳成份</option> 
</select>
<input type="submit" value="查询" id=Submit1 name=Submit1></B>
</FONT>
<hr>
<div id="Layer2" style="position:absolute; left:100; width:190; height:400; top:100; z-index:2; visibility: hidden"> 
<TEXTAREA name=comments readonly rows=10 cols=76 STYLE="border:1px dashed #999999;background-color:transparent"></TEXTAREA>
</div>
<div id="Layer4" style="position:absolute; left:100; width:190; height:400; top:100; z-index:2; visibility: visible"> 
<TEXTAREA name=comments2 readonly rows=10 cols=76 STYLE="border:1px dashed #999999;background-color:transparent">
  纳斯达克(NASDAQ)是美国全国证券交易商协会于1968年着手创建的自动报价系统名称的英文简称。纳斯达克的特点是收集和发布场外交易非上市股票的证券商报价。它现已成为全球最大的证券交易市场。目前的上市公司有5200多家。纳斯达克又是全世界第一个采用电子交易的股市,它在55个国家和地区设有26万多个计算机销售终端。
</TEXTAREA>
</div>
<br>
</form>
</td>
</tr>
</table>
</body></html>




dns2.asp源程序:


<%
dim xmlGet
xmlGet=""
if len(trim(Request.form("fqdn"))) > 1 then
Dim objXML, objXSL, objFSO
Dim strFile, strFileName, strXSL
Dim strURL, theString

' 得到域名银行的地址
strURL="http://cn.finance.yahoo.com/q?s="+trim(Request.form("fqdn"))+"&d=2b"
'response.write strURL
'response.end

'创建MS的XMLHTTP组件
Set objXML = CreateObject("Microsoft.XMLHTTP")

' 发送信息
objXML.Open "get", strURL, False
objXML.Send 
'xmlGet = objXML.responseText
xmlGet = objXML.responsebody

xmlGet = bytes2bstr(xmlGet)

strFind1 = instr(1,xmlGet,"最後交易",1)+8
strFind2 = instr(strFind1,xmlGet,"<b>",1)+3
strFind3 = instr(strFind2,xmlGet,"</b></td>",1)
xmlGet1="最后交易:"+mid(xmlGet,strFind2,strFind3-strFind2)+chr(13)+chr(10) '最后交易价

strFind1 = instr(1,xmlGet,"涨跌",1)+4
strFind2 = instr(strFind1,xmlGet,"<font color=",1)+19
strFind3 = instr(strFind2,xmlGet,"</font>",1)
xmlGet2="涨跌:"+mid(xmlGet,strFind2,strFind3-strFind2)+chr(13)+chr(10) '涨跌

strFind1 = instrb(1,xmlGet,"昨收",0)
strFind3 = instrb(strFind1,xmlGet,"</td>",0)
xmlGet3=midb(xmlGet,strFind1,strFind3-strFind1)+chr(13)+chr(10) '昨收
xmlGet3=replace(xmlGet3,"<br>",":")

strFind1 = instrb(1,xmlGet,"成交量",0)
strFind3 = instrb(strFind1,xmlGet,"</td>",0)
xmlGet4=midb(xmlGet,strFind1,strFind3-strFind1)+chr(13)+chr(10) '成交量
xmlGet4=replace(xmlGet4,"<br>",":")


Set objXML = Nothing

end if
response.write "北京时间"+Cstr(now())+chr(13)+chr(10)+trim(Request.form("fqdn"))+"的股市行情:"+chr(13)+chr(10)+xmlGet1+xmlGet2+xmlGet3+xmlGet4


function bytes2bstr(vin)
strreturn = ""
for i = 1 to lenb(vin)
thischarcode = ascb(midb(vin,i,1))
if thischarcode < &h80 then
strreturn = strreturn & chr(thischarcode)
else
nextcharcode = ascb(midb(vin,i+1,1))
strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
i = i + 1
end if
next
bytes2bstr = strreturn
end function
%>