主頁 > 後端開發 > 2021最新 QQqun乘員資料獲取專案(包含js逆向)——QQqunSpider [已完結]

2021最新 QQqun乘員資料獲取專案(包含js逆向)——QQqunSpider [已完結]

2021-03-01 10:59:57 後端開發

文章目錄

  • 前言
  • 專案背景
  • 專案實作
    • 1. 登陸
      • 登陸頁面分析
      • 登陸實作
        • 登陸流程
          • ① 獲取登陸二維碼并保存二維碼至本地
          • ② 本地彈出二維碼
          • ③ app掃碼確認——登陸成功
    • 2. 抓取分析
      • 介面引數分析
      • 相關js逆向
      • 資料抓取-資料保存
  • 總結


前言

最近啃了一個新專案,是關于某群官網的某群成員獲取,本專案僅用于交流學習,若侵犯到貴公司權益請聯系郵箱229456906@qq.com第一時間洗掉,讀者請切忌用于一切非法途徑,否則后果自行承擔!


專案背景

前段時間在某外包群看到一個需求:獲取QQ上的QQ群成員號碼…等,剛好現在有時間就打開了某群官網,進行了一波操作,肝了一個晚上終于是整得明明白白了,于是專案[QQqunSpider]問世了hhh,其中在登陸方面得到了一位大佬的技術指導,很感謝!!!下面是專案目錄結構圖:
在這里插入圖片描述


專案實作

本專案使用requests的方式進行全程獲取,登陸采用二維碼掃碼的方式代碼實作,因為目前沒找到賬密登錄的入口,網站好像并沒有,所以采用掃碼(如果有朋友知道賬密登陸的入口也可告知我,我會盡量去更新賬密登錄方式), 登錄獲取cookie,為之后的資料采集提供身份驗證,本專案實作并不難,從登陸到資料獲取入庫等流程較為簡單,下面正片開始~


1. 登陸

想要獲取資料,必須進行登錄處理,獲取cookie后才能實作完整的獲取流程,本次地址:aHR0cHM6Ly9xdW4ucXEuY29tLw==

登陸頁面分析

打開首頁并點擊登錄出現如圖:
在這里插入圖片描述
可以看到沒有其他的登陸方式,只能使用app進行掃碼登陸,

接下來抓包,直接F12打開開發者工具點擊All然后重繪網頁點擊登陸即可:
在這里插入圖片描述
首先看到這一條介面地址,他是一個圖片介面(也就是二維碼的介面):
在這里插入圖片描述
看看他的Headers:
在這里插入圖片描述
經過多次重復抓包知道他是一個GET請求,提交的引數沒有加密,并且所有引數均可寫死,

登陸實作

獲取二維碼并在本地呼叫彈出二維碼進行掃描登陸

登陸流程

① 獲取登陸二維碼并保存二維碼至本地

現在只需要撰寫python代碼請求二維碼介面即可,定義LoginFuncRequests類并初始化引數:

def __init__(self):
    self.session = requests.session()
    self.img_path = 'cookieserverfunction/image/code.png'

    self.headers = {
        'Host': 'ssl.ptlogin2.qq.com',
        'Referer': 'https://xui.ptlogin2.qq.com/',
        'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
    }

撰寫code_show方法獲取二維碼并保存:

def code_show(self):
    url = 'https://ssl.ptlogin2.qq.com/ptqrshow?'
    data = {
        'appid': '715030901',
        'e': '2',
        'l': 'M',
        's': '3',
        'd': '72',
        'v': '4',
        't': '0.9292435301685353',
        'daid': '73',
        'pt_3rd_aid': '0',
    }
    response = self.session.get(url, params=data, headers=self.headers)
    with open('cookieserverfunction/image/code.png', 'wb') as f:
        f.write(response.content)
        f.close()
② 本地彈出二維碼

這里需要注意的是當二維碼獲取到并彈出后服務器會定時驗證二維碼的有效性(包括是否過期,是否掃描,是否確認):
在這里插入圖片描述
介面如圖:
在這里插入圖片描述
回應的內容:
在這里插入圖片描述

所以這一步我們需要先處理這條介面請求,驗證二維碼是否被掃描是否過期或者確認,
先看看他的Headers,以及各個引數情況:
在這里插入圖片描述

其中ptqrtoken、login_sig、action是變動的,首先看看ptqrtoken,搜索:
在這里插入圖片描述
只有一條記錄, 打上斷點:
在這里插入圖片描述
先看這段代碼:
“ptqrlogin” == t && (o.ptqrtoken = k[“default”].str.hash33(k[“default”].cookie.get(“qrsig”)))

大致意思就是ptqrlogin=未知函式(從cookie中獲取qrsig)
接下來單步執行進入下一步:
在這里插入圖片描述
繼續執行到斷點處, 并在控制臺列印回傳值:
在這里插入圖片描述
所以只需要知道cookie中的qrsig引數即可, 這里嘗試一下搜索t的值進行搜索(因為qrsig=t=hNHL52PPCVBd6O45-6RCIEvRXjzt6ag36EUJKxX-VkkmRTdTJdDMYPTHDR*cUg):在這里插入圖片描述
需要注意的是全域搜索的字串不能含有特殊字符,否則會影響搜索結果,所以這里截取t的部分字符進行搜索:
在這里插入圖片描述
很清楚明了的看到:t是二維碼介面回傳的cookie值;
所以我們只需要在獲取二維碼的時候將cookie回傳獲取下來即可:

def code_show(self):
    url = 'https://ssl.ptlogin2.qq.com/ptqrshow?'
    data = {
        'appid': '715030901',
        'e': '2',
        'l': 'M',
        's': '3',
        'd': '72',
        'v': '4',
        't': '0.9292435301685353',
        'daid': '73',
        'pt_3rd_aid': '0',
    }
    response = self.session.get(url, params=data, headers=self.headers)
    with open('cookieserverfunction/image/code.png', 'wb') as f:
        f.write(response.content)
        f.close()
    print(response.cookies)
    return response.cookies

接下來將js扣出改寫,并撰寫get_ptqrtoken函式獲取ptqrtoken引數:
js代碼:

function ptqrtoken(t) {
    for (var e = 0, i = 0, n = t.length; i < n; ++i) e += (e << 5) + t.charCodeAt(i);
    return 2147483647 & e
}

get_ptqrtoken函式:

    def get_ptqrtoken(self, cookies):
        with open('lib/bkn.js', 'r') as f:
            js = f.read()
            f.close()
        com = execjs.compile(js)
        ptqrtoken = com.call('ptqrtoken', re.search(r'qrsig=(.*?) ', str(cookies)).group(1))
        print('ptqrtoken:', ptqrtoken)
        return ptqrtoken

現在看看action引數:action引數(0-0-1614435984861)類似于x-x-13位時間戳(先假設是這樣等下請求驗證便知)

接下來看看login_sig引數:在這里插入圖片描述
這里清楚login_sig=S.ptui.login_sig, 我們搜索S.ptui.login_sig:
在這里插入圖片描述

打下斷點并重繪網頁再次點擊登錄:
在這里插入圖片描述

通過控制臺輸出,以及代碼段:S.ptui.login_sig = S.ptui.login_sig || k[“default”].cookie.get(“pt_login_sig”)可以清楚的知道S.ptui.login_sig等于cookie中的pt_login_sig值, 接下來進行pt_login_sig值得搜索:
在這里插入圖片描述
經過多次觀察Headers,提交的引數為固定值在這里插入圖片描述
撰寫pt_login_sig函式代碼獲取cookie即可:

def pt_login_sig(self):
    url = 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?'
    data = {
        'pt_disable_pwd': '1',
        'appid': '715030901',
        'daid': '73',
        'pt_no_auth': '1',
        's_url': 'https://qun.qq.com/',
    }
    headers = {
        'referer': 'https://qun.qq.com/',
        'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
    }
    response = self.session.get(url, params=data, headers=headers)
    print(response.cookies)
    login_sig = re.search(r'pt_login_sig=(.*?) ', str(response.cookies)).group(1)
    print('login_sig:', login_sig)
    return login_sig, response.cookies

所有引數獲取完成,下面撰寫check_Codeshow函式向服務器發送請求:

def check_Codeshow(self, ptqrtoken, login_sig, ck):
    url = 'https://ssl.ptlogin2.qq.com/ptqrlogin?'
    action = int(time.time() * 1000)
    data = {
        'u1': 'https://qun.qq.com/',
        'ptqrtoken': ptqrtoken,
        'ptredirect': '1',
        'h': '1',
        't': '1',
        'g': '1',
        'from_ui': '1',
        'ptlang': '2052',
        'action': '0-0-' + str(action),
        'js_ver': '21020514',
        'js_type': '1',
        'login_sig': login_sig,
        'pt_uistyle': '40',
        'aid': '715030901',
        'daid': '73',
    }
    headers = {
        'referer': 'https://xui.ptlogin2.qq.com/',
        'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
    }
    response = self.session.get(url, params=data, headers=headers, cookies=ck)
    print(response.text)
    return response.text

將圖片顯示(showc函式)結合check_Codeshow函式:

def showc(self, ptqrtoken, login_sig, ck):
     # 顯示二維碼
     img = Image.open(self.img_path)  # 打開圖片,回傳PIL image物件
     plt.figure("請使用app掃描驗證碼", figsize=(5, 4))
     plt.ion()  # 打開互動模式
     plt.axis('off')  # 不需要坐標軸
     plt.imshow(img)
     global pausing
     pausing = True
     while pausing:
         plt.pause(0.05)
         while True:
             bg = self.check_Codeshow(ptqrtoken, login_sig, ck)
             if '登錄成功' in str(bg):
                 pausing = False
                 ebg = 1
                 break
             if '二維碼認證中' in str(bg):
                 pass
             if '二維碼已失效' in str(bg):
                 pausing = False
                 ebg = 0
                 break
             if '本次登錄已被拒絕' in str(bg):
                 pausing = False
                 ebg = 0
                 break
             time.sleep(1)
     plt.ioff()  # 顯示完后一定要配合使用plt.ioff()關閉互動模式,否則可能出奇怪的問題
     plt.clf()  # 清空圖片
     plt.close()  # 清空視窗
     return ebg, bg
③ app掃碼確認——登陸成功

然后我們使用app掃碼確認,再次抓包分析:
在這里插入圖片描述
當我們點擊確認之后緊接著服務器請求了一條介面:
在這里插入圖片描述
并且設定了一堆cookie:
在這里插入圖片描述
所以現在需要解決這條介面的引數,并進行模擬請求,先看看請求表單:
在這里插入圖片描述
我設想,會不會是上面的check_Codeshow函式想服務器發送請求的時候,在我們確認之后請求回應回傳的?帶著設想查看了response:
在這里插入圖片描述
并沒有…然后我通過代碼進行debug除錯:
在這里插入圖片描述

發現了有回傳值,并且其中的鏈接就是上面的介面地址,所以現在只需要將
check_Codeshow函式的回傳值稍作處理提取鏈接,然后再進行求情獲取登陸cookie即可,

get_cookie函式:

    def get_cookie(self, url):
        headers = {
            'referer': 'https://xui.ptlogin2.qq.com/',
            'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
        }
        response = self.session.get(url, headers=headers, allow_redirects=False)
        print(response.cookies)
        return response.cookies

整合代碼:

# -- coding: utf-8 --
# @Time : 2021/2/25 20:25
# @Author : Los Angeles Clippers
# @Email: 229456906@qq.com
# @sinaemail: angelesclippers@sina.com
import pickle
import re
import time

import execjs
import requests
from PIL import Image
import matplotlib.pyplot as plt


class LoginFuncRequests(object):
    def __init__(self):
        self.session = requests.session()
        self.img_path = 'cookieserverfunction/image/code.png'

        self.headers = {
            'Host': 'ssl.ptlogin2.qq.com',
            'Referer': 'https://xui.ptlogin2.qq.com/',
            'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
        }

    def code_show(self):
        url = 'https://ssl.ptlogin2.qq.com/ptqrshow?'
        data = {
            'appid': '715030901',
            'e': '2',
            'l': 'M',
            's': '3',
            'd': '72',
            'v': '4',
            't': '0.9292435301685353',
            'daid': '73',
            'pt_3rd_aid': '0',
        }
        response = self.session.get(url, params=data, headers=self.headers)
        print(response.status_code)
        with open('cookieserverfunction/image/code.png', 'wb') as f:
            f.write(response.content)
            f.close()
        print(response.cookies)
        return response.cookies

    def get_ptqrtoken(self, cookies):
        with open('lib/bkn.js', 'r') as f:
            js = f.read()
            f.close()
        com = execjs.compile(js)
        ptqrtoken = com.call('ptqrtoken', re.search(r'qrsig=(.*?) ', str(cookies)).group(1))
        print('ptqrtoken:', ptqrtoken)
        return ptqrtoken

    def pt_login_sig(self):
        url = 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?'
        data = {
            'pt_disable_pwd': '1',
            'appid': '715030901',
            'daid': '73',
            'pt_no_auth': '1',
            's_url': 'https://qun.qq.com/',
        }
        headers = {
            'referer': 'https://qun.qq.com/',
            'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
        }
        response = self.session.get(url, params=data, headers=headers)
        print(response.cookies)
        login_sig = re.search(r'pt_login_sig=(.*?) ', str(response.cookies)).group(1)
        print('login_sig:', login_sig)
        return login_sig, response.cookies

    def check_Codeshow(self, ptqrtoken, login_sig, ck):
        url = 'https://ssl.ptlogin2.qq.com/ptqrlogin?'
        action = int(time.time() * 1000)
        data = {
            'u1': 'https://qun.qq.com/',
            'ptqrtoken': ptqrtoken,
            'ptredirect': '1',
            'h': '1',
            't': '1',
            'g': '1',
            'from_ui': '1',
            'ptlang': '2052',
            'action': '0-0-' + str(action),
            'js_ver': '21020514',
            'js_type': '1',
            'login_sig': login_sig,
            'pt_uistyle': '40',
            'aid': '715030901',
            'daid': '73',
        }
        headers = {
            'referer': 'https://xui.ptlogin2.qq.com/',
            'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
        }
        response = self.session.get(url, params=data, headers=headers, cookies=ck)
        print(response.text)
        # print(response.cookies)
        return response.text

    def showc(self, ptqrtoken, login_sig, ck):
        # 顯示二維碼
        img = Image.open(self.img_path)  # 打開圖片,回傳PIL image物件
        plt.figure("請使用app掃描驗證碼", figsize=(5, 4))
        plt.ion()  # 打開互動模式
        plt.axis('off')  # 不需要坐標軸
        plt.imshow(img)
        global pausing
        pausing = True
        while pausing:
            plt.pause(0.05)
            while True:
                bg = self.check_Codeshow(ptqrtoken, login_sig, ck)
                if '登錄成功' in str(bg):
                    pausing = False
                    ebg = 1
                    break
                if '二維碼認證中' in str(bg):
                    pass
                if '二維碼已失效' in str(bg):
                    pausing = False
                    ebg = 0
                    break
                if '本次登錄已被拒絕' in str(bg):
                    pausing = False
                    ebg = 0
                    break
                time.sleep(1)
        plt.ioff()  # 顯示完后一定要配合使用plt.ioff()關閉互動模式,否則可能出奇怪的問題
        plt.clf()  # 清空圖片
        plt.close()  # 清空視窗
        return ebg, bg

    def get_cookie(self, url):
        headers = {
            'referer': 'https://xui.ptlogin2.qq.com/',
            'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
        }
        response = self.session.get(url, headers=headers, allow_redirects=False)
        print(response.cookies)
        return response.cookies

    def run(self):
        cookies = self.code_show()
        ptqrtoken = self.get_ptqrtoken(cookies=cookies)
        login_sig, ck = self.pt_login_sig()
        ebg, bg = self.showc(ptqrtoken, login_sig, ck)
        if ebg == 0:
            self.run()
        else:
            url = re.search(r"ptuiCB\('0','0','(.*?)'", bg).group(1)
            print(url)
            lck = self.get_cookie(url=url)
            cookie_name = re.search(r'uin=(.*?)&', bg).group(1)
            with open("cookied/{}_cookie.txt".format(cookie_name), 'w') as f:
                f.write(str(lck))
            return lck, cookie_name

獲取cookie結果:
在這里插入圖片描述
到這里登陸成功,并且成功獲取cookie,

2. 抓取分析

點擊群管理 →成員管理 ,到以下界面:
在這里插入圖片描述

介面引數分析

F12打開開發者工具,隨便點擊一個群進行抓包:
在這里插入圖片描述
看看回應:
在這里插入圖片描述
所以這里就是我們想要的資訊,看看表單引數:
在這里插入圖片描述

相關js逆向

這里的gc是群號碼,bkn不知道,先搜索一波:
在這里插入圖片描述
打下斷點,并重繪網頁:
在這里插入圖片描述
通過控制臺列印,他就是bkn引數,進入函式看看:
在這里插入圖片描述
打下斷點后我們再執行到斷點處:
在這里插入圖片描述
通過控制臺列印,這段js代碼即是bkn的演算法:

o.getCSRFToken = function() {
        var e = o.cookie("skey");
        if (e) {
            for (var t = 5381, n = 0, r = e.length; n < r; ++n)
                t += (t << 5) + e.charAt(n).charCodeAt();
            return this.CSRFToken = 2147483647 & t
        }
    }

通過var e = o.cookie(“skey”)可知, e等于cookie中的skey的值,所以在這里將cookie的skey值取出,傳入js函式即可得到bkn的值,撰寫getbkn函式:

def getbkn(self, skey):
    with open('lib/bkn.js', 'r') as f:
        js = f.read()
        f.close()
    com = execjs.compile(js)
    bkn = com.call('getbkn', skey)
    print(bkn)
    return bkn

資料抓取-資料保存

可以看到我的qq上有很多個群,所以如果是一個一個qq群號碼去寫的話很麻煩,所以看看服務器有沒有回傳我qq上的所有qq群,隨意找個群號進行搜索:
在這里插入圖片描述
有結果了,看看Headers:
在這里插入圖片描述
只有一個bkn引數,接下來撰寫get_gc函式獲取所有的群號碼串列:

def get_gc(self, cookies, bkn):
    data = {
        'bkn': bkn
    }
    response = requests.post(self.url, headers=self.headers, data=data, cookies=cookies)
    jsdata = json.loads(response.text)
    print(jsdata)
    gc = re.findall(r"'gc': (.*?),", str(jsdata))
    gn = re.findall(r"'gn': '(.*?),", str(jsdata))
    print(gc)
    print(gn)
    print(len(gc), len(gn))
    return (gc, gn)

加下來定義SearchGroupMembers類進行資料的獲取:
首先定義初始化引數:

def __init__(self, gcgn, bkn, cookies):
    self.url = 'https://qun.qq.com/cgi-bin/qun_mgr/search_group_members'
    self.bkn = bkn
    self.gc = gcgn[0]
    self.gn = gcgn[1]
    self.cookies = cookies

    self.fp = open('datas/qq.csv', 'a', encoding='gb18030', newline='')
    self.fw = csv.writer(self.fp)

    self.fps = open('datas/qq_email.csv', 'a', encoding='gb18030', newline='')
    self.fws = csv.writer(self.fps)

    self.headers = {
        'origin': 'https://qun.qq.com',
        'pragma': 'no-cache',
        'referer': 'https://qun.qq.com/member.html',
        'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
        'sec-ch-ua-mobile': '?0',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
    }

下面撰寫獲取資料函式getMembers:

def getMembers(self):
    o = 0
    for gc, gn in zip(self.gc, self.gn):
        print(gn)
        i = 0
        for pg in range(0, 1000000, 21):
            data = {
                'gc': gc,
                'st': pg,
                'end': 20 + pg,
                'sort': '0',
                'bkn': self.bkn,
            }
            response = requests.post(self.url, headers=self.headers, cookies=self.cookies, data=data)
            jsdata = json.loads(response.text)
            try:
                mems = jsdata['mems']
            except KeyError as e:
                break
            if len(mems) == 0:
                break
            for item in mems:
                i += 1
                o += 1
                qq = item['uin']
                qq_email = str(qq) + '@qq.com'
                nick = item['nick']
                print(i, o, qq, nick)
                self.fw.writerow([qq, nick])
                self.fws.writerow([str(qq), qq_email, nick])

    self.fp.close()
    self.fps.close()

啟動函式:

from cookieserverfunction.logincodeshow import LoginFuncRequests
from CrawlSpider.get_group_list import GetGroupList
from CrawlSpider.search_group_members import SearchGroupMembers


if __name__ == '__main__':
    logins = LoginFuncRequests()
    lck, cookie_name = logins.run()
    ggl = GetGroupList()
    gcgn, bkn, cookies = ggl.run(lck, cookie_name)
    sgm = SearchGroupMembers(gcgn, bkn, cookies)
    sgm.getMembers()

執行結果:
在這里插入圖片描述
資料保存情況:
在這里插入圖片描述
挺意外我群友居然有將近5w個的hhhhh~

總結

好好學習 天天向上 不掉頭發 事業有成~


碼字不易,如果不能篇文章對你有幫助請點個贊,謝謝~
合作及原始碼獲取vx:tiebanggg 【注明來意】
QQ交流群:735418202
需原始碼請關注微信公眾號回復【QQqunSpider】獲取 :在這里插入圖片描述

*注:本文為原創文章,轉載文章請附上本文鏈接!否則將追究相關責任,請自重!謝謝!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264844.html

標籤:python

上一篇:爬蟲實戰系列(十二):多執行緒帶你看貓眼春節檔熱映電影資料

下一篇:5.3 JDBC類加載機制原始碼決議(破壞雙親委派機制)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more