成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

對(duì)Soul 安卓App的一次 api請(qǐng)求 抓取記錄

Scott / 4307人閱讀

之前注冊(cè)玩過(guò)一段時(shí)間的社交app--soul,發(fā)現(xiàn)其沒(méi)有網(wǎng)頁(yè)版也沒(méi)有桌面版,app里也沒(méi)有相關(guān)的數(shù)據(jù)導(dǎo)出功能,作為一個(gè)老用戶,很多日常發(fā)布的瞬間很想導(dǎo)出來(lái),作為紀(jì)念,所以就想看看能不能腳本抓取我的數(shù)據(jù),才有了下面的記錄:

一.對(duì)soul抓包

分析Soul App的數(shù)據(jù)請(qǐng)求,需要用到工具對(duì)app應(yīng)用進(jìn)行抓包

0 - 工具:Fillder(直接下載安裝)
1 - 設(shè)置手機(jī)和電腦連接的wifi代理,具體步驟可以參考《使用fiddler對(duì)手機(jī)APP進(jìn)行抓包》
2 - 打開(kāi)Fillder,對(duì)soul 的數(shù)據(jù)請(qǐng)求api進(jìn)行跟蹤,抓到下面的請(qǐng)求:

1. 請(qǐng)求Header

其中有幾個(gè)主要的header :
api-sign : 請(qǐng)求簽名(由一個(gè) 字符串,UUID(替換"-"為""),時(shí)間戳 三個(gè)參數(shù)通過(guò)類c的
public static String a(aa paramaa, String paramString, long paramLong)
方法生成)
requeust-nonce:由UUID.randomUUID().toString().replaceAll("-", "")生成, 生成api-sign簽名的參數(shù)之一,String類型的UUID
X-Auth-UserId:用戶的ID(固定不變)
X-Auth-Token:用戶身份認(rèn)證Token(固定不變)
app-time:時(shí)間戳
其他的幾個(gè)如上圖所示,基本不會(huì)變化

2.響應(yīng)body

如圖所示,如果請(qǐng)求成功,返回的是一個(gè)json數(shù)據(jù)
失敗的話就是:{"code":9000003,"message":"您傳遞的信息有誤,請(qǐng)仔細(xì)檢查后重試","data":null,"success":false}

以上基本的抓包,可以知道現(xiàn)在需要的是api-sign的生成方法是怎樣的,然后根據(jù)自己的ID和token組合header進(jìn)行爬取的請(qǐng)求偽造。但官方?jīng)]有公開(kāi)API調(diào)用文檔,所以只有下載soul app的apk文件,進(jìn)行反編譯查看源碼

二、反編譯apk查找api簽名規(guī)則

1.反編譯工具

0 - dex2jar(直接下載)
1 - jd-GUI(直接下載,是一個(gè)可執(zhí)行的jar文件)
2 - soul 安卓版的apk

2.使用步驟

0 - 使用系統(tǒng)解壓軟件直接對(duì)apk文件解壓,獲得文件夾目錄,其中包含了classes.dex的類似文件,dex文件是Android虛擬機(jī)上面可以執(zhí)行的文件,jar文件其實(shí)就是java的class文件,解壓后如下圖:

1 - 下載dex2jar后解壓,將后綴為.dex的classes文件拷貝到dex2jar的目錄下,使用DOS的cmd進(jìn)入到該目錄,使用命令:

d2j-dex2jar  classes.dex

對(duì)dex文件進(jìn)行轉(zhuǎn)換為jar文件,該文件包含了soul App的java源碼:

2 - 使用jd-GUI查看jar文件的java源碼:
直接將classes2-dex2jar.jar 文件拖入到JD-GUI界面中,查找關(guān)鍵詞"api-sign"便可找到生成請(qǐng)求header的類及方法:

生成api-sign的方法:

  public static String a(aa paramaa, String paramString, long paramLong)
  {
    localStringBuilder = new StringBuilder();
    localStringBuilder.append(paramaa.a().a().getPath());
    HashMap localHashMap = new HashMap();
    Object localObject1 = new ArrayList();
    int i = 0;
    try
    {
      Object localObject2;
      while (i < ((s)paramaa.d()).a())
      {
        localObject2 = (s)paramaa.d();
        String str2 = ((s)localObject2).a(i);
        localHashMap.put(str2, ((s)localObject2).c(i));
        ((List)localObject1).add(str2);
        i += 1;
      }
      localObject1 = (String[])((List)localObject1).toArray(new String[0]);
      Arrays.sort((Object[])localObject1, String.CASE_INSENSITIVE_ORDER);
      if (localHashMap.size() != 0)
      {
        int j = localObject1.length;
        i = 0;
        while (i < j)
        {
          localObject2 = localObject1[i];
          if (!bw.a((CharSequence)localHashMap.get(localObject2))) {
            localStringBuilder.append((String)localObject2).append(URLDecoder.decode((String)localHashMap.get(localObject2), "Utf-8"));
          }
          i += 1;
        }
      }
      String str1;
      return f.b(localStringBuilder.toString()).toUpperCase();
    }
    catch (Exception localException1)
    {
      paramaa = paramaa.a();
      if (paramaa.q() > 0)
      {
        i = 0;
        for (;;)
        {
          if (i < paramaa.q())
          {
            str1 = paramaa.a(i);
            localObject1 = paramaa.b(i);
            if ((!bw.a(str1)) && (!bw.a((CharSequence)localObject1))) {}
            try
            {
              localObject2 = URLDecoder.decode(((String)localObject1).replaceAll("%(?![0-9a-fA-F]{2})", "%25"), "utf-8");
              localStringBuilder.append(str1).append((String)localObject2);
              i += 1;
            }
            catch (Exception localException3)
            {
              for (;;)
              {
                try
                {
                  localStringBuilder.append(str1).append((String)localObject1);
                }
                catch (Exception localException2) {}
              }
            }
          }
        }
      }
      localStringBuilder.append(UTDevice.getUtdid(SoulApp.b()));
      localStringBuilder.append("10000003");
      localStringBuilder.append(SoulApp.b().a().getAuthKey());
      localStringBuilder.append(a(paramLong));
      localStringBuilder.append(paramString);
      localStringBuilder.append("3.0.15".replaceAll(".", ""));
      j.a("genSign = :" + localStringBuilder.toString());
    }
  }
三、后續(xù)

后續(xù)有時(shí)間再把整個(gè)源碼看一遍。。畢竟還是代碼量不小。。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77168.html

相關(guān)文章

  • 研發(fā)手Q推廣遇到的一系列問(wèn)題

    摘要:第一次做和手對(duì)接的項(xiàng)目,雖然只是做一個(gè)靜態(tài)頁(yè)面,但是遇到的問(wèn)題無(wú)數(shù),分享出來(lái),做個(gè)記錄。項(xiàng)目需求,做一個(gè)靜態(tài)頁(yè)面,為導(dǎo)流,要求記錄號(hào),為后續(xù)分析準(zhǔn)備,頁(yè)面訪問(wèn)量使用統(tǒng)計(jì),頁(yè)面要能夠分享。 第一次做和手Q對(duì)接的項(xiàng)目,雖然只是做一個(gè)靜態(tài)頁(yè)面,但是遇到的問(wèn)題無(wú)數(shù),分享出來(lái),做個(gè)記錄。項(xiàng)目需求,做一個(gè)靜態(tài)頁(yè)面,為APP導(dǎo)流,要求記錄QQ號(hào),為后續(xù)分析準(zhǔn)備,頁(yè)面訪問(wèn)量使用MTA統(tǒng)計(jì),頁(yè)面要能夠分...

    Soarkey 評(píng)論0 收藏0
  • 如何用Python抓抖音上的小姐姐

    摘要:比如分鐘破譯朋友圈測(cè)試小游戲文章里用的方法但有些根本就沒(méi)有提供網(wǎng)頁(yè)端,比如今年火得不行的抖音。所以常用的方式就是通過(guò)在電腦上裝一些抓包軟件,將手機(jī)上的網(wǎng)絡(luò)請(qǐng)求全部顯示出來(lái)??偨Y(jié)下,重點(diǎn)是的抓取,關(guān)鍵是配置代理證書(shū),難點(diǎn)是對(duì)請(qǐng)求的分析。 爬蟲(chóng)的案例我們已講得太多。不過(guò)幾乎都是 網(wǎng)頁(yè)爬蟲(chóng) 。即使有些手機(jī)才能訪問(wèn)的網(wǎng)站,我們也可以通過(guò) Chrome 開(kāi)發(fā)者工具 的 手機(jī)模擬 功能來(lái)訪問(wèn),以便...

    FingerLiu 評(píng)論0 收藏0
  • 初步整理的關(guān)于 Progressive Web Apps 的資料

    摘要:在上看到發(fā)的視頻被狂轉(zhuǎn)開(kāi)始注意之前幾乎對(duì)這個(gè)詞語(yǔ)沒(méi)有印象看到是在的演講還以為是新技術(shù)在上找一下這次好多個(gè)視頻是關(guān)于的視頻的內(nèi)容主要是講網(wǎng)站優(yōu)化分別用做例子可惜沒(méi)有大概要等小右補(bǔ)方案應(yīng)該沒(méi)有問(wèn)題從視頻看優(yōu)化的效果非常顯著本來(lái)好幾秒的 在 Twitter 上看到 Addy Osmani 發(fā)的視頻被狂轉(zhuǎn), 開(kāi)始注意https://twitter.com/addyosmani/status/7...

    luffyZh 評(píng)論0 收藏0
  • 爬蟲(chóng)問(wèn)題總結(jié)

    摘要:編碼我們發(fā)現(xiàn),中有時(shí)候存在中文,這是就需要對(duì)進(jìn)行編碼??梢韵葘⒅形霓D(zhuǎn)換成編碼,然后使用方法對(duì)參數(shù)進(jìn)行編碼后傳遞。 本文檔對(duì)日常學(xué)習(xí)中用 python 做數(shù)據(jù)爬取時(shí)所遇到的一些問(wèn)題做簡(jiǎn)要記錄,以便日后查閱,部分問(wèn)題可能因?yàn)檎J(rèn)識(shí)不到位會(huì)存在一些誤解,敬請(qǐng)告知,萬(wàn)分感謝,共同進(jìn)步。 估算網(wǎng)站規(guī)模 該小節(jié)主要針對(duì)于整站爬取的情況。爬取整站之前,肯定是要先對(duì)一個(gè)網(wǎng)站的規(guī)模進(jìn)行估計(jì)。這是可以使用g...

    nanfeiyan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<