>>首页
用flash从百度搜索中找歌词
2006-2-8 17:22:00

代码:
System.useCodepage = true;
myLoadVars = new LoadVars();
function lrcSearch(keyWord) {
musicName = keyWord.slice(0, keyWord.indexOf(' '));
myLoadVars.load('http://www.baidu.com/s?wd='+'[ti:'+keyWord);
myLoadVars.onData = getLink;
pageIndex = 1;
}
function getLink(src) {
nextPageLink = 'http://www.baidu.com/'+src.slice(src.lastIndexOf('href=', src.indexOf('下一页'))+5, src.lastIndexOf('><', src.indexOf('下一页')));
linkData = src.split('快照');
for (var i = 0; i linkData[i] = linkData[i].slice(0, linkData[i].lastIndexOf(' linkData[i] = linkData[i].slice(linkData[i].lastIndexOf('href=')+6);
linkData[i] = linkData[i].slice(0, linkData[i].indexOf('\''));
}
linkIndex = 1;
openLRCPage(linkData[0]);
}
function openLRCPage(url) {
myLoadVars.load(url);
myLoadVars.onData = getLRC;
}
function getLRC(src) {
htmlData = src.slice(src.lastIndexOf('[ti:'+musicName));
findEndTag();
htmlData = htmlData.split('
').join('\n');
htmlData = htmlData.split('
').join('\n');
lrcData = htmlData.split(String.fromCharCode(10)).join('');
tx_lrc.text = lrcData;
}
function findEndTag() {
var lastIndex = htmlData.lastIndexOf(']');
if (htmlData.slice(lastIndex-3, lastIndex-2) == '.' && htmlData.slice(lastIndex-6, lastIndex-5) == ':') {
var tmpBR = htmlData.slice(lastIndex);
htmlData = htmlData.slice(0, lastIndex+tmpBR.indexOf(' htmlData = htmlData.slice(0, htmlData.indexOf(' } else {
htmlData = htmlData.slice(0, lastIndex);
if (loopStart == undefined) {
loopCount = 1;
} else {
delete loopStart;
}
if (loopCount<254) {
loopStart = true;
loopCount++;
findEndTag();
}
}
}
function error() {
if (nextPageLink != undefined) {
if (linkIndex>linkData.length-2) {
myLoadVars = new LoadVars();
myLoadVars.load(nextPageLink);
myLoadVars.onData = getLink;
pageIndex++;
linkIndex = 1;
delete nextPageLink;
} else {
linkIndex++;
openLRCPage(linkData[linkIndex-1]);
}
}
}


我们先来看第一句:
System.useCodepage = true;
这句主要的作用是让最后的结果不会变成乱码,默认情况下flash是按照UTF格式来解析所有加载的数据的,这在加载中文数据的时候会有些问题,只有数据在用UTF-8编码格式的时候才能被正确识别。因为很多页面(基本上现在90%的页面)并不是用UTF-8来保存的,所以要加上这句。这样才不会乱码。更详细的说明请参见flash帮助关于System.useCodepage的详细说明。反正在大部份情况下,如果你遇到乱码的问题都可以用这个来解决,使用 System.useCodepage = true 或者 System.useCodepage = false 来切换。

第二句:
myLoadVars = new LoadVars();
这是用来装载所有加载的数据的,等会加载的网页的数据(html源文件)都装在这里。基本上,要进行数据传输(例如和服务器程序交换变量数据或者从服务器上加载文件)的进候都要用到 LoadVars()、XML的数据传输/加载方法或者XMLSocket 。LoadVars() 是最基础的方法。

function lrcSearch(keyWord) {
    musicName = keyWord.slice(0, keyWord.indexOf(' '));
    myLoadVars.load('http://www.baidu.com/s?wd='+'[ti:'+keyWord);
    myLoadVars.onData = getLink;
    pageIndex = 1;
}

这里定义了一个函数 lrcSearch(keyWord) 。呆会每次搜索不同歌词的时候都是从这里开始的,通过向这个函数发送不同的歌词名(如 lrcSearch('突然的自我')、 lrcSearch('童话')、lrcSearch('不得不爱')或者lrcSearch('我听这种音乐的时候最爱你'))来启动搜索。在这里,是所有代码的入口。
它告诉flash:加载(下载) 'http://www.baidu.com/s?wd='+'[ti:'+keyWord 的文件。keyWord 是刚刚上面所说的 '突然的自我' 等需要搜索的关键字。 当你在搜索引擎搜索内容的时候注意一下地栏的url,在百度中,它是类似于这样:
www.baidu.com/s?wd=%5Bti%3A%CD%BB%C8%BB%B5%C4%D7%D4%CE%D2&cl=3
你可以更改里面的'%5Bti%3A%CD%BB%C8%BB%B5%C4%D7%D4%CE%D2&cl=3'来完成不同的搜索,这里是刚刚输入的“[ti:披着羊皮的狼”的对应URL标准格式编码,你可以在浏览器中将这段文本转换成“[ti:突然的自我”试试。它会帮你自动转换成相应的URL来进行以后的工作(下载网页)。在flash中,也是一样的。所以你可以通过加载 www.baidu.com/s?wd=[ti:突然的自我 这样的URL来获得在浏览器中打开的文件(它们的html源代码)。也就是上面的那句:
myLoadVars.load('http://www.baidu.com/s?wd='+'[ti:'+keyWord);

接着,myLoadVars.onData = getLink 定义了LoadVars的onData的事件。让 flash 在下载完网页后执行getLink这个函数的代码。
LoadVars有两个事件(也就是当某一件事完成后要怎么样):LoadVars.onData 和 LoadVars.onLoad 。在这里,我们使用 LoadVars.onData。它的写法如下:
my_lv.onData = function(src) {
// 此处是您的语句
}
它定义了当下载完成的时候该执行的代码。src 是加载的原始(未分析)数据(在这里是下载的网页的源代码)。它直接定义了一个函数。你也可以将这个函数写在其它地方或者调用其它你已经写好的函数。也就是这样写:
my_lv.onData = getLink 或者 my_lv.onData = getLink(src); (但注意不要这样写 my_lv.onData = getLink() ,因这样会丢失刚刚获得获得的网页源代码)

musicName = keyWord.slice(0, keyWord.indexOf(' ')); 这一句我就不详细论述了,只告诉你它用来完成搜索中使用空格隔开关键字的功能。使用更多的用空隔间隔的关键字可以更快更准确的搜索到所要的内容,如加入歌手 '披着羊皮的狼 谭咏麟' 的结果就可能比 '披着羊皮的狼' 更准确,还可以对歌词的内容作界定,这可以将同名歌曲区别开来,例如'青春'这首歌曲就有5个以上的版本,像这样 '青春 你我都不会变不会变'(在这里,歌手的名字则可有可无,大部份情况下,无更好一些)。pageIndex = 1 并不是很重要,它用来完善一些可用性的事情,也就不多说了。

[ 打印本页 ] [ 关闭窗口 ] [ 返回顶部]