0%

假设有一个第三方库,我们引用了它并且调用了它的方法,然后我们需要拿到这个方法的返回类型作为我们一个公共函数的参数类型,例如:

1
2
3
4
5
6
7
8
9
10
import { Innertube } from "youtubei.js";

const innertube = await Innertube.create();
const video = await innertube.getBasicInfo("video_id");
handleVideo(video);

// 注意这里的VideoInfo是getBasicInfo的返回类型,这里并没有拿到
function handleVideo(video: VideoInfo) {
// do something
}

这个时候可能就会有人说,很简单啊直接Ctrl + 点击进去方法看一下返回类型不就行了吗?,好的那我们点进getBasicInfo看下:

阅读全文 »

假设有一个结构体来表示用户信息:

1
2
3
4
5
6
type User struct {
Name string `json:"name"`
Sex string `json:"sex"`
Age int `json:"age"`
Vip bool `json:"vip"`
}

然后有个需求是展示给用户的名称要根据用户的性别VIP来生成,比如说:

  • 如果用户是 VIP,那么展示 尊贵的 + 名字 + 先生/女士
  • 如果用户不是 VIP,那么展示 名字 + 先生/女士

这个时候一般会有个做法,在结构体中加一个字段:

1
2
3
4
5
6
7
8
9
10
11
12
type User struct {
Name string `json:"name"`
Sex string `json:"sex"`
Age int `json:"age"`
Vip bool `json:"vip"`
DisplayName string `json:"display_name"`
}

// 实现一个方法来设置 DisplayName 字段
func (u *User) SetDisplayName() {

}

然后在每次更新NameSexVip的时候调用SetDisplayName方法来更新DisplayName字段,或者在序列化的时候调用SetDisplayName方法来更新DisplayName字段,这样做是没问题的,但是非常的不利于维护,要到处硬编码调用SetDisplayName方法,非常容易遗漏,那么有没有什么优雅的方式来解决这个问题呢?答案是有的,下面来介绍一下。

阅读全文 »

最近发现了一个沉浸式翻译的神奇功能,就是在输入框输入中文的时候敲三下空格就可以自动翻译成英文,这功能真的挺方便的,效果如下图:

这直接引起了我的好奇心,要知道模拟文本输入是一个很麻烦的事情,记得之前有一次我想用油猴来做一个discord自动发消息水经验的脚本,但是卡在了模拟输入这一步,最后就放弃了。

于是就去discord试了下沉浸式翻译的这个功能,发现是可以正常运作的,这我就不得不好好研究下了。

阅读全文 »

前言

之前把gopeed项目升级到go1.21版本后,发现gomobile编译完后,在 flutter ios 端编译会报错,如下:

1
2
3
4
5
6
7
8
9
ld: Undefined symbols:
_res_9_nclose, referenced from:
_runtime.text in Libgopeed[arm64][2](go.o)
_res_9_ninit, referenced from:
_runtime.text in Libgopeed[arm64][2](go.o)
_res_9_nsearch, referenced from:
_runtime.text in Libgopeed[arm64][2](go.o)
clang: error: linker command failed with exit code 1 (use -v to see invocation)

然后我在gogithub里找到了这个issue,但是看到这个@bcmills哥们的回复感觉太麻烦了就用了后面@dreacot老哥的解决方案,编译的时候加上-tags netgo

1
gomobile bind -target=ios -tags netgo

然后就可以正常编译了,因为我自己没有ios设备,就没有测试过,按理说编译通过了应该就没问题了,然而最近 github 上好多用户都在反馈 ios 端无法正常使用,附上一个issue,看起来都是DNS解析的问题,起初以为是用户的网络问题,但是随着越来越多的用户反馈,这肯定就不是单纯的用个例问题了,于是又重新开始研究@bcmills哥们的解决方案。

阅读全文 »

前言

之前苦于github action不支持macOS arm架构,导致我为了打gopped macos包煞费苦心,我在 linux 上用xgo交叉编译出来macos arm64的动态库,然后在macOS x64上再打包成macos amd64的动态库,最后把两个架构的动态库合并成一个universal binary包,来同时支持IntelApple Silicon架构,如今github action终于支持macOS arm架构了,这下可以省去很多麻烦了。

阅读全文 »

不知道从什么时候开始,新写的文章阅读数量一直是1,一直没有去管,今天把问题解决了,记录下希望能帮到有同样问题的人。

问题原因

Next 中内置的leancloud_visitors插件是用leancloud存储功能来实现的,类似一个mongodb,不知道什么时候开始默认把权限变成了只读,所以每次更新统计数的时候都会报403权限问题,通过网络请求可以看到:

阅读全文 »

前言

前一段时间给我的开源下载器 Gopeed 实现了一套扩展系统,相关设计草案可以在这里查看,基于这套扩展系统可以很方便的通过javascript来实现一些定制化的功能,目前已经实现的扩展有:

然后重点是这些扩展也是全平台支持的,这意味着你可以在windowsmaclinuxandroidiosweb平台上安装和使用这些扩展,是不是很酷?接下来就来介绍下我是如何实现这套扩展系统的。

阅读全文 »

前言

经过近三年的迭代,Gopeed 终于迎来了我觉得比较满意的一个版本 v1.4.3,早在 proxyee-down 停更的时候,我就立下了一个flag要用 Golang 来重写一个下载器:

当时刚接触 Golang 就被深深吸引了,它优秀的网络编程、协程和交叉编译等特性,不经感叹这简直就是开发下载器的天选编程语言,于是就有了这个项目,刚开始的时候想着就做一个类似aria2这样的命令行工具,后来flutter异军突起,我就一直在调研用flutter来开发一个支持所有平台的下载器的可行性,一开始flutter desktop还不是很成熟,我甚至有考虑过用electron做桌面端,flutter做移动端,后来flutter 2.0发布之后,flutter desktop也正式发布了,测了下基本没啥大坑,觉得这是一个很好的机会,就开始把命令行工具改造成GUI,更方便用户使用,最终不出所望,通过 Golang + flutter 的组合,实现了一个支持所有平台的下载器。

相关链接:
官网 -> https://gopeed.com
Github -> https://github.com/GopeedLab/gopeed

阅读全文 »

转载申明

文章转载自互联网,如有侵权,请联系删除
本文仅作为学习交流,禁止用于非法用途

0x00 概述

针对某麦网部分演唱会门票仅能在 app 渠道抢票的问题,本文研究了 APK 的抢票接口并编写了抢票工具。本文介绍的顺序为环境搭建、抓包、trace 分析、接口参数获取、rpc 调用实现,以及最终的功能实现。通过阅读本文,你将学到反抓包技术破解、Frida hook、jadx apk 逆向技术,并能对淘系 APP 的运行逻辑有所了解。本文仅用于学习交流,严禁用于非法用途。

阅读全文 »

转载申明

文章转载自互联网,如有侵权,请联系删除
本文仅作为学习交流,禁止用于非法用途

1. 背景

阿里系当前采用的加密版本是 6.3,6.2 版本的大家几乎都解决了,6.3 的网上资料很少,这里讲讲 6.3 的解密过程

  1. 阿里系通用这一套加密算法,主要是 x-sign,x-sgext,x_mini_wua,x_umt 这四个加密参数,解决了其中一个 app,其他的比如淘 X,咸 X 等 app 都相差不大了,改改参数,或者替换不同的方法名称就行;
  2. 使用的是 frida-rpc 主动调用的方法(对加密算法解密的话,难度很高,我没做出来);
  3. 本次做的是阿里系的某生鲜平台 app, 仅作为学习交流,禁止用于商业使用
阅读全文 »