导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2019/2/13 16:42:15
标题:
delphixe10如果获取TChromium浏览器中response返回的json数据?
浏览:1877
加入我的收藏
楼主:
delphixe10中嵌入TChromium浏览器cef4delphi,访问其他网站,可以登录,也可以获取到cookie,现在用idhttp获取到了数据,但是想直接获取返回的response中的json数据,不知道有什么好方法,已经在网上找了好久,资料太少,没有查询到,看看哪位有这方面的经验,请赐教!谢谢!
----------------------------------------------
-
作者:
2019/2/13 18:44:06
1楼:
josn就是一串字符串啊,和返回的文件,图片,文本之类没区别,你用浏览器调试工具查看下响应数据,看有没有json,能不能显示出来,不行的话直接用idhttp操作截取吧
----------------------------------------------
-
作者:
2019/2/13 18:45:12
2楼:
测试工具推荐 精易编程助手
----------------------------------------------
-
作者:
2019/2/13 20:02:46
3楼:
xhr类型?那要做一个getresourcehandler来处理。
----------------------------------------------
--
作者:
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来处理。这个应该怎么做呢? 不知道我上面的描述是不是清楚了.
----------------------------------------------
-
作者:
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处理来的爽利
----------------------------------------------
-
作者:
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;
----------------------------------------------
-
作者:
2019/2/14 11:00:42
7楼:
其实上面不看也可以,里面的代码都是为了显示而已。 在IdHTTPServer1CommandGet事件取ARequestInfo.Params.text就好; 这个是针对indy老版本的,新版本的自己改下
----------------------------------------------
-
作者:
2019/2/14 11:03:46
8楼:
这个是用来获取 content-type=application/json 类型接口数据的,现在最流行的接口方式
----------------------------------------------
-
作者:
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);
----------------------------------------------
-
作者:
2019/2/14 21:18:50
11楼:
10楼的方法,我可以负责的告诉楼主,肯定捕捉不到xhr.只能捕捉常规的。。。其实3楼的就是真相,只是,这么弄,你自己去思考了。
----------------------------------------------
-
作者:
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; 不知道是否有简单的方法了。
----------------------------------------------
-
作者:
2019/2/20 9:13:48
13楼:
更正一下吧,10楼和3楼的方法都可以。已经开过贴说明了。楼主用idhttp,有点折腾了,而且如果是非纯get的请求的话,还涉及到重复提交数据的问题。
----------------------------------------------
-
作者:
2019/2/20 9:22:51
14楼:
我增加了这个功能在xp上运行出现以下的错误。
此帖子包含附件: 大小: 6.1K
----------------------------------------------
-
作者:
2019/2/20 9:23:28
15楼:
crystalmoon (黑夜杀手)感谢,我慢慢再爬爬这个坑吧
----------------------------------------------
-
作者:
2019/2/20 9:51:05
16楼:
最新的CEF已经不能再XP上玩了,先确保是CEF_3.2526.1373一下版本。。不过那就不能用Cef4Delphi了,硬要用需要自己改很多。。。。直接用原来的DCEF3版本吧。
----------------------------------------------
-
作者:
2019/2/20 10:30:46
17楼:
感谢 crystalmoon (黑夜杀手),不知道d10怎么使用gecko呢,这方面网上的资源太少了 http://bbs.2ccc.com/topic.asp?topicid=561175
----------------------------------------------
-
作者:
2019/2/20 10:34:37
18楼:
这个我也没玩过gecko,看了下已经很旧了。还是定心玩一个,把他玩好就是了。。。。有空可以看看miniblink,基于cef精简,接口比原生的cef简单的多,这个有Delphi的封装。关键是,兼容xp
----------------------------------------------
-
作者:
2019/2/20 16:53:30
19楼:
crystalmoon (黑夜杀手),我去https://github.com/yangyxd/wke-for-delphi下载了,有错误啊,安装不上啊
----------------------------------------------
-
作者:
2019/2/20 17:12:29
20楼:
你这个是音儿小白写的。最新的我没试验过。以前试验过是可以得。除了这个,还有 浪迹 不得闲 两位,也封装过。。 跑不起来就debug一下啊,也许mb的接口有变动?
----------------------------------------------
-