本文章僅供學習使用-侵權請聯系刪除_2023年3月14日08:17:06
本來在深淵12層打不過的我偶然在刷到了一個dy的直播間,看到主播在搶碼上號幫忙打深淵還號稱痛苦號打不滿不送原石的旗號我就決定掃碼試試,在直播間內使用了兩部手機互相掃碼在掃了一下午的碼后發現根本搶不到二維碼心態崩潰后我就想著寫一個腳本來幫我搶碼(本人py小白),終于在又白忙活了一下的后終于決定抱著學習的態度寫一個程序來幫我進行搶碼的操作!
原理講解
進行屏幕區域的截圖(用來獲取二維碼)
將獲取到的二維碼進行解析
將解析后的內容截取出ticket
最后發送給米哈游的服務器

在搶碼登陸中一共分為兩步
第一步搶碼
第二步登陸
哈哈聽起來像廢話,我們首先會進行二維碼掃碼的認主,先確定這個二維碼的主人是誰只要確認好這個主人后就算等待幾分鐘再確認登陸也沒有問題。
# 搶碼開始
def Request(ticket):conn = http.client.HTTPSConnection("api-sdk.mihoyo.com")payload = json.dumps({"app_id": 4,"device": "","ticket": ticket})headers = {}conn.request("POST", "/hk4e_cn/combo/panda/qrcode/scan", payload, headers)res = conn.getresponse()data = res.read()data = json.loads(data.decode("utf-8"))retcode = data["retcode"]return retcode
我們先進行二維碼的認主 ticket這個參數為二維碼解析后的參數自行獲取
# 確認登陸
def ConfirmRequest(ticket):conn = http.client.HTTPSConnection("api-takumi.miyoushe.com")payload = ''headers = {'DS': '','cookie': '','x-rpc-client_type': '','x-rpc-app_version': '','x-rpc-sys_version': '','x-rpc-channel': '','x-rpc-device_id': '','x-rpc-device_fp': '','x-rpc-device_name': '','x-rpc-device_model': '','Referer': ' https://app.mihoyo.co'}conn.request("GET", "/auth/api/getGameToken?uid=0000000",payload, headers)res = conn.getresponse()data = res.read()# print(data.decode("utf-8"))data = json.loads(data.decode("utf-8"))token = data["data"]["game_token"]conn = http.client.HTTPSConnection("api-sdk.mihoyo.com")payload = json.dumps({"app_id": 4,"device": "","payload": {"proto": "Account","raw": f"{{\"uid\":\"0000000\",\"token\":\"{token}\"}}"},"ticket": ticket})headers = {'DS': '','cookie': '','x-rpc-client_type': '','x-rpc-app_version': '','x-rpc-sys_version': '','x-rpc-channel': 'xiaomi','x-rpc-device_id': '','x-rpc-device_fp': '','x-rpc-device_name': '','x-rpc-device_model': '','Referer': ' https://app.mihoyo.com','Content-Type': 'application/json'}conn.request("POST", "/hk4e_cn/combo/panda/qrcode/confirm",payload, headers)res = conn.getresponse()
然后再進行二維碼的確認來進行游戲內的確認登陸
啟動后會在 屏幕中間顯示一個300x300像素的框放入二維碼后直接掃碼登陸

由于自己學習就不做成品和優化了
好了廢話不多說了這里只提供思路參數在米游社掃碼時抓包即可獲取,有需要的自行閱讀吧
import cv2
from pyzbar.pyzbar import decode
import pyzbar.pyzbar as pyzbar
import numpy as np
from PIL import ImageGrab
import time
import tkinter as tk
import threading
import re
import http.client
import json# 顯示框框 啟動線程def my_function():import juxingmy_thread = threading.Thread(target=my_function)
my_thread.start()# 獲取坐標
root = tk.Tk()
win_width = 300
win_height = 300
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x_pos = (screen_width // 2) - (win_width // 2)
y_pos = (screen_height // 2) - (win_height // 2)# 設置掃描區域左上角的坐標和寬高
left, top, width, height = x_pos, y_pos, win_width, win_height
right = left + width
bottom = top + height# 創建窗口并設置窗口名稱
cv2.namedWindow("QR Code Scanner", cv2.WINDOW_NORMAL)
cv2.resizeWindow("QR Code Scanner", win_width, win_height)# 搶碼開始
def Request(ticket):conn = http.client.HTTPSConnection("api-sdk.mihoyo.com")payload = json.dumps({"app_id": 4,"device": "","ticket": ticket})headers = {}conn.request("POST", "/hk4e_cn/combo/panda/qrcode/scan", payload, headers)res = conn.getresponse()data = res.read()data = json.loads(data.decode("utf-8"))retcode = data["retcode"]return retcode# 確認登陸
def ConfirmRequest(ticket):conn = http.client.HTTPSConnection("api-takumi.miyoushe.com")payload = ''headers = {'DS': '','cookie': '','x-rpc-client_type': '2','x-rpc-app_version': '2.46.1','x-rpc-sys_version': '9','x-rpc-channel': '','x-rpc-device_id': '','x-rpc-device_fp': '','x-rpc-device_name': '','x-rpc-device_model': '','Referer': ' https://app.mihoyo.co'}conn.request("GET", "/auth/api/getGameToken?uid=0000000",payload, headers)res = conn.getresponse()data = res.read()# print(data.decode("utf-8"))data = json.loads(data.decode("utf-8"))token = data["data"]["game_token"]conn = http.client.HTTPSConnection("api-sdk.mihoyo.com")payload = json.dumps({"app_id": 4,"device": "","payload": {"proto": "Account","raw": f"{{\"uid\":\"0000000\",\"token\":\"{token}\"}}"},"ticket": ticket})headers = {'DS': '','cookie': '','x-rpc-client_type': '2','x-rpc-app_version': '2.46.1','x-rpc-sys_version': '9','x-rpc-channel': ' xiaomi','x-rpc-device_id': '','x-rpc-device_fp': '','x-rpc-device_name': '','x-rpc-device_model': '','Referer': ' https://app.mihoyo.com','Content-Type': 'application/json'}conn.request("POST", "/hk4e_cn/combo/panda/qrcode/confirm",payload, headers)res = conn.getresponse()# data = res.read()# print(data.decode("utf-8"))while True:# 截取指定區域的屏幕截圖screenshot = cv2.cvtColor(np.array(ImageGrab.grab(bbox=(left, top, right, bottom))),cv2.COLOR_BGR2RGB)# 將截圖轉換為灰度圖像gray = cv2.cvtColor(screenshot, cv2.COLOR_RGB2GRAY)# 嘗試使用pyzbar庫識別二維碼codes = decode(gray, symbols=[pyzbar.ZBarSymbol.QRCODE])# 如果找到了二維碼,輸出其內容if codes:print(codes[0].data.decode())pattern = r"ticket=([a-f0-9]+)"match = re.search(pattern, codes[0].data.decode())# 正則請求地址if match:start_time = time.time()# 進入搶碼retcode = Request(match.group(1))end_time = time.time()if retcode == 0:# 計算代碼執行時間elapsed_time = end_time - start_time# 輸出執行時間print("搶碼成功耗時 %.3f 秒" % elapsed_time)# 確認登陸ConfirmRequest(match.group(1))time.sleep(1)# 等待一段時間再繼續掃描time.sleep(0.05)# 在窗口中顯示截圖cv2.imshow("QR Code Scanner", screenshot)# 檢查是否按下了鍵盤上的任意鍵if cv2.waitKey(1) != -1:break
# 關閉窗口
cv2.destroyAllWindows()
下面是顯示框部分的代碼
import tkinter as tk# 創建一個Tkinter窗口
root = tk.Tk()# 隱藏窗口標題欄和邊框
root.overrideredirect(True)# 將窗口置頂
root.wm_attributes("-topmost", True)# 設置窗口大小和位置
win_width = 300
win_height = 300
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x_pos = (screen_width // 2) - (win_width // 2)
y_pos = (screen_height // 2) - (win_height // 2)
root.geometry('{}x{}+{}+{}'.format(win_width, win_height, x_pos, y_pos))# 將窗口背景設為透明
root.attributes('-transparentcolor', 'white')# 將窗口的畫布設為透明
canvas = tk.Canvas(root, bg='white', highlightthickness=0)
canvas.pack(fill='both', expand=True)# 繪制一個綠色空心正方形
canvas.create_rectangle(5, 5, win_width-5, win_height-5, outline='red', width=2)# 進入循環讓窗口保持打開狀態
root.mainloop()