我希望获得当您在ads settings page选择加入时Google发出的id
Cookie(如果您已经接受了目标广告,则必须先选择退出以查看我指的是)。
我发现,为了获取此Cookie,您必须在此页面中的表单中对GET
网址执行HTTP action
。问题是此URL包含为每个新HTTP连接更改的哈希,因此,首先,我必须转到此页面并获取此URL,然后执行GET
到URL。
我正在使用HttpComponents来获取http://www.google.com/ads/preferences但是当我使用JSOUP解析内容时,只有一个脚本,并且找不到任何表单。
我担心会发生这种情况,因为内容是使用某种超时动态加载的...有人知道解决方法吗?
编辑:顺便说一句,我现在使用的代码是:
HttpClient httpclient = new DefaultHttpClient();
// Create a local instance of cookie store
CookieStore cookieStore = new BasicCookieStore();
// Bind custom cookie store to the local context
((AbstractHttpClient) httpclient).setCookieStore(cookieStore);
CookieSpecFactory csf = new CookieSpecFactory() {
public CookieSpec newInstance(HttpParams params) {
return new BrowserCompatSpec() {
@Override
public void validate(Cookie cookie, CookieOrigin origin)
throws MalformedCookieException {
// Allow all cookies
System.out.println("Allowed cookie: " + cookie.getName() + " "
+ cookie.getValue() + " " + cookie.getPath());
}
};
}
};
((AbstractHttpClient) httpclient).getCookieSpecs().register("EASY", csf);
// Create local HTTP context
HttpContext localContext = new BasicHttpContext();
// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
HttpGet httpget = new HttpGet(doubleClickURL);
// Override the default policy for this request
httpclient.getParams().setParameter(
ClientPNames.COOKIE_POLICY, "EASY");
// Pass local context as a parameter
HttpResponse response = httpclient.execute(httpget, localContext);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(instream));
instream.close();
// Find action attribute of form
Document document = Jsoup.parse(reader.readLine());
Element form = document.select("form").first();
String optinURL = form.attr("action");
URL connection = new URL(optinURL);
// ... get id Cookie
}
答案 0 :(得分:1)
您可能有更多机会使用HtmlUnit,Selenium或jWebUnit来完成此类任务。 JSoup不解释Javascript,而您指向的Google页面中充满了Javascript,应该由浏览器执行以生成您所看到的内容。
HtmlUnit是独立于操作系统的,不需要安装任何其他东西,但我从未将它用于复杂的Javascript站点。 HtmlUnit也可以像JSoup那样从网页中提取数据,但是如果你喜欢使用它,你仍然可以将html提供给JSoup。
答案 1 :(得分:0)
最后我发现了!我发现以下网站描述了doubleclick cookie协议:
然后,就像在名称为id
且值为A
的域中设置Cookie一样简单。然后向http://www.google.com/ads/preferences发出HTTP请求,他们将设置正确的ID值。
这是一个非常具体的问题,但我希望这能为未来的观众服务。
顺便说一句,我发现amazon.com就是广告网络的成员。双击的HTTP请求通过主页面中的脚本发送到:
http://ad.doubleclick.net/adj/amzn.us.gw.atf
在那里你可以找到一个似乎是实际代码的脚本来为你提供id cookie。不过,如果您使用值为A
的Cookie来访问它,则会设置双击的ID。