博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

司辰博涂

kree the time
  ori.cublog.cn

关于作者
姓名:Ori
职业:Network
年龄:24
QQ:577762
婚否:否
个性介绍:
    大智慧不是用来炒股的
|| << >> ||
我的分类


一个内网代理天气预报程序
需求:公司内网安全用户无法访问外部网。但要求,能查看天气预报信息。
说明:其实简单的方法也有,那就是有一个人每天到外部网去查询天气预报信息,然后更新到内部OA邮件或内部网络上。但这样势必烦琐不及时。下面给出一个用ASP实现的代理程序,可以让不能访问互联网的内部用户访问到需要的信息。
配置:一台内网可访问到的服务器、服务器可访问互联网。
原理: 我们这里使用的是121的天气预报页面,搜现我们找到需要的天气预报预定页面,在服务器上将页面读取到服务器缓存,然后对缓存数据做适当处理。处理完成后反馈给内部请求用户。
Asp代码:

 

<BODY bgColor=#9d9d9d leftMargin=0 topMargin=0 rightMargin=0>
<TABLE width="100%" height="200" border=0 cellPadding=3 cellSpacing=1>
  <TBODY>
           <TR>
               <TD width="100%" class=row1>
<%
dim url,wstr,addr,timeadd,wstr1,wstr2,wstr_print
 Server.ScriptTimeOut=60
 url="http://weather.tq121.com.cn/detail.php?city=%BB%DD%D6%DD&submit=%B3%C7%CA%D0%CB%D1%CB%F7"

    wstr=getHTTPPage(url)
    
   if err.number=0 then

''''''''''''''''''''''''''''''''''''''需要实现将信息中地址从新定向,志向完整URL的也就是带
''''''HTTP://或www的联结改为proxy.asp?'url=完整地址,如果是相对地址,改成proxy.asp?url=
if wstr="" then
wstr="未取到数据"
else
wstr = Replace(wstr, "../images/","images/")
str=split(wstr,"</table>")
    for i=15 to Ubound(str)-7
'********************测试代码********************

'Response.Write str(i)&+"</table>"
'Response.Write "--"&+i&+"--"
wstr_print= wstr_print&+str(i)&+"</table>"
            Next
'
wstr_print=raplace(wstr_print,"<img","<b")

' for i=15 to 86
'
wstr= wstr&+str(i)
' Next
'
wstr=str(15)&+str(16)&+str(17)&+str(18)&+str(19)&+str(20)&+str(21)&+str(22)&+str(23)&+str(24)
 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''重写成功'''''''''

这样就实现了内网用户自动查看天气预报的功能,阅读代码会发现,数据中对图片路径做了处理,因为从站点取回来是超文本数据不包括图片信息,我们可以将图片下载到站点的指定的目录中即可。
实际测试发现这段代码的执行是比较缓慢的,而且占用一定的服务器资源。如果请求用户过多或过频繁势必会出一些问题,但幸好我的内网还承受的了。
  如果真的是有多人请求怎么办,其实也很简单。
我们只需要简单对代码进行修改即可,但前提是IUSER用户必须对目录具有写权限。
思路:因为天气预报为每天一次更新的内容,所以我们可以让每天第一个访问的用户触发天气访问事件。然后将天气信息更新到服务器文件或数据库,此处我们更新到数据库。

ASP完整代码:

<!--#include file="conn.asp"-->
<%
dim wstr_print
now_date=year(now)&+"-"&+month(now)&+"-"&+day(now)

set rs=Server.CreateObject("ADODB.Recordset")

     sql="select * from weather where id=1 "
      rs.open sql,conn,1,3
 if rs.bof and rs.eof then ' 未启用过天气数据
    rs("today_tianqi")="第二天开始启用天气数据"
    rs("date")=now_date
    rs.update() '
更新到数据库
    rs.close
    else
       if cdate(rs("date"))<cdate(now_date) then
       call htmlread() '读取天气信息
       rs("today_tianqi")=wstr_data
       rs("date")=now_date
       rs.update() '
更新到数据库
       rs.close
       wstr_print=wstr_data&+"测试一" '更新到页面
       else
        wstr_print=rs("today_tianqi")&+"测试二" '
更新到页面
       end if
 end if

sub htmlread()
dim url,wstr,addr,timeadd,wstr_data
 Server.ScriptTimeOut=60
 url="http://weather.tq121.com.cn/detail.php?city=%BB%DD%D6%DD&submit=%B3%C7%CA%D0%CB%D1%CB%F7"

    wstr=getHTTPPage(url)
    
   if err.number=0 then

''''''''''''''''''''''''''''''''''''''需要实现将信息中地址从新定向,志向完整URL的也就是带
''''''HTTP://或www的联结改为proxy.asp?'url=完整地址,如果是相对地址,改成proxy.asp?url=
if wstr="" then
wstr="未取到数据"
else
wstr = Replace(wstr, "../images/","images/")
str=split(wstr,"</table>")
    for i=15 to Ubound(str)-7
'
Response.Write str(i)&+"</table>" '测试数据
'
Response.Write "--"&+i&+"--" '测试数据
wstr_data= wstr_print&+str(i)&+"</table>"
            Next
 '
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''重写成功''''''''''
  
   end if
   else
        wscript.echo err.description
   end if
end sub

    function getHTTPPage(url)
        on error resume next
        dim http
        set http=Server.createobject("Microsoft.XMLHTTP")
        Http.open "GET",url,false
        Http.send()
        if Http.readystate<>4 then
            exit function
        end if
        getHTTPPage=bytes2BSTR(Http.responseBody)
        set http=nothing
        if err.number<>0 then err.Clear
    end function

Function bytes2BSTR(vIn)
        dim strReturn
        dim i,ThisCharCode,NextCharCode
        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

%>
<BODY bgColor=#9d9d9d leftMargin=0 topMargin=0 rightMargin=0>
<TABLE width="100%" height="200" border=0 cellPadding=3 cellSpacing=1>
  <TBODY>
           <TR>
               <TD width="100%" class=row1>

<table width="790" height="104" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
  <tr>
    <td width="790" valign="top" bgcolor="#FFFFFF">
<font color=red>您目前是通过Sic接口访问的中央台天气频道,欢迎使用本程序</font><a

href="http://weather.tq121.com.cn/detail.php?city=%BB%DD%D6%DD&submit=%B3%C7%CA%D0%CB%D1%CB%F7">能够连接互连网的人可以点击

访问问天网查询更多天气信息</a> <br>
由于此连接是服务器捕获访问,需要服务器大负荷处理数据,请不要频繁刷新此页面,我们将对每次查询的用户做日志记录。
<br><img src=../index.files/index-2.gif width="100%">
  </td></tr>
  <tr>
    <td width="790" valign="top" bgcolor="#FFFFFF">
<%=wstr_print%>
</td></tr></table>
</bofy>
</html>

发表于: 2008-01-03,修改于: 2008-01-03 10:55,已浏览434次,有评论2条 推荐 投诉


网友评论
网友: ztfstar 时间:2008-01-04 17:25:49 IP地址:59.33.249.★
实测过程中发现一个问题,那就是站点天气的实际更新时间为早上6点。如果6点之前有人点击更新了页面那当天天气将不能得到更新。遇到问题后对代码进行略微调整。
dim wstr_print,q_time
q_time="06:00:00"
now_date=year(now)&+"-"&+month(now)&+"-"&+day(now)

set rs=Server.CreateObject("ADODB.Recordset")

     sql="select * from weather where id=1 "
      rs.open sql,conn,1,3
 if rs.bof and rs.eof then  ' 未启用过天气数据
    rs("today_tianqi")="第二天开始启用天气数据"  
    rs("date")=now_date
    rs.update()        '更新到数据库
    rs.close 
    else
       if cdate(rs("date"))<cdate(now_date) and cdate(now())>cdate(q_time) then
 这样就判断了在6点之后才更新当前数据,使 程序更加完善。

网友: 本站网友 时间:2008-06-13 11:08:36 IP地址:61.142.179.★
<a href="http://www.bxcsb.com/pr.asp">超声波</a>
<a href="http://www.a8woool.com/pr.asp">净化工程</a>
<a href="http://www.kamson.cn/pr.asp">超声波清洗机</a>

 发表评论