代码改变世界

迅雷漫画下载工具II 故障日志09.04.12

2009-04-12 22:46  Kaedei  阅读(462)  评论(1编辑  收藏  举报

博客上很多的同学都来反映说是程序一打开就自动停止工作,经过分析发现程序出错很有可能发生在自动更新的过程中。

于是趁着返回学校前的十几分钟,决定抓虫试试。

 

根据网友们的反映,前几天尚未出现故障,说明软件本身可能出错的几率较小。于是研究目标一下就转到了新浪上……=-=

 

先来说一下迅雷漫画下载工具II自动更新的工作原理吧

(本程序是我初学VB.NET写的第一个程序……从第一版缝缝补补到现在,连我都不忍心看那些惨不忍睹的代码了……

如果贴出了一些不成熟源码,大家将就看吧=-=千万不要打击我)

 

1.我把新版本上传到某一外链空间中

2.把新版本的相关信息按照相应格式发到某一篇博文中:

这个博文的地址:http://blog.sina.com.cn/s/blog_58c506600100c37y.html

自动更新数据的格式:

#Region "版本更新格式说明"
    '版本更新格式
    '以十个 # 开始,十个 ~ 结束
    '每部分间以"|"作为分隔符
    '【0】版本(5位数,转换为Int64):81226
    '【1】此版本名称:迅雷漫画下载工具II
    '【2】更新信息:啊啊啊啊$啊啊啊啊啊$啊啊啊啊啊啊$啊啊啊啊     以美元符号($)作为换行符
    '【3】下载地址:http://www.xxxxxxxxxxxxxx.com/xxxxxx/xxxxx/xx/xxxxxxx/xxx.exe
    '【4】重要性:0-普通 1-推荐更新(修复了已知Bug) 2-强烈推荐(添加了软件功能) 3-修补了安全漏洞
    '【5】发布日期:2009年1月1日
#End Region

3.程序在启动时会取得上面文章的源代码,然后对源代码进行分析,并且与当前的版本进行对比后进行相应的提示(是否有新版本)

4.具体的取得方式为:

取得源代码后程序查询字符串”##########”和”~~~~~~~~~~”在文章中的位置,根据定义,这两个字符串分别表示了数据段的起始和结束位置

'开始标记
Private StartSign As String = "##########"
'结束标记
Private EndSign As String = "~~~~~~~~~~"

If html1.IndexOf(StartSign) >= 0 Then
            Dim codeStart As Integer = html1.IndexOf(StartSign) + StartSign.Length
            Dim codeEnd As Integer = html1.IndexOf(EndSign)
            Dim code As String = html1.Substring(codeStart, codeEnd - codeStart)
 
然后使用Split()函数将各个信息分开
'保存原始数据的数组
Private updateInfo() As String

updateInfo = code.Split("|"c)
'版本号
newVersion = CLng(updateInfo(0))
'名称
newVersionName = updateInfo(1)
'版本描述
newVersionDescribe = "当前最新版本:" & updateInfo(0) & ControlChars.CrLf & _
                                "发布日期:" & updateInfo(5) & vbCrLf & vbCrLf & updateInfo(2)
newVersionDescribe = newVersionDescribe.Replace("$", ControlChars.CrLf)
'下载地址
newVersionDownloadURL = updateInfo(3)
'重要性
newVersionImportant = CInt(updateInfo(4))
If newVersion > currentVersion Then
    Return 1
Else
    Return 0
End If

最后显示出来
 

本次的更新错误出现在了文章源代码分析上

背景:新浪大概在4月10号左右更新了博文的源代码构成方式,在源代码中新增了<meta>内容以更好地利用搜索引擎提取文章信息

相关HTML源码如下:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<meta name="description" content="Kaedei,坏天气,——————————迅雷漫画下载工具&#8545;更新数据用————————————————————" />
<meta name="keywords" content="Kaedei,坏天气,杂谈" />

可以看出,导致问题的正是Meta中的name属性,因为name=”description”多此一举地将文章的部分内容显示在了HTML的<head>之后(也就是比较靠前的位置),导致第一个”##########”提早出现。

所以程序截取的字符串就是一大堆无用的字符了,然后在类型转换的时候导致了异常产生(此段代码也因为疏忽没有加上Try……Catch),而又因为程序默认开启了自动更新,所以在程序刚一开始的时候就会出现错误,导致停止工作。

 

我已经修复了这个错误,现在可以正常使用了

以上~

 

感谢以下网友的反馈:

凉粉仔

jack2002003

林风对月

vita

还有几位匿名的朋友

再次表示感谢!