我正在尝试监控网站(www.bidcactus.com)。在网站上我打开Firebug,转到网络选项卡,然后单击XHR选项卡。
我想接受请求的响应并将其保存到mySql数据库(我的计算机上运行了本地数据库(XAMPP)。
我被告知主要使用jQuery或JavaScript做各种各样的事情,但我也没有经验,所以我想知道是否有人可以帮助我。
有人建议我这个链接 Using Greasemonkey and jQuery to intercept JSON/AJAX data from a page, and process it
它使用Greasemonkey,我也不太了解......
提前感谢您提供任何帮助
示例/更多细节:
在监控发送的请求时(通过firebug),我在下面看到
http://www.bidcactus.com/CactusWeb/ItemUpdates?rnd=1310684278585
The response of this link is the following:
{"s":"uk5c","a":[{"w":"MATADORA","t":944,"p":5,"a":413173,"x":10},
{"w":"1000BidsAintEnough","t":6,"p":863,"a":413198,"x":0},
{"w":"YourBidzWillBeWastedHere","t":4725,"p":21,"a":413200,"x":8},
{"w":"iwillpay2much","t":344,"p":9,"a":413201,"x":9},
{"w":"apcyclops84","t":884,"p":3,"a":413213,"x":14},
{"w":"goin_postal","t":165,"p":5,"a":413215,"x":12},
{"w":"487951","t":825,"p":10,"a":413218,"x":6},
{"w":"mishmash","t":3225,"p":3,"a":413222,"x":7},
{"w":"CrazyKatLady2","t":6464,"p":1,"a":413224,"x":2},
{"w":"BOSS1","t":224,"p":102,"a":413230,"x":4},
{"w":"serbian48","t":62,"p":2,"a":413232,"x":11},
{"w":"Tuffenough","t":1785,"p":1,"a":413234,"x":1},
{"w":"apcyclops84","t":1970,"p":1,"a":413240,"x":13},
{"w":"Tuffenough","t":3524,"p":1,"a":413244,"x":5},
{"w":"Cdm17517","t":1424,"p":1,"a":413252,"x":3}],"tau":"0"}
我了解这些信息,我认为我可以自己格式化,但网站会随机创建新请求
示例http://www.bidcactus.com/CactusWeb/ItemUpdates?rnd=XXXXXXXXXXXX
而且我不确定它是如何创造它们的。
所以我需要获取所有项目更新请求的响应,并将信息发送到mysql数据库。
答案 0 :(得分:3)
好的,这是工作代码,有点针对该网站(仅限首页,没有帐户)。
使用说明:
安装GM脚本。请注意,目前它只是Firefox。
观察它在Firebug的控制台中运行,并调整过滤器部分(清楚标记),以定位您感兴趣的数据。(可能是整个a
数组?)
请注意,打印“脚本开始”后可能需要几秒钟,因为ajax拦截开始。
设置您的Web应用程序和服务器以接收数据。该脚本发布了JSON,因此PHP会抓取数据,如下所示:
$jsonData = json_decode ($HTTP_RAW_POST_DATA);
将脚本指向您的服务器。
瞧。她已经完成了。
/******************************************************************************
*******************************************************************************
** This script intercepts ajaxed data from the target web pages.
** There are 4 main phases:
** 1) Intercept XMLHttpRequest's made by the target page.
** 2) Filter the data to the items of interest.
** 3) Transfer the data from the page-scope to the GM scope.
** NOTE: This makes it technically possibly for the target page's
** webmaster to hack into GM's slightly elevated scope and
** exploit any XSS or zero-day vulnerabilities, etc. The risk
** is probably zero as long as you don't start any feuds.
** 4) Use GM_xmlhttpRequest () to send the data to our server.
*******************************************************************************
*******************************************************************************
*/
// ==UserScript==
// @name _Record ajax, JSON data.
// @namespace stackoverflow.com/users/331508/
// @description Intercepts Ajax data, filters it and then sends it to our server.
// @include http://www.bidcactus.com/*
// ==/UserScript==
DEBUG = true;
if (DEBUG) console.log ('***** Script Start *****');
/******************************************************************************
*******************************************************************************
** PHASE 1 starts here, this is the XMLHttpRequest intercept code.
** Note that it will not work in GM's scope. We must inject the code to the
** page scope.
*******************************************************************************
*******************************************************************************
*/
funkyFunc = ( (<><![CDATA[
DEBUG = false;
//--- This is where we will put the data we scarf. It will be a FIFO stack.
payloadArray = []; //--- PHASE 3a
(function (open) {
XMLHttpRequest.prototype.open = function (method, url, async, user, pass)
{
this.addEventListener ("readystatechange", function (evt)
{
if (this.readyState == 4 && this.status == 200) //-- Done, & status "OK".
{
var jsonObj = null;
try {
jsonObj = JSON.parse (this.responseText); // FF code. Chrome??
}
catch (err) {
//if (DEBUG) console.log (err);
}
//if (DEBUG) console.log (this.readyState, this.status, this.responseText);
/******************************************************************************
*******************************************************************************
** PHASE 2: Filter as much as possible, at this stage.
** For this site, jsonObj should be an object like so:
** { s="1bjqo", a=[15], tau="0"}
** Where a is an array of objects, like:
** a 417387
** p 1
** t 826
** w "bart69"
** x 7
*******************************************************************************
*******************************************************************************
*/
//if (DEBUG) console.log (jsonObj);
if (jsonObj && jsonObj.a && jsonObj.a.length > 1) {
/*--- For demonstration purposes, we will only get the 2nd row in
the `a` array. (Probably stands for "auction".)
*/
payloadArray.push (jsonObj.a[1]);
if (DEBUG) console.log (jsonObj.a[1]);
}
//--- Done at this stage! Rest is up to the GM scope.
}
}, false);
open.call (this, method, url, async, user, pass);
};
} ) (XMLHttpRequest.prototype.open);
]]></>).toString () );
function addJS_Node (text, s_URL)
{
var scriptNode = document.createElement ('script');
scriptNode.type = "text/javascript";
if (text) scriptNode.textContent = text;
if (s_URL) scriptNode.src = s_URL;
var targ = document.getElementsByTagName('head')[0] || d.body || d.documentElement;
targ.appendChild (scriptNode);
}
addJS_Node (funkyFunc);
/******************************************************************************
*******************************************************************************
** PHASE 3b:
** Set up a timer to check for data from our ajax intercept.
** Probably best to make it slightly faster than the target's
** ajax frequency (about 1 second?).
*******************************************************************************
*******************************************************************************
*/
timerHandle = setInterval (function() { SendAnyResultsToServer (); }, 888);
function SendAnyResultsToServer ()
{
if (unsafeWindow.payloadArray) {
var payload = unsafeWindow.payloadArray;
while (payload.length) {
var dataRow = JSON.stringify (payload[0]);
payload.shift (); //--- pop measurement off the bottom of the stack.
if (DEBUG) console.log ('GM script, pre Ajax: ', dataRow);
/******************************************************************************
*******************************************************************************
** PHASE 4: Send the data, one row at a time, to the our server.
** The server would grab the data with:
** $jsonData = json_decode ($HTTP_RAW_POST_DATA);
*******************************************************************************
*******************************************************************************
*/
GM_xmlhttpRequest ( {
method: "POST",
url: "http://localhost/db_test/ShowJSON_PostedData.php",
data: dataRow,
headers: {"Content-Type": "application/json"},
onload: function (response) {
if (DEBUG) console.log (response.responseText);
}
} );
}
}
}
//--- EOF
其他说明:
我在该网站的主页上测试了它,没有登录(我不打算在那里创建一个帐户)。
我使用 AdBlock , FlashBlock , NoSCript 和 RequestPolicy 进行了全面测试。 JS为 bidcactus.com 打开了(它必须是)但没有其他人。重新开启所有这些不应该引起副作用 - 但如果确实如此,我就不会调试它。
此类代码必须针对网站进行调整,以及如何浏览所述网站 1 。这取决于你。希望代码足够自我记录。
享受!
1 主要是:@include
和@exclude
指令,JSON数据选择和过滤,以及是否需要阻止iFrame。此外,建议在完成调整时将2 DEBUG
个变量(一个用于GM范围,一个用于页面范围)设置为false
。
答案 1 :(得分:-3)
通过
,我没有经历过greasemonkey