吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7834|回复: 71
上一主题 下一主题
收起左侧

[Python 原创] 【星穹铁道抢码-首发】并优化原神抢码 米游社抢 崩坏抢码 扫码自动及分析脚本程序

  [复制链接]
跳转到指定楼层
楼主
tseed 发表于 2023-5-17 13:29 回帖奖励
本帖最后由 tseed 于 2023-5-18 20:34 编辑

在之前的文章中我有发布关于原神抢码的分析介绍,之前的文章
我发现有很多朋友不会分析和使用,无法重现我发布的抢码py文件的功能

最近米忽悠最新的星穹铁道上线又有很多朋友让我分析一下星穹铁道,是否能实现和原神一样的抢码效果呢?
那是肯定的啦(ps:在米游社不技术升级的情况下)只要是米游社内可以扫码的游戏应用都可以使用的未来即将上线的绝区零也是一样的。
其实实现的大体框架无需改动仅是请求方面需要改动替换一下的但还是有些朋友不会使用,
今天刚好有时间给你们优化和简洁一下步骤

新版本新功能
1.简化填写步骤
2.将原来的二维码识别速度翻倍(原来30帧现在可以达到60帧)速更快
3.将所有代码都写在一个py文件中 不再使用导入的方式来进行框框的显示
4.同时支持原神和星穹铁道的抢码
5.防止二维码刚抢到就确认登陆 被主播发现异常(被觉得是脚本在抢码)特此加入了随机延迟的功能来模拟为人手点击的延迟减少被主播怀疑的可能性

现在的最新版仅需要
stuid和stoken即,可步骤非常简单

stuid是米游社的uid并非是游戏内的uid请勿填写错误

至于stoken是怎么获取的呢,

1.抓包在米游社app内进行获取
2.有部分教程可以获取到stoken但是步骤些许复杂自己搜索一下即可找到办法
友情提示一下stoken权限等级极高请勿分享给他人

当前版本同时支持原神和星穹铁道

# 当前抢码游戏 原神=4,星穹铁道=8
GameType = 4
当前是原神想要切换星穹铁道的话把4改成8即可请勿改成这两个数以外的数字

原神效果演示

星穹铁道效果演示



无法运行排除错误方式
1.请确保当前所有库文件抖已安装
2.确保py在3.8及以上(因为文本是在3.8的环境中写的更低版是否可用用自己尝试
3.确保cookie的完整性

使用此程序的最低标准是懂编程基础如果你连一点点py基础都不会,那还是建议你还是先去学习一下py的基础教程再来使用,不然总是问我一些基础都不懂的问题我也不能从py基础开始教你用吧


好了废话不多说了下面就是代码复制粘贴之你的py文件运行即可

[Python] 纯文本查看 复制代码
import json
import time
import cv2
from pyzbar.pyzbar import decode
import pyzbar.pyzbar as pyzbar
import numpy as np
import tkinter as tk
import threading
import re
import http.client
import win32gui
import win32ui
import win32con
import uuid

# 当前抢码游戏 原神=4,星穹铁道=8
GameType = 4

# 填写米游社cookie
cookie = "stuid=;stoken=;mid=0mmmmato08_mhy;"
# cookie格式stuid=xxxxxxx;stoken=v2_xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=;mid=0mmmmato08_mhy;
# stuid为米游社UID非游戏内UID
# stoken需要此参数
# mid=0mmmmato08_mhy需要此参数

# 填写米游社uid
uid=""
# uid为米游社UID非游戏内UID可以使用上方的stuid

# 获取UUID
def get_uuid():
    get_timestamp_uuid = uuid.uuid1()  # 根据时间戳生成uuid,保证全球唯一
    return str(get_timestamp_uuid)


# 随机获取一个UUID来作为device
device = get_uuid()


# 显示框框
def my_function():
    # 创建一个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()


# 启动线程
my_thread = threading.Thread(target=my_function)
my_thread.start()


# 设置扫描区域
width, height = 300, 300
# 获取屏幕尺寸
screen_width = tk.Tk().winfo_screenwidth()
screen_height = tk.Tk().winfo_screenheight()
# 计算识别区域左上角
left = (screen_width - width) // 2
top = (screen_height - height) // 2
# 计算识别区右下角
right = left + width
bottom = top + height


# 获取屏幕DC
hwnd = win32gui.GetDesktopWindow()
hdc = win32gui.GetWindowDC(hwnd)
dc = win32ui.CreateDCFromHandle(hdc)


def capture_screen():

    saveDC = dc.CreateCompatibleDC()

    # 创建位图对象
    saveBitMap = win32ui.CreateBitmap()
    saveBitMap.CreateCompatibleBitmap(dc, right-left, bottom-top)

    # 将位图选入到DC中
    saveDC.SelectObject(saveBitMap)

    # 截屏并保存到位图中
    saveDC.BitBlt((0, 0), (right-left, bottom-top),
                  dc, (left, top), win32con.SRCCOPY)

    # 将位图对象转换为numpy数组并进行颜色空间转换
    bmpinfo = saveBitMap.GetInfo()
    bmpstr = saveBitMap.GetBitmapBits(True)
    screenshot = np.frombuffer(bmpstr, dtype='uint8').reshape(
        (bmpinfo['bmHeight'], bmpinfo['bmWidth'], 4))[:, :, :3]
    screenshot = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)

    # 释放资源
    saveDC.DeleteDC()
    win32gui.DeleteObject(saveBitMap.GetHandle())

    return screenshot


# 抢码开始
def Request(ticket):
    conn = http.client.HTTPSConnection("api-sdk.mihoyo.com")
    payload = json.dumps({
        "app_id": GameType,
        "device": device,
        "ticket": ticket
    })
    headers = {}
    if GameType == 4 :# 原神
        conn.request("POST", "/hk4e_cn/combo/panda/qrcode/scan", payload, headers)
    elif GameType == 8 :# 星穹铁道
        conn.request("POST", "/hkrpg_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 = {
        'cookie': cookie,
    }
    conn.request("GET", "/auth/api/getGameToken",
                 '', 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": GameType,
        "device": device,
        "payload": {
            "proto": "Account",
            "raw": f"{{\"uid\":\"{uid}\",\"token\":\"{token}\"}}"
        },
        "ticket": ticket
    })
    headers = {
        'cookie': cookie,
    }
    conn.request("POST", "/hk4e_cn/combo/panda/qrcode/confirm",
                 payload, headers)
    res = conn.getresponse()
    # data = res.read()
    # print(data.decode("utf-8"))


# 记录FPS开始时间
frame_count = 0
frame_start_time = time.time()
while True:

    # 截取指定区域的屏幕截图
    # 将截图转换为灰度图像
    screenshot = capture_screen()
    # 尝试使用pyzbar库识别二维码
    codes = decode(screenshot, symbols=[pyzbar.ZBarSymbol.QRCODE])

    # 如果找到了二维码,输出其内容
    if codes:
        print("扫码成功!")
        pattern = r"ticket=([a-f0-9]+)"
        match = re.search(pattern, codes[0].data.decode())
        # 正则请求地址
        if match:
            print(match.group(1))
            # 进入抢码
            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)
                random = 1.3
                time.sleep(random)
                print("防止过快被察觉插入随机延迟")
                # 确认登陆
                start_time = time.time()
                ConfirmRequest(match.group(1))
                end_time = time.time()
                # 计算代码执行时间并输出
                elapsed_time = end_time - start_time
                print("确认登陆成功耗时 %.3f 秒" % elapsed_time)
                # print("作者by:吾爱破解tseed")
                # 等待一下
                time.sleep(1)
        else:
            print("未知二维码抢码失败")
            # 等待一下
            time.sleep(1)

    # 记录每秒帧数
    frame_count += 1
    if time.time() - frame_start_time >= 1:
        fps = frame_count
        print(f"FPS:{fps}" + "\r", end='', flush=True)
        frame_count = 0
        frame_start_time = time.time()

    # 在窗口中显示截图
    cv2.imshow("QR Code Scanner", screenshot)

    # 检查是否按下了键盘上的任意键
    if cv2.waitKey(1) != -1:
        break
# 关闭窗口
cv2.destroyAllWindows()




免费评分

参与人数 6威望 +2 吾爱币 +25 热心值 +6 收起 理由
春又来人已去 + 1 + 1 谢谢@Thanks!
dyz5356 + 1 + 1 谢谢@Thanks!
renmingnanqi + 1 我很赞同!
苏紫方璇 + 2 + 20 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
164684693 + 2 + 1 用心讨论,共获提升!
LostMew + 1 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
落幕‘ 发表于 2023-6-16 23:21
2023/6/16出现了错误
扫码成功!
648c7d85f3775b7e187edb3e
抢码成功耗时 0.381 秒
防止过快被察觉插入随机延迟
Traceback (most recent call last):
  File "D:\py\main.py", line 210, in <module>
    ConfirmRequest(match.group(1))
  File "D:\py\main.py", line 156, in ConfirmRequest
    token = data["data"]["game_token"]
TypeError: 'NoneType' object is not subscriptable
{"data":null,"message":"登录失效,请重新登录","retcode":-100}
推荐
mnonak4 发表于 2023-6-23 19:17
抢码成功耗时 0.131 秒
防止过快被察觉插入随机延迟
Traceback (most recent call last):
  File "C:\Users\31460\PycharmProjects\pythonProject\main.py", line 210, in <module>
    ConfirmRequest(match.group(1))
  File "C:\Users\31460\PycharmProjects\pythonProject\main.py", line 156, in ConfirmRequest
    token = data["data"]["game_token"]
            ~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: 'NoneType' object is not subscriptable
{"data":null,"message":"登录失效,请重新登录","retcode":-100}

Process finished with exit code -1
推荐
LFY1227 发表于 2023-5-21 15:56
建议出个抓stoken教程 网上的方法抓出来的stoken数据不一样!!
沙发
Hmily 发表于 2023-5-18 17:08
你看下这个内容,修改下图片https://www.52pojie.cn/misc.php? ... 29&messageid=36
3#
 楼主| tseed 发表于 2023-5-18 20:58 |楼主
Hmily 发表于 2023-5-18 17:08
你看下这个内容,修改下图片https://www.52pojie.cn/misc.php?mod=faq&action=faq&id=29&messageid=36

好的已经改了
4#
164684693 发表于 2023-5-20 13:37
运行不了啊。。。
5#
a525335172 发表于 2023-5-20 18:27
可以,学习了
7#
DearMissbell 发表于 2023-5-22 20:26
stoken很多方法都不行了,希望出个抓stoken教程
8#
irui0226 发表于 2023-5-23 10:01
感谢楼主
9#
 楼主| tseed 发表于 2023-5-23 13:06 |楼主
DearMissbell 发表于 2023-5-22 20:26
stoken很多方法都不行了,希望出个抓stoken教程

在米游社app可以抓取到
10#
13715315553 发表于 2023-5-23 15:02
哈哈,可以。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表