• 分享
  • [第二弹] 在 Hydro,我们可以"免费"修改自己域 Logo 等高级功能...

  • @ 2024-8-6 8:03:12

演示传送门

此内容仅进行学习交流,为了不损害 Hydro 利益,本演示去除了一切其他功能(登录、注册)等,仅保留了一个首页的展示!

此页面可以实时根据 Hydro 同步!

功能:

  1. 修改 Hydro 图标
  2. 点击图标不跳转至主域
  3. 预览题目(New)
  4. 预览比赛(New)
  5. 持续开发中……

思路:

PHP获取HTML并处理。

PHP代理处理防盗链+细节修改。

主页代码实现例子:

<?php
$url='https://hydro.ac/d/<域ID>/';
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_REFERER,'https://hydro.ac');
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)');
curl_setopt($ch,CURLOPT_COOKIE,$cookie_string);
$page_content=curl_exec($ch);
curl_close($ch);
$base_url='https://hydro.ac';
$page_content=preg_replace_callback(
    '/(src|href)=["\']([^"\']+)["\']/i',
    function ($matches) use ($base_url)
	{
        $url=$matches[2];
        if(preg_match('/^https?:\/\//i',$url))
		{
            return $matches[0];
        }
        $absolute_url=(strpos($url,'/')===0)?$base_url.$url:$base_url.'/'.$url;
        return $matches[1].'="'.$absolute_url.'"';
    },
    $page_content
);
$page_content=preg_replace(
    '/(src|href)=["\'](https:\/\/cdn\.hydro\.ac\/[^"\']+)["\']/i',
    '$1="proxy.php?url=$2"',
    $page_content
);
$newContent='
<div class="row">
  <div class="columns clearfix">
    <ol class="nav__list nav__list--main clearfix">
      <li class="nav__list-item">
        <a href="https://cgrrms.mcfuns.cn/CJOJ/">
          <img class="nav__logo" src="/CJOJ/img/logo.png" alt="Logo">
        </a>
      </li>
      <li class="nav__list-item">
        <a href="https://cgrrms.mcfuns.cn/CJOJ/" class="nav__item nav--active">首页</a>
      </li>
      <li class="nav__list-item">
        <a href="https://cgrrms.mcfuns.cn/CJOJ/p/" class="nav__item">题库</a>
      </li>
      <li class="nav__list-item">
        <a href="https://cgrrms.mcfuns.cn/CJOJ/contest/" class="nav__item">比赛</a>
      </li>
      <li class="nav__list-item">
        <a href="https://hydro.ac/d/CJOJ/" class="nav__item">前往 Hydro</a>
      </li>
    </ol>
  </div>
</div>';
$pattern='/(<nav[^>]*id="menu"[^>]*>)(.*?)(<\/nav>)/s';
$replacement='$1'.$newContent.'$3';
$page_content=preg_replace($pattern,$replacement,$page_content);
echo $page_content;
?>
<script src="main.js"></script>

其中 proxy.php 是反代程序,绕过防盗链。

<?php
$url=$_GET['url'];
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
$response=curl_exec($ch);
if($response === false)
{
    http_response_code(500);
    echo "Error fetching URL: " . curl_error($ch);
}else{
    $contentType=curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    header("Content-Type: $contentType");
    echo $response;
}
curl_close($ch);
?>

如果您是 Hydro 开发人员,可以尝试规避此程序。

如果您是用户,请不要试图开发完整版本用于 OJ,此代码只为 学术交流

当前仅供交流,请在实验后 1 小时结束实验。

1 条评论

  • 1