冬冬一直用的騰訊云函數來保持Hostloc論壇的簽到,但是最近騰訊云函數開始收費了,最低9塊錢一個月,本著能省就省的原則,我們以Python的方式來保持簽到。
瀏覽器輸入https://github.com/DocWho22/hostloc_getPoints/blob/main/hostloc_auto_get_points.py直接進行下載,然后在本地修改好用戶米,密碼和Server醬SendKey之后再上傳服務器。
SSH命令行下載:
wget -p /root/hostloc https://raw.githubusercontent.com/DocWho22/hostloc_getPoints/main/hostloc_auto_get_points.py
寶塔界面下載:
選擇左側菜單欄,找到文件菜單,點進去之后,選擇root目錄(隨意,自己記住文件的位置就行,演示用root目錄),然后點擊遠程下載,輸入文件地址https://github.com/DocWho22/hostloc_getPoints/blob/main/hostloc_auto_get_points.py
進行下載。(為方便記憶,把源文件hostloc_auto_get_points.py重命名為loc.py)
這里附上源代碼:
import osimport timeimport randomimport reimport textwrapimport requestsfrom pyaes import AESModeOfOperationCBCfrom requests import Session as req_Session# 隨機生成用戶空間鏈接def randomly_gen_uspace_url() -> list: url_list = [] # 訪問小黑屋用戶空間不會獲得積分、生成的隨機數可能會重復,這里多生成兩個鏈接用作冗余 for i in range(12): uid = random.randint(10000, 50000) url = "https://hostloc.com/space-uid-{}.html".format(str(uid)) url_list.append(url) return url_list# 使用Python實現防CC驗證頁面中JS寫的的toNumbers函數def toNumbers(secret: str) -> list: text = [] for value in textwrap.wrap(secret, 2): text.append(int(value, 16)) return text# 不帶Cookies訪問論壇首頁,檢查是否開啟了防CC機制,將開啟狀態、AES計算所需的參數全部放在一個字典中返回def check_anti_cc() -> dict: result_dict = {} headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" } home_page = "https://hostloc.com/forum.php" res = requests.get(home_page, headers=headers) aes_keys = re.findall('toNumbers("(.*?)")', res.text) cookie_name = re.findall('cookie="(.*?)="', res.text) if len(aes_keys) != 0: # 開啟了防CC機制 print("檢測到防 CC 機制開啟!") printLog("檢測到防 CC 機制開啟!") if len(aes_keys) != 3 or len(cookie_name) != 1: # 正則表達式匹配到了參數,但是參數個數不對(不正常的情況) result_dict["ok"] = 0 else: # 匹配正常時將參數存到result_dict中 result_dict["ok"] = 1 result_dict["cookie_name"] = cookie_name[0] result_dict["a"] = aes_keys[0] result_dict["b"] = aes_keys[1] result_dict["c"] = aes_keys[2] else: pass return result_dict# 在開啟了防CC機制時使用獲取到的數據進行AES解密計算生成一條Cookie(未開啟防CC機制時返回空Cookies)def gen_anti_cc_cookies() -> dict: cookies = {} anti_cc_status = check_anti_cc() if anti_cc_status: # 不為空,代表開啟了防CC機制 if anti_cc_status["ok"] == 0: print("防 CC 驗證過程所需參數不符合要求,頁面可能存在錯誤!") printLog("防 CC 驗證過程所需參數不符合要求,頁面可能存在錯誤!") else: # 使用獲取到的三個值進行AES Cipher-Block Chaining解密計算以生成特定的Cookie值用于通過防CC驗證 print("自動模擬計嘗試通過防 CC 驗證") printLog("自動模擬計嘗試通過防 CC 驗證") a = bytes(toNumbers(anti_cc_status["a"])) b = bytes(toNumbers(anti_cc_status["b"])) c = bytes(toNumbers(anti_cc_status["c"])) cbc_mode = AESModeOfOperationCBC(a, b) result = cbc_mode.decrypt(c) name = anti_cc_status["cookie_name"] cookies[name] = result.hex() else: pass return cookies# 登錄帳戶def login(username: str, password: str) -> req_Session: headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36", "origin": "https://hostloc.com", "referer": "https://hostloc.com/forum.php", } login_url = "https://hostloc.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1" login_data = { "fastloginfield": "username", "username": username, "password": password, "quickforward": "yes", "handlekey": "ls", } s = req_Session() s.headers.update(headers) s.cookies.update(gen_anti_cc_cookies()) res = s.post(url=login_url, data=login_data) res.raise_for_status() return s# 通過抓取用戶設置頁面的標題檢查是否登錄成功def check_login_status(s: req_Session, number_c: int) -> bool: test_url = "https://hostloc.com/home.php?mod=spacecp" res = s.get(test_url) res.raise_for_status() res.encoding = "utf-8" test_title = re.findall("<title>(.*?)</title>", res.text) if len(test_title) != 0: # 確保正則匹配到了內容,防止出現數組索引越界的情況 if test_title[0] != "個人資料 - 全球主機交流論壇 - Powered by Discuz!": print("第", number_c, "個帳戶登錄失敗!") printLog("第" + str(number_c) + "個帳戶登錄失敗!") return False else: print("第", number_c, "個帳戶登錄成功!") printLog("第" + str(number_c) + "個帳戶登錄成功!") return True else: print("無法在用戶設置頁面找到標題,該頁面存在錯誤或被防 CC 機制攔截!") return False# 抓取并打印輸出帳戶當前積分def print_current_points(s: req_Session): test_url = "https://hostloc.com/forum.php" res = s.get(test_url) res.raise_for_status() res.encoding = "utf-8" points = re.findall("積分: (d+)", res.text) if len(points) != 0: # 確保正則匹配到了內容,防止出現數組索引越界的情況 print("帳戶當前積分:" + points[0]) printLog("帳戶當前積分:" + points[0]) else: print("無法獲取帳戶積分,可能頁面存在錯誤或者未登錄!") printLog("無法獲取帳戶積分,可能頁面存在錯誤或者未登錄!") time.sleep(5)# 依次訪問隨機生成的用戶空間鏈接獲取積分def get_points(s: req_Session, number_c: int): if check_login_status(s, number_c): print_current_points(s) # 打印帳戶當前積分 url_list = randomly_gen_uspace_url() # 依次訪問用戶空間鏈接獲取積分,出現錯誤時不中斷程序繼續嘗試訪問下一個鏈接 for i in range(len(url_list)): url = url_list[i] try: res = s.get(url) res.raise_for_status() print("第", i + 1, "個用戶空間鏈接訪問成功") printLog("第" + str(i + 1) + "個用戶空間鏈接訪問成功") time.sleep(5) # 每訪問一個鏈接后休眠5秒,以避免觸發論壇的防CC機制 except Exception as e: print("鏈接訪問異常:" + str(e)) printLog("鏈接訪問異常:" + str(e)) continue print_current_points(s) # 再次打印帳戶當前積分 else: print("請檢查你的帳戶是否正確!") printLog("請檢查你的帳戶是否正確!")# 打印輸出當前ip地址def print_my_ip(): api_url = "https://api.ipify.org/" try: res = requests.get(url=api_url) res.raise_for_status() res.encoding = "utf-8" print("當前使用 ip 地址:" + res.text) printLog("當前使用 ip 地址:" + res.text) except Exception as e: print("獲取當前 ip 地址失敗:" + str(e)) printLog("獲取當前 ip 地址失敗:" + str(e))# serverChan推送信息def sendMessage(serverChan: str, messageTitle: str, messageContent: list): """ :type messageContent: list[str] """ api = "https://sctapi.ftqq.com/%s.send" % serverChan title = messageTitle content = "n".join(messageContent) data = { "text": title, "desp": content } req = requests.post(api, data=data)# 輸出log到messageContentdef printLog(log: str): messageContent.append(log)if __name__ == "__main__": username = "在此填入用戶名" password = "在此填入密碼" serverChan = "在此填入Server醬SendKey" messageTitle = "hostloc簽到" messageContent = [] # username = os.environ["HOSTLOC_USERNAME"] # password = os.environ["HOSTLOC_PASSWORD"] # 賬戶和密碼 # 分割用戶名和密碼為列表 user_list = username.split(",") passwd_list = password.split(",") if not username or not password: printLog("未檢測到用戶名或密碼,請檢查環境變量是否設置正確!") print("未檢測到用戶名或密碼,請檢查環境變量是否設置正確!") elif len(user_list) != len(passwd_list): printLog("用戶名與密碼個數不匹配,請檢查環境變量設置是否錯漏!") print("用戶名與密碼個數不匹配,請檢查環境變量設置是否錯漏!") else: print_my_ip() print("共檢測到", len(user_list), "個帳戶,開始獲取積分") print("*" * 30) printLog("共檢測到" + str(len(user_list)) + "個帳戶,開始獲取積分") printLog("*" * 30) # 依次登錄帳戶獲取積分,出現錯誤時不中斷程序繼續嘗試下一個帳戶 for i in range(len(user_list)): try: s = login(user_list[i], passwd_list[i]) get_points(s, i + 1) print("*" * 30) printLog("*" * 30) except Exception as e: print("程序執行異常:" + str(e)) print("*" * 30) printLog("程序執行異常:" + str(e)) printLog("*" * 30) continue print("程序執行完畢,獲取積分過程結束") printLog("程序執行完畢,獲取積分過程結束") sendMessage(serverChan, messageTitle, messageContent)
打開下載好的源代碼,如果你是本地編輯,請用文本編輯工具來打開它,不要用電腦的TXT記事本編輯!
在文件的209-211行,填入自己的Hostloc的用戶名和密碼和Server醬SendKey。
如果你有多個賬戶,請用英文逗號分割開。
多賬戶示例:
username = "username1,username2"password = "password1,password2"
Server醬SendKey如何你沒有,可以去https://sct.ftqq.com/申請,微信掃碼注冊,在https://sct.ftqq.com/sendkey查看復制自己的SendKey。
編輯完自己的賬號信息和SendKey之后,保存,更改名字為loc.py并上傳到/root/目錄下(演示用,名字改不改都可以,隨便哪個文件夾,自己記住就行)。
此腳本用到Python3,所以我們要在服務器里安裝Python3
apt-get install python3-pip
安裝完后之后,就可以運行了
python3 loc.py
如果運行后提示以下錯誤,請安裝request模塊
root@debian:~# python3 loc.pyTraceback (most recent call last): File "/root/loc.py", line 6, in <module> import requestsModuleNotFoundError: No module named 'requests'
安裝request模塊
pip3 install requests
安裝完request模塊之后再次運行python3 loc.py ,如果沒有報錯,會看到運行日志
root@debian:~# python3 loc.py當前使用 ip 地址:152.67.x.x共檢測到 1 個帳戶,開始獲取積分******************************
如果再次報錯,請安裝pyaes模塊
Traceback (most recent call last): File "/root/loc.py", line 8, in <module> from pyaes import AESModeOfOperationCBCModuleNotFoundError: No module named 'pyaes'
安裝pyaes模塊
pip3 install pyaes
安裝完成之后再次運行python3 loc.py ,直至沒有報錯,缺什么模塊安裝什么模塊。
在寶塔面板左側菜單欄,找到計劃任務,然后添加shell腳本任務并保存。
腳本內容:
# 進入loc.py文件所在目錄的絕對路徑,自己的在哪就寫哪里,演示用是root目錄cd /root/# 執行簽到任務python3 ./loc.py
請盡量選擇在夜間簽到,Hostloc白天防火墻規則嚴格,密集請求會被當做CC攻擊,容易被金盾防火墻屏蔽,導致簽到失敗。
等待簽到完成之后,可以自己在后臺查看任務執行日志。
微信Server醬提醒:
服務器計劃任務運行日志:
如果你沒有用寶塔面板,請在SSH后臺添加crontab任務
新建crontab任務
crontab -e
添加(解釋:每天2點10分執行python3 /root/loc.py)
10 2 * * * sleep 5;python3 /root/loc.py
同樣達到每天自動簽到的效果。
crontab表達式:
* * * * * - - - - - | | | | | | | | | +----- 星期幾 (0 - 7) (Sunday=0 or 7)| | | +---------- 月份 (1 - 12)| | +--------------- 幾號 (1 - 31)| +-------------------- 小時 (0 - 23)+------------------------- 分鐘 (0 - 59)
如果這樣的方式你覺得麻煩,還可以在瀏覽器上安裝油猴腳本,同樣可以實現自動簽到,缺點是每天都要打開瀏覽器。
油猴腳本地址:https://greasyfork.org/zh-CN/scripts/40444-hostloc-checkin
這樣每天我們就可以獲得Hostloc的20積分,祝大家早日上神仙。
感謝@Jox2018 @DocWho22 等MJJ提供的代碼。
隨著Github Actions的大規模封殺以及騰訊云云函數開始收費,免費用的資源越來越少,且行且珍惜,希望大家避免濫用。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
echo off是什么語言?Echo off不是語言,是Dos命令行,意思是關閉Echo。bat批處理腳本中經常使用Echo。該命令的功能是顯示信息或回應命令開或關。簡單地說,有兩種用途,:。第一種用法是直接輸出字符串,比如在DOS終端輸入echo 123456,執行回車后,終端屏幕上會顯示字符串123456。該函數通常用于提示用戶或調試腳本。第二種用法是關閉后續命令的回顯。比如在DOS終端輸入命...
詳細介紹巴西柔術?來源:巴西柔術起源于1914年,由日本柔術藝術家前田江井傳入巴西。前田宏生于1878年,1897年成為日本柔道創始人菅野智五郎的學生。他因擅長格斗技巧而被稱為“格斗伯爵”。1904年,前田宏離開日本,周游世界,表演和宣傳武術,接受來自世界各地的挑戰,包括拳擊手、摔跤手、原始摔跤手等。1914年來到巴西后,前田結識了一位名叫加斯托格雷西的朋友。加斯托格雷西是一位著名的商人,他去過北...
正能量的歌一直深得人心汪峰-《英雄》北京國安球隊隊歌,聽見這首歌情況下你是不是覺得心潮澎湃?是不是有一種想要去開辟大場面的想法?也許和平時期獲得一場比賽也是英雄。國安隊歌歌詞誰知道???漢化版綠茵場上叫喊著姓名 翠綠色影子也是我們的大牌明星 向著未來 噢 朝著全球 去拼搏大家憧憬的殊榮 獲勝始終屬于你 北京國安永遠爭第一 喔噢…… 北京國安 我們永遠支持你 噢…… 北京國安 大家永遠熱愛你 綠茵場上...