Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 14.08.2017, 21:17   #1
Bruce Wayne
Пользователь
 
Регистрация: 08.07.2015
Сообщений: 21
Репутация: 11
По умолчанию Получить текст из открытой вкладки Google Chrome

Доброе время суток!

Уже не первую неделю ищу способ получения текста из окна браузера Google Chrome и ему подобных для последующей обработки этих данных. Пересмотрел множество тем на разных форумах, но во всех случаях обсуждение либо заканчивается ничем, либо решение уже давно не работает в современных версиях браузера: ни поиск контролов по классам, ни уж тем более DDE для извлечения текста не дают результатов.

Подскажите, пожалуйста, есть ли какой-то другой способ (желательно на C++) для получения текста с просматриваемой страницы? Или это стало невозможным из соображений безопасности?

P. S. Вариант Ctrl+A, Ctrl+C работает, конечно, но слишком раздражает
Bruce Wayne вне форума   Ответить с цитированием
Старый 18.08.2017, 09:25   #2
Bruce Wayne
Пользователь
 
Регистрация: 08.07.2015
Сообщений: 21
Репутация: 11
По умолчанию

Вот, что получилось:

Код:

#include "stdafx.h"
#include <string>
#include <iostream>
#include "windows.h"
#include "oleacc.h"
#include "atlbase.h"

std::wstring GetName(IAccessible *pAcc)
{
	CComBSTR bstrName;
	if (!pAcc || FAILED(pAcc->get_accName(CComVariant((int)CHILDID_SELF), &bstrName)) || !bstrName.m_str)
		return L"";

	return bstrName.m_str;
}

HRESULT WalkTreeWithAccessibleChildren(CComPtr<IAccessible> pAcc)
{
	long childCount = 0;
	long returnCount = 0;

	HRESULT hr = pAcc->get_accChildCount(&childCount);

	if (childCount == 0)
		return S_OK;

	CComVariant* pArray = new CComVariant[childCount];
	hr = ::AccessibleChildren(pAcc, 0L, childCount, pArray, &returnCount);
	if (FAILED(hr))
		return hr;

	for (int x = 0; x < returnCount; x++)
	{
		CComVariant vtChild = pArray[x];
		if (vtChild.vt != VT_DISPATCH)
			continue;

		CComPtr<IDispatch> pDisp = vtChild.pdispVal;
		CComQIPtr<IAccessible> pAccChild = pDisp;
		if (!pAccChild)
			continue;

		std::wstring name = GetName(pAccChild).data();

		CComBSTR bstrValue;
		if (SUCCEEDED(pAccChild->get_accValue(CComVariant((int)CHILDID_SELF), &bstrValue)) && bstrValue.m_str)
			std::wcout << std::wstring(bstrValue.m_str).c_str() << std::endl;

		if (WalkTreeWithAccessibleChildren(pAccChild) == S_FALSE)
			return S_FALSE;
	}

	delete[] pArray;
	return S_OK;
}

HWND hWndChrome = NULL;

BOOL CALLBACK FindChromeWindowProc(HWND hwnd, LPARAM lParam)
{
	wchar_t className[100];
	if (GetClassName(hwnd, className, 100) == 0 || wcscmp(className, L"Chrome_WidgetWin_1") != 0)
		return TRUE;

	wchar_t title[1000];
	if (GetWindowText(hwnd, title, 1000) == 0 || wcslen(title) == 0)
		return TRUE;

	hWndChrome = hwnd;
	return FALSE;
}

int main()
{
	::CoInitialize(NULL);
	EnumWindows(FindChromeWindowProc, 0);

	if (hWndChrome == NULL)
		return 0;

	CComPtr<IAccessible> pAccMain;
	::AccessibleObjectFromWindow(hWndChrome, OBJID_CLIENT, IID_IAccessible, (void**)(&pAccMain));

	WalkTreeWithAccessibleChildren(pAccMain);

	Sleep(10000);

	return 0;
}

На данный момент удалось получить адреса всех ссылок со страницы. Но как переделать код, чтобы выводить именно текст? Пробую добавить:

Код:

CComBSTR bstrValue2;
		if (SUCCEEDED(pAccChild->get_accName(CComVariant((int)CHILDID_SELF), &bstrValue2)) && bstrValue2.m_str)
			std::wcout << std::wstring(bstrValue2.m_str).c_str() << std::endl

или просто

std::wcout << name << std::endl

Но после однократного вывода "Google Chrome" и первой ссылки программа останавливается и перестаёт выводить ссылки со страницы O_o

P. S. Чтобы программа заработала, нужно запустить Google Chrome с ключом --force-renderer-accessibility

Вывод в файл работает отлично:

Код:

std::wofstream out("output.txt", std::ios::app);
out << name << std::endl;
out.close();


Последний раз редактировалось Bruce Wayne; 18.08.2017 в 10:08.
Bruce Wayne вне форума   Ответить с цитированием
Старый 18.08.2017, 11:20   #3
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 14,694
Репутация: 2887

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

Задача какая? Может проще взять Selenium или CEF? Или расширение для браузера.
Alex11223 вне форума   Ответить с цитированием
Старый 18.08.2017, 15:46   #4
Bruce Wayne
Пользователь
 
Регистрация: 08.07.2015
Сообщений: 21
Репутация: 11
По умолчанию

Задача - получение текста страницы из открытой вкладки Google Chrome. Но, вроде бы разобрался с помощью кода выше выводом в файл, спасибо
Bruce Wayne вне форума   Ответить с цитированием
Старый 18.08.2017, 22:07   #5
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 14,694
Репутация: 2887

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

Вряд ли это исходная задача, скорее один из способов ее решения (не факт, что оптимальный).
Alex11223 вне форума   Ответить с цитированием
Старый 18.08.2017, 23:56   #6
Bruce Wayne
Пользователь
 
Регистрация: 08.07.2015
Сообщений: 21
Репутация: 11
По умолчанию

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

Данное решение можно считать оптимальным, приняв во внимание эту статью.
Bruce Wayne вне форума   Ответить с цитированием
Старый 19.08.2017, 02:05   #7
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 14,694
Репутация: 2887

icq: 512-7шесть5
skype: alexp.frl
По умолчанию

Это расширением или юзерскриптом можно сделать, примерно в 100500 раз проще и кроссплатформенно.
Alex11223 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить текст страницы/body в расширении Chrome crom JavaScript, Ajax 0 03.07.2016 16:23
TabControl как взять надпись открытой вкладки yuran111 Общие вопросы Delphi 3 11.05.2011 14:30
Google Chrome Syltan Операционные системы общие вопросы 1 16.04.2010 08:18
IdHTTP.Get Google выдает ошибку при попытке получить исходный текст dkdkdk Работа с сетью в Delphi 6 17.12.2009 17:23
Google Chrome HellMercenariess Софт 1 06.10.2009 15:53




15:13.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru