fiddler 抓百度 app 直播间评论 php

此篇重点介绍下抓取百度app直播间评论,自动保存本地文件,PHP 提取解析。

前置准备

fiddler 配置、Openssl 安装等,网上资料比较多不是难题。安卓模拟器(比如夜神)。

乱码的问题

勾选工具栏上的 Decode
fiddler 抓百度直播间评论 php

编写自定义规则

fiddler 抓百度直播间评论 php

找到 OnBeforeResponse 方法

fiddler 抓百度直播间评论 php

后面追加自定义的代码

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 协议》,转载必须注明作者和本文链接
welcome come back
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
95
粉丝
24
喜欢
156
收藏
347
排名:324
访问:2.9 万
私信
所有博文
社区赞助商