mamoe / mirai

高效率 QQ 机器人支持库
https://mirai.mamoe.net
GNU Affero General Public License v3.0
14.5k stars 2.55k forks source link

新的登录失败类型 `238` #2552

Closed 4o4E closed 1 year ago

4o4E commented 1 year ago

问题描述

新的登录失败类型 238

复现

.

mirai-core 版本

2.14.0

bot-protocol

IPAD

其他组件版本

No response

系统日志

net.mamoe.mirai.network.WrongPasswordException: Error(bot=Bot(*), code=238, title=禁止登录, message=请使用手Q扫描二维码或短信登录。, errorInfo=)
    at net.mamoe.mirai.internal.network.components.SsoProcessorImpl$SlowLoginImpl.doLogin(SsoProcessor.kt:331) ~[mirai-core-jvm-2.14.0.jar:2.14.0]
    at net.mamoe.mirai.internal.network.components.SsoProcessorImpl$SlowLoginImpl$doLogin$1.invokeSuspend(SsoProcessor.kt) ~[mirai-core-jvm-2.14.0.jar:2.14.0]
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) ~[kotlin-stdlib-1.8.0.jar:1.8.0-release-345(1.8.0)]
    at kotlinx.coroutines.internal.ScopeCoroutine.afterResume(Scopes.kt:33) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:?]
    at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:102) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:?]
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46) ~[kotlin-stdlib-1.8.0.jar:1.8.0-release-345(1.8.0)]
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:?]
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:?]
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:?]
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:?]
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:?]

网络日志

No response

补充信息

No response

tomatoomato commented 1 year ago

我也遇到了,咋解决

Hyperfish0917 commented 1 year ago

我下午也遇到了

spqdem commented 1 year ago

同问

4o4E commented 1 year ago

可以先用cssxsh的fix-protocol-version

协议选择 ANDROID_PHONE 或者 ANDROID_PAD

MrY-Cat commented 1 year ago

我也

leihao commented 1 year ago

特意在38妇女节开238

RexQian commented 1 year ago

可以先用cssxsh的fix-protocol-version

协议选择 ANDROID_PHONE 或者 ANDROID_PAD

我的情况是使用ANDROID_WATCH协议会提示238 然后切换到ANDROID_PAD协议会提示版本过低

然后使用了fix-protocol-version这个插件后,不再提示版本过低。通过滑块验证+手机短信验证后,正常登录

lc0321 commented 1 year ago

可以先用cssxsh的fix-protocol-version 协议选择 ANDROID_PHONE 或者 ANDROID_PAD

我的情况是使用ANDROID_WATCH协议会提示238 然后切换到ANDROID_PAD协议会提示版本过低

然后使用了fix-protocol-version这个插件后,不再提示版本过低。通过滑块验证+手机短信验证后,正常登录

请问怎么使用fix-protocol-version这个插件呢?

ablupi commented 1 year ago

可以先用cssxsh的fix-protocol-version 协议选择 ANDROID_PHONE 或者 ANDROID_PAD

我的情况是使用ANDROID_WATCH协议会提示238 然后切换到ANDROID_PAD协议会提示版本过低 然后使用了fix-protocol-version这个插件后,不再提示版本过低。通过滑块验证+手机短信验证后,正常登录

请问怎么使用fix-protocol-version这个插件呢?

到链接里下载jar放到plugins文件夹中,重新运行一遍就可以了,我的解决了

Sunosay commented 1 year ago

想问一下java+core的怎么解决 看了看楼上好像用的都是console(

hais1992 commented 1 year ago

想问一下java+core的怎么解决 看了看楼上好像用的都是console(

ikaros143 commented 1 year ago

pc端的java版的怎么解决...

4o4E commented 1 year ago

想问一下java+core的怎么解决 看了看楼上好像用的都是console(

参考插件源码

hais1992 commented 1 year ago

真难 Java 操作不了 MiraiProtocolInternal 类。。

使用了来自不同模块的 Kotlin 内部声明

Zoumachuan commented 1 year ago

想问一下大家,jar格式的插件是怎么安装的?我试着把链接里的jar文件放进去了,但还是报错 10 11

wolfAndTime commented 1 year ago

真难 Java 操作不了 MiraiProtocolInternal 类。。

使用了来自不同模块的 Kotlin 内部声明

所以你现在解决了吗,java要怎么才能调用MiraiProtocolInternal 里面的内容

hais1992 commented 1 year ago

真难 Java 操作不了 MiraiProtocolInternal 类。。

使用了来自不同模块的 Kotlin 内部声明

所以你现在解决了吗,java要怎么才能调用MiraiProtocolInternal 里面的内容

我也在等大佬指点-.-

sandtechnology commented 1 year ago

直接把插件包导进去调用初始化方法就好了啊(

VoyagerII commented 1 year ago

尝试让AI写一个反射来修改protocols,失败了。。

Zoumachuan commented 1 year ago

直接把插件包导进去调用初始化方法就好了啊(

大佬麻烦看一下,我把fix-protocol-version的gradle-wrapper.jar放进plugins里了,但还是报错235,请问需要对mirai做什么别的操作吗? image

msojocs commented 1 year ago

想问一下java+core的怎么解决 看了看楼上好像用的都是console(

编辑:我加了这个以后就能正常登录了,能否正常取决于账号情况。

package cn.robot.robot.utils;

import net.mamoe.mirai.utils.BotConfiguration;

import java.lang.reflect.Field;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

public class FixProtocolVersion {
    public static void fix(){
        try {

            Class<?> MiraiProtocolInternal = Class.forName("net.mamoe.mirai.internal.utils.MiraiProtocolInternal");
            Field field = MiraiProtocolInternal.getFields()[0];
            Object companion = field.get(Object.class);

            EnumMap<BotConfiguration.MiraiProtocol, Object> protocols = (EnumMap<BotConfiguration.MiraiProtocol, Object>)companion.getClass().getMethod("getProtocols$mirai_core").invoke(companion);
            Object pad = protocols.get(BotConfiguration.MiraiProtocol.ANDROID_PAD);
        /*
        * apkId: String,
            id: Long,
            ver: String,
            sdkVer: String,
            miscBitMap: Int,
            subSigMap: Int,
            mainSigMap: Int,
            sign: String,
            buildTime: Long,
            ssoVersion: Int,
            canDoQRCodeLogin: Boolean = false,
        * */
            Class<?> padClass = pad.getClass();
            Map<String, Object> padData = new HashMap<String, Object>(){{
                put("id", 537151218);
                put("ver", "8.9.33.10335");
                put("sdkVer", "6.0.0.2534");
                put("buildTime", 1673599898L);
            }};
            for (Field f : padClass.getFields()) {
                f.setAccessible(true);
                if(padData.containsKey(f.getName())){
                    f.set(pad, padData.get(f.getName()));
                }
                f.setAccessible(false);
            }

            Object phone = protocols.get(BotConfiguration.MiraiProtocol.ANDROID_PHONE);
            Map<String, Object> phoneData = new HashMap<String, Object>(){{
                put("id", 537151682);
                put("ver", "8.9.33.10335");
                put("sdkVer", "6.0.0.2534");
                put("buildTime", 1673599898L);
            }};
            for (Field f : padClass.getFields()) {
                f.setAccessible(true);
                if(padData.containsKey(f.getName())){
                    f.set(phone, phoneData.get(f.getName()));
                }
                f.setAccessible(false);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
hais1992 commented 1 year ago

想问一下java+core的怎么解决 看了看楼上好像用的都是console(

package cn.robot.robot.utils;

import net.mamoe.mirai.utils.BotConfiguration;

import java.lang.reflect.Field;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

public class FixProtocolVersion {
    public static void fix(){
        try {

            Class<?> MiraiProtocolInternal = Class.forName("net.mamoe.mirai.internal.utils.MiraiProtocolInternal");
            Field field = MiraiProtocolInternal.getFields()[0];
            Object companion = field.get(Object.class);

            EnumMap<BotConfiguration.MiraiProtocol, Object> protocols = (EnumMap<BotConfiguration.MiraiProtocol, Object>)companion.getClass().getMethod("getProtocols$mirai_core").invoke(companion);
            Object pad = protocols.get(BotConfiguration.MiraiProtocol.ANDROID_PAD);
        /*
        * apkId: String,
            id: Long,
            ver: String,
            sdkVer: String,
            miscBitMap: Int,
            subSigMap: Int,
            mainSigMap: Int,
            sign: String,
            buildTime: Long,
            ssoVersion: Int,
            canDoQRCodeLogin: Boolean = false,
        * */
            Class<?> padClass = pad.getClass();
            Map<String, Object> padData = new HashMap<String, Object>(){{
                put("id", 537151218);
                put("ver", "8.9.33.10335");
                put("sdkVer", "6.0.0.2534");
                put("buildTime", 1673599898L);
            }};
            for (Field f : padClass.getFields()) {
                f.setAccessible(true);
                if(padData.containsKey(f.getName())){
                    f.set(pad, padData.get(f.getName()));
                }
                f.setAccessible(false);
            }

            Object phone = protocols.get(BotConfiguration.MiraiProtocol.ANDROID_PHONE);
            Map<String, Object> phoneData = new HashMap<String, Object>(){{
                put("id", 537151682);
                put("ver", "8.9.33.10335");
                put("sdkVer", "6.0.0.2534");
                put("buildTime", 1673599898L);
            }};
            for (Field f : padClass.getFields()) {
                f.setAccessible(true);
                if(padData.containsKey(f.getName())){
                    f.set(phone, phoneData.get(f.getName()));
                }
                f.setAccessible(false);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

-.-话说只有我一个人用了之后变 235错误的吗

Sunosay commented 1 year ago

想问一下java+core的怎么解决 看了看楼上好像用的都是console(

package cn.robot.robot.utils;

import net.mamoe.mirai.utils.BotConfiguration;

import java.lang.reflect.Field;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

public class FixProtocolVersion {
    public static void fix(){
        try {

            Class<?> MiraiProtocolInternal = Class.forName("net.mamoe.mirai.internal.utils.MiraiProtocolInternal");
            Field field = MiraiProtocolInternal.getFields()[0];
            Object companion = field.get(Object.class);

            EnumMap<BotConfiguration.MiraiProtocol, Object> protocols = (EnumMap<BotConfiguration.MiraiProtocol, Object>)companion.getClass().getMethod("getProtocols$mirai_core").invoke(companion);
            Object pad = protocols.get(BotConfiguration.MiraiProtocol.ANDROID_PAD);
        /*
        * apkId: String,
            id: Long,
            ver: String,
            sdkVer: String,
            miscBitMap: Int,
            subSigMap: Int,
            mainSigMap: Int,
            sign: String,
            buildTime: Long,
            ssoVersion: Int,
            canDoQRCodeLogin: Boolean = false,
        * */
            Class<?> padClass = pad.getClass();
            Map<String, Object> padData = new HashMap<String, Object>(){{
                put("id", 537151218);
                put("ver", "8.9.33.10335");
                put("sdkVer", "6.0.0.2534");
                put("buildTime", 1673599898L);
            }};
            for (Field f : padClass.getFields()) {
                f.setAccessible(true);
                if(padData.containsKey(f.getName())){
                    f.set(pad, padData.get(f.getName()));
                }
                f.setAccessible(false);
            }

            Object phone = protocols.get(BotConfiguration.MiraiProtocol.ANDROID_PHONE);
            Map<String, Object> phoneData = new HashMap<String, Object>(){{
                put("id", 537151682);
                put("ver", "8.9.33.10335");
                put("sdkVer", "6.0.0.2534");
                put("buildTime", 1673599898L);
            }};
            for (Field f : padClass.getFields()) {
                f.setAccessible(true);
                if(padData.containsKey(f.getName())){
                    f.set(phone, phoneData.get(f.getName()));
                }
                f.setAccessible(false);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

-.-话说只有我一个人用了之后变 235错误的吗

我用了变45了(但是其他小号是好的)

cssxsh commented 1 year ago

想问一下java+core的怎么解决 看了看楼上好像用的都是console(

https://docs.mirai.mamoe.net/UsingSnapshots.html

version 取 2.15.0-dev-20

Fixuxt commented 1 year ago

用了fix-protocol-version-1.0.0.mirai2.jar还是不行

SkyFutu commented 1 year ago

可以先用cssxsh的fix-protocol-version 协议选择 ANDROID_PHONE 或者 ANDROID_PAD

我的情况是使用ANDROID_WATCH协议会提示238 然后切换到ANDROID_PAD协议会提示版本过低

然后使用了fix-protocol-version这个插件后,不再提示版本过低。通过滑块验证+手机短信验证后,正常登录

大佬我本来也是238的,用了这个插件后变成237了,aoki部分协议238/235

SkyFutu commented 1 year ago

我本来238,现在237,怎么搞... code=237, title=安全提醒, message=当前网络不稳定,登录失败。推荐使用常用设备或通过手机号登录。, errorInfo=)

DrkF1ameMaster commented 1 year ago

请问,mirai登录了,但是接收不到消息是怎么回事?

2023-03-09 12:08:09 I/Bot.2507331475: Bot cancelled: Bot closed 2023-03-09 12:08:09 I/main: mirai-console started successfully.

下面一点消息都没有了

DrkF1ameMaster commented 1 year ago

2023-03-09 12:21:05 W/stderr: ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...

请问这是什么情况

SkyFutu commented 1 year ago

路径问题,如果你是手动部署建议检查下

Zoumachuan commented 1 year ago

bot closed说明marai就没启动……

qfys521 commented 1 year ago

bot closed说明marai就没启动……

你说有没有可能是启动后才会close 或者在启动中出现问题导致close,,, 另外,是mirai...

DrkF1ameMaster commented 1 year ago

我这是用windows整合包,机器人现在的情况是不理人,难绷呜呜呜

Zoumachuan commented 1 year ago

你说得对,我猜可能是前面mirai有一部分报错信息没截到

Zoumachuan commented 1 year ago

我这边是Ubuntu,不理人多重启几次setup就可以了,不过有人知道怎么解决228吗……具体该怎么做啊

SkyFutu commented 1 year ago

总之我搞完了,qq登进去了,换了个qq用IPAD协议

tomatoomato commented 1 year ago

我直接申请另一个号,放弃原先的号了,登上去又掉....

Him188 commented 1 year ago

2570