通过脚本免费下载全民K歌好友作品

首先需要将作品分享给QQ好友,这样我们就可以在QQ内看到该作品的链接了

接下来将链接保存到url.txt 每个链接一行 运行以下php文件就可以进行下载了

<?php
/*
 * @Author: witersen
 * @Date: 2021-09-24 22:15:06
 * @LastEditors: witersen
 * @LastEditTime: 2021-09-24 22:45:03
 * @Description: QQ:1801168257
 */

define('BASE_PATH', __DIR__);

//保存链接的文本地址
$url_file = BASE_PATH . "/url.txt";

//读取链接到数组
$file = fopen($url_file, "r") or exit("无法打开文件!");
$file_content = array();
while (!feof($file)) {
    $line = trim(fgets($file));
    if ($line != "") {
        array_push($file_content, $line);
    }
}
fclose($file);

//处理
foreach ($file_content as $key => $value) {
    //抓取页面
    $page_content = curl_request($value, true);
    //匹配信息
    preg_match_all("/\"playurl\":\"(.*).m4a/", $page_content, $preg_array);
    //拼接媒体地址
    $m4a_url = $preg_array[1][0] . ".m4a";
    //获取媒体
    $m4a_content = curl_request($m4a_url, true);
    //拼接文件地址
    $m4a_file = $key . ".m4a";
    //保存
    file_put_contents(BASE_PATH . "/" . $m4a_file, $m4a_content);
}

/**
 * 请求
 */
function curl_request($url, $is_set_header = false)
{
    //初始化
    $curl = curl_init();

    //设置请求url
    curl_setopt($curl, CURLOPT_URL, $url);

    //设置true会将头文件的信息作为数据流输出 否则作为字符串输出
    curl_setopt($curl, CURLOPT_HEADER, false);

    //设置true会不输出body部分 此时请求类型被转变为head请求
    curl_setopt($curl, CURLOPT_NOBODY, false);

    //设置请求头数组内容 默认不设置
    $is_set_header ? curl_setopt($curl, CURLOPT_HTTPHEADER, get_forge_header()) : "";

    //设置true会将curl_exec()获取的信息以字符串返回 否则会直接输出
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    //设置true会在页面发生301或者302时自动进行跳转抓取
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

    //将请求类型改为get 如果为探测状态 可避免因为请求类型为head造成的探测失误
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");

    //设置请求超时时间
    curl_setopt($curl, CURLOPT_TIMEOUT, 20);

    //设置false将不检查证书
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

    //设置false将不检查证书
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

    //执行
    $preg_array = curl_exec($curl);

    //关闭
    curl_close($curl);

    return $preg_array;
}

/**
 * 获取模拟http请求头的内容
 */
function get_forge_header()
{
    //构造随机ip
    $ip_long = array(
        array('607649792', '608174079'), //36.56.0.0-36.63.255.255
        array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255
        array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255
        array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255
        array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255
        array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255
        array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255
        array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255
        array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255
        array('-569376768', '-564133889'), //222.16.0.0-222.95.255.255
    );

    //获取随机数字
    $rand_key = mt_rand(0, 9);

    //将长整型转换为IP地址
    $ip = long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1]));

    //模拟http请求header头
    $header = array(
        "Connection: Keep-Alive",
        "Accept: text/html, application/xhtml+xml, */*",
        "Pragma: no-cache",
        "Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3",
        "User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)",
        'CLIENT-IP:' . $ip,
        'X-FORWARDED-FOR:' . $ip
    );

    return $header;
}

原创文章,作者:witersen,如若转载,请注明出处:https://www.witersen.com

(1)
witersen的头像witersen
上一篇 2021年3月20日 下午4:30
下一篇 2021年3月30日 下午6:51

相关推荐

发表回复

登录后才能评论