Доброго времени суток уважаемые.
Хочу сделать для 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
Здравствуйте, 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>
По поводу 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
Здравствуйте, Аноним, Вы писали:
А>Доступ к элементам страницы есть, но это не помогает. А>Например в ютубе перед загрузкой ролика бывает идет реклама. У плеера, рекламы и ролика — разные урлы. А>Я хочу чтобы над элементом рисовалась кнопка "блокировать", нажимая на которую можно было выбрать — какой урл блокировать.
А>В 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
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, Вы писали:
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
Здравствуйте, Аноним, Вы писали:
А>А что делает этот код? А>Добавляет обработчик события клика мышкой по всем элементам 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 элементом?
Спасибо, не знал
Хотя интересно, как он определяет эту связь...
Для статического ресурса это еще понятно ( <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
Здравствуйте, Аноним, Вы писали:
А>Есть мнение, что IE тоже знает — от какого элемента идет траффик. Как я уже упомянал эту связь можно достать, если узнать моникер к которому привязан интерфейс IBindInfo.
По логике, зачем он должен быть привязан? В nsIContentPolicy ясно сказано — для возможности блокировать контент т.е. сам FireFox поддерживает существование add-blocker.
Не знаю, как там внутри, но то, что это условие не является обязательным — 100%
А>Только не хакерского механизма достать этот моникер я найти не могу, также как и не могу узнать содержимое всех заголовков у пакетов GET
А подмену vtable не рассматриваете? У нас в рабочем проекте используется. Все http так ловится.
Это для IInternetSession.
Для перехвата событий DOM элементов тоже можно подумать на эту тему.