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

資訊專(zhuān)欄INFORMATION COLUMN

一鍵生成屬于自己的QQ歷史報(bào)告,看看你對(duì)自己的QQ了解程度有多深?

JinB / 2516人閱讀

摘要:一鍵生成屬于自己的歷史報(bào)告,看看你對(duì)自己的了解程度有多深簡(jiǎn)介近幾年,由于微信的流行,大部分人不再頻繁使用,所以我們對(duì)于自己的數(shù)據(jù)并不是特別了解。這里要說(shuō)明的是,加密函數(shù)的獲取,需要具備一定的抓包基礎(chǔ)才能獲取得到。

[TOC]

一鍵生成屬于自己的QQ歷史報(bào)告,看看你對(duì)自己的QQ了解程度有多深? 簡(jiǎn)介

近幾年,由于微信的流行,大部分人不再頻繁使用QQ,所以我們對(duì)于自己的QQ數(shù)據(jù)并不是特別了解。我相信,如果能夠生成一份屬于自己的QQ歷史報(bào)告,那將是無(wú)比開(kāi)心的一件事。

目前網(wǎng)上關(guān)于QQ的數(shù)據(jù)分析工具較少,原因是QQ相關(guān)接口比較復(fù)雜。而本程序的運(yùn)行十分簡(jiǎn)單,具有良好的用戶(hù)交互界面,只需要掃碼登錄一步操作即可。

目前本程序獲取的數(shù)據(jù)包括:QQ詳細(xì)數(shù)據(jù)、手機(jī)在線時(shí)間、非隱身狀態(tài)下在線時(shí)間、QQ活躍時(shí)間、單向好友數(shù)量、QQ財(cái)產(chǎn)分析、群聊分析、過(guò)去一年我退出的群聊數(shù)據(jù)、退去一個(gè)月我刪除的好友數(shù)據(jù)、所有代付信息、我最在意的人以及最在意我的人。由于相關(guān)的數(shù)據(jù)接口有訪問(wèn)限制,所以本程序并沒(méi)有對(duì)QQ好友進(jìn)行分析。

功能截圖




如何運(yùn)行
# 跳轉(zhuǎn)到當(dāng)前目錄
cd 目錄名
# 先卸載依賴(lài)庫(kù)
pip uninstall -y -r requirement.txt
# 再重新安裝依賴(lài)庫(kù)
pip install -r requirement.txt
# 開(kāi)始運(yùn)行
python main.py
編寫(xiě)思路

本程序分為多個(gè)模塊,模塊如下:

main.py,主程序,用于獲取并處理相關(guān)數(shù)據(jù),并導(dǎo)出數(shù)據(jù)報(bào)告。

qq_bot.py, 核心模塊,實(shí)現(xiàn)了qq相關(guān)的接口,較為復(fù)雜。

tkinter_gui.py,繪制gui模塊,使用tkinter繪制基本的交互界面。

static_data.py,數(shù)據(jù)存儲(chǔ)模塊,所有數(shù)據(jù)采用base64編碼存儲(chǔ)。

main.py模塊

首先,初始化相關(guān)文件夾,并調(diào)用qq_bot.py模塊,定義一個(gè)qq bot對(duì)象,該對(duì)象為本程序的核心對(duì)象,所有數(shù)據(jù)獲取均從該對(duì)象獲取。
同時(shí),本程序數(shù)據(jù)的報(bào)告文件為.md格式

    # 初始化文件夾
    init_folders()
    # 寫(xiě)入項(xiàng)目所需資源文件到本地目錄
    write_data()

    # 創(chuàng)建一個(gè)自己編寫(xiě)的qq bot對(duì)象
    bot = Bot()
    custom_print(u"登錄成功,正在獲取數(shù)據(jù)...")

    # 定義欲輸出的markdown字符串
    markdown_content = """
    

{qq_number}的個(gè)人QQ歷史報(bào)告
" + "## 我的詳細(xì)資料 " + "種類(lèi)|內(nèi)容 :- | :- " for key, value in detail_information.items(): if key == "qq_level": star_count, moon_count, sun_count, crown_count = calculate_level(value) data = crown_count * "![](data/level_crown.png)" + sun_count * "![](data/level_sun.png)" + moon_count * "![](data/level_moon.png)" + star_count * "![](data/level_star.png)" content += "{}|{} ".format(key_dict[key], data) else: content += "{}|{} ".format(key_dict[key], value) # 更新一下欲輸出的markdown文本 markdown_content += content markdown_content += " > 注:?jiǎn)蜗蚝糜驯硎舅?她的列表中有你,而你的列表中沒(méi)有他/她" # 每個(gè)步驟完成后,保存markdown文件,以便防止程序出錯(cuò)時(shí)能夠保存到最新的數(shù)據(jù) with open("{}的個(gè)人QQ歷史報(bào)告.md".format(bot.qq_number), "w", encoding="utf-8") as file: file.write(markdown_content)

接著,獲取所有qq好友的備注名和qq號(hào)

    all_qq_friends = bot.get_all_friends_in_qq()
    custom_print(u"所有qq好友號(hào)碼和備注名中...")
    qq_number_list = []
    for key, friend_group in all_qq_friends.items():
        for info in friend_group["mems"]:
            qq_number_list.append(info["uin"])

并獲取所有群數(shù)據(jù)

    # 獲取所有群信息
    custom_print(u"獲取該QQ加入的所有群信息...")
    group_list = bot.get_group()
    print(group_list)
    # content為markdown語(yǔ)法文本
    content = "



" + "## 我加入的群資料 " + "序號(hào)|群名|群號(hào)|群主QQ :- | :-| :-| :- " # 獲取某個(gè)群的群成員信息 for index, group in enumerate(group_list): group_number = group["gc"] group_name = group["gn"] owner = group["owner"] content += "{}|{}|{}|{} ".format(str(index+1), str(group_name), str(group_number), str(owner)) # 更新一下欲輸出的markdown文本 markdown_content += content # 每個(gè)步驟完成后,保存markdown文件,以便防止程序出錯(cuò)時(shí)能夠保存到最新的數(shù)據(jù) with open("{}的個(gè)人QQ歷史報(bào)告.md".format(bot.qq_number), "w", encoding="utf-8") as file: file.write(markdown_content)

接下來(lái)的步驟如你所需,也就是獲取其他相關(guān)的數(shù)據(jù),所以本小節(jié)就不一一詳細(xì)解釋了,您可以查看相關(guān)源代碼查看。獲取的數(shù)據(jù)包括:

獲取過(guò)去30天內(nèi)退出的群名單

獲取過(guò)去364天內(nèi)刪除的好友名單

判斷此次登錄的qq是否為vip或者svip

獲取qb值

獲取代付信息

親密度排行榜

共同好友數(shù)

成為好友的天數(shù)

qq_bot模塊

此模塊實(shí)現(xiàn)了獲取qq數(shù)據(jù)的接口,主要通過(guò)抓包獲得數(shù)據(jù)、分析數(shù)據(jù),對(duì)參數(shù)進(jìn)行加密解密等。

首先,是模擬掃碼登錄id.qq.com,qun.qq.com,qzone.qq.com。三者登錄方式大同小異,唯一有區(qū)別的就是提交數(shù)據(jù)中的參數(shù)加密方式不同。
我們以id.qq.com登錄為例:

    def login_id_qq_com(self):
        # 登錄id.qq.com

        # 訪問(wèn)網(wǎng)頁(yè),為了獲取參數(shù)pt_login_sig
        login_url = "https://xui.ptlogin2.qq.com/cgi-bin/xlogin?pt_disable_pwd=1&appid=1006102&daid=1&style=23&hide_border=1&proxy_url=https://id.qq.com/login/proxy.html&s_url=https://id.qq.com/index.html"
        html = get_html(login_url, "")
        # 對(duì)返回的cookies進(jìn)行轉(zhuǎn)化為dict類(lèi)型,方便處理
        cookies_back_dict = dict_from_cookiejar(html.cookies)
        pt_login_sig = cookies_back_dict["pt_login_sig"]
        self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict)

        # 訪問(wèn)網(wǎng)頁(yè),為了獲取參數(shù)ptqrtoken
        qrcode_url = "https://ssl.ptlogin2.qq.com/ptqrshow?appid=1006102&e=2&l=M&s=4&d=72&v=4&t=0.10239549811477189&daid=1&pt_3rd_aid=0"
        html = get_html(qrcode_url, "")
        # 對(duì)返回的cookies進(jìn)行轉(zhuǎn)化為dict類(lèi)型,方便處理
        cookies_back_dict = dict_from_cookiejar(html.cookies)
        qrsig = cookies_back_dict["qrsig"]
        ptqrtoken = hash33_token(qrsig)
        self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict)


        # 將二維碼顯示到圖片框
        BytesIOObj = BytesIO()
        BytesIOObj.write(html.content)
        qr_code = PIL.Image.open(BytesIOObj)
        image = PIL.ImageTk.PhotoImage(qr_code)
        image_label["image"] = image


        # 實(shí)時(shí)檢測(cè)二維碼狀態(tài)
        while (True):
            # 目標(biāo)網(wǎng)址
            target_url = "https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https://id.qq.com/index.html&ptqrtoken=" + str(ptqrtoken) + "&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-1556812236254&js_ver=19042519&js_type=1&login_sig=" + str(pt_login_sig) + "&pt_uistyle=40&aid=1006102&daid=1&"

            # 登錄,需要帶上訪問(wèn)cookies
            html = get_html(target_url, self.cookies_merge_dict_in_id_qq_com)

            # 返回的響應(yīng)碼為200說(shuō)明二維碼沒(méi)過(guò)期
            if (html.status_code):
                if ("二維碼未失效" in html.text):
                    custom_print(u"(1/3)登錄id.qq.com中,當(dāng)前二維碼未失效,請(qǐng)你掃描二維碼進(jìn)行登錄")
                elif ("二維碼認(rèn)證" in html.text):
                    custom_print(u"(1/3)登錄id.qq.com中,掃描成功,正在認(rèn)證中")
                elif ("登錄成功" in html.text):
                    self.is_login = True
                    custom_print(u"(1/3)登錄id.qq.com中,登錄成功")
                    break
                if ("二維碼已經(jīng)失效" in html.text):
                    custom_print(u"(1/3)登錄id.qq.com中,當(dāng)前二維碼已失效,請(qǐng)重啟本軟件")
                    exit()

            # 延時(shí)
            time.sleep(2)

        # 登錄成功后,把返回的cookies合并進(jìn)去
        self.cookies_merge_dict_in_id_qq_com = dict_from_cookiejar(html.cookies)
        self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict)
        # print(u"當(dāng)前cookies:{}".format(cookies_merge_dict))

        # 獲取此次登錄的qq號(hào)碼
        qq_list = re.findall(r"&uin=(.+?)&service", html.text)
        self.qq_number = qq_list[0]


        # 登錄成功后,會(huì)返回一個(gè)地址,需要對(duì)該地址進(jìn)行訪問(wèn)以便獲取新的返回cookies
        startIndex = (html.text).find("http")
        endIndex = (html.text).find("pt_3rd_aid=0")
        url = (html.text)[startIndex:endIndex] + "pt_3rd_aid=0"

        # 屏蔽https證書(shū)警告
        urllib3.disable_warnings()

        # 這里需要注意的是,需要禁止重定向,才能正確獲得返回的cookies
        html = get(url, cookies=self.cookies_merge_dict_in_id_qq_com, allow_redirects=False, verify=False)
        # 把返回的cookies合并進(jìn)去
        cookies_back_dict = dict_from_cookiejar(html.cookies)
        self.cookies_merge_dict_in_id_qq_com.update(cookies_back_dict)

首先是訪問(wèn)指定網(wǎng)址,獲取參數(shù)pt_login_sig,其次是訪問(wèn)另外一個(gè)網(wǎng)址,獲取參數(shù)qrsig,通過(guò)加密函數(shù),將參數(shù)qrsig轉(zhuǎn)化為ptqrtoken,然后就是獲取二維碼圖片的狀態(tài)了。當(dāng)我們檢測(cè)到登錄成功時(shí),就證明用戶(hù)已經(jīng)完成掃碼操作,此時(shí)將網(wǎng)址返回的cookie保存下來(lái)。

這里要說(shuō)明的是,加密函數(shù)的獲取,需要具備一定的抓包基礎(chǔ)才能獲取得到。本程序的幾個(gè)加密函數(shù)如下:

# 對(duì)qrsig進(jìn)行基本的加密,該加密函數(shù)由抓包獲得,需要具備一定抓包知識(shí)才能找到該加密函數(shù)
# 根據(jù)javascript版的加密函數(shù),將其改寫(xiě)成python版本
def hash33_token(t):
    e, n = 0, len(t)
    for i in range(0,n):
        e += (e << 5) + ord(t[i])
    return 2147483647 & e



# 對(duì)skey進(jìn)行基本的加密,該加密函數(shù)由抓包獲得,需要具備一定抓包知識(shí)才能找到該加密函數(shù)
# 根據(jù)javascript版的加密函數(shù),將其改寫(xiě)成python版本
def hash33_bkn(skey):
    e = skey
    t = 5381

    for n in range(0,len(e)):
        t += (t << 5) + ord(e[n])
    return 2147483647 & t

由于該模塊下具有許多獲取相關(guān)數(shù)據(jù)的qq接口,但是它們的形式非常相似,所以本節(jié)僅僅以獲取所有qq群數(shù)據(jù)為例:

    def get_group(self):

        # 獲取所有群基本信息
        # bkn由參數(shù)skey通過(guò)另一個(gè)加密函數(shù)得到
        bkn = hash33_bkn(self.cookies_merge_dict_in_qun_qq_com["skey"])
        submit_data = {"bkn": bkn}
        html = post_html("https://qun.qq.com/cgi-bin/qun_mgr/get_group_list", self.cookies_merge_dict_in_qun_qq_com, submit_data)
        group_info = loads(html.text)
        print(group_info)
        return group_info["join"]

這里主要涉及到的還是參數(shù)的加密、解密過(guò)程,這是一個(gè)難點(diǎn),其他的話還是比較簡(jiǎn)單的。

tkinter_gui模塊

這個(gè)模塊是繪制基本的gui模塊,采用python內(nèi)置的tkinter模塊完成,用法相當(dāng)簡(jiǎn)單,這里就不詳細(xì)講了。

static_data模塊

這個(gè)模塊主要是用來(lái)存儲(chǔ)相關(guān)的數(shù)據(jù)的,在程序每次運(yùn)行時(shí),將該靜態(tài)資源文件輸出。這么做的原因是可以防止用戶(hù)將某些靜態(tài)數(shù)據(jù)給刪除了,導(dǎo)致程序運(yùn)行錯(cuò)誤。

補(bǔ)充

完整版源代碼存放在github上,有需要的可以下載

項(xiàng)目持續(xù)更新,歡迎您star本項(xiàng)目

License

The MIT License (MIT)

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

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

相關(guān)文章

  • 為什么我需要深度學(xué)習(xí)?

    摘要:為什么我又要重新開(kāi)始寫(xiě)機(jī)器學(xué)習(xí)相關(guān)的文章了最主要的原因是現(xiàn)在的機(jī)器學(xué)習(xí)和五年前十年前區(qū)別很大。深度學(xué)習(xí)帶來(lái)了什么深度學(xué)習(xí)最重要的東西就是自帶了特征學(xué)習(xí),有時(shí)候也被翻譯為表征學(xué)習(xí),簡(jiǎn)單來(lái)說(shuō)就是,不需要進(jìn)行特別的特征抽取。 1.為什么我開(kāi)始寫(xiě)這個(gè)系列博客說(shuō)五年前我還在某A云公司的時(shí)候,身在一個(gè)機(jī)器學(xué)習(xí)算法組,對(duì)機(jī)器學(xué)習(xí)懷有濃厚的興趣。花了好多的時(shí)間來(lái)試圖搞清楚各種流行的機(jī)器學(xué)習(xí)算法,經(jīng)常周末也跟...

    lordharrd 評(píng)論0 收藏0
  • 一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告,了解微信社交歷史

    摘要:一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告了解你的微信社交歷史簡(jiǎn)介你是否想過(guò)生成一份屬于你的微信個(gè)人數(shù)據(jù)報(bào)告,了解你的微信社交歷史。 [TOC] 一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告,了解你的微信社交歷史 簡(jiǎn)介 你是否想過(guò)生成一份屬于你的微信個(gè)人數(shù)據(jù)報(bào)告,了解你的微信社交歷史?,F(xiàn)在,我們基于python對(duì)微信好友進(jìn)行全方位數(shù)據(jù)分析,包括:昵稱(chēng)、性別、年齡、地區(qū)、備注名、個(gè)性簽名、頭像、群聊、公眾號(hào)等。 其中...

    whidy 評(píng)論0 收藏0
  • 一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告,了解微信社交歷史

    摘要:一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告了解你的微信社交歷史簡(jiǎn)介你是否想過(guò)生成一份屬于你的微信個(gè)人數(shù)據(jù)報(bào)告,了解你的微信社交歷史。 [TOC] 一鍵生成微信個(gè)人專(zhuān)屬數(shù)據(jù)報(bào)告,了解你的微信社交歷史 簡(jiǎn)介 你是否想過(guò)生成一份屬于你的微信個(gè)人數(shù)據(jù)報(bào)告,了解你的微信社交歷史?,F(xiàn)在,我們基于python對(duì)微信好友進(jìn)行全方位數(shù)據(jù)分析,包括:昵稱(chēng)、性別、年齡、地區(qū)、備注名、個(gè)性簽名、頭像、群聊和公眾號(hào)等。 其中...

    Jaden 評(píng)論0 收藏0
  • 騰訊云運(yùn)維干貨沙龍-海量運(yùn)維實(shí)踐大曝光 (三)

    摘要:月日,首期沙龍海量運(yùn)維實(shí)踐大曝光在騰訊大廈圓滿舉行??椩聘咝У膶?shí)踐是,它是以運(yùn)維標(biāo)準(zhǔn)化為基石,以為核心的自動(dòng)化運(yùn)維平臺(tái)。 作者丨周小軍,騰訊SNG資深運(yùn)維工程師,負(fù)責(zé)社交產(chǎn)品分布式存儲(chǔ)的運(yùn)維及團(tuán)隊(duì)管理工作。對(duì)互聯(lián)網(wǎng)網(wǎng)站架構(gòu)、數(shù)據(jù)中心、云計(jì)算及自動(dòng)化運(yùn)維等領(lǐng)域有深入研究和理解。 12月16日,首期沙龍海量運(yùn)維實(shí)踐大曝光在騰訊大廈圓滿舉行。沙龍出品人騰訊運(yùn)維技術(shù)總監(jiān)、復(fù)旦大學(xué)客座講師、De...

    eechen 評(píng)論0 收藏0
  • 靈感源自谷歌:對(duì)話CloudPhysics

    摘要:大數(shù)據(jù)分析技術(shù)在的數(shù)據(jù)感應(yīng)結(jié)果分析中起到了非常重要的作用。我們針對(duì)它制定的計(jì)劃以及我們所用的標(biāo)簽其實(shí)源自于谷歌和其他大規(guī)模基礎(chǔ)設(shè)施。不幸地是,那些技術(shù)完全被大數(shù)據(jù)這個(gè)被過(guò)度使用的營(yíng)銷(xiāo)語(yǔ)掩蓋了。 大數(shù)據(jù)分析技術(shù)在CloudPhysics的數(shù)據(jù)感應(yīng)結(jié)果分析中起到了非常重要的作用。這是Willem ter Harmsel采訪Cloud Physics的首席執(zhí)行官約翰布盧門(mén)塔爾(John Blum...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<