PHP实现Wget在线仿站工具

admin 2024年10月21日19:31:12评论18 views字数 4166阅读13分53秒阅读模式

引言

项目的核心是使用PHP处理用户请求,通过SSH连接服务器执行爬取命令,并将结果发送到用户邮箱。

功能概述

该工具具备以下功能:

  1. 输入有效的URL和邮箱。

  2. 验证URL格式。

  3. 通过SSH连接执行Wget命令抓取网页。

  4. 生成ZIP文件并通过邮箱通知用户。

页面结构

页面使用Bootstrap框架实现响应式设计。以下是页面的基本HTML结构示例:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>在线仿站工具</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-light bg-white border-bottom">
<div class="container">
<a class="navbar-brand" href="./">在线仿站工具</a>
</div>
</nav>

<div class="container mt-5">
<div class="row">
<div class="col-md-8 offset-md-2">
<input type="text" id="url" class="form-control" placeholder="请输入有效的网址" required/>
<input type="text" id="email" class="form-control mt-2" placeholder="请输入有效的邮箱" required/>
<input id="submit" type="button" value="提交任务" class="btn btn-primary btn-block mt-3"/>
</div>
</div>
</div>

<script src="./assets/js/common.js"></script>
</body>
</html>

PHP实现Wget在线仿站工具

后端逻辑

后端使用PHP实现,主要功能集中在api.php文件中。以下是该文件的核心代码示例:

1. 请求处理

首先,我们检查请求方法是否为POST,并获取URL和邮箱:

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
exit(json_encode(array('code' => '-1', 'msg' => '仅支持POST请求'), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
}

$url = $_POST['url'];
$email = $_POST['email'];

2. URL验证

使用正则表达式验证输入的URL格式,确保用户输入的是有效的URL:

$preg = "/^http(s)?:\/\/.+/";
if (!preg_match($preg, $url)) {
log_error("Invalid URL format: $url");
exit(json_encode(array('code' => '-1', 'msg' => '域名请带上协议头!如(http:// 或 https://)'), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
}

3. 生成文件名

生成唯一的文件名以便于后续的下载:

$timestamp = time();
$file = "website_$timestamp.zip";

4. 执行SSH命令

通过自定义的SSH类连接到服务器并执行Wget命令:

$ssh = new Components_Ssh($host, $user, $pass, $port, $log);
$command = escapeshellcmd("bash /www/wwwroot/{$site_url}/wget_site.sh {$url} {$file} >/dev/null && echo "success"");
$result = $ssh->cmd($command);

5. 检查文件生成状态

检查文件是否成功生成,若未生成,则记录错误信息:

if (!file_exists('./down/' . $file)) {
log_error("File generation failed for: $url");
exit(json_encode(array('code' => '-1', 'msg' => '爬取失败,请稍后再试。'), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
}

6. 发送邮件通知

发送爬取结果到用户邮箱的代码如下:

$content = '爬取成功,下载链接:' . $site_url . '/down/' . $file;
$wz = $smtpapi . "?adress=" . urlencode($email) . "&isHTML=false&title={$site_url}爬取成功&content=" . urlencode($content);
$response = @file_get_contents($wz);

7. 错误日志记录

使用自定义的log_error函数记录所有错误信息,确保系统的可维护性:

function log_error($message) {
error_log(date('Y-m-d H:i:s') . " - " . $message . "n", 3, '/path/to/error.log');
}

8. SSH连接类

以下是一个简单的SSH连接类示例,供后续使用:

class Components_Ssh {
private $connection;

public function __construct($host, $user, $pass, $port = 22) {
$this->connection = ssh2_connect($host, $port);
ssh2_auth_password($this->connection, $user, $pass);
}

public function cmd($command) {
$stream = ssh2_exec($this->connection, $command);
stream_set_blocking($stream, true);
return stream_get_contents($stream);
}
}

9. Wget脚本示例

wget_site.sh脚本负责执行实际的爬取操作,代码示例如下:

#!/bin/bash
url=$1
file=$2
wget --mirror --convert-links --adjust-extension --page-requisites --no-parent $url -P /www/wwwroot/your_site/down/
zip -r /www/wwwroot/your_site/down/$file /www/wwwroot/your_site/down/*

10. 处理返回结果

处理执行命令后的返回结果以便后续使用:

if ($result === 'success') {
exit(json_encode(array('code' => '1', 'msg' => '爬取任务已提交,请查看邮箱。'), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
} else {
log_error("Command execution failed: $command");
exit(json_encode(array('code' => '-1', 'msg' => '命令执行失败,请重试。'), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
}

11. 提交任务前的提示

在前端添加任务提交前的提示,增强用户体验:

document.getElementById('submit').onclick = function() {
const url = document.getElementById('url').value;
const email = document.getElementById('email').value;

if (url === '' || email === '') {
alert('请填写所有字段!');
return;
}

fetch('api.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: `url=${encodeURIComponent(url)}&email=${encodeURIComponent(email)}`
})
.then(response => response.json())
.then(data => {
if (data.code === '-1') {
alert(data.msg);
} else {
alert('任务已提交,请查看您的邮箱!');
}
});
};

12. 邮件发送状态检查

检查邮件发送状态以确保用户能够及时收到通知:

if ($response === false) {
log_error("Email failed to send to: $email");
exit(json_encode(array('code' => '-1', 'msg' => '邮件发送失败,请检查邮箱地址。'), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
}

核心技术

  1. PHP:后端逻辑处理,包括请求处理和SSH命令执行。

  2. SSH:使用SSH连接到服务器进行远程操作。

  3. Wget:爬取网页及其资源的工具。

  4. Bootstrap:用于简化前端布局和样式。

总结

这个在线仿站工具允许用户快速爬取并下载网站资源。关键在于安全地处理用户输入、稳定地执行后端爬取操作,并确保系统的可维护性。

原文始发于微信公众号(HackTips):PHP实现Wget在线仿站工具

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月21日19:31:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PHP实现Wget在线仿站工具https://cn-sec.com/archives/3291514.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息