fiddler 抓百度 app 直播間評論 php

php_yt發表於2020-12-23

此篇重點介紹下抓取百度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 協議》,轉載必須註明作者和本文連結
focus

相關文章