Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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

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

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

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

Код:
#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 в 09:08.
Bruce Wayne вне форума Ответить с цитированием
Старый 18.08.2017, 10:20   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Задача какая? Может проще взять Selenium или CEF? Или расширение для браузера.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 18.08.2017, 14:46   #4
Bruce Wayne
Пользователь
 
Регистрация: 08.07.2015
Сообщений: 21
По умолчанию

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

Вряд ли это исходная задача, скорее один из способов ее решения (не факт, что оптимальный).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 18.08.2017, 22:56   #6
Bruce Wayne
Пользователь
 
Регистрация: 08.07.2015
Сообщений: 21
По умолчанию

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

Данное решение можно считать оптимальным, приняв во внимание эту статью.
Bruce Wayne вне форума Ответить с цитированием
Старый 19.08.2017, 01:05   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Это расширением или юзерскриптом можно сделать, примерно в 100500 раз проще и кроссплатформенно.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить текст страницы/body в расширении Chrome crom JavaScript, Ajax 0 03.07.2016 15: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 16:23
Google Chrome HellMercenariess Софт 1 06.10.2009 15:53