Hola compañeros bueno les comento que hace unos meses se me ocurrió la idea de crear alguna aplicación que bloqueara paginas web. Estuve investigando un poco y encontré el poderoso Archivo Hosts al principio no sabia en realidad en que lenguaje programar la aplicación ya que hay una gran gama de estos (Java , C# , JavaScript ,Vb.net , etc.) pero finalmente me decidí por crear la aplicación en .Net (C# y Vb.net). Pero primero me gustaría comentarles como funciona el archivo hosts es solo un pequeño archivo de texto que Windows utiliza como un servidor DNS en nuestra PC, cualquier petición de una dirección URL que se introduzca en el navegador, Windows comprobará primero si existe alguna referencia a ella en el archivo hosts, si es asi utilizará la dirección IP registrada en el para realizar la conexión. El archivo hosts se encuentra en la siguiente ruta en todos los equipos:
C:\Windows\System32\drivers\etcTodas las líneas que comienzan con el carácter # son solo comentarios. En la última fila, la combinación de números en la primera columna es la dirección IP donde Windows buscará el dominio. Para impedir el acceso a una página web, solo es necesario incluir en el archivo host una dirección IP que no le corresponda o preferentemente no sea válida, es decir que no conduzca a ningún lado. Por ejemplo para impedir el acceso a la página de ejemplo: http://sitio.com/pagina.htm puedes usar la IP 127.0.0.1 que es la del equipo local o la que se muestra en este caso que es una dirección IP inválida:
Ahora empezando un poco con la programación
Primer paso creamos nuestro algorimo
- Ubicamos la ruta C:\WINDOWS\system32\drivers\etc
- Abrimos el archive llamado hosts
- Escribir la url de la pagina web
- Cerrar el archivo
Agregar permisos de administrador
Debemos de tomar en cuenta que el archivo hosts es un archivo protedigo es por esto que debemos de modificar nuestra aplicación para esto debemos de hacer los siguiente pasos
- Abrir el explorador de soluciones
- Dar click derecho y escojer la opción agregar componente
- Escojemos la opción que dice archivo mainifiesto
Nos saldra el app.manifiest como el de la siguiente imagen
lo unico que tenemos que cambiar es el requestedExecutionLevel level="asInvoker" uiAccess="false"
por esto
requestedExecutionLevel level="requireAdministrator" uiAccess="false"
Lo unico que hacemos es que nuestra app corra con permisosde administrador
Tercer paso“Crear una clase”
Como segundo paso vamos a crear una clase llamada EdicionArchivo.cs ( C#) ó EdicionArchivo.vb (Vb.net) esta clase básicamente tendrá tres procedimientos
EscribirPagina Este procedimiento toma como parámetro un string llamado PaginaWeb donde insertaremos la url de la pagina web que queremos bloquear, como podemos ver hacemos uso del namespace system.io para poder tener acceso al archivo
LeerArchivo Este procedimiento toma como parámetro una variable de tipo object llamadamilistadespués dentro de este procedimiento hacemos un cast para convertilo en un objeto de tipo listbox declaramos una variable llamada myarray y utilizamos el método File.ReadAllLines(Básicamente lo que hace es abrir un archivo de texto, lee todas sus líneas, las introduce en una matriz de cadenas) ; sin embargo no queremos leer todas las líneas del archivo es por esto que hacemos uso de linq para hacer nuestra query.Despues de crear la query convertimos los resultados obtenidos en un array y con un ciclo for llenamos el listbox con cada elemento del array
BorrarPagina Este procedimiento vuelve a tomar como parámetro un string llamado PaginaWeb igual como mencioné anteriormente es donde inserteremos la url de la pagina web también volvemos hacer uso del método File.ReadAllLines lo único nuevo es que utilizamos es el procedimiento remplace y el método WriteAllText que lo que hace es escribir una cadena especificada en archivo y, a continuación, lo cierra. Si el archivo de destino ya existe, se sobrescribe. y en el método remplace lo que hacemos es “remplazar” el string obtenido de la url y remplazarlo por Nada
[C#]
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Diagnostics; using System.Collections; using System.Windows.Forms; namespace ArchivoHost { public class EdicionArchivo { //variable globla en la cual obtengo acesso al archivo hosts private String rutaArchivo=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "drivers/etc/hosts"); //Procedimiento en el cual escribiremos dentro del archivo hosts public void EscribirPagina(String PaginaWeb) { using(StreamWriter Miwriter =File.AppendText(rutaArchivo)) { Miwriter.WriteLine(String.Format("127.0.0.1\t {0}",PaginaWeb)); Miwriter.Close(); } //Mandamos un msgbox para ver si el usuario quiere ver el archivo if(MessageBox.Show("Desea abir el archivo ahora?","",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes) Process.Start(rutaArchivo);//abro el archivo host } public void LeerArchivo(Object milista) { ListBox lista = (ListBox)milista;//Hago el cast de mi objeto a un listbox var miarray = File.ReadAllLines(rutaArchivo).Where(m => m.StartsWith("127.0.0.1")).ToArray();//Hago una consulta con linq y la convierto en un array for (int j = 0; j < miarray.Length; j++) { lista.Items.Add(miarray[j]);//Lleno mi lista con cada elemento de mi array } } public void BorrarPagina(String PaginaWeb) { String strFile = File.ReadAllText(rutaArchivo);//Obtengo todo el texto del archivo strFile = strFile.Replace(PaginaWeb,String.Empty);//Remplazo el string obtenido osea la pagina web File.WriteAllText(rutaArchivo, strFile);// Vuelvo a escribir el archivo MessageBox.Show("Pagina web desbloqueada exitosamente");//enviamos mensaje de confirmacion } } }
[VB.NET]
Imports System.Linq Imports System.IO Public Class EdicionArchivovb '//variable globla en la cual obtengo acesso al archivo hosts Private rutaArchivo As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "drivers/etc/hosts") ' //Procedimiento en el cual escribiremos dentro del archivo hosts Public Sub EscribirPagina(ByVal PaginaWeb As String) Using Miwriter As StreamWriter = File.AppendText(rutaArchivo) Miwriter.WriteLine(String.Format("127.0.0.1{0} {1}", vbTab, PaginaWeb)) Miwriter.Close() End Using '//Mandamos un msgbox para ver si el usuario quiere ver el archivo If (MessageBox.Show("Desea abir el archivo ahora?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes) Then Process.Start(rutaArchivo) '//abro el archivo host End If End Sub Public Sub LeerArchivo(ByVal milista As Object) Dim lista As ListBox = DirectCast(milista, ListBox) 'Hago el cast de mi objeto a un listbox Dim miarray = File.ReadAllLines(rutaArchivo).Where(Function(m) m.StartsWith("127.0.0.1")).ToArray() 'Hago una consulta con linq y la convierto en un array For j As Integer = 0 To miarray.Length - 1 'Lleno mi lista con cada elemento de mi array lista.Items.Add(miarray(j)) Next End Sub Public Sub BorrarPagina(ByVal PaginaWeb As String) Dim strFile As [String] = File.ReadAllText(rutaArchivo) 'Obtengo todo el texto del archivo strFile = strFile.Replace(PaginaWeb, [String].Empty) 'Remplazo el string obtenido osea la pagina web File.WriteAllText(rutaArchivo, strFile) ' Vuelvo a escribir el archivo MessageBox.Show("Pagina web desbloqueada exitosamente") 'enviamos mensaje de confirmacion End Sub End Class
Crear un formulario para ver los resultados
Bueno ahora lo que necesitamos es construir nuestro formulario el cual contendrá los siguientes objetos:
- Un textbox que nos servirá para poner el url de las paginas web
- Dos botones uno sera para bloquear paginas y el otro para desbloquearlas
- Un listbox para llenarlo con el texto que esta en el archivo hosts
Nuestro formulario debe quedar algo así como el de la siguiente imagen
Lo que necesitamos ahora es declarar un par de variables gloables en la clase de nuestro formulario
[C#]
private EdicionArchivo miedicion = new EdicionArchivo();//Declaro y hago instancia a mi clase private String PaginaWeb;//Variable que se utilizará para obtener el texto de mi textbox private ErrorProvider Mierror = new ErrorProvider();//Control que servirá para el control de errores
[VB.NET]
Private miedicion As New EdicionArchivovb() '//Declaro y hago instancia a mi clase Private PaginaWeb As String '//Variable que se utilizará para obtener el texto de mi textbox Private Mierror As New ErrorProvider() '//Control que servirá para el control de errores
En el evento load de nuesto formulario hacemos referencia a nuestro procedimiento llamado LeerArchivo
[C#]
private void Form1_Load(object sender, EventArgs e) { miedicion.LeerArchivo(listBox1);//LLamamos al procedimientyo de mi clase }
[VB.NET]
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load miedicion.LeerArchivo(ListBox1) End Sub
Ahora por ultimo lo que necesitamos hacer controlar el evento click de nuestro boton
-
En el boton llamado Bloquear debemos de verificar si la url esrita es correcta , se que no es el mejor procedimiento pero lo que yo hice es recorrer cada caracter de mi variable y verificar si tiene las "3 w" si es así procedemos a llamar a nuestro procedimiento que se llama EscribirPagina
-
En el boton llamdo desbloquear lo que debemos verificar es que este seleccionado un item de nuestro listbox , de caso contrario mandara un msgbox advirtiendo que no ha seleccionado ningún elemento, si esta seleccionado un item de nuestro listbox llamamos a nuestro procedimiento BorrarPagina
[C#]
private void btnBloquear_Click(object sender, EventArgs e) { PaginaWeb = textpagina.Text; if (!String.IsNullOrEmpty(PaginaWeb))//Verifico que mi string no este vacio { int cont = 0; for (int j = 0; j < PaginaWeb.Length; j++)//Recorremos cada uno de los caracteres de mi string y verifico si contiene la letra 'w' { if (PaginaWeb[j] == 'w') cont++; } //Si el contador es igual a 3 , es decir www if (cont >= 3) { miedicion.EscribirPagina(PaginaWeb); listBox1.Items.Clear(); miedicion.LeerArchivo(listBox1); } else Mierror.SetError(textpagina, "URL NO VALIDA :("); } } private void BtnDesbloquear_Click(object sender, EventArgs e) { if (listBox1.SelectedIndex != -1)//Verificamos que el usuario haya seleccionado un elemento de mi listbox { miedicion.BorrarPagina(listBox1.SelectedItem.ToString()); listBox1.Items.Clear();//Limpio los elementos contenidos en el listbox para proceder actualizarlos miedicion.LeerArchivo(listBox1);//Llamamos a mi procedimiento para volver a llenar la lista } else //De caso contrario si no ha seleccionado ningun elemento MessageBox.Show("Seleccione un elemento de la lista por favor", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); }
[VB.NET]
Private Sub btnBloquear_Click(sender As System.Object, e As System.EventArgs) Handles btnBloquear.Click PaginaWeb = textpagina.Text If (Not String.IsNullOrEmpty(PaginaWeb)) Then '//Verifico que mi string no este vacio Dim cont As Integer = 0 For j As Integer = 0 To PaginaWeb.Length - 1 'Recorremos cada uno de los caracteres de mi string y verifico si contiene la letra 'w' If PaginaWeb(j) = "w"c Then cont += 1 End If Next ' //Si el contador es igual a 3 , es decir www If (cont >= 3) Then miedicion.EscribirPagina(PaginaWeb) ListBox1.Items.Clear() miedicion.LeerArchivo(ListBox1) Else Mierror.SetError(textpagina, "URL NO VALIDA :(") End If End If End Sub Private Sub BtnDesbloquear_Click(sender As System.Object, e As System.EventArgs) Handles BtnDesbloquear.Click If ListBox1.SelectedIndex <> -1 Then 'Verificamos que el usuario haya seleccionado un elemento de mi listbox miedicion.BorrarPagina(ListBox1.SelectedItem.ToString()) ListBox1.Items.Clear() 'Limpio los elementos contenidos en el listbox para proceder actualizarlos 'Llamamos a mi procedimiento para volver a llenar la lista miedicion.LeerArchivo(ListBox1) Else 'De caso contrario si no ha seleccionado ningun elemento MessageBox.Show("Seleccione un elemento de la lista por favor", "", MessageBoxButtons.OK, MessageBoxIcon.Warning) End If End Sub
Les dejo unas capturas de pantalla de la aplicación
Desbloqueando pagina web
Bloqueando pagina web
Descarga las soluciones!!Espero que les haya gustadó espero sus comentarios gracias
Agradecerte por compartir tu conocimiento. No he utilizado tu código pero estoy casi seguro que funcionará gracias a las buenas explicaciones que has dejado.
ResponderEliminar