首页 PT网站求生
文章
取消

PT网站求生

Owner: Olimi tags: 见闻分享 date: 2024年4月30日 12:02 status: Published type: Post

今天看了一部二十年前的电影《常在心中》发了疯全网找资源,找了一大圈都没找到好资源。这才意识到有时候资源这种东西不是那么的唾手可得。

之前就了解过PT网站(这期分享),刚好进去看看能不能拿到好资源。

进入PT

找了一份名单,[国内PT站点汇总(中英文名称对照表)PT邀请码网 (ptyqm.com)](http://www.ptyqm.com/28634.html)

因为现在还在教育网内,那肯定直接选择教育网内部的好(就是一般是学校名义搭建的),有免费注册的可能性。从上到下试了一圈:(链接不贴了,自己搜)

  1. 北洋园-TJUPT,3月后才能注册,不在注册时间。(更新:注册成功。这个更好用一点。更好的UI和规则。)
  2. 蝴蝶-HUD注册进去了。

生存

进去后认真阅读规则、注意事项。大致和之前看的分享文章差不多。核心思路就是一个,想获取多少东西、就付出多少东西,禁止白嫖。下载多大的资源、那就分享多大的资源出去。不一定是你独家的资源,只要提供了上行带宽供其他人下载就可以。只要维持这个思路大改就没有问题。

刚开始稍微试试水,先下载几个稍微小的(几个G左右)的资源(高清资源动不动上百G、硬盘本身都存不下呀),特别是free的那种,先挂在电脑上。

更新:

北洋园这种规则生存更加简单(H&R),下载种子只需要在下载完成后按照规则做种满时间即可,这样下载基本无需担心和考虑什么成本,也更加鼓励大家多下载、也才能多贡献。

上传下载碰到的问题

bittorrent本身就和其他普通资源一样直接下载就行,就是多了个Private key记录身份而已。但是pt网站规范了使用的圈子,在小圈子内部,你的身份、设备是不是和大家契合就很重要(主要是网络环境)。而在这里,一个IPV6就非常非常重要。

首先开始尝试时,因为前面注册北洋就需要ipv6网络,所以当时在实验室电脑已经专门确定解决过ipv6环境(SCUT对ipv6支持很好,基本直接有线接入就直接有了,当时实验室因为局域网测试用无线wifi接入所以才有问题)

所以一开始上传下载在实验室电脑很顺利没碰到什么问题。

但是因为我emby服务器是在自己电脑上,所以主要想下来自己看的话还是要自己电脑下,这个时候就碰到了大坑。

自己电脑所在的环境是,学校教育网,通过路由器使用有线网线接入,然后自己电脑和其他设备再通过路由器共享(SCUT学生宿舍的有线网带宽上线是20Mbps,低的让人发指,忍受了很多年了)。这个时候我自己的电脑是经过了路由器的一层NAT的,同时这个时候默认也只有ipv4.

但是这个时候看官方所说是支持ipv4访问的(两个域名,使用zeus域名确实可以通过ipv4访问官网),另外也看到一些帖子的人说自己ipv4也能连接tracker并获取到种子、有下载速度。

img

因此,一开始我觉得我这个网络环境应该是支持的范围的。希望自己努努力。

首先解决的第一个问题是:tracker连接不上(cannot connect、HTTP response 0等),查看了一下tracker地址,使用的是hudbt这个ipv6服务器,ipv4访问不到。官方说明是改hosts,加上一条直接指向这个域名的ipv4地址。当然官方说明过旧,我们实际可以通过ping拿到这个域名对应的ipv4地址。

当然实际上可以通过另一个途径解决,就是手动修改种子的tracker地址,改为zeus开头的ipv4服务器域名。这个时候tracker的问题解决。

然而接着更大的问题是一直没有速度(即使能够查看到tracker返回了用户、种子列表,很多个!)

到官网这个种子下面的同伴列表,确实可以看到多个做种和正在下载者,也能看到我的ID,但毫无疑问这里我的下载速度一直是0.

继续认真看了官方的说明(认真品读规则!虽然有点认真过头了)

为什么我的“可连接”是“否”?(以及为什么我需要关注这个问题?)

Tracker服务器认为你在防火墙后,或者在NAT桥接后,并且无法接收其他Peer的连接请求。

这意味着其它的大批Peer无法连接到你,只能由你连接到他们。更糟糕的情况是,如果两个Peer都处于这样的状态,他们将完全无法连接到对方。这对于整体速度有着非常不利的影响。

对于这个问题,有以下解决方式:对于防火墙,打开用于接收连接的端口(即你在BT客户端中定义的端口);对于NAT,你需要配置NAT服务器使用Basic NAT方式而不是NAPT(不同的路由有着不同的运行方式。翻阅你的路由文档或客服论坛。

所以问题是因为我的NAT网络结构?

问题肯定是我连不上其他做种者的一端。但是为什么呢。

研究了一下所说的BasicNAT等,一般的说法(比如这个)都是加上端口映射(UPnP)甚至直接上端口转发(DMZ),直接暴露内网指定IP。

这么做以后,同时确认过我的外网IP(ipv4)实际上确实是公网ip(myip.ipip.net和路由器现实外网ip一致)

但无论怎么办就是不行!

这个时候洗了下澡冷静清醒了一下。

  1. 首先种子本身肯定没有问题,这么多下载者正在使用。有问题的肯定是我。
  2. 其次,我的网络结构很简单、很典型。不可能我说我是那么特殊的不行的,肯定有行的办法。
  3. 使用路由器的这么多,NAT本身肯定没问题,不可能一定要有网线直连校园网。

这个时候终于想起翻一翻路由器的手册(在前面折腾的时候,在路由器管理页面看到了ipv6配置,但是我不知道ipv6地址应该填啥,因为直接连接校园网会直接分配ipv6,不像ipv4是手动填写分配的静态ip)。一看里面果然有关于ipv6的说明!

这个时候仍然挣扎了一下ipv4,为啥有人说可以但是我就是不行呢,其实前面升起了一下猜测,但是虽然可以查看到下载者,但是点进去没有权限看到别人的ip。这里仔细想想,终于想懂了。

ipv4和ipv6地址本身就是独立两套东西,如果提供方(服务器)只给你ipv6的地址来服务,那你只拿着ipv4去连人家的服务,肯定连不上呀。所以问题就不是我ipv4的问题,问题是我是ipv4,别人的资源方没有ipv4提供给我呀。

首先是人尽皆知的概念:你的下载来源于他人的上传,反之亦然 若双方的端口都不可被连接,他们之间便不能传输数据。 若你的端口开放,你便可直接被连接,即 对外传输数据。 若你的端口不可被连接,而对方可被连接,那么,你需要从tracker拿到对方的信息之后,主动连接对方才可上传 —— 因为对方就算想主动连接你也无法成功 反之亦然,你想下载一个种子,但做种人端口不开放,你就无法立即连接上他以获取数据;幸运的是,若你的端口是开放的,那么,对方在下一次与tracker通讯时 获取到你的信息,你就能下载了。 注意,tracker announce 最小容许的时间间隔往往较长(因站点设置而异),下载做种人数较少的种子 且下不动时,请先耐心等待至少30mins~1h,若你的端口不可被连接,建议置顶求加速。 所谓“搭桥”/“加速”,就是拥有开放ipv4/ipv6端口的客户端加入到下载中来,虽然你不能直接从发种人/保种人那里拿到数据,但你能从其他peer处“曲线”获得数据 IPv4/IPv6是两个不同的协议栈:若你有开放的ipv6端口,但对方只有开放的ipv4端口,你们之间仍然无法传输数据。但考虑到家宽都能拥有公网ipv6地址 却不一定能申请到动态公网ipv4,所以正确配置ipv6是比较重要的。 值得注意的是,无论谁主动连接,当连接被建立后,双方既能产生上传行为也能产生下载行为(具体取决于双方需求)。因此得到结论:就算你的连接性差到极点,当种子发布不久,仍有多人下载时,你仍有几率分得一杯羹(但上传量可能很少)。进一步得知,有上传并不意味着你的连接性就是好的。

所以才强调了正确配置ipv6是比较重要的。初来乍到,才意识到ipv6之于PT网站的关系。

然后根据路由器手册配置了一下(其实也很简单,能拿到手的都是很成熟的方案,别人早就做好来了,虽然这个时候发现买路由器的时候也稍微被坑了一下,低配高价买,这就是作为不懂的韭菜),马上拿到了ipv6的网络环境(所以之前这么倔是为啥呢)

然后很自然就解决了。

最后顺便一提,虽然是在进入PT的时候搞的ipv6,但搞到ipv6之后才发现这两者相辅相成呀(特别是针对教育网这个大水管的网络场景下)。ipv6是真的爽,相当于和ipv4是并行的两套环境,而用前者的相对较少,所以ipv6就没有那么强的个体带宽上限。拿ipv6随便跑到100Mbps,是真的爽。这个时候原本觉得没有意义耗在这里的,忽然很有意义了起来。拨开云雾见天日呀。

絮絮叨叨end on 2024年01月18日。

结合emby媒体库食用

从PT网站下载了资源,同时使用emby管理媒体库,因此需要将下载后的资源放到媒体库中,同时修改命名。另一方面又需要保留原本的内容以提供做种。编写一个windows平台poweshell的脚本,完成硬链接工作。

  • 硬链接脚本参考:(windows平台就使用powershell了)。该脚本在种子下载完成后自动调用。

    个人使用qBittorrent下载器,在设置→下载→最后的Torrent完成时运行执行下面脚本:“powershell.exe -File “D:\F\知识库\tools\mkhlinkforemby.ps1” -src “C:\Users\Olimi\Downloads\media\%L\%N” -dst “C:\Users\Olimi\Videos\%L\%N””。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
      param (
          [string]$src,
          [string]$dst
      )
        
      $Kernel32 = Add-Type -MemberDefinition @"
      [DllImport("Kernel32.dll")]
      public static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes);
      "@ -Name "Kernel32" -Namespace "Win32Functions" -PassThru
        
      # 添加.NET类的引用以使用MessageBox
      Add-Type -AssemblyName System.Windows.Forms
        
      # 检查源路径是否存在
      if (-Not (Test-Path -LiteralPath $src)) {
          Write-Error "Source path does not exist."
          exit
      }
        
      # 确定源路径是文件还是目录
      $sourceItem = Get-Item -LiteralPath $src
      $sourceType = if ($sourceItem.PSIsContainer) { "Directory" } else { "File" }
        
      # 检查目标路径是否存在,如果不存在则创建
      if (-Not (Test-Path -LiteralPath $dst)) {
          New-Item -ItemType Directory -Path $dst -Force | Out-Null
      }
        
      if ($sourceType -eq "File") {
          # 处理单个文件
          $file = Get-Item -LiteralPath $src
          $destinationFile = Join-Path -Path $dst -ChildPath $file.Name
          $null = $Kernel32::CreateHardLink($destinationFile, $file.FullName, [IntPtr]::Zero)
      } else {
          # 处理目录
          $files = Get-ChildItem -LiteralPath $src -Recurse -File
        
          foreach ($file in $files) {
              # 构建目标文件的相对路径,保持目录结构
              $relativePath = $file.FullName.Substring($src.Length).TrimStart('\')
              $destinationFile = Join-Path -Path $dst -ChildPath $relativePath
        
              # 确保目标目录存在
              $destinationDir = [System.IO.Path]::GetDirectoryName($destinationFile)
              if (-Not (Test-Path -LiteralPath $destinationDir)) {
                  New-Item -ItemType Directory -Path $destinationDir -Force | Out-Null
              }
        
              # 检查文件大小,大于1MB使用硬链接,小于等于1MB则拷贝
              if ($file.Length -gt 1MB) {
                  $null = $Kernel32::CreateHardLink($destinationFile, $file.FullName, [IntPtr]::Zero)
              } else {
                  Copy-Item -LiteralPath $file.FullName -Destination $destinationFile -Force
              }
          }
      }
        
      Write-Host "Operation completed."
    
  • 硬链接脚本(prompt版)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    
      $Kernel32 = Add-Type -MemberDefinition @"
      [DllImport("Kernel32.dll")]
      public static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes);
      "@ -Name "Kernel32" -Namespace "Win32Functions" -PassThru
        
      # 请求用户输入源路径(文件或目录)和目标路径
      $sourcePath = Read-Host "Please enter the source path (file or directory)"
      $destinationPath = Read-Host "Please enter the destination path"
        
      # 检查源路径是否存在
      if (-Not (Test-Path -LiteralPath $sourcePath)) {
          Write-Error "Source path does not exist."
          exit
      }
        
      # 确定源路径是文件还是目录
      $sourceItem = Get-Item -LiteralPath $sourcePath
      $sourceType = if ($sourceItem.PSIsContainer) { "Directory" } else { "File" }
        
      # 请求用户确认源类型
      $confirmation = Read-Host "The source path is a $sourceType. Do you want to proceed? (Y/N)"
      if ($confirmation -ne "Y") {
          Write-Host "Operation cancelled by user."
          exit
      }
        
      # 检查目标路径是否存在,如果不存在则创建
      if (-Not (Test-Path -LiteralPath $destinationPath)) {
          Write-Host "Destination path does not exist. Creating directory..."
          New-Item -ItemType Directory -Path $destinationPath -Force | Out-Null
      }
        
      if ($sourceType -eq "File") {
          # 处理单个文件
          $file = Get-Item -LiteralPath $sourcePath
          $destinationFile = Join-Path -Path $destinationPath -ChildPath $file.Name
          $null = $Kernel32::CreateHardLink($destinationFile, $file.FullName, [IntPtr]::Zero)
      } else {
          # 处理目录
          $files = Get-ChildItem -LiteralPath $sourcePath -Recurse -File
        
          foreach ($file in $files) {
              $relativePath = $file.FullName.Substring($sourcePath.Length).TrimStart('\')
              $destinationFile = Join-Path -Path $destinationPath -ChildPath $relativePath
                
              $destinationDir = [System.IO.Path]::GetDirectoryName($destinationFile)
              if (-Not (Test-Path -LiteralPath $destinationDir)) {
                  New-Item -ItemType Directory -Path $destinationDir -Force | Out-Null
              }
        
              if ($file.Length -gt 1KB) {
                  $null = $Kernel32::CreateHardLink($destinationFile, $file.FullName, [IntPtr]::Zero)
              } else {
                  Copy-Item -LiteralPath $file.FullName -Destination $destinationFile -Force
              }
          }
      }
        
      Write-Host "Operation completed."
    
  • 检查硬链接:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
      param(
          [string]$directoryPath = (Get-Location)
      )
        
      # Check if the user has the required administrative rights
      if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
          Write-Host "You need to run PowerShell as an Administrator to execute this script."
          exit
      }
        
      # Get all files in the directory recursively
      $files = Get-ChildItem -Path $directoryPath -Recurse -File
        
      # Loop through each file and check for hard links
      foreach ($file in $files) {
          $filePath = $file.FullName
          # Use fsutil to find hard links, ignore errors silently
          $hardLinks = fsutil hardlink list $filePath 2>$null
          if ($hardLinks.Count -gt 1) {
              Write-Host "File: $filePath has $($hardLinks.Count) hard links:"
              foreach ($link in $hardLinks) {
                  Write-Host " - $link"
              }
          }
      }
    

最后,要清除(或者迁移)资源时,直接拷贝硬链接的文件,行为和普通文件一样。但是要删除时,记得把PT做种处的文件(但是记得做种足够的时间)和媒体库中的文件都删除,这时才能真正删除文件,回收空间。

本文由作者按照 CC BY 4.0 进行授权

校园求职总结

家庭多媒体库&投屏&内网穿透