Compare commits

..

17 Commits

Author SHA1 Message Date
Sunny Young
ebdcb7bbd2 config: add version 32288 support 2025-12-11 15:10:03 +08:00
Sunny Young
2a9978b046 config: add version 31960 support 2025-12-10 00:10:09 +08:00
Sunny Young
ac9b1575de command: optimize with option group 2025-12-10 00:08:47 +08:00
Sunny Young
0682644327 reorder code blocks 2025-12-08 14:52:08 +08:00
Sunny Young
3cc0f2c5c6 update README.md 2025-12-07 15:46:34 +08:00
Sunny Young
f8226536dc update README.md 2025-12-07 15:13:48 +08:00
Sunny Young
87d4854174 update README.md 2025-12-07 15:05:38 +08:00
Sunny Young
4f801b35f2 update README.md 2025-12-07 13:59:22 +08:00
Sunny Young
6d3c75faec config: replace with master url 2025-12-07 13:52:41 +08:00
Sunny Young
6922703e57 update README.md 2025-12-07 13:49:14 +08:00
Sunny Young
171c352dce command: fix default command flow to show help instead of error 2025-12-07 13:49:14 +08:00
Sunny Young
a58f04b1d4 subcommand: add versions 2025-12-07 13:49:14 +08:00
Sunny Young
003643d063 config: add version 32281 support 2025-12-07 13:49:14 +08:00
Sunny Young
4b1bd7c2ab refactor: use async/await instead of promises
support both local and network config
2025-12-07 13:49:14 +08:00
Sunny Young
540f13b35b config: add support for multiple instances 2025-12-07 13:49:14 +08:00
Sunny Young
723e982bf3 fix a config.json reading issue 2025-12-07 13:49:14 +08:00
Sunny Young
8e13e947d5 refactor: support WeChat 4.x 2025-12-07 13:49:14 +08:00
6 changed files with 215 additions and 80 deletions

View File

@ -1 +0,0 @@
2.7.8

View File

@ -1,5 +0,0 @@
# Contributing
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
[![Contributors](https://opencollective.com/WeChatTweak-macOS/contributors.svg?width=890&button=false)](https://github.com/Sunnyyoung/WeChatTweak-macOS/graphs/contributors)

View File

@ -1,7 +1,10 @@
# WeChatTweak
[![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)](LICENSE)
[![README](https://img.shields.io/badge/Telegram-WeChatTweak-brightgreen.svg)](https://t.me/wechattweak)
[![README](https://img.shields.io/badge/GitHub-black?logo=github&logoColor=white)](https://github.com/sunnyyoung/WeChatTweak)
[![README](https://img.shields.io/badge/Telegram-black?logo=telegram&logoColor=white)](https://t.me/wechattweak)
[![README](https://img.shields.io/badge/FAQ-black?logo=googledocs&logoColor=white)](https://github.com/sunnyyoung/WeChatTweak/wiki/FAQ)
A command-line tool for tweaking WeChat.
## 功能
@ -9,16 +12,20 @@
- 阻止自动更新
- 客户端多开
## 安装
## 安装&使用
```bash
# 安装
brew install sunnyyoung/tap/wechattweak
```
## 使用
# 更新
brew upgrade wechattweak
```bash
# 执行 Patch
wechattweak patch
# 查看所有支持的 WeChat 版本
wechattweak versions
```
## 参考
@ -29,9 +36,9 @@ wechattweak patch
## 贡献者
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
This project exists thanks to all the people who contribute.
[![Contributors](https://opencollective.com/WeChatTweak-macOS/contributors.svg?width=890&button=false)](https://github.com/Sunnyyoung/WeChatTweak-macOS/graphs/contributors)
[![Contributors](https://contrib.rocks/image?repo=sunnyyoung/WeChatTweak)](https://github.com/sunnyyoung/WeChatTweak/graphs/contributors)
## License

View File

@ -81,7 +81,7 @@ struct Config: Decodable {
let version: String
let targets: [Target]
static func load(from url: URL) async throws -> [Config] {
static func load(url: URL) async throws -> [Config] {
if url.isFileURL {
return try JSONDecoder().decode(
[Config].self,

View File

@ -8,7 +8,64 @@ import Foundation
import Dispatch
import ArgumentParser
// MARK: Versions
extension Tweak {
struct Versions: AsyncParsableCommand {
static let configuration = CommandConfiguration(abstract: "List all supported WeChat versions")
@OptionGroup
var options: Tweak.Options
mutating func run() async throws {
print("------ Current version ------")
print(try await Command.version(app: options.app) ?? "unknown")
print("------ Supported versions ------")
try await Config.load(url: options.config).forEach({ print($0.version) })
Darwin.exit(EXIT_SUCCESS)
}
}
}
// MARK: Patch
extension Tweak {
struct Patch: AsyncParsableCommand {
static let configuration = CommandConfiguration(abstract: "Patch WeChat.app")
@OptionGroup
var options: Tweak.Options
mutating func run() async throws {
print("------ Version ------")
let version = try await Command.version(app: options.app)
print("WeChat version: \(version ?? "unknown")")
print("------ Config ------")
guard let config = (try await Config.load(url: options.config)).first(where: { $0.version == version }) else {
throw Error.unsupportedVersion
}
print("Matched config: \(config)")
print("------ Patch ------")
try await Command.patch(
app: options.app,
config: config
)
print("Done!")
print("------ Resign ------")
try await Command.resign(
app: options.app
)
print("Done!")
Darwin.exit(EXIT_SUCCESS)
}
}
}
// MARK: Tweak
struct Tweak: AsyncParsableCommand {
enum Error: LocalizedError {
case invalidApp
case invalidConfig
@ -29,8 +86,7 @@ struct Patch: AsyncParsableCommand {
}
}
static let configuration = CommandConfiguration(abstract: "Patch WeChat.app")
struct Options: ParsableArguments {
@Option(
name: .shortAndLong,
help: "Path of WeChat.app",
@ -57,54 +113,22 @@ struct Patch: AsyncParsableCommand {
}
}
)
var config: URL = URL(string: "https://raw.githubusercontent.com/sunnyyoung/WeChatTweak/refs/heads/feature/2.0/config.json")!
mutating func run() async throws {
do {
print("------ Version ------")
guard let version = try await Command.version(app: self.app) else {
throw Error.invalidVersion
}
print("\(version)")
print("------ Config ------")
guard let config = (try await Config.load(from: self.config)).first(where: { $0.version == version }) else {
throw Error.unsupportedVersion
}
print("\(config)")
print("------ Patch ------")
try await Command.patch(
app: self.app,
config: config
)
print("Done!")
print("------ Resign ------")
try await Command.resign(
app: self.app
)
print("Done!")
print("------🎉 Done!------")
Darwin.exit(EXIT_SUCCESS)
} catch {
print("------🚨 Error------")
print("\(error.localizedDescription)")
Darwin.exit(EXIT_FAILURE)
}
}
var config: URL = URL(string:"https://raw.githubusercontent.com/sunnyyoung/WeChatTweak/refs/heads/master/config.json")!
}
struct Tweak: AsyncParsableCommand {
static let configuration = CommandConfiguration(
commandName: "wechattweak",
abstract: "A command-line tool for tweaking WeChat.",
subcommands: [
Versions.self,
Patch.self
],
defaultSubcommand: Self.self
]
)
mutating func run() async throws {
print(Tweak.helpMessage())
Darwin.exit(EXIT_SUCCESS)
}
}
Task {

View File

@ -168,5 +168,115 @@
]
}
]
},
{
"version": "32288",
"targets": [
{
"identifier": "revoke",
"entries": [
{
"arch": "arm64",
"addr": "103db34c0",
"asm": "00008052C0035FD6"
}
]
},
{
"identifier": "startUpdater",
"entries": [
{
"arch": "arm64",
"addr": "1001e9ed0",
"asm": "00008052C0035FD6"
}
]
},
{
"identifier": "startBackgroundUpdatesCheck",
"entries": [
{
"arch": "arm64",
"addr": "1001ecb10",
"asm": "00008052C0035FD6"
}
]
},
{
"identifier": "checkForUpdates",
"entries": [
{
"arch": "arm64",
"addr": "1001ec73c",
"asm": "00008052C0035FD6"
}
]
},
{
"identifier": "enableAutoUpdate",
"entries": [
{
"arch": "arm64",
"addr": "1001ecfc0",
"asm": "00008052C0035FD6"
}
]
},
{
"identifier": "automaticallyDownloadsUpdates",
"entries": [
{
"arch": "arm64",
"addr": "1001f59e0",
"asm": "00008052C0035FD6"
}
]
},
{
"identifier": "canCheckForUpdate",
"entries": [
{
"arch": "arm64",
"addr": "1001f59e0",
"asm": "00008052C0035FD6"
}
]
},
{
"identifier": "multiInstance",
"entries": [
{
"arch": "arm64",
"addr": "1001e1a74",
"asm": "20008052C0035FD6"
}
]
}
]
},
{
"version": "31960",
"targets": [
{
"identifier": "revoke",
"entries": [
{
"arch": "arm64",
"addr": "10408a408",
"asm": "00008052C0035FD6"
}
]
},
{
"identifier": "multiInstance",
"entries": [
{
"arch": "arm64",
"addr": "1001e4a38",
"asm": "20008052C0035FD6"
}
]
}
]
}
]