虾米音乐Qt版下载器之Location解密部分

最近一直在虾米听歌,但是学校网速拙计,手机在外面也舍不得用流量听歌,遂百度。都说能用longkeymusic下载,试用一番还是不好使,再百度,根据教程真的解析出虾米的下载地址了。然后就有了做一个虾米音乐下载器自用的想法,也顺便熟悉一下Qt5.3的开发。

虾米音乐的解析不再赘述,详情可见我找到的那篇教程(http://www.shaoqun.com/a/29606.aspx)。不过比较坑爹的是它里面给出了一个过期的网址说是可以解析地址。然而,地址失效了。。。没办法,只能自己研究。

随便选了一首歌的Location代码做解释: 4h%2Ff.moF%4%722939l3a_%a2cc9464E16%55ut3Fmixim12121%1614.%uk3f1bfe474-3%5EEltA%5li.%2F2F722638m3teDed3499b%195E--lp%2.eac292919F1_8_pFhy1c7e6c2e543E%%n  乍看起来这串代码很复杂,不过百度之后发现是一种凯撒数列(不同的文章也有说叫凯撒矩阵的)加密,简单来说就是分组,横着写下来,然后竖着读出来。如何得知分了几行呢?字符串第一个字符就是行数,例子中得行数为4,将字符串分成四份可得如下矩阵:


竖着读出来可以看出是非常标准的http,剩下的就好办了,把location读取到字符串中,竖过来,再输出。

然而中间却遇到了一个问题,有些Location并不能完全组成一个矩阵,所以在实现的时候非常容易下标越界。我使用了一种巧妙的办法,使用Location中不会出现的‘~’字符作为占位,在转动的时候可以整个进行操作。而最后读取的时候,会检测是不是‘~’符号,只有不是的字符才会传给输出字符串。


最后,贴出完整版的虾米音乐location转正常url代码,希望能帮助后来的人:

QString Dialog::DecodeXiamiLocation(QString location)
{
    if(!(location.data()[0].isDigit()))//数字分行
        return "ERROR";
    int linecount=location.data()[0].digitValue();
    QString loc_temp=location.right(location.length()-1);
    int linestringcount=UpDiv(loc_temp.length(),linecount);
    int martix_size=linecount*linestringcount;
    QChar martix[martix_size];
    //凯撒矩阵转置
    for(int i=0;i<martix_size;i++)
    {
        if(i<loc_temp.length())
            martix[i]=loc_temp.data()[i];
        else
            martix[i]='~';
    }
    QString ret;
    for(int j=0;j<linestringcount;j++)
        for(int i=0;i<linecount;i++)
            if(martix[i*linestringcount+j]!='~')
            ret.append(martix[i*linestringcount+j]);
    //urldecode
    ret=QUrl::fromPercentEncoding(ret.toLocal8Bit());
    //^转0
    ret=ret.replace('^','0');
    return ret;
}

PS:代码使用Qt5.3编译测试通过。

PPS:虾米音乐解析出来的地址带有auth_key ,在一段时间后就不能下载了,必须现解析现下载。而且,同一首歌曲不同时候请求到的Location都不一样。

PPPS:正在尝试把软件从简单的Location解析器转变为下载器,所以没留下截图.....

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值