суббота, 29 января 2011 г.

Блокировщик сайтов для Хрома

Сегодня мы с вами будем писать блокировщик сайтов для Хрома. Как известно, нужен он в том случае, если вы или кто-то ещё, не хотят знакомится с содержимым сайта. Это может быть по разным причинам. Например во время рабочего дня, нет времени заходить на сайты различных социальный сетей и при попытки нарушить данный запрет, программа будет перебрасывать нас например на сайт www.google.ru. Ну и конечно, данная программа будет полезна при блокировки контента эротического содержания, который нежелателен для просмотра детям.
Теперь разбирёмся с регламентом. Логичнее всего, данную идею оформить в виде расширения для Google Chrome. Но, как мне кажется, и на C++, программа будет выглядеть тоже достойно. А расширение мы ещё напишем. Если говорить о внешнем виде, то лично я буду писать консольное приложение, а кому надо, могут прикрутить GUI, ну и дописать ещё что-нибудь. Ведь наша цель больше образовательная и не претендует на полноценное решение.
Ну пора начинать. Создаём новый файл в Visual Studio и после этого, думаем что будем писать. Очевидно, что сначала надо получить дескриптор окна, который принадлежит Хрому, потом получить данные которые находятся в URL и если этот адрес находится в чёрном списке, то переходим на www.google.ru. Всё это выглядит примерно так:

Листинг 1.1

#include < windows.h >
#include < tchar.h >

#pragma comment(lib, "user32.lib")

const TCHAR wqq[] = L"www.google.ru";
BOOL __stdcall GetChromeEditText(HWND hWnd,LPARAM)
{
char szbuff[500];
if( GetWindowTextA(hWnd, szbuff, sizeof(szbuff)/sizeof(szbuff[0]))!= 0 ) //Получаем адрес
{
if(!strstr(szbuff,"Chrome")) //Если там нет слова Chrome, то выходим
false;
HWND hw = FindWindowExA(hWnd,NULL,"Chrome_AutocompleteEditView",NULL); //Ищем дескриптор //адресной строки
if(hw != NULL) //Если дескриптор найден
{
TCHAR buff[1000];
char szdisplay[1000];
SendMessage(hw,WM_GETTEXT,100,(LPARAM)buff); //считываем URL
wcstombs(szdisplay,buff,lstrlen(buff)); //приводим его к виду
if(strstr(szdisplay,"sex")) //если он содержит слово
{
//то посылаем текст Google
SendMessage(hw,WM_SETTEXT,100,(LPARAM)wqq);
//нажимаем Enter
PostMessage(hw, WM_KEYDOWN, VK_RETURN, VK_RETURN);
}
}
}
return true;
}

void main() {EnumWindows(GetChromeEditText,0);}

Тут надо сделать несколько пояснений. Наверное сразу у многих появился вопрос: Откуда взялся “Chrome_AutocompleteEditView”? Имя этого класса, удалось получить с помощью утилиты Spy++. Далее, у нас блокируется только одно слово, а если мы хотим несколько? Для этого, поместим все ненужные нам слова в отдельный массив и при проверки, с помощью цикла, будем проверять соответствия. То есть сделаем как-то так:

Листинг 1.2

const int len = 2;
const char* badwords[len] = {"sex","porno"};

…..
for(int i = 0;i if(strstr(szdisplay,badwords[i])) //Это у нас уже было
{
SendMessage(hw,WM_SETTEXT,100,(LPARAM)wqq);
PostMessage(hw, WM_KEYDOWN, VK_RETURN, VK_RETURN);
PostMessage(hw, WM_KEYUP, 0, VK_RETURN);
}

….......

И в завершении, надо сделать чтобы программа работала всегда и реагировала на изменения в в адресной строке браузера. Это можно сделать через хуки, но я оформлю это просто как бесконечный цикл.

void main() {
while(1)
{
Sleep(1000);
EnumWindows(GetChromeEditText,0);
}

}

Вы можете всё доработать и переработать по своему вкусу.
Мы рассмотрели способ доступа к адресной строки браузера Google Chrome. Аналогично, тоже самое можно сделать и для других браузеров, но это уже на ваш выбор. А пока, удачи во всех ваших начинаниях!

Комментариев нет:

Отправить комментарий