Quantcast
Channel: Comunidad Underground Hispana
Viewing all articles
Browse latest Browse all 11602

Script powershell para submanga.com

$
0
0
Resulta que me robaron la notebook con mi querido GNU/Linux sabayon. Con ello, tuve que volverme a amigar con la pc de escritorio con windows 7 (todavía no lo consigo).
Con GNU/Linux, pasar tiempo en la consola es agradable, pero en windows ésto no sucede. Existe powershell, pero si por lo menos fuera más amigable...
Bien, entonces veamos el baso medio lleno y aprovechemos éste impass para aprender a usar powershell (incluso sirve para el trabajo).

Junto con mi notebook, se fueron un montón de imágenes y scripts que utilizaba para bajar mangas y leerlos tranquilamente desde mi teléfono... el leerlo desde la web me resulta incómodo, decae mucho el tener que esperar a que cargue la imagen para poder leer, un delay de 3 segundos (que aquellos que leen sabrán comprender).

Fue así que, con los pocos conocimientos que tenía, junto con los nuevos que fui aprendiendo, llegué a éste script, sólo funciona sobre submanga. Ejemplos de uso:
* Ejemplo 1, supongamos que quiero bajar todo Bleach (cosa que no va a pasar, aparentemente éste tipo de servidores detectan la intromisión de éstos bots y bloquean cada cierto tiempo, pero para bajar de a uno puede que sirva), la cosa sería:
Código:

.\get.ps1 -manga Bleach
Ésto lo que hace es generar una página cache, para luego no tener que volver a descargarla.
* Ejemplo 2: Supongamos que quiero ver cuáles son los últimos 10 capítulos que salieron de Bleach
Código:

.\get.ps1 -manga Bleach -onlyTest
Ahora, de nuevo, hay que tener presente que si existe la página cache la va a utilizar, ésto significa que puede que estemos consultando una página antigua y ya exista un nuevo capítulo, para evitar ésto se puede hacer utilizar el parámetro -invalidateCache.

* Ejemplo 3: bajar un rango de capítulos
Código:

.\get.ps1 -manga Bleach -from 500 -to 510
(No lo probé, pero calculo que si no le pasamos el parámetro -from descargará desde el capítulo 1 hasta el que dice el parámetro -to, a la inversa si no le pasamos -to descargará desde -from hasta... 1000, un valor totalmente aleatorio tomando como referencia Bleach un manga con casi 600 capítulos (hasta la fecha), y el cual es muy extenso).

Código:

Param (
  [Parameter(Mandatory=$True)]
  [string]$manga,
  [int]$fromChapter=1,
  [int]$toChapter=1000,
  [switch]$invalidateCache,
  [switch]$onlyTest
)

$ext = ".html"
$cache_path = "$pwd\tmp_$manga$ext"

if(-not $invalidateCache){
  $invalidateCache = (-not (Test-Path $cache_path))
}

#Write-Host "$fromChapter ------ $toChapter"

$r = [regex]"submanga.com/$manga/\d+/[0-9]+"

$client = New-Object System.Net.WebClient

# Bajo la página principal
if($invalidateCache){
  Write-Host "Bajando página principal"
  Remove-Item $cache_path 2> Out-Null
  $client.DownloadFile("http://submanga.com/$manga/completa", $cache_path)
}
$file = Get-Content $cache_path

# Nos quedamos con los capítulos que nos interesan
$all_matches = $r.Matches($file) | `
              ForEach { $_.Captures[0].value } |`
              Where-Object {
                [int]$_.Split("/")[2] -ge [int]$fromChapter -and
                [int]$_.Split("/")[2] -le [int]$toChapter
              }

$all_matches = ($all_matches | Sort -desc { [int]$_.Split("/")[2]})

if($onlyTest){
  Write-Host Last Chapters:
  # mostrar los últimos 10 nomás.
  $i = 0
  $all_matches | ForEach {
    Write-Host "  Chapter:"  $_.Split("/")[2]
    $i++
    if($i -gt 9){
      exit
    }
  }
  exit
}

$ext = ".jpg"
$all_matches | ForEach {
  Sleep 4
  $chapter = $_.Split("/")[2]
  $flag = $_.Split("/")[3]
  Write-Host "Descargando $_"
  $client.DownloadFile("http://$_", "$pwd/tmp$chapter")
  $chapter_content = [String]::Join(" ", (Get-Content tmp$chapter))
  if($chapter_content -match "submanga.com/.{1,3}/$flag"){
    $url = "http://" + $matches[0]
    Write-Host "Encontrado comic $url"
    del tmp$chapter
    $client.DownloadFile($url, "$pwd/tmp_$chapter")
    $chapter_content = [String]::Join(" ", (Get-Content tmp_$chapter))
    del tmp_$chapter
    if($chapter_content -match 'http://[iomg]{3}\.submanga.com/.+1\.jpg'){
      $img_url = $matches[0].Replace("1.jpg", "")
      Write-Host "Encontrada primera página $img_url"
      md $chapter
      $is_ok = 1
      $i = 1;
      Write-Host -noNewLine "Descargando página: "
      while($is_ok -eq 1){
        Write-Host -noNewLine $i-
        $file_name = "$i$ext"
        if($i -lt 10){
          $file_name = "0$file_name"
        }
        try{

          $client.DownloadFile("$img_url/$i$ext", "$pwd/$chapter/$file_name")
          $i++;
        }catch { $is_ok = 0; Write-Host "[FIN]"}
      }
    }
  }
}

Realmente con la organización del código estoy bastante desconforme, pero el funcionamiento es muy lindo y el API de uso mucho mejor. Más allá de que lo... usé (y lo usaré), el objetivo final en realidad era aprender y ver qué es lo que tiene windows para ofrecer a un administrador de sistemas, gracias a ésto estoy empezando a entender el funcionamiento de powershell y la mecánica de uso, muy entretenida... pero está a años luz de lo que un sistema *NIX tiene para ofrecer con sus consolas en interfaces gráficas (alguien mencionó konsole?)

Viewing all articles
Browse latest Browse all 11602

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>