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

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

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2016, 23:18   #1
index58
Пользователь
 
Регистрация: 27.07.2016
Сообщений: 23
По умолчанию Доступ к данным Ajax из другой программы

Всем привет.

Есть приложение для игры в онлайн-покер, а в нём - окно статистики, в котором есть дочернее окошко класса "Internet Explorer_Server". В этом окошке, собственно, данные статистики, которые мне нужны. К окошку доступ я получил, считываю через IHTMLDocument2. Но проблема в том, что там есть какой-то, по всей видимости, Ajax-контейнер, подгружающий данные самостоятельно, и к которым я никак не могу получить доступ. Изначальную страницу я вижу, а то, что подгружается динамически - никак.

Вот файл с текстом моего модуля Делфи (рабочий, но видит только изначальную страницу):
Unit1.pas

А вот файл с текстом HTML-страницы, получаемой через IHTMLDocument2:
1.txt

Может подскажет кто, как к этому Ajax-у подобраться?
А то измучился уже вручную забивать всё в Эксель.
index58 вне форума Ответить с цитированием
Старый 27.07.2016, 23:38   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Выложите код сюда или (если очень сильно большой) загрузите на нормальный файлохостинг (яндекс.диск, дропбокс, rghost, ...) или gist.github.com
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 28.07.2016, 11:41   #3
index58
Пользователь
 
Регистрация: 27.07.2016
Сообщений: 23
По умолчанию

Текст модуля Delphi:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, activex, mshtml, SHDocVw,
  Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.OleCtrls, OleAcc;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    RichEdit1: TRichEdit;
    Edit4: TEdit;
    Label4: TLabel;
    OpenDialog1: TOpenDialog;
    WebBrowser1: TWebBrowser;
    Splitter1: TSplitter;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure WB_LoadHTML(WebBrowser: TWebBrowser; HTMLCode: string; blank:boolean=true);
var
  sl: TStringList;
  ms: TMemoryStream;
begin
if blank=true then WebBrowser.Navigate('about:blank');
while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages;
  if Assigned(WebBrowser.Document) then
  begin
    sl := TStringList.Create;
    try
    ms := TMemoryStream.Create;
    try
    sl.Text := HTMLCode;
    sl.SaveToStream(ms);
    ms.Seek(0, 0);
    (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms) );
      finally
      ms.Free;
      end;
      finally
      sl.Free;
      end;
  end;
end;

function GetIDocFromHWND(AWindow: THandle; out ADoc: IHTMLDocument2): HRESULT;
var OldMode: integer;
    hInstLib: HMODULE;
    ObjectFromLResult: TObjectFromLResult;
    lRes: Cardinal;
begin
  Result := E_FAIL;
  OldMode := SetErrorMode(SEM_NOOPENFILEERRORBOX or SEM_FAILCRITICALERRORS);
  hInstLib := LoadLibrary('Oleacc.dll');
  SetErrorMode(OldMode);
  if hInstLib <> HINSTANCE_ERROR then
    try
      @ObjectFromLResult := GetProcAddress(hInstLib, 'ObjectFromLresult');
      if Assigned(ObjectFromLResult) then
        begin
          SendMessageTimeOut(AWindow, RegisterWindowMessage('WM_HTML_GETOBJECT'),
            0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
          Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, ADoc);
        end;
    finally
      FreeLibrary(hInstLib);
    end;
end;

function GetInnerHTMLFromBody(const ADocument: IHTMLDOCUMENT2): AnsiString;
var ms: TMemoryStream;
begin
  Result := '';
  if ADocument <> nil then
    begin
    ms := TMemoryStream.Create;
    try
      Succeeded((ADocument as IPersistStreamInit).Save(
        TStreamAdapter.Create(ms, soReference) as IStream, true));
      ms.Seek(0, soFromBeginning);
      SetLength(Result, ms.size);
      ms.ReadBuffer(Result[1], ms.size);
      finally
        ms.Free;
      end;
    end
  else
    begin
    showmessage('IHTMLDocument2 = nil');
    exit;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var  Wnd: HWND;
     WndChild: HWND;
     msg : UINT;
     R : DWORD_PTR;
     hr : HRESULT;
     spDoc : IHTMLDocument2;
     S: string;
begin
RichEdit1.Clear;
WebBrowser1.Navigate('about:blank');
Edit1.Text:= '';
Edit2.Text:= '';
Edit3.Text:= '';
Edit4.Text:= '';
Wnd := FindWindow('External Browser Window Class', nil);
Edit1.Text:= IntToStr(Wnd);
if Wnd = 0 then
  begin
  showmessage('Окно статистики не запущено');
  exit;
  end;
WndChild := FindWindowEX(Wnd, 0, 'Shell Embedding', nil);
Edit2.Text:= IntToStr(WndChild);
if WndChild <> 0 then
  begin
  WndChild := FindWindowEX(WndChild, 0, 'Shell DocObject View', nil);
  Edit3.Text:= IntToStr(WndChild);
  if WndChild <> 0 then
    begin
    WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil);
    Edit4.Text:= IntToStr(WndChild);
    if WndChild <> 0 then
      begin
      msg := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeout(WndChild, msg, 0, 0, SMTO_ABORTIFHUNG, 1000, @R);
      hr := ObjectFromLresult(R, IHTMLDocument2, 0, spDoc);
      if Succeeded(hr) then
        begin
        S:= GetInnerHTMLFromBody(spDoc);
        RichEdit1.Text:= UTF8ToANSI(S);
        WB_LoadHTML(WebBrowser1, S);
        end;
      end;
    end;
  end;
end;

end.
index58 вне форума Ответить с цитированием
Старый 28.07.2016, 11:49   #4
index58
Пользователь
 
Регистрация: 27.07.2016
Сообщений: 23
По умолчанию

Текст первой части HTML-страницы:
Код HTML:
<!DOCTYPE html SYSTEM "about:legacy-compat">
<html xmlns="Здесь был адрес (чтобы без палева)">
<head>
<title>Здесь было название (чтобы без палева))</title>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>
<meta content="IE=Edge" http-equiv="X-UA-Compatible"/>
<link href="/skins/...(без палева).../favicon.ico" rel="shortcut icon"/>
<link rel="stylesheet" href="/c/css/default_styles.css"/>
<link rel="stylesheet" href="/c/css/dialog.css"/>
<link rel="stylesheet" href="/c/css/common-web-styles.css"/>
<link rel="stylesheet" href="/c/css/common_styles.css"/>
<link rel="stylesheet" href="/c/css/page_styles.css"/>
<link rel="stylesheet" href="/c/css/menu_styles.css"/>
<link rel="stylesheet" href="/c/css/table_styles.css"/>
<link rel="stylesheet" href="/c/css/fonts.css"/>
<link rel="stylesheet" href="/opencms/opencms/...(без палева)...//c/css/custom.css"/>
<script type="text/javascript" src="/c/js/cg/math.js">/**/</script>
<script type="text/javascript" src="/c/js/cg/html.utils.js">/**/</script>
<script type="text/javascript" src="/c/js/jquery/jquery-1.7.2.min.js">/**/</script>
<script type="text/javascript" src="/c/js/jquery/jquery.browser.min.js">/**/</script>
<script type="text/javascript" src="/c/js/jquery/jquery.form.min.js">/**/</script>
<script type="text/javascript" src="/c/js/cg/ajax.content.loader.js">/**/</script>
<script type="text/javascript" src="/c/js/plugins/ui/minified/jquery-ui.min.js">/**/</script>
<script type="text/javascript" src="/c/js/plugins/ui/i18n/jquery.ui.datepicker-ru.js">/**/</script>
<script type="text/javascript" src="/c/js/plugins/ui/jquery.ui.timepicker.addon.js">/**/</script>
<script type="text/javascript" src="/c/js/jquery/jquery.mask.plugin.js">/**/</script>
<link rel="stylesheet" href="/c/css/jquery-ui/themes/base/jquery-ui.css"/>
<link rel="stylesheet" href="/c/css/jquery-ui/themes/base/jquery.ui.all.css"/>
<style type="text/css">
            .ui-timepicker-div .ui-widget-header{ margin-bottom: 8px; }
            .ui-timepicker-div dl{ text-align: left; }
            .ui-timepicker-div dl dt{ height: 25px; }
            .ui-timepicker-div dl dd{ margin: -25px 0 10px 65px; }
            .ui-timepicker-div td { font-size: 90%; }
        </style>
<script type="text/javascript" src="/c/js/cg/scripts.js">/**/</script>
<script type="text/javascript" src="/c/js/cg/session.checker.js">/**/</script>
<script type="text/javascript">
                doTimezone();
            
            AjaxPageLoader.PageLoader.checkAjaxRedirect();
            $(function(){
                $(window).bind('hashchange',function(){AjaxPageLoader.PageLoader.actionHistory()});
            });
            $(document).ready(function(){
                AjaxPageLoader.Preloader.message = 'Загрузка...';
            });
            
            SessionChecker.init(
                '198000',
                '/games/sessionrefresher.html'
            );
            </script>
<script type="text/javascript">
                        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
                        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
                        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
                        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
                        
                            ga('create', 'UA-75269641-1', {'name':'CG'});
                            ga('CG.set', 'dimension1', location.host.replace('www.',''));
                            ga('CG.set', 'dimension2', navigator.userAgent);
                            ga('CG.send', 'pageview');
                        </script>
<script type="text/javascript" src="/c/js/cg/detect_flash.js">/**/</script>
<script type="text/javascript" src="/c/js/detect_skins.js">/**/</script>
<script type="text/javascript" src="/c/js/jquery/jquery.selectbox-0.5.js">/**/</script>
<script type="text/javascript" src="/c/js/jquery/swf_object.js">/**/</script>
            
                <!--[if IE]>
                    <link href="/c/css/ie.css" rel="stylesheet" type="text/css"/>
                <![endif]-->
                <!--[if lte IE 8]>
                    <link href="/c/css/ie8.css" rel="stylesheet" type="text/css"/>
                <![endif]-->
            
        
<script type="text/javascript">
            var url = '/lobby/lobbyflash.html';
            var t_url = '/lobby/tourneylobbyflash.html';
            var sid = 'c4ce8c8217314bad-898b99749d1ec368';
            var _w = '800';
            var _h = '600';
            var resizable = '1';
            var scrollbars = '0';
            var testLoginUrl = '/testxml/casino/testlogin.html';
            var notLoggedUrl = '';
            var notLoggedFunc = false;
            var flashWithLogin = 'true';
            lobby.init(url, t_url, sid, _w, _h, resizable, scrollbars, testLoginUrl, notLoggedUrl, notLoggedFunc, flashWithLogin);
        </script>
<script type="text/javascript">
            $(document).ready(function() {
                var langSelected = false;
                if(!langSelected)   {
                    $('#select_lang').selectbox({debug: true, inputClass: 'selectbox_' + 'ru'+'_a', lang: 'Русский'});
                    langSelected = true;
                }
            });
        </script>
<link type="text/css" rel="stylesheet" href="/c/css/common-mobile-styles.css"/>
</head>
<body class="mobile">
<div class="mobile_content_wrapper">
<div class="mobile_content">
<div class="history_menu">
<ul>
<li class="">
<a class="hand_info_button" href="/mobile/history/poker-games.html?tourney=">
<span class="side_menu_text">Стол</span>
</a>
</li>
<li class="active">
<a class="hand_info_button" href="/mobile/history/poker-games.html?tourney=1">
<span class="side_menu_text">Турнир</span>
</a>
</li>
<li class="">
<a class="hand_info_button" href="/mobile/history/poker-games.html?tourney=2">
<span class="side_menu_text">Сит-энд-Гоу</span>
</a>
</li>
<li class="">
<a class="hand_info_button" href="/mobile/history/poker-games.html?tourney=4">
<span class="side_menu_text">Windfall</span>
</a>
</li>
<li class="">
<a class="hand_info_button" href="javascript:clientRedirect('ts-history');">
<span class="side_menu_text">Специальные</span>
</a>
</li>
</ul>
</div>

Последний раз редактировалось index58; 28.07.2016 в 11:55.
index58 вне форума Ответить с цитированием
Старый 28.07.2016, 11:51   #5
index58
Пользователь
 
Регистрация: 27.07.2016
Сообщений: 23
По умолчанию

Текст второй части HTML-страницы:
Код HTML:
<script type="text/javascript">
        var formName = 'calendarForm';
        var allRowsPerPageElements = new Array();
        var currentPages = new Array();
        var tooltipFn = null
        

        $(document).ready(function(){
            $('form[name='+formName+']').submit(function(e){
                e.preventDefault();
                e.stopPropagation();
                var params = $(e.target).serializeArray(),
                    namepage;
                $.each(params, function(i, item) {var name = item['name'];if(_AND(_GT(name.indexOf('_page'), 0), name.indexOf('_rows_per_page') === -1)) namepage = name});
                if (namepage) goToPage(namepage, 1, 1);
            });
        });

        window.goToPage = function (namepage, numpage, reset) {
            document[formName][namepage].value=numpage;
            if (reset == 1) {
                for (var rowsPerPage in currentPages){
                    var element = document.getElementById(currentPages[rowsPerPage]);
                    if (element){
                        element.value = 1;
                    }
                }
            }
            var tableName = namepage.replace('_page','');
            AjaxPageLoader.Preloader.message_with_img = true;
            AjaxPageLoader.submitForm(document[formName].name, [tableName + '_wrapper'], tooltipFn);
        };
        window.setAllRowsPerPage = function (value){
            for (var rowsPerPage in allRowsPerPageElements){
                var element = document.getElementsByName(
                allRowsPerPageElements[rowsPerPage])[0];
                if (element){
                    element.value = value;
                }
            }
        };

    
            var putDate = function(){
                var fdate = $('#todate_id', this.data).val();
                var parts = fdate.split('/');
                $('#todate_id').datepicker('setDate',new Date(parts[2],parseInt(parts[1], 10)-1,parts[0]));
            };
            function doApply(){
                AjaxPageLoader.submitForm('calendarForm', ['game_history_container'], putDate);
            }
            $(document).ready(function(){
                $('.prev_date').click(function(){
                    $('input[name="action"]').val('prev');
                    doApply();
                });
                $('.next_date').click(function(){
                    $('input[name="action"]').val('next');
                    doApply();
                });
            });
        </script>
<div class="poker_history_container poker_history_tournament_container">
<form method="post" action="/mobile/history/poker-games.html" name="calendarForm">
<input value="1" name="tourney" type="hidden"/>
<table class="noborder history_filter_table table_noborder">
<tr>
<td class="nowrap">Дата начала:
                        </td>
<td>
<a class="prev_date arrow_left_1" href="#" title="Previous day">
<span class="hidden">Prev</span>
</a>
</td>
<td>
<script type="text/javascript">
                    var todate = function(dateText, inst) {};
                </script>
<div style="position:relative;display: inline-block;">
<input id="todate_id" value="21/04/2016" name="todate" class="datepicker_common input_common input " type="text" readonly="readonly"/>
<script type="text/javascript">
            var setMinDate = null;
            
                setMinDate = new Date(2004,00,01);
            
            var setMaxDate = null;
                
                    setMaxDate = new Date(2016,11,31);
                
            $(document).ready(function(){
                $('#todate_id').datepicker({
                    hideIfNoPrevNext: true,
                    dateFormat: 'dd/mm/yy',
                    defaultDate: null,
                    timeFormat: '',
                    setDate: '21/04/2016',
                    changeYear: true,
                    yearRange: '2004:2016',
                    separator: ' ',
                    buttonText: 'Выбор даты',
                    buttonImage: '/c/i/calendar_icon.png',
                    
                        buttonImageOnly: true,
                    
                    minDate: setMinDate,
                    maxDate: setMaxDate,
                    showOn: 'both',
                    onClose: doApply,
                    closeText: 'Clear',
                    showButtonPanel: false,
                    beforeShow: null,
                    onChangeMonthYear: null

                });
            });
        </script>
<script type="text/javascript">
                $(function () {$('#todate_id').parent().width($('#todate_id').outerWidth());});
            </script>
</div>
</td>
index58 вне форума Ответить с цитированием
Старый 28.07.2016, 11:52   #6
index58
Пользователь
 
Регистрация: 27.07.2016
Сообщений: 23
По умолчанию

Текст третьей части HTML-страницы:
Код HTML:
<td>
<a class="next_date arrow_right_1" href="#" title="Next day">
<span class="hidden">Next</span>
</a>
</td>
<td class="nowrap">Вид игры:
                        </td>
<td>
<select class="select_common select" id="select-game" name="game">
<option value="59">ОКП Ананас</option>
<option value="9" selected="selected">Холдем</option>
<option value="18">Americana</option>
<option value="16">32 Дроу</option>
<option value="19">Омаха Хай</option>
<option value="20">Омаха Хай-Лоу</option>
<option value="21">7 Стад Хай</option>
<option value="22">7 Стад Хай-Лоу</option>
<option value="68">Техас 6+</option>
</select>
</td>
<td>
<a class="link_show" id="btn_doAply_submit" href="javascript:doApply()">Показать</a>
</td>
</tr>
</table>
<br/>
<h2>История покерных игр - Турнир</h2>
<div id="game_history_container">
<input value="" name="action" type="hidden"/>
<br/>
<div class="tournamentshistory_wrapper table_wrapper" id="tournamentshistory_wrapper">
<table class="border table_common table tournamentshistory" id="tournamentshistory_table">
<tr class="header th_row first">
<th title="Start" class=" darkcell date first lightcell textcell
                    ">Start</th>
<th title="Турнир" class=" darkcell name lightcell textcell
                    ">Турнир</th>
<th title="Взнос" class=" darkcell buyin place lightcell textcell
                    ">Взнос</th>
<th title="Место" class=" darkcell lightcell textcell
                    ">Место</th>
<th title="Приз" class=" darkcell prize last lightcell textcell
                    ">Приз</th>
</tr>
<tr class="odd last">
<td class="textcell  lightcell date first"><a href=/mobile/history/poker-hands.html?tourneyId=00000000000002d000000000011d2045&tourney=1>21 апр 23:30</a></td>
<td class="textcell  lightcell name"><b>Multibounty 5000 RUB GTD R&amp;A</b><br/>Texas Hold'em NL<br/><div title="BuyIn: 40 р.
Fee: 4 р.
Knockout: 40 р.">40 р. + 4 р. + 40 р.</div></td>
<td class="textcell  lightcell buyin place"><span class="history_result_wallet" title="Initial balance: 84 р.
Closing balance: 0,00 р.">&nbsp;</span> <span class="result"><b>84 р.</b></span></td>
<td class="textcell  lightcell">48</td>
<td class="textcell  lightcell prize last">0,00 р.</td>
</tr>
</table>
<script type="text/javascript">
                allRowsPerPageElements.push('tournamentshistory_rows_per_page');
                currentPages.push('tournamentshistory_page');
            </script>
<table id="pages_table_tournamentshistory" class="pages">
<tr>
<td class="left_td pages_input">
<input id="tournamentshistory_page" value="1" name="tournamentshistory_page" type="hidden"/>
</td>
</tr>
</table>
</div>
</div>
<br/>
</form>
<br/>
</div>
</div>
</div>
</body>
</html>
index58 вне форума Ответить с цитированием
Старый 28.07.2016, 12:15   #7
index58
Пользователь
 
Регистрация: 27.07.2016
Сообщений: 23
По умолчанию

Понимаю, что текст страницы HTML большой, но я в этих скриптах вообще не шарю.
index58 вне форума Ответить с цитированием
Старый 28.07.2016, 12:26   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

То что динамически подгружается вы совсем не видите в вашем браузере в Дельфи?

Может оно просто не работает в нем.

По умолчанию WebBrowser использует режим 7 версии IE независимо от версии установленной на компе.

Можно изменить это в реестре http://msdn.microsoft.com/en-us/libr...wser_emulation
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 28.07.2016, 13:42   #9
index58
Пользователь
 
Регистрация: 27.07.2016
Сообщений: 23
По умолчанию

Дело в том, что я не планирую перегонять данные через WebBrowser. Использую его только для наглядности во время разработки. Данные мне нужны в текстовом виде, чтобы распарсить их и сохранить в своей базе данных. Т.е. моя программа будет показывать историю моей игры в табличном виде (взятую из БД), а не в виде HTML. Скажите пожалуйста, можно как-нибудь получить эти динамические данные без компонента WebBrowser?
index58 вне форума Ответить с цитированием
Старый 28.07.2016, 13:51   #10
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

для этого WebBrowser не нужен
берите синапс или инди или ..
come-on вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к данным потока. Landgraf132 C# (си шарп) 6 26.10.2015 13:02
Доступ к памяти другой программы BaronTreep Win Api 10 31.05.2009 07:16
Как получить доступ к данным kiber0net0 Помощь студентам 2 03.09.2008 08:14
Доступ к данным buk Microsoft Office Excel 2 11.07.2007 09:44