Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TextBox1.Text = AdflyUrlDecode("http://adf.ly/1NfMkS")
End Sub
' Return: https://itunes.apple.com/us/app/game-of-thrones-ascent/id799145075
' ***********************************************************************
' Author : fudmario
' Created : 09-15-2015
'
' Last Modified By : fudmario
' Last Modified On : 09-16-2015
' ***********************************************************************
' <copyright file="Adfly_Decode.vb" company="fudmarioDev">
' Copyright (c) fudmarioDev. All rights reserved.
' </copyright>
' <summary></summary>
' ***********************************************************************
Imports System.IO
Imports System.Net
Imports System.Text
Module AdflyDecode
''' <summary>
''' Decodifica una Url de Adf.ly.
''' </summary>
''' <param name="url">URL a decodificar.</param>
''' <returns>Retorna la Url Decodificada.</returns>
Public Function AdflyUrlDecode(url As String) As String
Try
Dim sb As New StringBuilder
Dim data As String = GetSource(url:=url)
Dim rt As String() = {"ysmm = '", "'"c}
Dim a As Integer = data.IndexOf(rt(0), StringComparison.Ordinal) + rt(0).Length + 1
Dim b As Integer = data.Substring(a).IndexOf(rt(1), StringComparison.Ordinal) + 1
Dim s As String = Mid(data, a, b)
For i = 0 To s.Length - 1 Step 2
sb.Append(s(i))
Next
For k = s.Length - 1 To 0 Step -2
sb.Append(s(k))
Next
Return Encoding.ASCII.GetString(Convert.FromBase64String(sb.ToString())).Substring(2)
Catch ex As Exception
Return String.Empty
End Try
End Function
''' <summary>
''' Obtiene el Código Fuente de una Url.
''' </summary>
''' <param name="url">Url.</param>
''' <returns>Retorna el código fuente de una Url.</returns>
Private Function GetSource(url As String) As String
Try
Return New StreamReader(WebRequest.Create(url).GetResponse().GetResponseStream()).ReadToEnd()
Catch ex As Exception
Return String.Empty
End Try
End Function
End Module
Hola estoy tratando de entender este codigo para tratar de traducirlo a Delphi :
For i = 0 To s.Length - 1 Step 2
sb.Append(s(i))
Next
For k = s.Length - 1 To 0 Step -2
sb.Append(s(k))
Next
Mi pregunta es , ¿ que trata de hacer el autor en ese codigo ? ¿ leer al reves la variable "sb" ? ¿ para que sirve step ?
Otra parte es :
Return Encoding.ASCII.GetString(Convert.FromBase64String(sb.ToString())).Substring(2)
¿ Para que sirve Encoding.ASCII.GetString ? ¿ Para decodificar un ASCII a texto normal ? ¿ Que hace SubString(2) en la variable ?
Solo son esas dudas espero no molestar.
Que es lo que hace esta funcion es:
Primero descarga el codigo fuente de una url y lo almacena en la variable "data"
Luego obtiene el valor que esta entre "ysmm = '" y "'"
por ejemplo si fuese el resultado asi: "HoOmLoAc"
recorremos cada letra saltando de 2 en dos comenzado con la H,O,L,A
y luego lo hacemos de manera inversa comenzamos del final hasta la penultima letra c,o,m,o
y luego el resultado es H,O,L,A,c,o,m,o->HOLAcomo
y luego lo decodificamos en base64 (el resultado real que obtenemos será de la forma 64http://sitiooriginal.com/blal.html )
omitimos las 2 primeras letras y Listo URL Decodificada.
Ahora respecto a tus dudas:
Al principio Inicializamos una nueva instancia de la clase System.Text.StringBuilder.
Dim sb as New StringBuilder
Con el For recorremos cada letra desde 0 hasta la longitud de la cadena que obtuvimos aumentado de dos en dos.
y con el sb.Append(s(i)) lo que hace es: Anexar a sb la representación en forma de cadena del carácter Unicode especificado.
tomando el ejemplo anterior: comienza con H luego le anexa la siguiente que seria O es decir HO->HOL y asi sucesivamente hasta llegar a :"HOLA"
y luego lo hacemos de manera inversa del final a el inicio primero "c" luego "co"->"com"->"como" seguimos anexando a la misma instancia que inicializamos.
con respecto a : Encoding.ASCII.GetString(bytes() As Byte), que mejor que la definicion que nos da:
' Resumen:
' Cuando se reemplaza en una clase derivada, descodifica todos los bytes de la
' matriz de bytes especificada en una cadena.
'
' Parámetros:
' bytes:
' Matriz de bytes que contiene la secuencia de bytes que se va a descodificar(en este caso la que obtendremos de Convert.FromBase64String(sb.ToString())).
'
' Devuelve:
' Cadena que contiene el resultado de la descodificación de la secuencia de bytes
' especificada.
Y Substring(2)
Lo que hace es empezar en una posición de caracteres especificada(en este caso 2, será la Posición inicial.) y continúa hasta el final de la cadena.
te agradezo la explicacion Fudmario , espero tener tiempo para hacer esta traduccion aunque ahora estoy examenes.
Saludos y gracias por responder.
buenas, gracias por el aporte y por la explicación , nunca hubiera adivinado que las letras estaban entrelazadas pares e impares y codificada en base64... eres una maquina!! Saludos y gracias por ayudar a los que empezamos!!
Me gustó, gracias por compartirlo y por tu explicación. Como soy nuevo me puse a buscar en internet y tambien me tope con el mismo script pero en lenguaje PHP, aqui se los comparto.
<?php
function request( $url ) {
$ua = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1712.4 Safari/537.36';
if ( !preg_match( '/^[a-zA-Z0-9\/]+$/', $url ) )
return false;
$ch = curl_init();
curl_setopt_array( $ch, array(
CURLOPT_FAILONERROR => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_USERAGENT => $ua,
CURLOPT_URL => 'http://adf.ly/' . $url
) );
$data = curl_exec( $ch );
curl_close( $ch );
if ( preg_match( "#var ysmm = '([a-zA-Z0-9+/=]+)'#", $data, $matches ) ) {
$final = $url = decode( $matches[1] );
// check for redirects
$ch = curl_init();
curl_setopt_array( $ch, array(
CURLOPT_FAILONERROR => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
CURLOPT_NOBODY => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_USERAGENT => $ua,
CURLOPT_URL => $url
) );
$data = curl_exec( $ch );
if ( preg_match_all( '/Location:\s*(.+)\s*$/im', $data, $matches, PREG_SET_ORDER ) ) {
$last = array_pop( $matches );
$final = trim( $last[1] );
}
return array( $url, $final );
}
return false;
}
function decode( $ysmm ) {
$left = '';
$right = '';
for ( $i = 0; $i < strlen( $ysmm ); $i++ ) {
if ( $i % 2 == 0 ) {
$left .= $ysmm[$i];
} else {
$right = $ysmm[$i] . $right;
}
}
return substr( base64_decode( $left . $right ), 2 );
}
if ( isset( $_GET['url'] ) && $_GET['url'] ) {
// strip out beginning (everything up to last slash)
$stripped = '';
$slashes = explode( '/', $_GET['url'] );
$stripped = array_pop( $slashes );
list( $url, $final ) = request( $stripped );
if ( $url ) {
echo '<p>Your URL is <a href="' . $url . '">' . $url . '</a>';
if ( $url != $final ) {
echo ' (<a href="' . $final . '">' . $final . '</a>)';
}
echo '</p>';
} else {
// try 2 parts
$stripped = array_pop( $slashes ) . '/' . $stripped;
list( $url, $final ) = request( $stripped );
if ( $url ) {
echo '<p>Your URL is <a href="' . $url . '">' . $url . '</a>';
if ( $url != $final ) {
echo ' (<a href="' . $final . '">' . $final . '</a>)';
}
echo '</p>';
} else {
echo '<p>Adf.ly URL not found</p>';
}
}
}
?>
Fuente: Skizzerz (http://skizzerz.net/scripts/adfly.php)
Saludos :)