Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Domowy sposób na Diodę

Konkurs z diodą to konkurs z diodą, nie tylko wiedza ale i czas udzielenia odpowiedzi się liczy. Wcześniej powstał na blogu wpis o powiadomieniach SMS gdy dioda się uaktywni, działa to różnie i już kilka razy mnie zawiodło, a dziś odrobiło zaległości przysyłając mi 3 smsy z rzędu. Więc postanowiłem coś z tym zrobić...

Dioda od środka

Głównym założeniem mojego projektu było: znaleźć sposób aby określić kiedy dioda jest włączona a kiedy nie, następnie powiadomić o tym.

Jednak zostałem (nie ukrywam - pozytywnie) zaskoczony tym, że klikając najnormalniej w świecie prawym na diodę, następnie "Zbadaj element", nie da się jednoznacznie określić jaki jest aktualnie stan diody, img src zawsze wskazuje na "dioda-off.png". Tak więc wniosek - jakoś to przecież musi być zrobione, że na moim komputerze ta dioda świeci. Spróbowałem zapisać stronę przez Chrome, następnie próbowałem ją otworzyć i dioda nie działała. Przejrzałem dosłownie wszystkie skrypty jakie zapisały się razem z nią, nawet te z xenium, całe style css, wszystkie obrazki zawarte w nich. Próbowałem też zapisać stronę przez IE, ale efekt był podobny (tylko kod poukładany).

r   e   k   l   a   m   a

Więc zabrałem się za przeglądanie pliku źródłowego samej strony, w IE w narzędziach deweloperskich. Po pewnym czasie znalazłem bardzo fajny odcinek kodu który mnie zaciekawił, mianowicie:

<STYLE type="text/css">.top_3 span ~ a:after { content: " "; background-image:url(/8jgdwkfposl.png); width:35px; height:36px; display:block; }</STYLE>

Stwierdziłem, że wypadało by zobaczyć jaki obrazek kryje się pod tą tajemniczą nazwą. Okazało się, że to dioda, na dodatek włączona :) Nazwa wydawała się losowa więc kilka razy poodświeżałem stronę i za każdym razem plik miał inną nazwę.

Tu Cię mam..

Już wiem gdzie kryje się dioda, więc odpalam Visual Studio 2010 i robię nowy projekt C#, konsolowy, który będzie tą diodę bacznie obserwował. Najpierw trzeba wymyślić w jaki sposób ten biedny podglądacz ma tą diodę śledzić. Na myśl przyszło mi kilka opcji z czego najbardziej mi odpowiadającą było wyszukanie kodu diody we zwracanym przez stronę pliku html i jego odpowiednie przetworzenie.

Jak to zrobić? Moim ulubionym sposobem! Na stringach! Od zawsze lubiłem te użeranie się ze stringami, plikami tekstowymi itp. więc przyszło mi to prościej niż mogło by się zdawać :) Tak więc nasz szpieg pobiera pierw stronę dzięki komponentowi HttpWebResponse, a potem zapisuje ją do StringBuildera. Następnie szuka ciągu znaków

<div id=\"header\"><style type=\"text/css\">.top_3 span ~ a:after { content: \" \"; background-image:url(

i zapisuje położenie ich początku w zmiennej. Następnie wycina powyższy fragment dodając do niego jeszcze z 20 znaków, aby nazwa pliku diody która natychmiast po nim występuje była również zaliczona.
Plik diody zaczyna się od znaku "/" więc szukamy ostatniego wystąpienia tego znaku w wyciętym fragmencie i odcinamy wszystko co jest wcześniej. Plik diody koczy się znakami ");" więc szukamy ich i odcinamy wszystko co jest za nimi. Tym sposobem mamy aktualną nazwę pliku diody :)

Następnie diodę trzeba pobrać. Używamy tego samego elementy HttpWebResponse, tylko jako adres używamy ścieżki do pliku diody, a następnie zapisujemy odpowiedź w pliku png. Taki plik może być mierzony na wiele sposobów, ja wybrałem metodę która określa jaka to dioda za pomocą rozmiaru pliku. Dioda włączona jest o wiele większa od diody wyłączonej - i tu Cię mam :)

Dioda włączona:

Dioda wyłączona:

Domowe sposoby dla wszystkich

Napisałem program, sam nie jestem w tej całej diodzie za dobry, więc podzielę się z Wami. Najpierw kod, aby było grzecznie:


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;

namespace busy_dane
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                string URL = "http://www.dobreprogramy.pl/";
                System.Uri MainURL = new System.Uri(URL);
                Console.WriteLine("GATHERING DIODA DATA");
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(MainURL);

                request.KeepAlive = false;
                request.Method = "GET";

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                StringBuilder dane = new StringBuilder();
                System.IO.Stream files = response.GetResponseStream();

                int iStrmByte;
                StringBuilder str = new StringBuilder();
                while ((iStrmByte = files.ReadByte()) != -1)
                {

                    str.Append((char)Convert.ToByte(iStrmByte));

                }
                int index = str.ToString().IndexOf("<div id=\"header\"><style type=\"text/css\">.top_3 span ~ a:after { content: \" \"; background-image:url(");
                string filename = "";
                if (index != -1)
                {
                    string partof = str.ToString().Substring(index, 135);
                    index = partof.LastIndexOf("/");
                    partof = partof.Substring(index + 1);
                    index = partof.IndexOf(");");
                    filename = partof.Substring(0, index);
                    Console.WriteLine("DIODA FILE NAME:      " + filename);
                    Console.WriteLine("DIODA FILE NAMELENGTH:" + filename.Length.ToString());
                }
                if (filename.Length > 0)
                {
                    MainURL = new System.Uri(URL + filename);
                    Console.WriteLine("GATHERING DIODA FILE");
                    request = (HttpWebRequest)HttpWebRequest.Create(MainURL);

                    request.KeepAlive = false;
                    request.Method = "GET";

                    response = (HttpWebResponse)request.GetResponse();

                    files = response.GetResponseStream();
                    System.IO.FileStream strmFile = System.IO.File.Create("dioda.png");

                    iStrmByte = 0;
                    int bytes = 0;
                    byte average = 00;
                    while ((iStrmByte = files.ReadByte()) != -1)
                    {
                        bytes++;
                        strmFile.WriteByte(Convert.ToByte(iStrmByte));
                        average = (byte)(((int)average + (int)Convert.ToByte(iStrmByte)) / 2);

                    }
                    strmFile.Close();
                    Console.WriteLine("DIODA FILE SIZE         :" + bytes + " BYTES");
                    Console.WriteLine("DIODA AVERAGE BYTE VALUE:" + average);
                    if (bytes > 2300 && bytes < 3000 && average > 105 && average < 120)
                    {
                        Console.WriteLine("\r\n>>>> DIODA IS ACTIVE <<<<\r\n");
                        System.Diagnostics.Process.Start("http://konkurs.dobreprogramy.pl/Autoryzacja.html");
                        break;
                    }
                    else Console.WriteLine("\r\nDIODA IS NOT ACTIVE\r\n");
                }
                else
                {
                    Console.WriteLine("CAN'T FIND DIODA");
                }
                Console.WriteLine("END");
                System.Threading.Thread.Sleep(1000);
                Console.Clear();
            }
        }
    }
}

A teraz link do programu: http://luby.acech24.pl/files/dioda.exe

Program automatycznie co 1 sekundę sprawdza czy dioda się oświeciła, jeśli tak, natychmiast otwiera domyślną przeglądarkę na stronie autoryzacji do pytania, a sam zamyka się :) Idealne po dostaniu Alertu konkursowego :)

Powodzenia! 

windows oprogramowanie internet

Komentarze