fiddler 抓百度 app 直播间评论 php
此篇重点介绍下抓取百度app直播间评论,自动保存本地文件,PHP 提取解析。
前置准备
fiddler 配置、Openssl 安装等,网上资料比较多不是难题。安卓模拟器(比如夜神)。
乱码的问题
勾选工具栏上的 Decode
编写自定义规则
找到 OnBeforeResponse
方法
后面追加自定义的代码
if (oSession.uriContains("pim.baidu.com/imsapi/1.0/fetchmsg/liveshow")){
try{
oSession.utilDecodeResponse();// 防止乱码
var jsonString = oSession.GetResponseBodyAsString();
var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(jsonString);
if((responseJSON.JSONObject=='System.Collections.ArrayList' || responseJSON.JSONObject=='System.Collections.Hashtable')&&jsonString!='[]'&&jsonString!='{}'){
// messages字段
var messages = responseJSON.JSONObject["messages"];
//FiddlerObject.log(messages); //打印
var str = '';
for(var j in messages){
var item = '';
item += "msgid="+j["msgid"];
item += "&from_user="+j["from_user"];
item += "&create_time="+j["create_time"];
var text = j["content"];
var textJson = Fiddler.WebFormats.JSON.JsonDecode(text);
var text_body = textJson.JSONObject["text"];
item += "&text='" + text_body + "'";
str += item + '|';
}
//保存
var fso;
var file;
fso = new ActiveXObject("Scripting.FileSystemObject");
//不要在C盘不要有中文,盘符分隔符用\\放入的时候要先创建
file = fso.OpenTextFile("E:\\WWW\\fiddler\\response\\"+ parseInt(+new Date()/1000) + ".txt",8 ,true, true);
file.write(str);
file.close();
}
}catch(e){
FiddlerObject.log(e)
FiddlerObject.log("啊哦!保存文本时候出错了!!!")
}
}
原始的数据不规则,建议先用 fiddler 层层解析后再保存文件。解析成 json
格式用的方法是 Fiddler.WebFormats.JSON.JsonDecode
,responseJSON.JSONObject["messages"]
是 messages
json 数组。
上面的代码拼装成了字符串参数形式,以 |
分隔。
后端解析保存的文件
// 保存文件的文件夹
$fidder_public_dir = 'E:\WWW\fiddler\response';
// 查看文件夹下的文件
$scan = $this->scanFile($fidder_public_dir);
/*return null or array*/
public function scanFile($path)
{
global $result;
$files = scandir($path);
foreach ($files as $file){
if ($file != '.' && $file != '..'){
$result[] = basename($file);
}
}
return $result;
}
// 提取其中一个
$filename = $scan[0];
// 完整路径
$filename_full = $fidder_public_dir.'/'.$filename;
// 去bom头
$content = $this->detect_utf_encoding($filename_full);
public function detect_utf_encoding($filename){
if( 'UTF-16LE' === $this->utf_encoding( $filename )){
return iconv('UTF-16', 'UTF-8', file_get_contents( $filename ));
}else {
return file_get_contents( $filename );
}
}
public function utf_encoding($filename) {
$utf32_big_bom = chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF);
$utf32_little_bom = chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00);
$utf16_big_bom = chr(0xFE) . chr(0xFF);
$utf16_little_bom = chr(0xFF) . chr(0xFE);
$utf8_bom = chr(0xEF) . chr(0xBB) . chr(0xBF);
$text = file_get_contents($filename);
$first2 = substr($text, 0, 2);
$first3 = substr($text, 0, 3);
$first4 = substr($text, 0, 3);
if ($first3 == $utf8_bom) return 'UTF-8';
elseif ($first4 == $utf32_big_bom) return 'UTF-32BE';
elseif ($first4 == $utf32_little_bom) return 'UTF-32LE';
elseif ($first2 == $utf16_big_bom) return 'UTF-16BE';
elseif ($first2 == $utf16_little_bom) return 'UTF-16LE';
}
// 保存到新的地址
$new_save_dir = public_path().'/fiddler/response/';
file_put_contents( $new_save_path.$filename, $content);
// 删除原文件
unlink($filename_full);
// 解析
$arr = explode('|',$content);
foreach ($arr as $value) {
parse_str(trim($value),$tmp);
$item['msgid'] = $tmp['msgid'];
...
}
// 入库
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: