4 changed files with 455 additions and 2 deletions
			
			
		@ -1,3 +1,54 @@
				@@ -1,3 +1,54 @@
					 | 
				
			||||
# xw.al | 
				
			||||
用于生成短链接。 | 
				
			||||
 | 
				
			||||
xw.al前端 | 
				
			||||
## 使用说明 | 
				
			||||
 | 
				
			||||
- 请求方法:POST | 
				
			||||
- 请求地址:`https://xw.al/api.php` | 
				
			||||
 | 
				
			||||
## 请求参数 | 
				
			||||
 | 
				
			||||
| **参数名称** | **类型** | **是否必须** | **示例值**              | | 
				
			||||
| -------- | ------ | -------- | -------------------- | | 
				
			||||
| url      | string | 是        | https://www.xiaoz.me | | 
				
			||||
 | 
				
			||||
**请求成功:** | 
				
			||||
 | 
				
			||||
```json | 
				
			||||
{ | 
				
			||||
 "url": { | 
				
			||||
 "keyword": "1aj1z", | 
				
			||||
 "url": "https://www.xiaoz.me", | 
				
			||||
 "title": "小z博客 - 生命不息,吾将折腾不止。", | 
				
			||||
 "date": "2021-01-01 05:29:35", | 
				
			||||
 "ip": "118.112.xxx.xxx" | 
				
			||||
 }, | 
				
			||||
 "status": "success", | 
				
			||||
 "message": "https://www.xiaoz.me 已保存为", | 
				
			||||
 "title": "小z博客 - 生命不息,吾将折腾不止。", | 
				
			||||
 "shorturl": "https://xw.al/1aj1z", | 
				
			||||
 "statusCode": 200 | 
				
			||||
} | 
				
			||||
``` | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
- statusCode:状态码,请求成功为200 | 
				
			||||
- shorturl:返回的短网址 | 
				
			||||
 | 
				
			||||
**请求失败:** | 
				
			||||
 | 
				
			||||
```json | 
				
			||||
{ | 
				
			||||
 "code": 403, | 
				
			||||
 "err_msg": "Blacklisted domain." | 
				
			||||
} | 
				
			||||
``` | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
- code:请求失败的状态码 | 
				
			||||
- err_msg:错误原因 | 
				
			||||
 | 
				
			||||
## 限制 | 
				
			||||
 | 
				
			||||
- 单IP每日限制50次请求 | 
				
			||||
				 
					 | 
				
			||||
@ -0,0 +1,74 @@
				@@ -0,0 +1,74 @@
					 | 
				
			||||
<?php | 
				
			||||
/* | 
				
			||||
 * YOURLS API | 
				
			||||
 * | 
				
			||||
 * author:xiaoz<xiaoz.me> | 
				
			||||
 * update:2022/03 | 
				
			||||
 * | 
				
			||||
 */ | 
				
			||||
header('Content-Type:application/json; charset=utf-8'); | 
				
			||||
//载入扩展配置文件 | 
				
			||||
require('ext.php'); | 
				
			||||
 | 
				
			||||
//默认域名,请改成你自己的域名,末尾不要带有/ | 
				
			||||
define("DOMAIN","https://xw.al"); | 
				
			||||
//每日单IP限制,就是每个IP每天可以生成多少个短链接,默认50个 | 
				
			||||
define("LIMIT",50); | 
				
			||||
//过期时间设置 | 
				
			||||
$today = strtotime(date("Y-m-d 23:59:59"),time()); | 
				
			||||
$exp_time = $today - time(); | 
				
			||||
//改成你自己的secret signature token,登录YOURLS后台 - 工具 - 安全的API调用 - 获取secret signature token | 
				
			||||
define("TOKEN",''); | 
				
			||||
 | 
				
			||||
//获取url | 
				
			||||
$url = @$_POST['url']; | 
				
			||||
//echo $url; | 
				
			||||
//exit; | 
				
			||||
//try{ | 
				
			||||
//	$url = urldecode($url); | 
				
			||||
//} | 
				
			||||
//catch(Exception $e){ | 
				
			||||
//  	err_msg($e->getMessage()); | 
				
			||||
//} | 
				
			||||
//如果URL不合法,直接停止 | 
				
			||||
if( ! filter_var($url, FILTER_VALIDATE_URL) ) { | 
				
			||||
	err_msg('URL不合法!'); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//获取用户IP | 
				
			||||
$ip = getIP(); | 
				
			||||
//设置key | 
				
			||||
$key = 'ip_'.str_replace('.','_',$ip); | 
				
			||||
 | 
				
			||||
//连接本地的 Redis 服务 | 
				
			||||
$redis = new Redis(); | 
				
			||||
$redis->connect('127.0.0.1', 6379); | 
				
			||||
 | 
				
			||||
//判断key是否存在 | 
				
			||||
if( ! $redis->get($key) ) { | 
				
			||||
	$redis->set($key, '0'); | 
				
			||||
	$redis->EXPIRE($key, $exp_time); | 
				
			||||
} | 
				
			||||
//如果key存在 | 
				
			||||
if ( ($redis->get($key)) || ( $redis->get($key) === '0' ) ) { | 
				
			||||
	//获取value | 
				
			||||
	$value = intval($redis->get($key)); | 
				
			||||
	//如果value小于limit,则调用API | 
				
			||||
	if( $value < LIMIT ) { | 
				
			||||
		$api_url = DOMAIN.'/yourls-api.php?signature='.TOKEN.'&action=shorturl&format=json&url='.$url; | 
				
			||||
		$re = curl($api_url); | 
				
			||||
		$value = (string)($value + 1); | 
				
			||||
		 | 
				
			||||
		$redis->set($key, $value); | 
				
			||||
		$redis->EXPIRE($key, $exp_time); | 
				
			||||
		// | 
				
			||||
		exit($re); | 
				
			||||
	} | 
				
			||||
	else{ | 
				
			||||
		err_msg('今日请求上限!'); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
//var_dump($redis->get($key)); | 
				
			||||
//echo $key; | 
				
			||||
//echo $redis->get($key); | 
				
			||||
@ -0,0 +1,51 @@
				@@ -0,0 +1,51 @@
					 | 
				
			||||
<?php | 
				
			||||
//*API扩展文件*/ | 
				
			||||
 | 
				
			||||
function getIP() {  | 
				
			||||
  if (getenv('HTTP_CLIENT_IP')) {  | 
				
			||||
  $ip = getenv('HTTP_CLIENT_IP');  | 
				
			||||
}  | 
				
			||||
elseif (getenv('HTTP_X_FORWARDED_FOR')) {  | 
				
			||||
	$ip = getenv('HTTP_X_FORWARDED_FOR');  | 
				
			||||
}  | 
				
			||||
	elseif (getenv('HTTP_X_FORWARDED')) {  | 
				
			||||
	$ip = getenv('HTTP_X_FORWARDED');  | 
				
			||||
}  | 
				
			||||
  elseif (getenv('HTTP_FORWARDED_FOR')) {  | 
				
			||||
  $ip = getenv('HTTP_FORWARDED_FOR');  | 
				
			||||
}  | 
				
			||||
  elseif (getenv('HTTP_FORWARDED')) {  | 
				
			||||
  $ip = getenv('HTTP_FORWARDED');  | 
				
			||||
}  | 
				
			||||
else {  | 
				
			||||
	$ip = $_SERVER['REMOTE_ADDR'];  | 
				
			||||
}  | 
				
			||||
	return $ip;  | 
				
			||||
}  | 
				
			||||
 | 
				
			||||
function curl($url) { | 
				
			||||
	$ip = getIP(); | 
				
			||||
	$curl = curl_init($url); | 
				
			||||
 | 
				
			||||
    #curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"); | 
				
			||||
    curl_setopt($curl, CURLOPT_FAILONERROR, true); | 
				
			||||
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); | 
				
			||||
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); | 
				
			||||
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); | 
				
			||||
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); | 
				
			||||
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('CLIENT-IP: '.$ip,'X-FORWARDED-FOR: '.$ip)); | 
				
			||||
    #设置超时时间,最小为1s(可选) | 
				
			||||
    curl_setopt($curl , CURLOPT_TIMEOUT, 5); | 
				
			||||
 | 
				
			||||
    $html = curl_exec($curl); | 
				
			||||
    curl_close($curl); | 
				
			||||
    return $html; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
function err_msg($msg) { | 
				
			||||
	$data = [ | 
				
			||||
		'code'		=>	403, | 
				
			||||
		'err_msg'	=>	$msg | 
				
			||||
	]; | 
				
			||||
	exit(json_encode($data)); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,277 @@
				@@ -0,0 +1,277 @@
					 | 
				
			||||
<!DOCTYPE html> | 
				
			||||
<html lang="zh-cn" xmlns="http://www.w3.org/1999/xhtml"> | 
				
			||||
<head> | 
				
			||||
	<meta charset="utf-8" /> | 
				
			||||
	<title>xw.al 小五爱链短网址</title> | 
				
			||||
	<meta name="viewport" content="width=device-width, initial-scale=1"> | 
				
			||||
	<meta name="generator" content="EverEdit" /> | 
				
			||||
	<meta name="author" content="xiaoz<xiaoz93@outlook.com>" /> | 
				
			||||
	<meta name="keywords" content="xw.al,小五爱链,小五短链,短链接生成,短链接生成器,短链地址,短网址生成" /> | 
				
			||||
	<meta name="description" content="xw.al 小五爱链是一个免费短链接生成工具,链接永久有效。" /> | 
				
			||||
	<link rel='stylesheet' href='https://libs.xiaoz.top/font-awesome/4.7.0/css/font-awesome.min.css'> | 
				
			||||
	<link rel="stylesheet" href="https://lib.sinaapp.com/js/bootstrap/4.3.1/css/bootstrap.min.css"> | 
				
			||||
	<style type="text/css" media="screen"> | 
				
			||||
		.menu { | 
				
			||||
			width:100%; | 
				
			||||
			background-color: #343a40!important; | 
				
			||||
		} | 
				
			||||
		.content{ | 
				
			||||
			margin-top:2em; | 
				
			||||
		} | 
				
			||||
		.footer{ | 
				
			||||
			width:100%; | 
				
			||||
			margin-top:2em; | 
				
			||||
		} | 
				
			||||
		footer { | 
				
			||||
			/*color:#fff;*/ | 
				
			||||
			text-align:center; | 
				
			||||
			padding:16px; | 
				
			||||
			line-height:1em; | 
				
			||||
		} | 
				
			||||
		#qrcode{ | 
				
			||||
			max-width:200px; | 
				
			||||
			max-width:200px; | 
				
			||||
		} | 
				
			||||
		.err_msg{ | 
				
			||||
			position:fixed; | 
				
			||||
			top:0; | 
				
			||||
			text-align:center; | 
				
			||||
			width:100%; | 
				
			||||
			z-index:99; | 
				
			||||
			display: none; | 
				
			||||
		} | 
				
			||||
		.success_msg{ | 
				
			||||
			position:fixed; | 
				
			||||
			top:0; | 
				
			||||
			text-align:center; | 
				
			||||
			width:100%; | 
				
			||||
			z-index:99; | 
				
			||||
			display: none; | 
				
			||||
		} | 
				
			||||
		.qr-box{ | 
				
			||||
			display:none; | 
				
			||||
			margin-top:2em; | 
				
			||||
			 | 
				
			||||
		} | 
				
			||||
		.qr-box img{ | 
				
			||||
			border:1px solid #EEEEEE; | 
				
			||||
		} | 
				
			||||
		.logo{ | 
				
			||||
			padding-top:0; | 
				
			||||
		} | 
				
			||||
		.tos{ | 
				
			||||
			margin-top:2em; | 
				
			||||
		} | 
				
			||||
		.promotion{ | 
				
			||||
			margin-top:2em; | 
				
			||||
		} | 
				
			||||
		.promotion img{ | 
				
			||||
			max-width:100%; | 
				
			||||
		} | 
				
			||||
		.loading{ | 
				
			||||
			width:100%; | 
				
			||||
			height:100%; | 
				
			||||
			/*height:30px;*/ | 
				
			||||
			position:absolute; | 
				
			||||
			 | 
				
			||||
			text-align:center; | 
				
			||||
			/*height:30px; | 
				
			||||
			line-height:30px;*/ | 
				
			||||
			z-index:999; | 
				
			||||
			display: none; | 
				
			||||
		} | 
				
			||||
		.loading img{ | 
				
			||||
			width:30px; | 
				
			||||
			height:30px; | 
				
			||||
			/*margin-left:auto; | 
				
			||||
			margin-left:auto;*/ | 
				
			||||
			margin: 0 auto; | 
				
			||||
			position:absolute; | 
				
			||||
			top:30%; | 
				
			||||
			display: inline-block; | 
				
			||||
			vertical-align: middle; | 
				
			||||
			 | 
				
			||||
		} | 
				
			||||
		.menu i { | 
				
			||||
			padding-right:3px; | 
				
			||||
		} | 
				
			||||
	</style> | 
				
			||||
</head> | 
				
			||||
<body> | 
				
			||||
	<!--加载图标--> | 
				
			||||
	<div class="loading"> | 
				
			||||
		<img src = 'https://libs.xiaoz.top/material/loading/loading_37.gif' /> | 
				
			||||
	</div> | 
				
			||||
	<!--加载图标END--> | 
				
			||||
	<!--错误提示框--> | 
				
			||||
	<div class="alert alert-danger err_msg"> | 
				
			||||
	    <strong></strong>  | 
				
			||||
	</div> | 
				
			||||
	<!--错误提示框END--> | 
				
			||||
	<!--成功的提示--> | 
				
			||||
	<div class="alert alert-success success_msg"> | 
				
			||||
	    <strong></strong>  | 
				
			||||
	</div> | 
				
			||||
	<!--成功的提示END--> | 
				
			||||
	<div class="menu"> | 
				
			||||
		<div class="container"> | 
				
			||||
			<div class="row"> | 
				
			||||
				<div class="col-12"> | 
				
			||||
					<nav class="navbar navbar-expand-sm bg-dark navbar-dark"> | 
				
			||||
						<a class="navbar-brand logo" href="/" title = "小五爱链"><i class="fa fa-home"></i> xw.al </a> | 
				
			||||
						<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar"> | 
				
			||||
						    <span class="navbar-toggler-icon"></span> | 
				
			||||
						  </button> | 
				
			||||
						  <div class="collapse navbar-collapse" id="collapsibleNavbar"> | 
				
			||||
					  <ul class="navbar-nav"> | 
				
			||||
					    <li class="nav-item"> | 
				
			||||
					      <a class="nav-link" href="/api" target = "_blank" rel = "nofollow"><i class="fa fa-code"></i> API </a> | 
				
			||||
					    </li> | 
				
			||||
					    <li class="nav-item"> | 
				
			||||
					      <a class="nav-link" href="/xiaozblog" target = "_blank" rel = "nofollow"><i class="fa fa-wordpress"></i> Blog </a> | 
				
			||||
					    </li> | 
				
			||||
					    <li class="nav-item"> | 
				
			||||
					      <a class="nav-link" href="/onenav" target = "_blank" rel = "nofollow"><i class="fa fa-bookmark-o"></i> OneNav导航 </a> | 
				
			||||
					    </li> | 
				
			||||
					    <li class="nav-item"> | 
				
			||||
					      <a class="nav-link" href="/imgurl" target = "_blank" rel = "nofollow"><i class="fa fa-image"></i> ImgURL图床 </a> | 
				
			||||
					    </li> | 
				
			||||
					  </ul> | 
				
			||||
					  </div> | 
				
			||||
					</nav> | 
				
			||||
				</div> | 
				
			||||
			</div> | 
				
			||||
		</div> | 
				
			||||
	</div> | 
				
			||||
 | 
				
			||||
	<div class="container"> | 
				
			||||
		<!--TOS--> | 
				
			||||
		<div class="row tos"> | 
				
			||||
			<div class="col-md-8 offset-md-2"> | 
				
			||||
				<div id="accordion"> | 
				
			||||
				<div class="card"> | 
				
			||||
				  <div class="card-header"> | 
				
			||||
				    <a class="collapsed card-link" data-toggle="collapse" href="#collapseTwo"> | 
				
			||||
				    使用条款 | 
				
			||||
				  </a> | 
				
			||||
				  </div> | 
				
			||||
				  <div id="collapseTwo" class="collapse" data-parent="#accordion"> | 
				
			||||
				    <div class="card-body"> | 
				
			||||
				      <p>xw.al我为他取了个很骚气的中文名叫:小五爱链,主要提供短链接转换服务,简称小五,使用中请务必遵守以下协议。</p> | 
				
			||||
				      <ul> | 
				
			||||
					      <li>不得转换博彩、赌博、色情、政治、暴力、血腥、成人用品等网站。</li> | 
				
			||||
					      <li>违法上一条协议,对短链做删除处理,不做任何通知。</li> | 
				
			||||
					      <li>单IP每日限制50次转换。</li> | 
				
			||||
					      <li>转换后的链接长期有效,直到项目无法维持。</li> | 
				
			||||
					      <li>为保持良性发展,您可以进行捐赠:<a href="https://www.xiaoz.me/api/pay/" target = "_blank" rel = "nofollow">捐赠地址</a></li> | 
				
			||||
				      </ul> | 
				
			||||
				      <p>如有疑问,您可通过以下方式联系我。</p> | 
				
			||||
				      <ul> | 
				
			||||
					      <li>QQ:337003006</li> | 
				
			||||
					      <li>QQ群1:147687134</li> | 
				
			||||
					      <li>QQ群2:932795364</li> | 
				
			||||
				      </ul> | 
				
			||||
				    </div> | 
				
			||||
				  </div> | 
				
			||||
				</div> | 
				
			||||
				</div> | 
				
			||||
				 | 
				
			||||
			</div> | 
				
			||||
		</div> | 
				
			||||
		<!--TOS END--> | 
				
			||||
		<div class="row content"> | 
				
			||||
			<!--表但--> | 
				
			||||
			<div class="col-md-8 offset-md-2"> | 
				
			||||
				<form> | 
				
			||||
				  <div class="input-group mb-3"> | 
				
			||||
				    <input type="url" id = "url" class="form-control" placeholder="请输入URL"> | 
				
			||||
				    <div class="input-group-append"> | 
				
			||||
				      <button type="button" class="btn btn-primary" onclick = "short();">缩短</button> | 
				
			||||
				    </div> | 
				
			||||
				  </div> | 
				
			||||
				</form> | 
				
			||||
			</div> | 
				
			||||
			<!--表单END--> | 
				
			||||
		</div> | 
				
			||||
		<!--结果--> | 
				
			||||
		<div class="row"> | 
				
			||||
			<div class="col-md-8 offset-md-2"> | 
				
			||||
				<!--结果左侧--> | 
				
			||||
				<div class=""> | 
				
			||||
					<div><label>短网址:</label></div> | 
				
			||||
					<form> | 
				
			||||
				    <div class="input-group mb-3"> | 
				
			||||
				      <input type="text" class="form-control" id="short_url"> | 
				
			||||
				      <div class="input-group-append"> | 
				
			||||
				      	<button type="button" id = "copy" class="btn btn-primary" onclick = "copy_url();">复制</button> | 
				
			||||
				    </div> | 
				
			||||
				    </div> | 
				
			||||
				  </form> | 
				
			||||
				</div> | 
				
			||||
				<!--结果左侧END--> | 
				
			||||
				<!--结果右侧--> | 
				
			||||
				<div class="qr-box"> | 
				
			||||
					<div style = "padding-bottom:16px;text-align:center;">扫码访问:</div> | 
				
			||||
					<div class = "qrcode"><center><img id = "qrcode" src="" alt=""></center></div> | 
				
			||||
				</div> | 
				
			||||
				<!--结果右侧END--> | 
				
			||||
			</div> | 
				
			||||
		</div> | 
				
			||||
		<!--结果END--> | 
				
			||||
		<!--banner--> | 
				
			||||
		<div class="row promotion"> | 
				
			||||
			<div class="col-md-8 offset-md-2"> | 
				
			||||
				<center><a href="https://xw.al/nodecache" rel = "nofollow" target = "_blank"><img src="https://www.xiaoz.me/wp-content/uploads/2020/12/node_banner.jpg" alt=""></a></center> | 
				
			||||
			</div> | 
				
			||||
		</div> | 
				
			||||
		<!--banner end--> | 
				
			||||
	</div> | 
				
			||||
	<!--底部footer--> | 
				
			||||
	<div class="footer"> | 
				
			||||
	<footer class = ""> | 
				
			||||
		© 2022 Powered by <a target = "_blank" href="https://xw.al" title = "小五爱链" rel = "nofollow">xw.al</a>.The author is <a href="https://www.xiaoz.me/" target="_blank" title = "小z博客">xiaoz.me</a> | 
				
			||||
	</footer> | 
				
			||||
	</div> | 
				
			||||
	<!--底部footer end--> | 
				
			||||
</body> | 
				
			||||
<script src = 'https://libs.xiaoz.top/jquery/2.2.4/jquery.min.js'></script> | 
				
			||||
<script src = 'https://libs.xiaoz.top/clipBoard.js/clipBoard.min.js'></script> | 
				
			||||
<script src="https://lib.sinaapp.com/js/bootstrap/4.3.1/js/bootstrap.min.js"></script> | 
				
			||||
<script> | 
				
			||||
function short(){ | 
				
			||||
	var url = $("#url").val(); | 
				
			||||
	$(".loading").show(); | 
				
			||||
	$.post("/api.php",{"url":url},function(data,status){ | 
				
			||||
		if(data.statusCode == 200) { | 
				
			||||
			$("#short_url").val(data.shorturl); | 
				
			||||
			$('#qrcode').attr('src', 'https://qr.rss.ink/v1/?text=' + data.shorturl); | 
				
			||||
			$(".loading").hide(); | 
				
			||||
			$(".qr-box").show(); | 
				
			||||
		} | 
				
			||||
		else if( data.code == 403 ) { | 
				
			||||
			$(".err_msg strong").text(data.err_msg); | 
				
			||||
			$("#short_url").val(''); | 
				
			||||
			$(".qr-box").hide(); | 
				
			||||
			$(".loading").hide(); | 
				
			||||
			$(".err_msg").show(); | 
				
			||||
			$(".err_msg").fadeOut(5000); | 
				
			||||
		} | 
				
			||||
	}); | 
				
			||||
} | 
				
			||||
function copy_url(){ | 
				
			||||
	var copy = new clipBoard(document.getElementById('copy'), { | 
				
			||||
		beforeCopy: function() { | 
				
			||||
			 | 
				
			||||
		}, | 
				
			||||
		copy: function() { | 
				
			||||
			return document.getElementById('short_url').value; | 
				
			||||
		}, | 
				
			||||
		afterCopy: function() { | 
				
			||||
			$(".success_msg strong").text('链接已复制!'); | 
				
			||||
			$(".success_msg").show(); | 
				
			||||
			$(".success_msg").fadeOut(5000); | 
				
			||||
		} | 
				
			||||
	}); | 
				
			||||
} | 
				
			||||
</script> | 
				
			||||
</html> | 
				
			||||
					Loading…
					
					
				
		Reference in new issue