Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: kzv Россия  
Дата: 05.07.11 09:10
Оценка:
Доброго времени суток уважаемые.
Хочу сделать для IE аддон — аналог адблок плюс для фаерфокса.
Покопался в гугле — вроде путь такой: писать bho в котором будет перехватываться mime application/x-shockwave-flash

Сказано — сделано, перехватчик работает, но не могу теперь понять: как получить какой-нибудь DOM интерфейс перехваченного элемента (

Вобщем проблема: есть эстеншен для IE такого вида:


class CMyMimeFilter :
    public IInternetProtocol,
    public IInternetProtocolSink


В нем вызывается метод:


STDMETHODIMP CMyMimeFilter::Start(
            LPCWSTR szUrl,
            IInternetProtocolSink *pIProtSink,
            IInternetBindInfo *pIBindInfo,
            DWORD grfSTI,
            DWORD dwReserved)
{
  CComPtr<IHTMLDOMNode> pNode;
  pIBindInfo->QueryInterface(IID_IHTMLDOMNode, &pNode) <--- это естественно не работает.., а очень надо :(
}
Re: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: boot  
Дата: 09.07.11 16:47
Оценка:
Здравствуйте, kzv, Вы писали:

kzv>Доброго времени суток уважаемые.

kzv>Хочу сделать для IE аддон — аналог адблок плюс для фаерфокса.
kzv>Покопался в гугле — вроде путь такой: писать bho в котором будет перехватываться mime application/x-shockwave-flash

kzv>Сказано — сделано, перехватчик работает, но не могу теперь понять: как получить какой-нибудь DOM интерфейс перехваченного элемента (


kzv>Вобщем проблема: есть эстеншен для IE такого вида:



kzv>
kzv>class CMyMimeFilter :
kzv>    public IInternetProtocol,
kzv>    public IInternetProtocolSink

kzv>


kzv>В нем вызывается метод:



kzv>
kzv>STDMETHODIMP CMyMimeFilter::Start(
kzv>            LPCWSTR szUrl,
kzv>            IInternetProtocolSink *pIProtSink,
kzv>            IInternetBindInfo *pIBindInfo,
kzv>            DWORD grfSTI,
kzv>            DWORD dwReserved)
kzv>{
kzv>  CComPtr<IHTMLDOMNode> pNode;
kzv>  pIBindInfo->QueryInterface(IID_IHTMLDOMNode, &pNode) <--- это естественно не работает.., а очень надо :(
kzv>}
kzv>


Может стоит начать отсюда отсюда
Автор(ы): Борис Гулай aka BoresExpress
Дата: 23.01.2002
?
Жизнеспособность прямо пропорциональна простоте!
Re[2]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: Аноним  
Дата: 10.07.11 08:35
Оценка:
Здравствуйте, boot, Вы писали:

B>Может стоит начать отсюда отсюда
Автор(ы): Борис Гулай aka BoresExpress
Дата: 23.01.2002
?


Проблема в том, что мне нужно не начинать, а заканчивать
А начинал я отсюда: http://msdn.microsoft.com/en-us/library/aa767916%28v=VS.85%29.aspx
Re[3]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: boot  
Дата: 10.07.11 09:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Проблема в том, что мне нужно не начинать, а заканчивать

А>А начинал я отсюда: http://msdn.microsoft.com/en-us/library/aa767916%28v=VS.85%29.aspx

По поводу BHO пока ничего сказать не могу, но подкину две мысли для размышлений.
1. Если есть доступ к "телу" загружаемой страницы, может взять да и вырезать рекламу прямо там?
2. Если получится добраться до этого метода, будет Вам счастье.
Жизнеспособность прямо пропорциональна простоте!
Re[4]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: Аноним  
Дата: 10.07.11 14:27
Оценка:
Здравствуйте, boot, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Проблема в том, что мне нужно не начинать, а заканчивать

А>>А начинал я отсюда: http://msdn.microsoft.com/en-us/library/aa767916%28v=VS.85%29.aspx

B>По поводу BHO пока ничего сказать не могу, но подкину две мысли для размышлений.

B>1. Если есть доступ к "телу" загружаемой страницы, может взять да и вырезать рекламу прямо там?
B>2. Если получится добраться до этого метода, будет Вам счастье.

Доступ к элементам страницы есть, но это не помогает.
Например в ютубе перед загрузкой ролика бывает идет реклама. У плеера, рекламы и ролика — разные урлы.
Я хочу чтобы над элементом рисовалась кнопка "блокировать", нажимая на которую можно было выбрать — какой урл блокировать.

В HTML странице прописан только адрес плеера. Чтобы резать рекламу — надо перехватывать трафик, который генерит плеер.
Самым прямым способом перехвата трафика я считаю mime-фильтр на тип video/x-flv.
Этот фильтр работает, но в него никак не сообщается — от какого элемента страницы идет траффик.
Хорошо если на странице один элемент OBJECT, но если их несколько — то тут и возникакет вопрос: над каким элементом рисовать кнопку?

Вобщем, изучая этот вопрос постепенно прихожу к выводу, что IE не очень то приспособлен для такого рода приложения.
Так что видимо придется ограничиться фаерфоксом
Re[5]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: boot  
Дата: 10.07.11 16:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доступ к элементам страницы есть, но это не помогает.

А>Например в ютубе перед загрузкой ролика бывает идет реклама. У плеера, рекламы и ролика — разные урлы.
А>Я хочу чтобы над элементом рисовалась кнопка "блокировать", нажимая на которую можно было выбрать — какой урл блокировать.

А>В HTML странице прописан только адрес плеера. Чтобы резать рекламу — надо перехватывать трафик, который генерит плеер.

А>Самым прямым способом перехвата трафика я считаю mime-фильтр на тип video/x-flv.
А>Этот фильтр работает, но в него никак не сообщается — от какого элемента страницы идет траффик.
А>Хорошо если на странице один элемент OBJECT, но если их несколько — то тут и возникакет вопрос: над каким элементом рисовать кнопку?

А>Вобщем, изучая этот вопрос постепенно прихожу к выводу, что IE не очень то приспособлен для такого рода приложения.

А>Так что видимо придется ограничиться фаерфоксом

Верно, я и забыл про взаимодействие с пользователем.
Но отчаиваться рано. Если на C# с WebBrowser можно делать как в следующем куске кода, то и на C++ можно найти способ.
        private void webBrowserMain_DocumentCompleted(Object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            String body = this.webBrowserMain.Document.Body.InnerHtml;
            List<Char> list = new List<char>();
            int mode = 0;
            for (int i = 0; i < body.Length; i++)
            {
                switch (mode)
                {
                    case 0:
                        if (body[i] == '<')
                            mode = 1;
                        else if (Char.IsLetter(body[i]))
                        {
                            list.AddRange("<span>".ToCharArray());
                            mode = 2;
                        }
                        break;
                    case 1:
                        if (body[i] == '>')
                            mode = 0;
                        break;
                    case 2:
                        if (body[i] == '<')
                        {
                            list.AddRange("</span>".ToCharArray());
                            mode = 1;
                        }
                        else if (!Char.IsLetter(body[i]))
                        {
                            list.AddRange("</span>".ToCharArray());
                            mode = 0;
                        }
                        break;
                }
                list.Add(body[i]);
            }
            this.webBrowserMain.Document.Body.InnerHtml = new String(list.ToArray());
            HtmlElementCollection items = this.webBrowserMain.Document.GetElementsByTagName("span");
            foreach (HtmlElement i in items) i.MouseDown += new HtmlElementEventHandler(ShowHelp);
            this.ParseStatus.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;


А вообще то говоря (не пойму почему раньше не допер) от всех проблем избавит инекция JavaScript кода на страницу. Если получится внедрить скрипт, то дальше как в Firefox.
Жизнеспособность прямо пропорциональна простоте!
Re: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: sidorov18 США  
Дата: 11.07.11 07:15
Оценка:
Здравствуйте, kzv, Вы писали:

kzv>
kzv>STDMETHODIMP CMyMimeFilter::Start(
kzv>            LPCWSTR szUrl,
kzv>            IInternetProtocolSink *pIProtSink,
kzv>            IInternetBindInfo *pIBindInfo,
kzv>            DWORD grfSTI,
kzv>            DWORD dwReserved)
kzv>{
kzv>  CComPtr<IHTMLDOMNode> pNode;
kzv>  pIBindInfo->QueryInterface(IID_IHTMLDOMNode, &pNode) <--- это естественно не работает.., а очень надо :(
kzv>}
kzv>


А почему это должно работать?)))

Попробуйте искать урл, по которому делается запрос в flashvars или свойствах object.
И еще, почему вы уверены, что реклама для флеша должна быть в соседнем object/embed? возможно, это интегрировано в одну флешку, и тут определить реклама это или нет — можно только методом анализа http заголовков(урл, размер и т.п.).

Прежде, чем такое реализовывать, я бы порекомендовал поставить add block для FireFox и посмотреть его исходный код.
Re[2]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: Аноним  
Дата: 11.07.11 08:30
Оценка:
Здравствуйте, sidorov18, Вы писали:

S>Здравствуйте, kzv, Вы писали:


kzv>>
kzv>>STDMETHODIMP CMyMimeFilter::Start(
kzv>>            LPCWSTR szUrl,
kzv>>            IInternetProtocolSink *pIProtSink,
kzv>>            IInternetBindInfo *pIBindInfo,
kzv>>            DWORD grfSTI,
kzv>>            DWORD dwReserved)
kzv>>{
kzv>>  CComPtr<IHTMLDOMNode> pNode;
kzv>>  pIBindInfo->QueryInterface(IID_IHTMLDOMNode, &pNode) <--- это естественно не работает.., а очень надо :(
kzv>>}
kzv>>


S>А почему это должно работать?)))


Потому что в фаерфоксе работает

S>Попробуйте искать урл, по которому делается запрос в flashvars или свойствах object.


Нахожу, но от этого мало толку — это урл плеера, а не контента...

S>И еще, почему вы уверены, что реклама для флеша должна быть в соседнем object/embed? возможно, это интегрировано в одну флешку, и тут определить реклама это или нет — можно только методом анализа http заголовков(урл, размер и т.п.).


Вы меня не правильно поняли. Я как раз "анализирую" http заголовок, а не парсю html, в котором нужной информации не бывает.

S>Прежде, чем такое реализовывать, я бы порекомендовал поставить add block для FireFox и посмотреть его исходный код.


Исходник фаерфоксовского аддона изучен вдоль и поперек и на его основе уже есть рабочий аддон для фаерфокса.
Re[6]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: Аноним  
Дата: 11.07.11 08:36
Оценка:
Здравствуйте, boot, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Доступ к элементам страницы есть, но это не помогает.

А>>Например в ютубе перед загрузкой ролика бывает идет реклама. У плеера, рекламы и ролика — разные урлы.
А>>Я хочу чтобы над элементом рисовалась кнопка "блокировать", нажимая на которую можно было выбрать — какой урл блокировать.

А>>В HTML странице прописан только адрес плеера. Чтобы резать рекламу — надо перехватывать трафик, который генерит плеер.

А>>Самым прямым способом перехвата трафика я считаю mime-фильтр на тип video/x-flv.
А>>Этот фильтр работает, но в него никак не сообщается — от какого элемента страницы идет траффик.
А>>Хорошо если на странице один элемент OBJECT, но если их несколько — то тут и возникакет вопрос: над каким элементом рисовать кнопку?

А>>Вобщем, изучая этот вопрос постепенно прихожу к выводу, что IE не очень то приспособлен для такого рода приложения.

А>>Так что видимо придется ограничиться фаерфоксом

B>Верно, я и забыл про взаимодействие с пользователем.

B>Но отчаиваться рано. Если на C# с WebBrowser можно делать как в следующем куске кода, то и на C++ можно найти способ.
B>
B>        private void webBrowserMain_DocumentCompleted(Object sender, WebBrowserDocumentCompletedEventArgs e)
B>        {
B>            String body = this.webBrowserMain.Document.Body.InnerHtml;
B>            List<Char> list = new List<char>();
B>            int mode = 0;
B>            for (int i = 0; i < body.Length; i++)
B>            {
B>                switch (mode)
B>                {
B>                    case 0:
B>                        if (body[i] == '<')
B>                            mode = 1;
B>                        else if (Char.IsLetter(body[i]))
B>                        {
B>                            list.AddRange("<span>".ToCharArray());
B>                            mode = 2;
B>                        }
B>                        break;
B>                    case 1:
B>                        if (body[i] == '>')
B>                            mode = 0;
B>                        break;
B>                    case 2:
B>                        if (body[i] == '<')
B>                        {
B>                            list.AddRange("</span>".ToCharArray());
B>                            mode = 1;
B>                        }
B>                        else if (!Char.IsLetter(body[i]))
B>                        {
B>                            list.AddRange("</span>".ToCharArray());
B>                            mode = 0;
B>                        }
B>                        break;
B>                }
B>                list.Add(body[i]);
B>            }
B>            this.webBrowserMain.Document.Body.InnerHtml = new String(list.ToArray());
B>            HtmlElementCollection items = this.webBrowserMain.Document.GetElementsByTagName("span");
B>            foreach (HtmlElement i in items) i.MouseDown += new HtmlElementEventHandler(ShowHelp);
B>            this.ParseStatus.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;

B>


А что делает этот код?
Добавляет обработчик события клика мышкой по всем элементам span?
Как это связано с перехватом трафика

B>А вообще то говоря (не пойму почему раньше не допер) от всех проблем избавит инекция JavaScript кода на страницу. Если получится внедрить скрипт, то дальше как в Firefox.


Не избавит. В IE нет фаерфоксовских событий и интерфейсов
Re[3]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: sidorov18 США  
Дата: 11.07.11 11:01
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, sidorov18, Вы писали:


S>>Здравствуйте, kzv, Вы писали:


kzv>>>
kzv>>>STDMETHODIMP CMyMimeFilter::Start(
kzv>>>            LPCWSTR szUrl,
kzv>>>            IInternetProtocolSink *pIProtSink,
kzv>>>            IInternetBindInfo *pIBindInfo,
kzv>>>            DWORD grfSTI,
kzv>>>            DWORD dwReserved)
kzv>>>{
kzv>>>  CComPtr<IHTMLDOMNode> pNode;
kzv>>>  pIBindInfo->QueryInterface(IID_IHTMLDOMNode, &pNode) <--- это естественно не работает.., а очень надо :(
kzv>>>}
kzv>>>


А>Потому что в фаерфоксе работает


Вы думаете, должна быть связь у интернет соединения и узла html?
В FireFox этого нет. Я пишу аддоны под FireFox. Нет там этого. Поправьте, если я вас неправильно понял.

А>Нахожу, но от этого мало толку — это урл плеера, а не контента...

Должен быть и контента, хотя вы правы.. скорее всего они динамически генерируются..

А>Вы меня не правильно поняли. Я как раз "анализирую" http заголовок, а не парсю html, в котором нужной информации не бывает.

Ну я так понял, что вам все равно нужно находить нужный элемент на странице, и добавлять кнопку заблокировать. т.е. в DOM лезть все равно прийдется)

А>Исходник фаерфоксовского аддона изучен вдоль и поперек и на его основе уже есть рабочий аддон для фаерфокса.

И что, вы там нашли связь между http запросом и DOM элементом?
Re[7]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: boot  
Дата: 11.07.11 11:29
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>А что делает этот код?

А>Добавляет обработчик события клика мышкой по всем элементам span?
А>Как это связано с перехватом трафика

Не как это связано, а где это не связано

А>Не избавит. В IE нет фаерфоксовских событий и интерфейсов


На то он и IE, что он не Firefox.

А если серьезно, последний намек, есть такой аддон под Firefox, Greasemonkey зовется. Используя этот аддон, можно решить Вашу изначальную задачу при помощи одного единственного скрипта (не считая, разумеется, сервера с БД для хранения "определителей" рекламы, как в натуратьном AdBlock). А теперь вообразите, что есть Greasemonkey под IE.

Если Вам что-то до сих пор непонятно, возможно это отого что я пишу не kzw, а Анониму?
Жизнеспособность прямо пропорциональна простоте!
Re[4]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: Аноним  
Дата: 11.07.11 11:42
Оценка:
Здравствуйте, sidorov18, Вы писали:

S>Вы думаете, должна быть связь у интернет соединения и узла html?

S>В FireFox этого нет. Я пишу аддоны под FireFox. Нет там этого. Поправьте, если я вас неправильно понял.

Есть. Смотрите ниже

А>>Вы меня не правильно поняли. Я как раз "анализирую" http заголовок, а не парсю html, в котором нужной информации не бывает.

S>Ну я так понял, что вам все равно нужно находить нужный элемент на странице, и добавлять кнопку заблокировать. т.е. в DOM лезть все равно прийдется)

Залезть в DOM проблем не представляет. А вот связать DOM с трафиком для IE это похоже проблемма...

А>>Исходник фаерфоксовского аддона изучен вдоль и поперек и на его основе уже есть рабочий аддон для фаерфокса.

S> И что, вы там нашли связь между http запросом и DOM элементом?

https://developer.mozilla.org/en/nsIContentPolicy
Re[5]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: sidorov18 США  
Дата: 11.07.11 13:32
Оценка:
Здравствуйте, Аноним, Вы писали:

S>> И что, вы там нашли связь между http запросом и DOM элементом?


А>https://developer.mozilla.org/en/nsIContentPolicy


Спасибо, не знал
Хотя интересно, как он определяет эту связь...
Для статического ресурса это еще понятно ( <img src=""/> )
Но при создании объекта XMLHttpRequest мы ведь не передаем элемент.. наверное FireFox передает элемент, из обработчика события которого был вызван код.
Re[6]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: Аноним  
Дата: 12.07.11 05:19
Оценка:
Здравствуйте, sidorov18, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


S>>> И что, вы там нашли связь между http запросом и DOM элементом?


А>>https://developer.mozilla.org/en/nsIContentPolicy


S>Спасибо, не знал

S>Хотя интересно, как он определяет эту связь...
S>Для статического ресурса это еще понятно ( <img src=""/> )
S>Но при создании объекта XMLHttpRequest мы ведь не передаем элемент.. наверное FireFox передает элемент, из обработчика события которого был вызван код.

Есть мнение, что IE тоже знает — от какого элемента идет траффик. Как я уже упомянал эту связь можно достать, если узнать моникер к которому привязан интерфейс IBindInfo.
Только не хакерского механизма достать этот моникер я найти не могу, также как и не могу узнать содержимое всех заголовков у пакетов GET
Re[7]: Можно ли получить IHTMLDOMNode из IInternetBindInfo
От: sidorov18 США  
Дата: 12.07.11 07:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть мнение, что IE тоже знает — от какого элемента идет траффик. Как я уже упомянал эту связь можно достать, если узнать моникер к которому привязан интерфейс IBindInfo.


По логике, зачем он должен быть привязан? В nsIContentPolicy ясно сказано — для возможности блокировать контент т.е. сам FireFox поддерживает существование add-blocker.
Не знаю, как там внутри, но то, что это условие не является обязательным — 100%


А>Только не хакерского механизма достать этот моникер я найти не могу, также как и не могу узнать содержимое всех заголовков у пакетов GET


А подмену vtable не рассматриваете? У нас в рабочем проекте используется. Все http так ловится.
Это для IInternetSession.

Для перехвата событий DOM элементов тоже можно подумать на эту тему.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.