主要思路

鄒平ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
從UI獲取文本信息是最為簡單的方法,于是應該優先逆向UI代碼部分。
逆向微信apk
首先解包微信apk,用dex2jar反編譯classes.dex,然后用JD-GUI查看jar源碼。當然,能看到的源碼都是經過高度混淆的。但是,繼承自安卓重要組件(如Activity、Service等)的類名無法被混淆,于是還是能從中看到點東西。
首先定位到微信APP package。我們知道這個是 com.tencent.mm。
在 com.tencent.mm
中,我們找到一個 ui
包,有點意思。
展開 com.tencent.mm.ui
,發現多個未被混淆的類,其中發現 MMBaseActivity直接繼承自 Activity
, MMFragmentActivity
繼承自 ActionBarActivity
, MMActivity
繼承自 MMFragmentActivity
,并且 MMActivity
是微信中大多數Activity的父類:
public class MMFragmentActivity
extends ActionBarActivity
implements SwipeBackLayout.a, b.a {
...
}
public abstract class MMActivity
extends MMFragmentActivity {
...
}
public class MMBaseActivity
extends Activity {
...
}
現在需要找出朋友圈的Activity,為此要用Xposed hook MMActivity。
創建一個Xposed模塊
參考 [TUTORIAL]Xposed module devlopment,創建一個Xposed項目。
簡單Xposed模塊的基本思想是:hook某個APP中的某個方法,從而達到讀寫數據的目的。
小編嘗試hook com.tencent.mm.ui.MMActivity.setContentView這個方法,并打印出這個Activity下的全部TextView內容。那么首先需要遍歷這個Activity下的所有TextView,遍歷ViewGroup的方法參考了SO的以下代碼:
private void getAllTextViews(final View v) {if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i vg.getChildCount(); i++) {View child = vg.getChildAt(i);
getAllTextViews(child);
}
} else if (v instanceof TextView ) {
dealWithTextView((TextView)v); //dealWithTextView(TextView tv)方法:打印TextView中的顯示文本}
}
Hook MMActivity.setContentView
的關鍵代碼如下:
findAndHookMethod("com.tencent.mm.ui.MMActivity", lpparam.classLoader, "setContentView", View.class, new XC_MethodHook() {...
});
在findAndHookMethod方法中,第一個參數為完整類名,第三個參數為需要hook的方法名,其后若干個參數分別對應該方法的各形參類型。在這里, Activity.setContentView(View view)方法只有一個類型為 View
的形參,因此傳入一個 View.class
。
現在,期望的結果是運行時可以從Log中讀取到每個Activity中的所有的TextView的顯示內容。
但是,因為View中的數據并不一定在 setContentView()時就加載完畢,因此小編的實驗結果是,log中啥都沒有。
意外的收獲
當切換到朋友圈頁面時,Xposed模塊報了一個異常,異常源從 com.tencent.mm.plugin.sns.ui.SnsTimeLineUI這個類捕捉到。從類名上看,這個很有可能是朋友圈首頁的UI類。展開這個類,發現更多有趣的東西:
這個類下有個子類 a
(被混淆過的類名),該子類下有個名為 gyO的 ListView
類的實例。我們知道, ListView
是顯示列表類的UI組件,有可能就是用來展示朋友圈的列表。
順藤摸瓜
那么,我們先要獲得一個 SnsTimeLineUI.a.gyO的實例。但是在這之前,要先獲得一個 com.tencent.mm.plugin.sns.ui.SnsTimeLineUI.a的實例。繼續搜索,發現 com.tencent.mm.plugin.sns.ui.SnsTimeLineUI有一個名為 gLZ
的 SnsTimeLineUI.a
實例,那么我們先取得這個實例。
經過測試, com.tencent.mm.plugin.sns.ui.SnsTimeLineUI.a(boolean, boolean, String, boolean)這個方法在每次初始化微信界面的時候都會被調用。因此我們將hook這個方法,并從中取得 gLZ。
findAndHookMethod("com.tencent.mm.plugin.sns.ui.SnsTimeLineUI", lpparam.classLoader, "a", boolean.class, boolean.class, String.class, boolean.class, new XC_MethodHook() {@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {XposedBridge.log("Hooked. ");
Object currentObject = param.thisObject;
for (Field field : currentObject.getClass().getDeclaredFields()) { //遍歷類成員field.setAccessible(true);
Object value = field.get(currentObject);
if (field.getName().equals("gLZ")) {
XposedBridge.log("Child A found.");
childA = value;
//這里獲得了gLZ
...
}
}
}
});
現在取得了 SnsTimeLineUI.a
的一個實例 gLZ
,需要取得這個類下的 ListView
類型的 gyO
屬性。
private void dealWithA() throws Throwable{if (childA == null) {
return;
}
for (Field field : childA.getClass().getDeclaredFields()) { //遍歷屬性field.setAccessible(true);
Object value = field.get(childA);
if (field.getName().equals("gyO")) { //取得了gyOViewGroup vg = (ListView)value;
for (int i = 0; i vg.getChildCount(); i++) { //遍歷這個ListView的每一個子View...
View child = vg.getChildAt(i);
getAllTextViews(child); //這里調用上文的getAllTextViews()方法,每一個子View里的所有TextView的文本...
}
}
}
}
現在已經可以將朋友圈頁面中的全部文字信息打印出來了。我們需要根據TextView的子類名判斷這些文字是朋友圈內容、好友昵稱、點贊或評論等。
private void dealWithTextView(TextView v) {String className = v.getClass().getName();String text = ((TextView)v).getText().toString().trim().replaceAll("\n", " ");if (!v.isShown())
return;
if (text.equals(""))
return;
if (className.equals("com.tencent.mm.plugin.sns.ui.AsyncTextView")) {//好友昵稱
...
}
else if (className.equals("com.tencent.mm.plugin.sns.ui.SnsTextView")) {//朋友圈文字內容
...
}
else if (className.equals("com.tencent.mm.plugin.sns.ui.MaskTextView")) {if (!text.contains(":")) {
//點贊
...
} else {
//評論
...
}
}
}
自此,我們已經從微信APP里取得了朋友圈數據。當然,這部分抓取代碼需要定時執行。因為從 ListView中抓到的數據只有當前顯示在屏幕上的可見部分,為此需要每隔很短一段時間再次執行,讓用戶在下滑加載的過程中抓取更多數據。
剩下的就是數據分類處理和格式化輸出到文件,受本文篇幅所限不再贅述,詳細實現可參考作者GitHub上的源碼。
程序運行原理
給頁面文字添加span標簽,設置id="text-xx"唯一屬性,使用contenteditable="true",開啟該元素的編輯模式,用jQuery屬性.click()判斷點擊,用.text()返回此元素的文本內容,并用正則進行判斷內容是否合法,然后通過AJAX POST給php處理,php對傳入的參數進行過濾,然后讀取模版文件,替換模版文件對應內容,保存為新文件并記錄操作,最后返回數據給前端,前端處理數據并更新頁面。
可以通過代碼實現。
修改Scrapy項目中的文件,需要獲取的數據是朋友圈和發布日期,因此在這里定義好日期和動態兩個屬性,修改實現爬蟲邏輯的主文。
首先要導入模塊,尤其是要主要將WeixinMomentItem類導入進來,之后修改start_requests方法,修改parse方法,對導航數據包進行解析。
定義parse_moment函數,來抽取朋友圈和聊天信息數據,返回的數據以JSON加載的,用JSON去提取數據,之后就可以在命令行中進行程序運行了,在命令行中輸入scrapy crawl moment -o moment.json,之后可以得到微信聊天信息和朋友圈的數據。
申請應用AppKey申請方法:訪問友推網站后臺,登錄后進入應用列表,添加需要集成友推組件的App,如下圖,添加成功后可獲取應用的AppKey。如何把app分享到微信2申請社交平臺appkey集成前您需要為您的應用在各大社交網站的開放平臺申請賬號并通過審核,否則只能調用系統的分享菜單,無法跟蹤分享的回調事件及統計平臺如何把app分享到微信3引用youtui庫項目將youtui-lib項目庫和應用工程放在同一個目錄下在PackageExplorer中右鍵點擊工程的根目錄,選擇Properties(屬性),然后點擊,在Android選項點擊Add添加youtui-lib如何把app分享到微信4注冊需要分享的平臺1.配置各分享平臺key,該配置文件為youtui_sdk.xml,配置完放入工程的assets文件夾。2.如果需要分享到哪個平臺就將該平臺的Enable屬性設置為true.3.如果需要將某個平臺排列到前面,只需要改變它在youtui_sdk.xml文件中的位置即可。5各平臺需要注意的事項:新浪微博:新浪微博需要驗證應用簽名,請一定要在新浪開放平臺管理中心應用信息-基本信息-Android簽名包名信息配置該信息每次包名變化或者使用的.keystore變化都會導致應用簽名變化,請重新到新浪微博開放平臺設置。運行Demo時如果重新編譯,因為使用的.keystore文件變化也會導致應用簽名變化,導致Demo新浪微博分享無法正常工作,請運行Demo時使用Demo工程包中提供的debug.keystore替換C:\Users\Administrator.android中的debug.keystore文件微信和朋友圈:微信和朋友圈也需要驗證應用簽名,請在微信開放平臺管理中心修改應用-開發信息配置。QQ和QQ空間:QQ和QQ空間使用的是騰訊開放平臺api,請在騰訊開放平臺申請賬號和注冊應用,請不要使用QQ互聯(用于網站賬號登錄)的配置,雖然都是騰訊的,但是兩個平臺并不通用,除了需要在youtui_sdk.xml配置信息,還需要在manifest文件中的android:scheme中的tencent后的一串數字換成自己應用的appid。最后一行配置說明:選用調用系統分享菜單功能在AndroidManifest.xml注冊權限在AndroidManifest.xml注冊需要的Activity微信和朋友圈回調設置如果需要分享微信和朋友圈,必需建一個應用包名+.wxapi的包,在該包下建WXEntryActivity.java,將該類繼承cn.bidaround.youtui.wxapi.WXEntryActivity即可(里面不用寫代碼)publicclassWXEntryActivityextendscn.bidaround.youtui.wxapi.WXEntryActivity{}如圖:(將com.xingxinglangtuoche替換成你應用的package名,微信回調會使用到)如何把app分享到微信初始化友推開發者請在自己的程序開始,最好是在MainActivity的onCreate方法調用YtTemplate.init(this)初始化友推sdk,這樣友推sdk才能進行后續調用(否則分享等操作會出現空指針異常),例如:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);YtTemplate.init(this);/初始化友推/initView();}應用退出時:在您項目的出口Activity的onDestroy方法的第一行插入下面的代碼YtTemplate.release(this);此方法用于釋放內存,統計用戶使用情況,一旦調用了release,就必須重新調用init才能使用友推的功能,否則會出現空指針異常;創建ShareData實例,調用該實例的set方法設置需要分享的數據:創建ShareData實例,調用該實例的set方法設置自己需要分享的數據,關于該實例具體內容見下文,如果只是分享應用則只需要設置setIsAppShare(true)就可以分享應用在友推后臺填寫的信息和下載鏈接。ShareData包含的字段:isAppSharetextimagePathimageUrldescriptiontitletarget_url判斷是否為分享應用待分享的文字,短信要小于70個字符,微博要小于140個字符,如果需要分享鏈接,最好將鏈接url放在最后待分享的本地圖片地址,分享圖片的話需要在本地和網絡圖片中選一,如果都有則優先分享本地圖片待分享網絡圖片url,分享圖片的話需要在本地和網絡圖片中選一,如果都有則優先分享本地圖片待分享內容的描述待分享內容的標題待分享內容的跳轉鏈接通過創建該類實例,調用實例的set方法設置這些參數,例如:ShareDatashareData=newShareData();shareData.isAppShare=false;//設置為true則分享的信息從友推后臺填寫的應用信息中讀取,可動態更新,后面的值不用設置。shareData.setDescription("友推積分組件");shareData.setTitle("友推分享");shareData.setText("通過友推積分組件,開發者幾行代碼就可以為應用添加分享送積分功能,并提供詳盡的后臺統計數據,除了本身具備的分享功能外,開發者也可將積分功能單獨集成在已有分享組件的app上,");shareData.setTarget_url("");shareData.setImageUrl("");shareData.setImagePath("");各個平臺分享數據的限制和注意事項:因為各個平臺的分享限制,請分享時盡量分享圖片+鏈接,依靠鏈接來了解信息1)微信朋友圈微信分享為linkcard形式,超出的文字部分不會顯示2)新浪微博很低版本的新浪微博不支持發多類型微博,進行圖文分享時只會分享圖片,新浪微博分享消息最長為140字3)QQ、QQ空間QQ分享的消息最長40字,分享的標題最長30字,多余的部分將被忽略,description將被忽略QQ空間分享的消息最長200字,分享的標題最長600字,多余的部分將被忽略,description將被忽略4)騰訊微博只有image(imagePath或imageUrl)和text被分享,其他字段忽略,騰訊微博分享消息最長為140字5)人人網只有image(imagePath或imageUrl)和text被分享,其他字段忽略6)短信只有text被分享,其他字段忽略7)郵件只有text被分享,其他字段忽略如何把app分享到微信調用友推分享推薦組件為應用添加一個分享推薦按鈕,如:如何把app分享到微信在分享按鈕事件中調用youtui的組件即可,示例代碼:publicvoidonClick(Viewv){if(v.getId()==R.id.popup_bt){/調用友推分享推薦組件,YouTuiViewType類的常量為分享樣式參數,目前支持白色列表和黑色網格兩種//創建分享的模板,第一個參數為activity,第二個參數為分享窗口樣式,第三個參數為是否需要積分/YtTemplateblackTemp=newYtTemplate(this,YouTuiViewType.BLACK_POPUP,false);//黑色網格樣式不需要積分活動/YtTemplateblackTemp=newYtTemplate(this,YouTuiViewType.WHITE_LIST,ture);///白色列表樣式需要積分活動ShareDatashareData=newShareData();shareData.isAppShare=false;//設置為true則分享的信息從友推后臺填寫的應用信息中讀取,可動態更新后面的值不用設置。shareData.setDescription("友推積分組件");shareData.setTitle("友推分享");shareData.setText("通過友推積分組件,開發者幾行代碼就可以為應用添加分享送積分功能,并提供詳盡的后臺統計數據,除了本身具備的分享功能外,開發者也可將積分功能單獨集成在已有分享組件的app上,快來試試吧");shareData.setTarget_url("");shareData.setImageUrl("");shareData.setImagePath("");blackTemp.setShareData(shareData);//設置默認的分享數據;shareData設置參看4.6//**如果要為某個平臺設置不一樣的分享信息。則單獨設置*///blackTemp.addData(YtPlatform.PLATFORM_QQ,shareData);//調出分享窗口blackTemp.show();//如果需要自定義分享事件,可以創建監聽事件,然后在回調中處理YtShareListenerlistener1=newYtShareListener(){@OverridepublicvoidonSuccess(ErrorInfoarg0){}@OverridepublicvoidonPreShare(){}@OverridepublicvoidonError(ErrorInfoarg0){}@OverridepublicvoidonCancel(){}};//給新浪微博添加分享監聽blackTemp.addListener(YtPlatform.PLATFORM_SINAWEIBO,listener1);//給QQ添加分享監聽//blackTemp.addListener(YtPlatform.PLATFORM_QQ,listener2);}
新聞名稱:php抓取朋友圈發布數據 微信爬蟲抓取朋友圈
網頁鏈接:http://www.js-pz168.com/article40/ddjoseo.html
成都網站建設公司_創新互聯,為您提供品牌網站制作、企業建站、網站設計、品牌網站設計、網站建設、網站營銷
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯