DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: webb123
今日帖子: 3
在线用户: 2
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 adong_71 (呆糊涂) ▲▲▲▲▲ -
普通会员
2019/2/13 16:42:15
标题:
delphixe10如果获取TChromium浏览器中response返回的json数据? 浏览:1877
加入我的收藏
楼主: delphixe10中嵌入TChromium浏览器cef4delphi,访问其他网站,可以登录,也可以获取到cookie,现在用idhttp获取到了数据,但是想直接获取返回的response中的json数据,不知道有什么好方法,已经在网上找了好久,资料太少,没有查询到,看看哪位有这方面的经验,请赐教!谢谢!
----------------------------------------------
-
作者:
男 luchao900 (哈你宝贝) ▲▲▲▲△ -
普通会员
2019/2/13 18:44:06
1楼: josn就是一串字符串啊,和返回的文件,图片,文本之类没区别,你用浏览器调试工具查看下响应数据,看有没有json,能不能显示出来,不行的话直接用idhttp操作截取吧
----------------------------------------------
-
作者:
男 luchao900 (哈你宝贝) ▲▲▲▲△ -
普通会员
2019/2/13 18:45:12
2楼: 测试工具推荐 精易编程助手
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/2/13 20:02:46
3楼: xhr类型?那要做一个getresourcehandler来处理。
----------------------------------------------
--
作者:
男 adong_71 (呆糊涂) ▲▲▲▲▲ -
普通会员
2019/2/13 21:51:34
4楼: josn就是一串字符串啊,和返回的文件,图片,文本之类没区别,你用浏览器调试工具查看下响应数据,看有没有json,能不能显示出来,不行的话直接用idhttp操作截取吧

感谢bahamut8348和luchao900,我现在只能用这个方法来处理了,先获取到控件中的cookie然后再用idhttp重新获取,但是总觉得这个方法有些费事,我想把浏览器中显示数据直接取出来用,f12直接在chrome中看到response返回值是json,但是在控件中如何能取到这个数据呢?我这些天一直在查找这方面的资料,没有找到,郁闷中.....,哥们用.net,他说这个用gicko的firefox插件很容易实现,我也在xe10上安装了gecko,但是运行以后出现好多错误,根本没办法运行,真是苦恼啊,难道现在的delphi研究的人真的少了吗?原来在csdn上很多人回答问题,现在发了问题基本没人理。。。。。。

xhr类型?那要做一个getresourcehandler来处理。这个应该怎么做呢?
不知道我上面的描述是不是清楚了.
----------------------------------------------
-
作者:
男 luchao900 (哈你宝贝) ▲▲▲▲△ -
普通会员
2019/2/14 4:37:49
5楼: 额,这个和控件的关系不大吧,你像IE内核的 TWebbroswer,要操作html需要转换IDocument,但是也不能直接从响应中获取html元素之外的东西,其它语言基本也都一样,响应的文本不能直接解释成HTML元素,就不能显示出来,浏览器操作最直接的办法就是JS,但根据你的问题,这里就需要通过JS从响应结果中获取JSON流,然后与DELPHI交互,将结果导出  
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434499490767fe5a0e31e17e44b69dcd1196f7ec6fc6000
这网址最后有个练习,就是JS获取JSON

JS与DELPHI的交互,找我以前的贴子
http://bbs.2ccc.com/topic.asp?topicid=559512

你可以通过JS在HTML页面中添加元素,把JS获取的json传给delphi。
综上,解决方法是有,但反到麻烦,你说的firefox中处理json的插件,其实还是通过JS响应网址抓取数据。还是直接采集json数据的网址,直接用idhttp处理来的爽利
----------------------------------------------
-
作者:
男 hdcopy (hdcopy) ★☆☆☆☆ -
普通会员
2019/2/14 10:58:30
6楼: procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  s : string;
  sl, sl1: TStringList ;
  i, idx : Integer;
begin
  s:= format('{"code":"0000","desc":"成功收到","date":"%s"}', [formatdatetime('yyyy-mm-dd hh:nn:ss', now)]);
  AResponseInfo.ContentText := s;          
  Memo1.Lines.Add(Format('FormParams=%s',[UTF8ToAnsi(ARequestInfo.FormParams) + #13 ]));
  Memo1.Lines.Add(Format('Document=%s',[ARequestInfo.Document + #13 ]));
  Memo1.Lines.Add(Format('Params=%s',[ARequestInfo.Params.text + #13 ])); 
  Memo1.Lines.Add(Format('ReceiveData=%s',[UTF8ToAnsi(ARequestInfo.UnparsedParams) + #13 ]));

  if ARequestInfo.Params.Count = 0 then Exit;
  sl := TStringList.Create ;
  sl1 := TStringList.Create ;
  sl.Assign(ARequestInfo.Params);

  while sl.count > 0 do
  begin
    s := sl.Names[0];
    idx := sl1.IndexOfName(s);
    if idx = -1 then
      sl1.Add(sl[0])
    else begin
      sl1[idx] := sl1[idx] + ',' + sl.Values[s];
    end;
    sl.Delete(0);
  end;
  s := '{';
  for i:=0 to sl1.Count-1 do
  begin
    s := s + Format('"%s":"%s",', [sl1.Names[i], sl1.Values[sl1.Names[i]]]);
  end;
  s := s + '}';
  Memo1.Lines.Add(s);
  sl.Free;
  sl1.Free;
end;
----------------------------------------------
-
作者:
男 hdcopy (hdcopy) ★☆☆☆☆ -
普通会员
2019/2/14 11:00:42
7楼: 其实上面不看也可以,里面的代码都是为了显示而已。

在IdHTTPServer1CommandGet事件取ARequestInfo.Params.text就好;

这个是针对indy老版本的,新版本的自己改下
----------------------------------------------
-
作者:
男 hdcopy (hdcopy) ★☆☆☆☆ -
普通会员
2019/2/14 11:03:46
8楼: 这个是用来获取
content-type=application/json 类型接口数据的,现在最流行的接口方式
----------------------------------------------
-
作者:
男 redhan (晓寒) ★☆☆☆☆ -
盒子活跃会员
2019/2/14 11:48:27
9楼: TChromium 有类似 idhttp 接口,本身是可以使用当前cookie的
----------------------------------------------
-
作者:
男 vkow (vkow) ★☆☆☆☆ -
普通会员
2019/2/14 19:16:35
10楼: 其实没看懂你想问什么。

为啥还整出TIdHttp组件来了?

大概回答一下吧,供参考。

我猜,这个事件应该能满足你的需求。

procedure OnGetResourceResponseFilter(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;  const request: ICefRequest; const response: ICefResponse; out Result: ICefResponseFilter);
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2019/2/14 21:18:50
11楼: 10楼的方法,我可以负责的告诉楼主,肯定捕捉不到xhr.只能捕捉常规的。。。其实3楼的就是真相,只是,这么弄,你自己去思考了。
----------------------------------------------
-
作者:
男 adong_71 (呆糊涂) ▲▲▲▲▲ -
普通会员
2019/2/20 9:05:42
12楼: 非常感谢大家的回答,本身我对这方面的知识比较弱,只能采用以前的方法,用idhttp获取json数据了。不过看到9楼的回答,不知道idhttp是否可以直接使用TChromium的cookie,我现在获取Tchromium的方法:
function CookieVisitorProc(const name, value, domain, path: ustring;
          secure, httponly, hasExpires: Boolean;
          const creation, lastAccess, expires: TDateTime;
          count, total: Integer;
          out   deleteCookie: Boolean): Boolean;
var
  TempCookie : TCookie;
begin
  deleteCookie := False;

  TempCookie.name        := name;
  TempCookie.value       := value;
  TempCookie.domain      := domain;
  TempCookie.path        := path;
  TempCookie.secure      := secure;
  TempCookie.httponly    := httponly;
  TempCookie.creation    := creation;
  TempCookie.last_access := lastAccess;
  TempCookie.has_expires := hasExpires;
  TempCookie.expires     := expires;

  Frm1.AddCookieInfo(TempCookie);

  if (count = pred(total)) then
    begin
      if (Frm1 <> nil) and Frm1.HandleAllocated then
        PostMessage(Frm1.Handle, MINIBROWSER_SHOWCOOKIES, 0, 0);

      Result := False;
    end
   else
    Result := True;
end;

procedure TFrm1.FormCreate(Sender: TObject);
begin
  Chromium1.DefaultURL := MINIBROWSER_HOMEPAGE;
//  Chromium1.LoadURL(str_weburl);  //调用默认页
  FVisitor  := TCefFastCookieVisitor.Create(CookieVisitorProc);
end;

procedure TFrm1.getCookieInfo;
var
  CookieManager: ICefCookieManager;
begin
  Str_jspxCookie := '';
  CookieManager:= TCefCookieManagerRef.Global(nil);
  CookieManager.VisitAllCookies(FVisitor);
end;

不知道是否有简单的方法了。
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2019/2/20 9:13:48
13楼: 更正一下吧,10楼和3楼的方法都可以。已经开过贴说明了。楼主用idhttp,有点折腾了,而且如果是非纯get的请求的话,还涉及到重复提交数据的问题。
----------------------------------------------
-
作者:
男 adong_71 (呆糊涂) ▲▲▲▲▲ -
普通会员
2019/2/20 9:22:51
14楼: 我增加了这个功能在xp上运行出现以下的错误。
此帖子包含附件:
PNG 图像
大小:6.1K
----------------------------------------------
-
作者:
男 adong_71 (呆糊涂) ▲▲▲▲▲ -
普通会员
2019/2/20 9:23:28
15楼: crystalmoon (黑夜杀手)感谢,我慢慢再爬爬这个坑吧
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2019/2/20 9:51:05
16楼: 最新的CEF已经不能再XP上玩了,先确保是CEF_3.2526.1373一下版本。。不过那就不能用Cef4Delphi了,硬要用需要自己改很多。。。。直接用原来的DCEF3版本吧。
----------------------------------------------
-
作者:
男 adong_71 (呆糊涂) ▲▲▲▲▲ -
普通会员
2019/2/20 10:30:46
17楼: 感谢 crystalmoon (黑夜杀手),不知道d10怎么使用gecko呢,这方面网上的资源太少了

http://bbs.2ccc.com/topic.asp?topicid=561175
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2019/2/20 10:34:37
18楼: 这个我也没玩过gecko,看了下已经很旧了。还是定心玩一个,把他玩好就是了。。。。有空可以看看miniblink,基于cef精简,接口比原生的cef简单的多,这个有Delphi的封装。关键是,兼容xp
----------------------------------------------
-
作者:
男 adong_71 (呆糊涂) ▲▲▲▲▲ -
普通会员
2019/2/20 16:53:30
19楼: crystalmoon (黑夜杀手),我去https://github.com/yangyxd/wke-for-delphi下载了,有错误啊,安装不上啊
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2019/2/20 17:12:29
20楼: 你这个是音儿小白写的。最新的我没试验过。以前试验过是可以得。除了这个,还有 浪迹  不得闲 两位,也封装过。。
跑不起来就debug一下啊,也许mb的接口有变动?
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行95.70313毫秒 RSS