获取 Github commit 通知请进入关联群组
@ZGQinc_chat_room

频道主的个人主页
domain.zgqinc.gq

网页版
tg.zgqinc.gq
RSS订阅
https://tg.zgqinc.gq/rss.xml
𝐙𝐆𝐐 ɪɴᴄ.的唠嗑频道
Video
自学MC皮肤花了几小时做出来了,接下来还有Live2D面捕模型和VRChat模型。
𝐙𝐆𝐐 ɪɴᴄ.的唠嗑频道
Samsung Notes在One UI 6版本(4.3.418.0)中已经移除机型限制,从MS Store安装后直接就能使用,包括云同步功能,云同步需要安装Samsung Account。 三星这是想开了? https://github.com/ZGQ-inc/GalaxyBookEnablerEnhanced?tab=readme-ov-file#三星应用程序列表
三星自己的Quick Share已经限制非三星电脑使用,通过伪造BIOS信息可以解决。倒是解决了三星版Quick Share在有些时候无法传PC的问题,二者可以共存,共存可能会导致谷歌版Quick Share找不到设备。
打算写一个导出账号内全部已归档贴纸包的脚本,被Telegram的messages.getArchivedStickers()方法折磨了几个月后,我可以确信这是服务器端的问题,而不是客户端的方法定义有问题。

TG最多可以添加200个贴纸包,当超过之后最老的贴纸包会被自动归档,我TG用了几年了,一看,嗯,3000多个已归档贴纸包,就想导出一下,然后就被硬控了,具体怎么硬控我不想说了,反正循环遍历休息各种逻辑都尝试过了还是没戏,总之下面是报告。

https://core.telegram.org/method/messages.getArchivedStickers
依据官方文档,messages.getArchivedStickers()方法允许用户通过分页方式浏览其已归档的贴纸包列表,该方法接受偏移量ID offset_id 和单次获取数量限制 limit 两个参数,旨在实现标准的分页浏览机制。
其工作流程如下:
客户端发送offset_id=0,服务器返回第1页贴纸包;
接着客户端获取第1页结果中最后一个贴纸包的ID,并将其作为下一次请求的offset_id,从而获取第二页数据。如此循环,直至服务器返回空列表。
然而,实际情况却是:服务器仅正确响应了offset_id=0首次请求和第1页结果中最后一个贴纸包的ID的第二次请求。对于所有后续的、携带了有效offset_id的请求,服务器完全无视该参数,再次返回第1页的数据。这种行为使任何超过2页数据量的归档贴纸包都无法通过此API访问。

以Telethon为例,使用GetArchivedStickersRequest()方法,脚本如下:
import json
import asyncio
from telethon.sync import TelegramClient
from telethon.tl.functions.messages import GetArchivedStickersRequest

API_ID = '数据删除'
API_HASH = '数据删除'
SESSION_NAME = 'account'
JSON = 'sticker.json'

async def main():
    async with TelegramClient(SESSION_NAME, API_ID, API_HASH) as client:
        try:
            initial_request = await client(GetArchivedStickersRequest(offset_id=0, limit=1, masks=False))
            total_count = initial_request.count
        except:
            return

        seen_ids = set()
        all_archived_sets = []
        offset_id = 0
        is_stuck = False

        while len(seen_ids) < total_count:
            count_before = len(seen_ids)
            print(f"DEBUG: offset_id = {offset_id}")
            try:
                result = await client(GetArchivedStickersRequest(offset_id=offset_id, limit=100, masks=False))
            except:
                break
            if not result.sets:
                break

            new_items = 0
            for s in result.sets:
                if s.set.id not in seen_ids:
                    seen_ids.add(s.set.id)
                    all_archived_sets.append(s.set)
                    new_items += 1

            print(f"新增 {new_items} 个")

            if new_items == 0 and len(result.sets) > 0:
                print("API开始返回重复数据 终止")
                is_stuck = True
                break

            offset_id = result.sets[-1].set.id

        print(f"最终获取 {len(all_archived_sets)} / {total_count} 个贴纸包")
        with open(JSON, 'w', encoding='utf-8') as f:
            json.dump(
                [{'id': s.id, 'access_hash': s.access_hash, 'title': s.title, 'short_name': s.short_name}
                 for s in all_archived_sets],
                f, indent=4, ensure_ascii=False
            )

if __name__ == '__main__':
    asyncio.run(main())


输出:
zgqinc@B850M-PLUS:/mnt/f/test/telethon$ python3 acv_sticker.py
DEBUG: offset_id = 0
新增 40 个
DEBUG: offset_id = 591378...
新增 37 个
DEBUG: offset_id = 747964...
新增 0 个
API开始返回重复数据 终止
最终获取 77 / 3410 个贴纸包


使用基于TDLib实现的Telegram X查阅已归档贴纸包页面,依然返回77个贴纸包。不仅如此,Unigram以及官方客户端都只能获取少于80个的数据。

基于以上证据,我们可以得出结论:
这不是 messages.getArchivedStickers()方法定义的问题。因为该方法在前两页的请求中工作得非常完美,证明其参数设计是正确的。TDLib和Telethon都在以正确的方式使用这个方法。
这是服务器端实现的bug。问题的根源在于,当处理拥有超过100个数据的账户时,服务器的后端逻辑在处理到第三页的分页请求时出现了错误。它没能正确解析offset_id参数来定位到数据列表的相应位置,而是错误地重置或返回了初始位置的数据。

打个比方:
想象你在用某APP浏览文章,看完前2页,翻页,又出现了第1页。

那很搞笑了,我看看有什么办法可以让官方修修这个问题。
900收了台Note FE和S7 Edge,颜值没话说,可惜其中有台命运多舛。为了给7年前买不起S系列和Note系列旗舰机只买得起A系列的自己补票才买的。都是韩版,猎户座8890处理器,可以刷LineageOS 21安卓14,One UI 7的包不完善,所以不考虑。
由于Toolbox for Minecraft停更了,加上感觉是时候从移动版转PC版了,再有自己已经习惯基岩版特性和UI了,而且懂我的都知道我玩生存没修改器浑身不舒服,目前不考虑转Java版,所以研究了一下TFM的平替。
32767附魔等级神装+特殊物品
https://t.me/ZGQinc_chat_room/46559
由于某些工具附魔32767等级的时运会生成太多掉落物导致游戏崩溃,因此使用NBT Studio改成500。使用/function命令添加带有物品的潜影盒。
/function armor

/function tools

/function blocks

🐏修改器菜单
https://t.me/ZGQinc_chat_room/46560
/give @s cheats:cheat_menu_staff

💎物品信息
https://mcpedl.com/hunger-points-on-food-names/
💃传送
https://mcpedl.com/multiplayer-waypoint-system/
🟢动态光源
https://mcpedl.com/raiyons-dynamic-light-addon/
快速挖掘
https://mcpedl.com/utilities-vein-miner/
🦅飞行功能其实原生就自带,编辑世界,无敌模式,启用Education Edition,输入命令即可。
/ability @s mayfly true
𝐙𝐆𝐐 ɪɴᴄ.的唠嗑频道
https://xdaforums.com/t/bootloader-unlocking-option-removed-from-one-ui-8-0.4751904/ OEM解锁开关在One UI 8设置的开发者选项中被移除,进而无法解锁BL。 已经证实的机型为Fold7、Flip7、S25U,S24U(泄露ROM),EUX欧盟和CHC国行的ROM都是如此。 对于从One UI 7升级到One UI 8的机型,如果仅开启OEM解锁开关未解锁BL,OEM解锁开关会重新关闭,如果之前就解锁了BL则不受影响。…
三星禁止解锁BL很有可能是受到了欧盟法案《Radio Equipment Directive》(以下简称RED)的约束,我把重点放在前面说了:
三星赶在2025年8月1日这个最后期限履行了法律法规,虽然法案中没有明确要求OEM必须禁止解锁Bootloader(以下简称BL)以确保市场规范,但三星可能用了极其激进且一刀切的方式——禁止解锁BL,来确保其合规性。

法律条款2014/53/EU中指出:
...
Article 3
...
3. Radio equipment within certain categories or classes shall be so constructed that it complies with the following essential requirements:
...
(d) radio equipment does not harm the network or its functioning nor misuse network resources, thereby causing an unacceptable degradation of service;
(e) radio equipment incorporates safeguards to ensure that the personal data and privacy of the user and of the subscriber are protected;
(f) radio equipment supports certain features ensuring protection from fraud;
...

然后在(EU) 2022/30这个授权法案中明确指出:
...
supplementing Directive 2014/53/EU of the European Parliament and of the Council with regard to the application of the essential requirements referred to in Article 3(3), points (d), (e) and (f), of that Directive
...
Article 3
This Regulation shall enter into force on the twentieth day following that of its publication in the Official Journal of the European Union.
It shall apply from 1 August 2024.
This Regulation shall be binding in its entirety and directly applicable in all Member States.
...

考虑到欧盟法案的宽限期,留给三星最后的时间就是2025年8月1日。

我们逐条分析三星是怎么做来满足要求的:
关于(d):强制锁定BL,只运行经过制造商签名和审查的固件,确保其在网络上的行为可预测且无害,防止被劫持的物联网设备被用于危害网络基础设施的行为。
关于(e):通过锁定BL,防止安装任何可能窃取数据的恶意软件,完全依赖Knox进行防护,以确保用户的个人数据和隐私受到保护。
关于(f):确保支付应用仅在由完整、未被破坏的信任链和锁定的BL所保障的TEE中运行,确保防范欺诈的功能。

不过欧盟的立法是目标导向型,而非具体实施方案限定型。法规的语言,如“确保”、“包含保障措施”、“支持某些功能”,定义了需要解决的问题(如网络危害、数据泄露、金融欺诈),但并未规定必须采用何种技术方案来解决这些问题。
此外,协调标准(如EN 18031)和公告机构评估机制的存在,进一步证明了欧盟的合规路径是灵活的。制造商可以选择遵循协调标准以获得符合性推定,也可以选择不使用这些标准,而是通过独立的公告机构来评估其产品是否满足基本要求。
所以三星禁止解锁BL是战略选择,而非法律强制,尽管采取这种方式欠妥,但三星就是这么干了,至于后果,如果这种一刀切的策略被欧盟监管机构接受为满足RED指令的有效方式,而未引发任何法律挑战,那么它很可能成为行业内事实上的合规标准,其它同类OEM将面临巨大的压力去效仿三星的做法,以确保市场准入并规避法律风险,这可能引发一场多米诺骨牌效应,导致整个生态系统在欧洲乃至全球范围内加速走向封闭,进一步边缘化那些少数仍坚持开放BL的品牌,毕竟已经是少数了。



我不知道上述的有没有过度解读,但目前为止没有比这更合理的解释了。
《赛博朋克2077》最烧脑最费解最高难的彩蛋 “FF:06:B5” CET修改器辅助解法

TL;DR 一个打破第四面墙的彩蛋。
Wiki: https://ff06b5.fandom.com

Cyber Engine Tweaks真是个好东西,因为全是命令,所以文章会有点长,彩蛋流程也有点长,做个存档花了我几小时,解说会挑一些关键的讲,因为太冗杂了没办法讲完,感兴趣可以看Wiki。

首先这是6座大雕像和公寓内2座小雕像和#FF06B5颜色球体2座雕像的传送命令。用于观光。
D3
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-1564.049, y=280.393, z=9.815, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

F5
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-236.700, y=-1428.052, z=12.020, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

D5
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-159.348, y=379.761, z=72.674, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

D4
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-449.653, y=698.163, z=48.295, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

E5
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-125.208, y=-193.011, z=24.132, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

E3
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-1721.013, y=-367.517, z=-12.201, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

公寓1
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-1517.8036, y=-969.2194, z=89.59819, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

公寓2
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-783.0242, y=982.2893, z=28.224358, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

#FF06B5
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-657.8248, y=926.22656, z=19.90857, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

#FF06B5
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-1541.2432, y=1196.5316, z=15.905518, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})


开始解密:
来到教堂位置
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=-3452.357, y=-4051.7979, z=74.130554, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=0})

这里要通关Arasaka Tower 3D小游戏那8台服务器才会通电,视频演示 https://t.me/ZGQinc_chat_room/46437 ,不过这里不是正常通关流程而且非常难,直接输入命令开启无敌和无限弹药
ModStatPl = function(ID, value) Game.GetStatsSystem():AddModifier(Game.GetPlayer():GetEntityID(), RPGManager.CreateStatModifier(ID, gameStatModifierType.Additive, value)) end ApplStatEff = function(effect) Game.GetStatusEffectSystem():ApplyStatusEffect(Game.GetPlayer():GetEntityID(), effect) end RemoStatEff = function(effect) Game.GetStatusEffectSystem():RemoveStatusEffect(Game.GetPlayer():GetEntityID(), effect) end if Game.GetStatusEffectSystem():HasStatusEffect(Game.GetPlayer():GetEntityID(), "BaseStatusEffect.Invulnerable") == false then ApplStatEff("BaseStatusEffect.Invulnerable") ApplStatEff("GameplayRestriction.InfiniteAmmo") ModStatPl("Stamina", 90000) print(" [ GOD MODE TOGGLE ]") print(" - NO DAMAGE TAKEN: ON") print(" - INFINITE AMMO: ON") print(" - INFINITE STAMINA: ON") else RemoStatEff("BaseStatusEffect.Invulnerable") RemoStatEff("GameplayRestriction.InfiniteAmmo") ModStatPl("Stamina", -90000) print(" [ GOD MODE TOGGLE ]") print(" - NO DAMAGE TAKEN: OFF") print(" - INFINITE AMMO: OFF") print(" - INFINITE STAMINA: OFF") end

接下来首先需要通过120层和86层下到52层,这里参考地图 https://ff06b5.fandom.com/wiki/File:Floor_52-secret.png ,首先需要去①有雕像的房间,然后去③写着941229的房间待到游戏倒计时到271秒的时候去②④房间,通过走进墙的凹槽内的方式输入密码240891,最后去⑤出口到-10层走迷宫,迷宫地图https://ff06b5.fandom.com/wiki/The_Church?file=Themaze1.png ,时间可能会不够,这里可以用Simple Menu的时间膨胀(慢动作)功能,如图这样配置 https://t.me/ZGQinc_chat_room/46428 ,走完迷宫会遇到亚当重锤,反正无敌别管他直接去出口即可逃离荒坂塔。逃离之后服务器会通电,密码解密在垃圾场的电脑里面,传送命令
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=1200.8964, y=-1511.8367, z=49.39361, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

结合《巫师3》的隐藏地点破解,先把时间调到凌晨4:00左右,然后按照从左到右次序输入8个密码00255 00006 00181 00051 00091 00240 00270 00420,教堂中间的笔记本里面会出现一个坐标,传送命令
Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=2569.96, y=-1816.1348, z=88.84706, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=45})

到那里会看到一个床垫,等到4:30左右就站在床垫上什么都不干,游戏内一个小时过后就会触发过场动画,视频演示 https://t.me/ZGQinc_chat_room/46431
到这里就是目前网上对这个彩蛋的解谜流程了,最后放上流程不同时期的存档 https://t.me/ZGQinc_chat_room/46434 ,进入03_Mattress存档直接看过场动画。
暂时结束,彩蛋可能还有地方可以挖掘,官方工作人员不愿意透露一点信息。
Back to Top