主頁 > 區塊鏈 > 爬蟲實戰 -- QQ空間自動點贊

爬蟲實戰 -- QQ空間自動點贊

2020-10-02 19:42:06 區塊鏈

QQ空間自動點贊

    • 前景提要
    • 目標確定
    • 分析介紹
      • 登陸獲取cookie
      • 尋找XML
      • 尋找可變引數
      • 獲取第一個空間動態
      • 尋找點贊所需的URL
      • 尋找可變引數
      • 功能提升到秒贊
    • 全部代碼
      • 最后還是希望你們能給我點一波小小的關注,
      • 奉上自己誠摯的愛心💖

前景提要

因為我周圍的小伙伴們天天跟我說的最多的一句話就是:空間第一條點贊,
所以說我還不如直接做一個自動點贊的代碼呢,免得天天催我點贊,


目標確定

  • QQ空間秒贊

分析介紹

登陸獲取cookie

首先既然是對 QQ空間的一系列操作,自然是先解決登陸方面,在這篇文章里面我就不過多介紹了,因為我上幾期之前對QQ空間已經做了一定的介紹了,直接放出鏈接就好,歡迎看博主以前的文章

def search_cookie():
    qq_number = input('請輸入qq號:')
    if not __import__('os').path.exists('cookie_dict.txt'):
        get_cookie_json(qq_number)
    with open('cookie_dict.txt', 'r') as f:
        cookie=json.load(f)
    return True
def get_cookie_json(qq_number):
    password = __import__('getpass').getpass('請輸入密碼:')
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    login_url = 'https://i.qq.com/'
    chrome_options =Options()
    chrome_options.add_argument('--headless')
    driver = webdriver.Chrome(options=chrome_options)
    driver.get(login_url)
    driver.switch_to_frame('login_frame')
    driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq_number)
    driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="login_button"]').click()
    time.sleep(1)
    cookie_list = driver.get_cookies()
    cookie_dict = {}
    for cookie in cookie_list:
        if 'name' in cookie and 'value' in cookie:
            cookie_dict[cookie['name']] = cookie['value']
    with open('cookie_dict.txt', 'w') as f:
        json.dump(cookie_dict, f)
    return True
def get_g_tk():
    p_skey = self.cookie['p_skey']
    h = 5381
    for i in p_skey:
        h += (h << 5) + ord(i)
        g_tk = h & 2147483647

尋找XML

當我們拿到cookie資訊和g_tk這個引數之后,繼續去尋找空間好友動態的XML在何處,
首先點到XML位置一個個查找,發現有一個feeds3_html_more很像,點進去發現的確是我們要找的url鏈接,
XML位置

尋找可變引數

這個鏈接所需要的引數有很多,在這里列舉出來

  • uin:
  • scope:
  • view:
  • daylist:
  • uinlist:
  • gid:
  • flag:
  • filter:
  • applist:
  • refresh:
  • aisortEndTime:
  • aisortOffset:
  • getAisort:
  • aisortBeginTime:
  • pagenum:
  • externparam:
  • firstGetGroup:
  • icServerTime:
  • mixnocache:
  • scene:
  • begintime:
  • count:
  • dayspac:
  • sidomain:
  • useutf8:
  • outputhtmlfeed:
  • rd:
  • usertime:
  • windowId:
  • g_tk:
  • qzonetoken:
  • g_tk:

這些引數中類似于可變引數的一共有五個,

  • qzonetoken
  • windowId
  • rd
  • usertime
  • g_tk
  1. qzonetoken 引數在原始碼中是個可變的“定值”,因為每次重繪這個引數都會變,但是原始碼中卻給出了他的具體值,直接獲取即可,

變數位置查找

def get_space():
    your_url = 'https://user.qzone.qq.com/' + str(qq_number)
    html = requests.get(your_url,headers=headers,cookies=cookie)
    if html.status_code == 200:
        qzonetoken = re.findall('window.g_qzonetoken =(.*?);',html.text,re.S)[1].split('"')[1]
    return True
  1. windowId 與 rd 雖說每次重繪結果都不同,但是經過博主多次實驗得出,這兩個引數對整體并沒有什么影響,可以直接抄下來,
'rd': '0.9311604844249088',
'windowId': '0.51158950324406',
  1. usertime 引數看似很眼熟,是個時間戳引數,因為位數不對,說明應該是被放大了一千倍,
'usertime': str(round(time.time() * 1000)),
  1. g_tk 引數上次教程已給出,在JavaScript中分析即可獲得,
def get_g_tk():
    p_skey = self.cookie['p_skey']
    h = 5381
    for i in p_skey:
        h += (h << 5) + ord(i)
        g_tk = h & 2147483647

獲取第一個空間動態

我們拿到XML以及各個引數后,即可訪問該網頁獲取其回傳值了,
但是這個回傳與其他的有一些不同的是,它不僅僅是個json檔案,我們無法獲取后直接轉換成字典格式去給我們使用,這就很麻煩,
_Callback
我們獲取字串后,首先先將前后不一致的都切片扔掉,之后經過一系列處理后發現,我們很難將這個看似像json格式的字串轉換成字典,
在這里我繼續介紹一個第三方庫demjson,

demjson 可以解決不正常的json格式資料

demjson的使用方法很簡單,

encode將 Python 物件編碼成 JSON 字串
decode將已編碼的 JSON 字串解碼為 Python 物件
# 例子
# -*- coding: utf-8 -*-
import demjson
js_json = "{x:1, y:2, z:3}"
py_json1 = "{'x':1, 'y':2, 'z':3}"
py_json2 = '{"x":1, "y":2, "z":3}'
data = demjson.decode(js_json)
print(data)
# {'y': 2, 'x': 1, 'z': 3}
data = demjson.decode(py_json1)
print(data)
# {'y': 2, 'x': 1, 'z': 3}
data = demjson.decode(py_json2)
print(data)
# {'y': 2, 'x': 1, 'z': 3}

我們使用demjson直接將該字串轉換為耳熟能詳的字典格式,提取其中的data的data,即為前八條動態的每個引數,但我們這里只要第一個說說的動態資訊,

text = html.text[10:-2].replace(" ", "").replace('\n','')
json_list = demjson.decode(text)['data']['data']
qq_spaces = json_list[0]

我們拿到其資訊后,先提取一些我們比較想知道的東西,比如名字、QQ號、發布時間、所獲贊數、說說內容、說說地址等等結果,
在 qq_spaces 引數中我們發現里面有一個很長也很特殊的一個結果是 html 結果,這個結果里面很長,簡單來看是個網頁常規代碼,應該是被JavaScript寫入到網頁中了,既然不是全部代碼,那么只能用正則提取一下里面的具體我們需要的東西了,

content = str(qq_spaces['html'])
try:zanshu = re.findall('<spanclass="f-like-cnt">(.*?)</span>人覺得很贊</div>',content,re.S)[0]
except:return None
time_out = str(qq_spaces['feedstime'])
print("名字:"+str(qq_spaces['nickname']))
print("QQ號:"+str(qq_spaces['opuin']))
print("時間:"+time_out)
print('贊數:'+zanshu)
times = qq_spaces['abstime']
his_url = re.findall('data-curkey="(.*?)"',content,re.S)[0]

尋找點贊所需的URL

在QQ空間隨便找個好友點個贊吧,這樣我們才能接收到請求,
我們首先清空原來動態產生的抓包,直接點個贊發現關于dolike的url只有三個,第一個是個POST請求,應該是我們所需要的點贊網址,
點贊URL

尋找可變引數

我們獲取到URL后,找到里面所需要的引數,發現一共有十一個引數,在這里猜測應該不存在加密引數,

  1. qzreferrer引數為自己QQ空間的網址,表示從哪里來的鏈接地址,
  2. opuin引數為自己的QQ號,可以直接在代碼提取,
  3. unikey引數與curkey引數為被點贊方的鏈接,即說說鏈接,剛才已獲取,
  4. abstime引數為被點贊方說說的發布時間的時間戳,
  5. fid引數為被點贊方的鏈接后綴,

既然引數沒什么問題那就直接寫代碼吧,

def get_zan(times,his_url):
    data = {'g_tk': g_tk,'qzonetoken': qzonetoken}
    post_data = {
        'qzreferrer': 'https://user.qzone.qq.com/'+str(qq_number),
        'opuin': str(qq_number),
        'unikey': str(his_url),
        'curkey': str(his_url),
        'from': '1',
        'appid': '311',
        'typeid': '0',
        'abstime': str(times),
        'fid': str(his_url).split('/')[-1],
        'active': '0',
        'fupdate': '1'
    }
    url = 'https://user.qzone.qq.com/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?'
    url = url + urllib.parse.urlencode(data)
    html = requests.post(url,headers=headers,cookies=cookie,data=post_data)
    if html.status_code == 200:print("點贊成功" if len(html.text) == 469 else "點贊失敗")

功能提升到秒贊

因為樹莓派并不是很不錯的問題,這個代碼做不到絕對的秒贊,

  1. 在本地建立一個檔案,負責寫入最后一條說說所產生的時間戳,
  2. 比對當前時間戳與空間第一條說說是否相同,若相同則無更新,
  3. 點贊后重寫檔案,以便下次使用代碼即可秒贊,
def run_tolike():
    if os.path.exists('time_out.txt'):
        with open('time_out.txt','r') as f:
            time_out = f.read()
    else:time_out = None
    while True:
        get_friends_list()
        time.sleep(__import__('random').randint(0,5)) # 秒贊?
if not time_out or time_out != time_out:
    time_out = time_out
    get_zan(times,his_url)
    return True
else:log('說說無更新,等待中...')
with open('time_out.txt','w') as f:
    f.write(str(times))

全部代碼

import time,os,json
import re
import demjson
import urllib
import requests
from lxml import etree
def log(content):
    this_time = time.strftime('%H:%M:%S',time.localtime(time.time()))
    print("["+str(this_time)+"]" + content)
class QQ_like:
    def __init__(self,qq_number):
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
        self.qq_number = qq_number
        self.get_preparameter()
        self.run_tolike()
    def get_preparameter(self):
        self.search_cookie()
        self.get_g_tk()
        self.get_space()
    def run_tolike(self):
        if os.path.exists('time_out.txt'):
            with open('time_out.txt','r') as f:
                self.time_out = f.read()
        else:self.time_out = None
        while True:
            self.get_friends_list()
            time.sleep(__import__('random').randint(0,5))
    def search_cookie(self):
        if not os.path.exists('cookie_dict.txt'):
            self.get_cookie_json()
        with open('cookie_dict.txt', 'r') as f:
            self.cookie=json.load(f)
        return True
    def get_cookie_json(self):
        password = __import__('getpass').getpass('請輸入密碼:')
        from selenium import webdriver
        from selenium.webdriver.chrome.options import Options
        login_url = 'https://i.qq.com/'
        chrome_options =Options()
        chrome_options.add_argument('--headless')
        driver = webdriver.Chrome(options=chrome_options)
        driver.get(login_url)
        driver.switch_to_frame('login_frame')
        driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
        time.sleep(1)
        driver.find_element_by_xpath('//*[@id="u"]').send_keys(self.qq_number)
        driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
        time.sleep(1)
        driver.find_element_by_xpath('//*[@id="login_button"]').click()
        time.sleep(1)
        cookie_list = driver.get_cookies()
        cookie_dict = {}
        for cookie in cookie_list:
            if 'name' in cookie and 'value' in cookie:
                cookie_dict[cookie['name']] = cookie['value']
        with open('cookie_dict.txt', 'w') as f:
            json.dump(cookie_dict, f)
        return True
    def get_g_tk(self):
        p_skey = self.cookie['p_skey']
        h = 5381
        for i in p_skey:
            h += (h << 5) + ord(i)
            self.g_tk = h & 2147483647
    def get_space(self):
        your_url = 'https://user.qzone.qq.com/' + str(self.qq_number)
        html = requests.get(your_url,headers=self.headers,cookies=self.cookie)
        if html.status_code == 200:
            self.qzonetoken = re.findall('window.g_qzonetoken =(.*?);',html.text,re.S)[1].split('"')[1]
        return True
    def get_friends_list(self):
        times = ""
        url = "https://user.qzone.qq.com/proxy/domain/ic2.qzone.qq.com/cgi-bin/feeds/feeds3_html_more?"
        data = {
            'uin': self.qq_number,
            'scope': '0',
            'view': '1',
            'daylist': '',
            'uinlist': '',
            'gid': '',
            'flag': '1',
            'filter':'all',
            'applist': 'all',
            'refresh': '0',
            'aisortEndTime': '0',
            'aisortOffset': '0',
            'getAisort': '0',
            'aisortBeginTime': '0',
            'pagenum': '1',
            'externparam': 'undefined',
            'firstGetGroup': '0',
            'icServerTime': '0',
            'mixnocache': '0',
            'scene': '0',
            'begintime': 'undefined',
            'count': '10',
            'dayspac': 'undefined',
            'sidomain': 'qzonestyle.gtimg.cn',
            'useutf8': '1',
            'outputhtmlfeed': '1',
            'rd': '0.9311604844249088',
            'usertime': str(round(time.time() * 1000)),
            'windowId': '0.51158950324406',
            'g_tk': self.g_tk,
            'qzonetoken': self.qzonetoken,
        }
        url = url + urllib.parse.urlencode(data) + '&g_tk=' + str(self.g_tk)
        html = requests.get(url,headers=self.headers,cookies=self.cookie)
        if html.status_code == 200:
            text = html.text[10:-2].replace(" ", "").replace('\n','')
            json_list = demjson.decode(text)['data']['data']
            qq_spaces = json_list[0]
            content = str(qq_spaces['html'])
            try:zanshu = re.findall('<spanclass="f-like-cnt">(.*?)</span>人覺得很贊</div>',content,re.S)[0]
            except:return None
            time_out = str(qq_spaces['feedstime'])
            log("名字:"+str(qq_spaces['nickname']))
            log("QQ號:"+str(qq_spaces['opuin']))
            log("時間:"+time_out)
            log('贊數:'+zanshu)
            times = qq_spaces['abstime']
            his_url = re.findall('data-curkey="(.*?)"',content,re.S)[0]
            if not self.time_out or self.time_out != time_out:
                self.time_out = time_out
                self.get_zan(times,his_url)
                return True
            else:log('說說無更新,等待中...')
        else:log(html.status_code)
    def get_zan(self,times,his_url):
        data = {'g_tk': self.g_tk,'qzonetoken': self.qzonetoken}
        post_data = {
            'qzreferrer': 'https://user.qzone.qq.com/'+str(qq_number),
            'opuin': str(qq_number),
            'unikey': str(his_url),
            'curkey': str(his_url),
            'from': '1',
            'appid': '311',
            'typeid': '0',
            'abstime': str(times),
            'fid': str(his_url).split('/')[-1],
            'active': '0',
            'fupdate': '1'
        }
        url = 'https://user.qzone.qq.com/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?'
        url = url + urllib.parse.urlencode(data)
        html = requests.post(url,headers=self.headers,cookies=self.cookie,data=post_data)
        if html.status_code == 200:log("點贊成功" if len(html.text) == 469 else "點贊失敗")
        with open('time_out.txt','w') as f:
            f.write(str(times))
if __name__ == "__main__":
    qq_number = input('請輸入qq號:')
    QQ_like(qq_number)

最后還是希望你們能給我點一波小小的關注,

奉上自己誠摯的愛心💖

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

標籤:區塊鏈

上一篇:模擬登陸——以github為例

下一篇:第二章HTML5基礎

標籤雲
其他(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)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more