带小白搓一个属于自己的ChatGPT客户端app

成品效果

开发工具

  • NP管理器/MT管理器

开发原理

逆向ChatAir成品APP:

教程开始

安装好可以自己去看看这个app的状态
提取安装包->查看->点开一个dex->Dex编辑器+±>全选

修改默认API服务地址

点击常量->过滤->输入api.openai.com->不要任何勾选->确定->点击在当前结果中替换->换成你自己的One-API、New-API服务(如果没有ssl,就搜https://api.openai.com替换http://xx.com


别忘记点击应用修改

去除全局AI参数中的GPT4模型Google模型

常量->过滤->输入GPT-3.5确认
过滤结果我们点击第一个搜索

我们修改UserConfig,点击搜索结果
给大家看一下这个initAiModeList方法

private void initAiModelList() {
        LinkedHashMap<Integer, AiModelBean> linkedHashMap = this.aiModelList;
        if (linkedHashMap != null) {
            linkedHashMap.clear();
        } else {
            this.aiModelList = new LinkedHashMap<>();
        }
        this.aiModelList.put(1, new AiModelBean("GPT-3.5", "gpt-3.5-turbo", true));
        this.aiModelList.put(2, new AiModelBean("GPT-3.5-0613", "gpt-3.5-turbo-0613", false));
        this.aiModelList.put(3, new AiModelBean("GPT-3.5-16k", "gpt-3.5-turbo-16k", true));
        this.aiModelList.put(4, new AiModelBean("GPT-3.5-16k-0613", "gpt-3.5-turbo-16k-0613", false));
        this.aiModelList.put(12, new AiModelBean("GPT-3.5-0125", "gpt-3.5-turbo-0125", true));
        this.aiModelList.put(5, new AiModelBean("GPT-4", "gpt-4", true));
        this.aiModelList.put(6, new AiModelBean("GPT-4-0613", "gpt-4-0613", false));
        this.aiModelList.put(7, new AiModelBean("GPT-4-32k", "gpt-4-32k", true));
        this.aiModelList.put(8, new AiModelBean("GPT-4-32k-0613", "gpt-4-32k-0613", false));
        this.aiModelList.put(9, new AiModelBean("GPT-4-1106-preview", "gpt-4-1106-preview", false));
        this.aiModelList.put(11, new AiModelBean("GPT-4-0125-preview", "gpt-4-0125-preview", true));
        this.aiModelList.put(10, new AiModelBean("GPT-4-vision-preview", "gpt-4-vision-preview", "GPT-4-vision-preview (Picture model)", true));
        initGoogle();
        this.aiModelList.put(0, new AiModelBean(LocaleController.getString("CustomModel", R.string.CustomModel), "custom Model", true));
    }

明显看到 使用put 方法向aiModelList 中添加多个AiModelBean 实例。
而且参数存在一个布尔值,如果是flase则不显示(可以去参考app内部的AI全局参数)。
我们把这部分的GPT4已经我们不想公开的GPT3.5模型删掉(只是不put而已)或者给一个false。
我这边给大家提供删掉后的代码

.method private initAiModelList()V
    .registers 9

    .line 495
    iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;

    if-eqz v0, :cond_8

    .line 496
    invoke-virtual {v0}, Ljava/util/LinkedHashMap;->clear()V

    goto :goto_f

    .line 498
    :cond_8
    new-instance v0, Ljava/util/LinkedHashMap;

    invoke-direct {v0}, Ljava/util/LinkedHashMap;-><init>()V

    iput-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;

    .line 500
    :goto_f
    iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;

    const/4 v1, 0x1

    invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v2

    new-instance v3, Lorg/telegram/tgnet/AiModelBean;

    const-string v4, "GPT-3.5"

    const-string v5, "gpt-3.5-turbo"

    invoke-direct {v3, v4, v5, v1}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V

    invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    .line 501
    iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;

    const/4 v2, 0x2

    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v2

    new-instance v3, Lorg/telegram/tgnet/AiModelBean;

    const-string v4, "GPT-3.5-0613"

    const-string v5, "gpt-3.5-turbo-0613"

    const/4 v6, 0x0

    invoke-direct {v3, v4, v5, v6}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V

    invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    .line 502
    iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;

    const/4 v2, 0x3

    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v2

    new-instance v3, Lorg/telegram/tgnet/AiModelBean;

    const-string v4, "GPT-3.5-16k"

    const-string v5, "gpt-3.5-turbo-16k"

    invoke-direct {v3, v4, v5, v1}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V

    invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    .line 503
    iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;

    const/4 v2, 0x4

    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v2

    new-instance v3, Lorg/telegram/tgnet/AiModelBean;

    const-string v4, "GPT-3.5-16k-0613"

    const-string v5, "gpt-3.5-turbo-16k-0613"

    invoke-direct {v3, v4, v5, v6}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V

    invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    .line 504
    iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;

    const/16 v2, 0xc

    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v2

    new-instance v3, Lorg/telegram/tgnet/AiModelBean;

    const-string v4, "GPT-3.5-0125"

    const-string v5, "gpt-3.5-turbo-0125"

    invoke-direct {v3, v4, v5, v1}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V

    invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    .line 505
    iget-object v0, p0, Lorg/telegram/messenger/UserConfig;->aiModelList:Ljava/util/LinkedHashMap;

    invoke-static {v6}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v2

    new-instance v3, Lorg/telegram/tgnet/AiModelBean;

    sget v4, Lorg/telegram/messenger/R$string;->CustomModel:I

    const-string v5, "CustomModel"

    invoke-static {v5, v4}, Lorg/telegram/messenger/LocaleController;->getString(Ljava/lang/String;I)Ljava/lang/String;

    move-result-object v4

    const-string v5, "custom Model"

    invoke-direct {v3, v4, v5, v1}, Lorg/telegram/tgnet/AiModelBean;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V

    invoke-virtual {v0, v2, v3}, Ljava/util/LinkedHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    return-void
.end method

注意:一定要替换干净,还有.不要忘记!
注意:一定要替换干净,还有.不要忘记!
注意:一定要替换干净,还有.不要忘记!

修改app名称

点击resources.arsc点击Arsc编辑器++
常量->过滤->ChatAir这次要勾选完全匹配
别看搜索的结果多,没用,他这是对于多种语言的。我们直接全部替换就好了,反正我们面多的都是中国人!
回到常量->在当前替换->换成你自己想要的APP名称


替换的内容别忘记改,而且我们这里勾选了完全匹配,记得区分大小写
Cha,替换完记得应用

替换应用图标

点击图标,提取


随后会给你一个压缩包,里面有一个res文件夹,这里面的文件就是我们要替换的。
在我们apk的res目录下,把压缩包res文件夹中的全部png文件,搜索替换成你自己的图标即可。

也就是按照左侧的名字,修改apk里面的图片

换成你自己的图片哦!这里就不演示了!

DEX注入,添加自定义弹窗(点睛之笔啊!!)

把我们的OnlineDialog.dex添加到app中,然后重命名classes5.dex。
安装我们的app,打开Activity记录


记录这条activityorg.telegram.ui.LaunchActivity
进入dex编辑器,类名搜索

定位到onCreate方法(为什么是onCreate: onCreate() 方法是Activity生命周期中的第一个方法,当一个Activity被创建时,它会被调用)

然后把我们的配置代码粘贴到里面

const-string v0, "https://sharechain.qq.com/9bd7fa41bb14bd6db850f526d05d65ac"


invoke-static {p0, v0}, Lmutil/OnlineDialog;->show(Landroid/app/Activity;Ljava/lang/String;)V

大家自己开发的时候,自己访问我的在线弹窗连接复制里面的内容替换成你的。我这里使用的qq收藏的链接!
然后保存退出,在线弹窗也配置好了!

最后成果


弹窗配置下载:
https://xcyp.lanzoub.com/i51ce1v1p4ra
解压密码:linux.do-pastking

反馈邮箱替换就自己去搜吧!很简单!!!

总结

大家自行尝试哈!成功的可以在评论区附上你的截图!
如果这篇帖子对你有帮助,记得三连哦!嘻嘻 :stuck_out_tongue: :yum:

往期回顾

https://linux.do/t/topic/56465
https://linux.do/t/topic/53704

42 个赞

弹窗好玩吧

1 个赞

直接可以通过在线弹窗,给自己的客户免费的Key都行

优秀啊

大佬好高产啊

1 个赞

:+1::+1::+1:

1 个赞

没流量,没用:sob:

3 个赞

大佬啊!

1 个赞

好好好

1 个赞

给你点赞 :+1: :+1: :+1:

1 个赞

大佬太强了,这ui跟电报一样

1 个赞

强哇

2 个赞

硬核

1 个赞

硬核,来学习

1 个赞

能用gpts吗?

3 个赞

没试过

1 个赞

弹窗用云注入方便点吧

1 个赞

我看github下载的app中有设置API Server的功能,这和用mt个性的api服务地址有什么区别么?:thinking:

1 个赞

对代码完全不懂的小白来说按照教程也能部署成功嘛

1 个赞

来了

1 个赞