fiddler插件開發(fā)-DouYinCapture(五)

fiddler插件開發(fā)-DouYinCapture

文集 移動端網(wǎng)頁端爬蟲
源碼

  • 前言

    前面幾篇文章介紹了app的自動化柒巫,但是光這樣只是去掉人工操作奉件,app運行時的請求并沒有抓下來踪宠。下面介紹如何通過代理實現(xiàn)數(shù)據(jù)的抓取 — DouYinCapture。

  • 介紹

    DouYinCapture是fiddler的最基礎(chǔ)最簡單的一個插件即實現(xiàn)了IFiddlerExtension, IAutoTamper, IAutoTamper2接口的dll類庫,只需要將這個dll文件加入到fiddler/scripts/下即能加載插件并按照我們的意愿過濾請求

  • 部分代碼

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Fiddler;
using RabbitMQ.Client;

namespace DouYinCaptuer
{ 
    public class Douyin : IFiddlerExtension, IAutoTamper, IAutoTamper2
    {
        private static IModel channel;
        private void sendTask(byte[] bs, string key)
        {
            try 
            {
                channel.BasicPublish(exchange: "DouYin",
                routingKey: key,
                basicProperties: null,
                body: bs);
                FiddlerApplication.Log.LogString("rabbitmq: send successfully");
            }
            catch (Exception)
            {
                FiddlerApplication.Log.LogString("rabbitmq: send timeout");
            }
        }
        //private static FileStream fs = new FileStream("I:\\fiddlerlog\\response\\douyin.txt", FileMode.Append, FileAccess.Write);
        public void AutoTamperRequestAfter(Session oSession)
        {
        }
         
        public void AutoTamperRequestBefore(Session oSession)
        {
        } 

        public void AutoTamperResponseAfter(Session oSession)
        {
            if (oSession.responseCode == 200)
            {
                String path = oSession.PathAndQuery.Split('?')[0];
                String queue = "";
                String key = "";
                switch (path)
                {
                    case "/aweme/v1/feed/":
                        // 首頁列表
                        queue = "douyin.author";
                        key = "douyin.author.feed";
                        break;
                    case "/aweme/v1/user/":
                        // 主播信息
                        queue = "douyin.author";
                        key = "douyin.author.info";
                        break;
                    case "/aweme/v1/aweme/post/":
                        // 主播作品
                        queue = "douyin.author";
                        key = "douyin.author.post";
                        break;
                    case "/aweme/v1/aweme/favorite/":
                        // 主播喜歡的視頻
                        queue = "douyin.author";
                        key = "douyin.author.favorite";
                        break;
                    case "/aweme/v1/user/following/list/":
                        // 主播關(guān)注
                        queue = "douyin.author";
                        key = "douyin.author.following";
                        break;
                    case "/aweme/v1/user/follower/list/":
                        // 主播粉絲
                        queue = "douyin.author";
                        key = "douyin.author.follower";
                        break;
                    case "/aweme/v1/music/detail/":
                        // 音樂人信息
                        queue = "douyin.music";
                        key = "douyin.music.detail";
                        break;
                    case "/aweme/v1/music/fresh/aweme/": 
                        // 使用某音樂最新的作品
                        queue = "douyin.music";
                        key = "douyin.music.fresh";
                        break;
                    case "/aweme/v1/music/aweme/":
                        // 使用某音樂的作品中最熱的
                        queue = "douyin.music";
                        key = "douyin.music.hot";
                        break;
                    case "/aweme/v1/comment/list/":
                        //評論列表
                        queue = "douyin.author";
                        key = "douyin.author.comment";
                        break;
                    case "/rest/n/feed/hot":
                        queue = "kuaishou.author";
                        key = "kuaishou.author.kol"; 
                        break;
                    default: 
                        return; 
                } 
                if (queue != "")
                {
                    // # 提取uid 放到response中
                    String uid_pattern = "user_id=(?<uid>\\d{1,13})&";
                    String mid_pattern = "music_id=(?<mid>\\d{1,20})&";
                    Match uid_match = Regex.Match(oSession.PathAndQuery, uid_pattern);
                    Match mid_match = Regex.Match(oSession.PathAndQuery, mid_pattern);
                   
                    /* String pattern = "\"uid\" ?: ?\"(?<uid>\\d{11,12})\"";
                     MatchCollection matches = Regex.Matches(oSession.GetResponseBodyAsString(), pattern);

                     foreach (Match match in matches)
                     {
                         fs.Write(Encoding.UTF8.GetBytes(match.Groups["uid"]+"\r\n"), 0, match.Groups["uid"].Length+"\r\n".Length);
                     }
                     */
                    string response = oSession.GetResponseBodyAsString().Trim();
                    string post_time = ", \"post_time\":\"" + GetTimestamp().ToString() + "\"}"; 
                    response = response.Substring(0, response.Length - 1) + post_time;
                    if (uid_match.Success)
                    {
                        string uid = ", \"uid\":\"" + uid_match.Groups["uid"] + "\"}";
                        response = response.Substring(0, response.Length - 1) + uid;
                    }
                    if (mid_match.Success) 
                    {
                        string mid = ", \"mid\":\"" + mid_match.Groups["mid"] + "\"}";
                        response = response.Substring(0, response.Length - 1) + mid;
                    }
                    sendTask(Encoding.UTF8.GetBytes(response), key);
                }
            }
        }

        public void AutoTamperResponseBefore(Session oSession)
        {
        }

        public void OnBeforeReturningError(Session oSession)
        {
        } 

        public void OnBeforeUnload()
        {
            FiddlerApplication.Log.LogString("卸載抖音插件成功");
            // fs.Close();
            channel.Close();
            channel.Dispose();
        }

        public void OnLoad()
        {
            FiddlerApplication.Log.LogString("加載抖音插件成功");
            try
            {
                ConnectionFactory rbmqfactory = new ConnectionFactory()
                {
                    HostName = "118.190.112.223",
                    Port = 5672,
                    UserName = "admin",
                    Password = "avGX9IHGeUVVcs5B"
                };
                IConnection con = rbmqfactory.CreateConnection();
                channel = con.CreateModel();
                FiddlerApplication.Log.LogString("連接RabbitMQ成功");
            }
            catch (Exception)
            {
                FiddlerApplication.Log.LogString("rabbitmq: send timeout");
            }
        }
          
        public void OnPeekAtResponseHeaders(Session oSession)
        {
        }
        public static long GetTimestamp()
        {
            TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1);//ToUniversalTime()轉(zhuǎn)換為標(biāo)準(zhǔn)時區(qū)的時間,去掉的話直接就用北京時間
            return (long)ts.TotalSeconds;//獲取10位
        }
    }
}

代碼很簡單茫藏,唯一需要注意的用了AssemblyInfo.cs的配置必須指定fiddler的最低版本民鼓,如果不指定薇芝,到時候fiddler既不報錯也不能生效插件就很騷了。下面是我的fiddler的版本

> [assembly: Fiddler.RequiredVersion("5.0.20182.28034")]
FIDDLER4.png
  • 至于如何將手機(jī)代理設(shè)置到fiddler丰嘉,相關(guān)教程網(wǎng)上一大堆
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夯到,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子饮亏,更是在濱河造成了極大的恐慌耍贾,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件路幸,死亡現(xiàn)場離奇詭異荐开,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)简肴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門晃听,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事能扒∮犊剩” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵初斑,是天一觀的道長辛润。 經(jīng)常有香客問我,道長见秤,這世上最難降的妖魔是什么砂竖? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮鹃答,結(jié)果婚禮上乎澄,老公的妹妹穿的比我還像新娘。我一直安慰自己挣跋,他們只是感情好三圆,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著避咆,像睡著了一般舟肉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上查库,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天路媚,我揣著相機(jī)與錄音,去河邊找鬼樊销。 笑死整慎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的围苫。 我是一名探鬼主播裤园,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剂府!你這毒婦竟也來了拧揽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤腺占,失蹤者是張志新(化名)和其女友劉穎淤袜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衰伯,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡铡羡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了意鲸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烦周。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡尽爆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出读慎,到底是詐尸還是另有隱情教翩,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布贪壳,位于F島的核電站,受9級特大地震影響蚜退,放射性物質(zhì)發(fā)生泄漏闰靴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一钻注、第九天 我趴在偏房一處隱蔽的房頂上張望蚂且。 院中可真熱鬧,春花似錦幅恋、人聲如沸杏死。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淑翼。三九已至,卻和暖如春品追,著一層夾襖步出監(jiān)牢的瞬間玄括,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工肉瓦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留遭京,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓泞莉,卻偏偏與公主長得像哪雕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鲫趁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理斯嚎,服務(wù)發(fā)現(xiàn),斷路器饮寞,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,694評論 0 3
  • =========================================================...
    lavor閱讀 3,484評論 0 5
  • 一天一天孝扛,自己又混了這么多日子,剛騎共享單車從生活區(qū)大門出來幽崩,想和對象打電話苦始,因為宿舍人太多不方便,一回頭看見一排...
    家小文閱讀 215評論 0 0
  • 很多情侶都會有這樣一種感覺慌申,就是談戀愛久了感情就慢慢淡了陌选,兩個人也回不到從前了理郑。其實如果沒有第三個人的出現(xiàn),你們兩...
    為什么昵稱老是被使用呢閱讀 284評論 0 3