二、酷狗 歌词下载

上篇中得到的JSON穿通过解析可以得到以下数据

TSearchKg=record

singername:string;//歌手名

filename:string;//歌词名

hash:string;//哈希验证

timelength:string;//时长

end;

酷狗歌词下载Url:http://mobilecdn.kugou.com/new/app/i/krc.php?' + 'keyword=' +
    song + '&timelength=' + timelength + '&type=1' + '&cmd=200' +'&time='+time+
    '&hash=' + hash;

song为utf8编码,有字符的处理转码需要特别处理,也许有更巧妙的UrlCode方式,但是我这里只解析song字段,所以这样处理,可能比较麻烦

 1 function StrToHex5(str: string; AEncoding: TEncoding): string;
 2 var
 3   ss: TStringStream;
 4   i: Integer;
 5   reg:TPerlRegex;
 6 begin
 7   Result := '';
 8   reg:=TPerlregex.Create;
 9   ss := TStringStream.Create(str, AEncoding);
10   try
11     for i := 0 to ss.Size - 1 do
12     begin
13       reg.Subject:=char(ss.Bytes[i]);
14       reg.RegEx:= '[a-zA-Z0-9]|-|.';
15       if reg.Match then
16       begin
17         result:=result+char(ss.Bytes[i]);
18         continue;
19       end;
20 
21       if Trim(Char(ss.Bytes[i])) = ' ' then
22       begin
23         result:=Result + '%20';
24         Continue;
25       end;
26 
27       Result := Result + '%' + Format('%.2x', [ss.Bytes[i]]);
28     end;
29   finally
30     ss.Free;
31     reg.Free;
32   end;
33 end;

timelength,hash以通过搜索获取

time字段为时间戳,System.DateUtils单元中有function DateTimeToUnix(const AValue: TDateTime; AInputIsUTC: Boolean): Int64;

可以转换获取AInputIsUTC默认True设置False

字段值全部获取成功,提交链接,我通过Idhttp下载下来的文件在头尾都会多出一些内容,尚未查明原因,

所以直接用系统自带的下载Api下载

添加Winapi.UrlMon单元,使用URLDownloadToFile(nil,pchar(下载链接),pchar(保存路径),0,nil);即可

原文地址:https://www.cnblogs.com/ab0416/p/4087673.html