0

Wget扒站原理与写一条在线扒站接口

r69p7ze8
6月前 173

0x01

wget 首先会对输入的 url 进行解析并提取出其中的协议路径等信息,
通过该信息 wget 建立与服务器的连接并发送请求
服务器收到请求报文后会返回相应的响应报文。
wget 会将其解析并响应,如请求成功,
服务器会将资源返回至 wget,wget 根据响应信息,将资源递归保存至本地。
00x02
windows 版本下的 wget 调用
微信图片_20231024042416.png

@echo off & cd /d %~dp0
mode con cols=100
call :showLogo
pause
exit
:showLogo
title Wget downloads tool 2.0-Wget.fit
color 80
mode con cols=72 lines=22
if not exist .outlogo (
echo IF9fICAgICAgICAgIF9fICAgICAgICBfICAgICBfX19fX18gXyBfICAgX19fICAgIF9fXyAgCiBcIFwgICAgICAgIC8gLyAgICAgICB8IHwgICB8ICBfX19fKF8pIHwgfF9fIFwgIC8gXyBcIAogIFwgXCAgL1wgIC8gL18gXyAgX19ffCB8XyAgfCB8X18gICBffCB8XyAgICkgfHwgfCB8IHwKICAgXCBcLyAgXC8gLyBfYCB8LyBfIFwgX198IHwgIF9ffCB8IHwgX198IC8gLyB8IHwgfCB8CiAgICBcICAvXCAgLyAoX3wgfCAgX18vIHxfIF98IHwgICAgfCB8IHxfIC8gL18gfCB8X3wgfAogICAgIFwvICBcLyBcX18sIHxcX19ffFxfXyhfKV98ICAgIHxffFxfX3xfX19fKF8pX19fLyAKICAgICAgICAgICAgIF9fLyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHxfX18vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA==>.logo
certutil -decode .logo .outlogo>nul
del .logo
)
type .outlogo
echo.
echo The principle of this tool is very simple, is to apply wget with bat      
echo                  Official website: www.wget.fit
echo=====================================================================
set /p a=Url(http/https):
color 2f
mode con cols=80 lines=25
wget.exe -U‘Mozilla/5.0 -r -p -np -k --no-check-certificate %a% 
cls
title Wget downloads tool 2.0-Wget.fit
echo The task is complete. Press Enter to exit
echo.                                  &pause >nul

运行如下图
QQ图片20231024042312.png

00x02

扒站网站建设
微信图片_20231024042711.png
这是 wget.fit 网站的文件目录

│  api.php       api接口
│  common.php    网站全局文件
│  Config.php    网站核心文件
│  index.php     网站主页
│  ssh.class.php  ssh认证文件
│  wget_site.sh  wget请求文件
└─work           网站预览目录

从网站主页说起
网站主页仅用于请求 api.php

if (isset($_POST['url'])) {
    $url = $_POST['url'];
    $email = $_POST['email'];
    if (get_code($url) != 200) {
        exit(json_encode(array('code' => '-1', 'msg' => '爬取失败,请检查网址是否正确!'),JSON_UNESCAPED_UNICODE| JSON_PRETTY_PRINT));
    }
    $preg = "/^http(s)?:\\/\\/.+/";
    if(!preg_match($preg,$url)){
            exit(json_encode(array('code' => '-1', 'msg' => '域名请带上协议头!如( http:// 或 https:// )'),JSON_UNESCAPED_UNICODE| JSON_PRETTY_PRINT));
    }
    $file = parse_url($url)['host'].'-'.mt_rand(10000,99999);
    $ssh = new Components_Ssh($host, $user, $pass, $port, $log);
    $ssh->cmd("bash /www/wwwroot/wget.fit/wget_site.sh {$url} {$file} >/dev/null && echo \"success\"");
    if(file_exists('./down/'.$file.'.zip')) {
    $content='你在Wget.fit提交的扒站请求已结束,下载链接:wget.fit/down/' . $file . '.zip';
       $wz=$smtpapi."?adress=".$email."&isHTML=false&title=Wget.fit爬取成功&content=".$content;
       file_get_contents($wz);
       exit(json_encode(array('code' => '1', 'msg' => '<center><img src="./assets/simple/img/wget.jpg" width="50%" ></center>', 'down' => 'http://wget.fit/down/' . $file . '.zip', 'yulan' => 'http://wget.fit/work/' . $file . '/' . parse_url($url)['host']),JSON_UNESCAPED_UNICODE| JSON_PRETTY_PRINT));
    } else {
        exit(json_encode(array('code' => '-1', 'msg' => '爬取失败!'),JSON_UNESCAPED_UNICODE| JSON_PRETTY_PRINT));
    }
} else {
function trans_byte($byte)

{

    $KB = 1024;

    $MB = 1024 * $KB;

    $GB = 1024 * $MB;

    $TB = 1024 * $GB;

    if ($byte < $KB) {

        return $byte . "B";

    } elseif ($byte < $MB) {

        return round($byte / $KB, 2) . "KB";

    } elseif ($byte < $GB) {

        return round($byte / $MB, 2) . "MB";

    } elseif ($byte < $TB) {

        return round($byte / $GB, 2) . "GB";

    } else {

        return round($byte / $TB, 2) . "TB";

    }

}
    $list = glob('./down/*.zip');
    $count = count($list);
    $page_num = isset($_GET['limit'])?$_GET['limit']:10;
    $pages = ceil($count / $page_num);
    $page = isset($_GET['page'])? $_GET['page']:1;
    $startpos = ($page - 1)*$page_num;
    $json['code'] = '0';

    $json['data'] = $arr;
    exit(json_encode($json,JSON_UNESCAPED_UNICODE| JSON_PRETTY_PRINT));
  }
function get_code($url){
  $ch = curl_init();
  $timeout = 3;
  curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch, CURLOPT_HEADER, 1);
  curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_exec($ch);
  return $httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
  curl_close($ch);
}

主要用于以下功能:

首先,它检查是否有名为 'url' 和 'email' 的POST请求参数被发送。
接着,它使用 get_code 函数来检查指定URL的HTTP响应代码是否为200。如果不是200,它将返回一个JSON响应,指示爬取失败并提供错误消息。
接下来,它检查URL是否以"http://"或"https://"开头,如果不是,它会返回一个JSON响应,指示URL应该包含协议头。
然后,它生成一个随机文件名($file),该文件名包括URL的主机名和一个随机数。
通过SSH连接到服务器,并运行一个bash命令来执行爬取操作,将结果保存到名为$file.zip的文件中。
如果爬取成功并且文件存在,它将构建一个包含下载链接的消息,并通过SMTP发送到指定的电子邮件地址。
最后,它返回一个JSON响应,其中包含成功或失败的代码,以及相应的消息和链接。
如果没有接收到 'url' 参数,它将跳转到下面的代码段。

下面的代码段包含了两个函数和一些变量:

trans_byte 函数用于将字节数转换为更容易阅读的格式,如KB,MB,GB,TB等。
$list 变量通过 glob 函数获取指定目录下的所有ZIP文件文件名,并存储在一个数组中。
$count 变量用于存储ZIP文件的数量。
$page_num 从GET请求参数中获取,用于指定每页显示的ZIP文件数量。
$pages 计算总页数,以便进行分页显示。
$page 从GET请求参数中获取,指示当前页数。
$startpos 用于计算分页的起始位置。
get_code 函数用于检查指定URL的HTTP响应代码。它使用CURL来执行HTTP请求,获取响应代码,并返回它。

以下是对这段代码的注释:

if (isset($_POST['url'])) {
// 检查是否有POST请求参数 'url'
$url = $_POST['url'];
$email = $_POST['email'];
// 获取POST请求中的URL和电子邮件地址

if (get_code($url) != 200) {
    // 使用 get_code 函数检查指定URL的HTTP响应代码是否不等于200
    exit(json_encode(array('code' => '-1', 'msg' => '爬取失败,请检查网址是否正确!'),JSON_UNESCAPED_UNICODE| JSON_PRETTY_PRINT));
    // 如果响应代码不等于200,返回一个JSON响应,指示爬取失败
}

$preg = "/^http(s)?:\\/\\/.+/";
if(!preg_match($preg, $url)){
    // 使用正则表达式检查URL是否以"http://"或"https://"开头
    exit(json_encode(array('code' => '-1', 'msg' => '域名请带上协议头!如( http:// 或 https:// )'),JSON_UNESCAPED_UNICODE| JSON_PRETTY_PRINT));
    // 如果URL没有协议头,返回一个JSON响应,提醒用户添加协议头
}

$file = parse_url($url)['host'].'-'.mt_rand(10000,99999);
// 生成一个随机文件名,包括URL的主机名和一个随机数

$ssh = new Components_Ssh($host, $user, $pass, $port, $log);
// 创建SSH连接对象

$ssh->cmd("bash /www/wwwroot/wget.fit/wget_site.sh {$url} {$file} >/dev/null && echo \"success\"");
// 在服务器上执行bash命令,执行爬取操作

if(file_exists('./down/'.$file.'.zip')) {
    // 如果爬取成功并且文件存在
    $content='你在Wget.fit提交的扒站请求已结束,下载链接:wget.fit/down/' . $file . '.zip';
    $wz=$smtpapi."?adress=".$email."&isHTML=false&title=Wget.fit爬取成功&content=".$content;
    file_get_contents($wz);
    // 发送包含下载链接的消息到指定的电子邮件地址

    exit(json_encode(array('code' => '1', 'msg' => '<center><img src="./assets/simple/img/wget.jpg" width="50%" ></center>', 'down' => 'http://wget.fit/down/' . $file . '.zip', 'yulan' => 'http://wget.fit/work/' . $file . '/' . parse_url($url)['host']),JSON_UNESCAPED_UNICODE| JSON_PRETTY_PRINT));
    // 返回一个JSON响应,指示爬取成功,并包含相关信息和链接
} else {
    exit(json_encode(array('code' => '-1', 'msg' => '爬取失败!'),JSON_UNESCAPED_UNICODE| JSON_PRETTY_PRINT));
    // 如果爬取失败,返回一个JSON响应
}
} else {
// 如果没有接收到 'url' 参数

function trans_byte($byte)
{
    // 定义一个函数,用于将字节数转换为更易读的格式

    $KB = 1024;
    $MB = 1024 * $KB;
    $GB = 1024 * $MB;
    $TB = 1024 * $GB;

    if ($byte < $KB) {
        return $byte . "B";
    } elseif ($byte < $MB) {
        return round($byte / $KB, 2) . "KB";
    } elseif ($byte < $GB) {
        return round($byte / $MB, 2) . "MB";
    } elseif ($byte < $TB) {
        return round($byte / $GB, 2) . "GB";
    } else {
        return round($byte / $TB, 2) . "TB";
    }
}

$list = glob('./down/*.zip');
$count = count($list);
// 获取指定目录下的ZIP文件列表和文件数量

$page_num = isset($_GET['limit'])?$_GET['limit']:10;
// 获取每页显示的ZIP文件数量,如果未指定则默认为10

$pages = ceil($count / $page_num);
// 计算总页数

$page = isset($_GET['page'])? $_GET['page']:1;
// 获取当前页数,如果未指定则默认为第一页

$startpos = ($page - 1)*$page_num;
// 计算分页的起始位置

$json['code'] = '0';

$json['data'] = $arr;
// 构建JSON响应

exit(json_encode($json,JSON_UNESCAPED_UNICODE| JSON_PRETTY_PRINT));
}
function get_code($url){
$ch = curl_init();
$timeout = 3;
  curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch, CURLOPT_HEADER, 1);
  curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_exec($ch);
  return $httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
  curl_close($ch);
}

进入下一个文件:ssh_class.php

本文链接:

https://www.1042.net/6.html

最新回复 (0)

    暂无评论

请先登录后发表评论!

返回