2020年9月10日更新:騰訊在9月9日,再次對簽到系統進行了大幅度的更新,整個實現思路失效!
本篇文章僅記錄實現思路,原文,並不放置源代碼,不喜繞道~
騰訊在8月12日,對QQ群進行了大幅度的更新,24小時全程自動登錄簽到腳本失效,腳本棄用。
新的腳本是通過php手動更新加密值到數據庫,java多線程執行簽到,並隨時監測會話是否失效,失效則通知管理員進行數據更新。
其實實現過程很簡單,我把整個思路記錄下來。
本篇文章開放評論,有問題可以隨時交流。
一、前因后果
之前的QQ是所有的cookie通用的,比如QQ空間跟QQ群跟手機app,都是同一套加密值。我之前就是通過登錄QQ空間,獲取到cookie,來實現自動的群簽到。當時是純java實現的,自動滑塊驗證登錄QQ
在8月12之前,簽到只需要skey即可,也可以攜帶p_skey。
經過8月12日更新之后,必須攜帶p_skey,QQ空間跟群的加密數據完全分離開了,也就是兩者的數據並不通用了,qq空間的p_skey跟qq群的p_skey並不通用。
舉個例子來說,之前登錄QQ空間,就可以查看你的群信息,進行一系列群操作,反之登錄Q群,同樣可以進行Q空間的一系列操作,現在就不能了。
8月12日到8月13日這兩天,看了下舊的腳本,猶豫要不要寫個新的。
寫個新的可能就要手動更新了,一想就很麻煩,果斷放棄了。
如果說加密值不一樣,那肯定就是服務器對session處理邏輯不一樣了,服務器的自然沒法看。但是,手機apk上面可以反編譯來查看它的加密算法啊,這是我的下意識。
說干就干,反編譯QQ。
先找pskey,找到了方法getPskey
然后根據里面邏輯,繼續找getLocalTicket
再找getLocalSig
此時看到這里,已經接近崩潰了,我整了一上午毫無進度,嘗試用別的方法(MT管理)進行編譯,但是還是失敗了。
我有種直覺,pskey的生成邏輯,apk的源碼里就有,只不過太麻煩
二、實現原理
具體流程
- php:手動更新cookie(加密值)到數據庫
- java:多線程監測會話是否失效,失效則下發郵件通知
- java:多線程定時簽到->隨機地點、隨機圖片、自增天數
通過手機或者電腦,將數據更新到服務器數據庫(數據庫采用觸發器,更新之前,將數據庫的time更改為當前時間)
java取出數據,然后開啟線程,進行每隔10分鍾的訪問,如果出錯,就會下發郵件通知(通過一個類的成員變量errorTime,判斷errorTime與數據庫中的時間是否相同,如果相同就是沒有更新數據,不會再次下發通知)
訪問時,需要攜帶bkn。通過chrome開發者工具全局ctrl+shift+f搜索bkn,可以找到加密算法。
Account account = QQSkey.getAccount();
String skey=account.getSkey();
int t=5381;
for(int n=0,o=skey.length();n<o;n++) {
t+=(t<<5)+(int)skey.charAt(n);
}
int bkn=2147483647&t;//即所求
接下來,只要cookie有效,就可以簽到咯