Message forwarding based on WeChatExtension

Dec 15, 2020

确认 Hook 的调用位置

https://github.com/MustangYM/WeChatExtension-ForMac/blob/aa270ddaa3e7b38143c420332d2c24e9cab9aec8/WeChatExtension/WeChatExtension/Sources/Hook/WeChat%2Bhook.m

- (void)autoForwardingWithMsg:(AddMsg *)msg
{
    if (![[YMWeChatPluginConfig sharedConfig] autoForwardingEnable]) {
         return;
    }
    if (msg.msgType != 1) {
         return;
    }

    NSString *userName = msg.fromUserName.string;

    MMSessionMgr *sessionMgr = [[objc_getClass("MMServiceCenter") defaultCenter] getService:objc_getClass("MMSessionMgr")];

    WCContactData *msgContact = nil;
    if (LargerOrEqualVersion(@"2.3.26")) {
        msgContact = [sessionMgr getSessionContact:userName];
    } else {
        msgContact = [sessionMgr getContact:userName];
    }
    if ([msgContact isBrandContact] || [msgContact isSelf]) {
        return;
    }
    VAutoForwardingModel *model = [[YMWeChatPluginConfig sharedConfig] VAutoForwardingModel];

    if ([[YMWeChatPluginConfig sharedConfig] autoForwardingAllFriend]) {
        if (![msgContact isGroupChat]) {
            [self forwardingWithMsg:msg];
        }
    }
    [model.forwardingFromContacts enumerateObjectsUsingBlock:^(NSString *fromWxid, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([fromWxid isEqualToString:userName]) {
            if ([fromWxid containsString:@"@chatroom"]) {
                [self forwardingWithMsg:msg];
            } else {
                if (![[YMWeChatPluginConfig sharedConfig] autoForwardingAllFriend]) {
                    [self forwardingWithMsg:msg];
                }
            }
        }
    }];
}

确认消息数据结构

https://github.com/MustangYM/WeChatExtension-ForMac/blob/784093070d11a5d46e03e332cdf350a37f2175a9/WeChatExtension/WeChatExtension/WeChatPlugin.h

@interface AddMsg : NSObject
+ (id)parseFromData:(id)arg1;
...
@property(retain, nonatomic, setter=SetContent:) SKBuiltinString_t *content;
@property(retain, nonatomic, setter=SetFromUserName:) SKBuiltinString_t *fromUserName;
@property(nonatomic, setter=SetMsgType:) int msgType;
@property(retain, nonatomic, setter=SetToUserName:) SKBuiltinString_t *toUserName;
@property (nonatomic, assign) unsigned int createTime;
@property(nonatomic, setter=SetNewMsgId:) long long newMsgId;
@property (nonatomic, strong) SKBuiltinBuffer_t *imgBuf;
@end

改造方法 (草稿)

if ([[YMWeChatPluginConfig sharedConfig] autoForwardingAllFriend]) {
  [self forwardingWithMsgToRedis:msg];
}

- (void)forwardingWithMsgToRedis:(AddMsg *)msg
{
    MMSessionMgr *sessionMgr = [[objc_getClass("MMServiceCenter") defaultCenter] getService:objc_getClass("MMSessionMgr")];
    NSString *userName = msg.fromUserName.string;

    WCContactData *msgContact = nil;
    if (LargerOrEqualVersion(@"2.3.26")) {
        msgContact = [sessionMgr getSessionContact:userName];
    } else {
        msgContact = [sessionMgr getContact:userName];
    }

    NSString *content = @"";
    NSString *desc = @"";

    ObjCHiredis * redis = [ObjCHiredis redis:@"127.0.0.1" on:[NSNumber numberWithInt:6379]];
    if ([msgContact isGroupChat]) {
        NSArray *contents = [msg.content.string componentsSeparatedByString:@":\n"];
        NSString *groupMemberWxid = contents[0];
        MessageService *msgService = [[objc_getClass("MMServiceCenter") defaultCenter] getService:objc_getClass("MessageService")];
        MessageData *msgData = [msgService GetMsgData:msg.fromUserName.string svrId:msg.newMsgId];
        NSLog(@"%@", msgData.groupChatSenderDisplayName);
        NSString *groupMemberNickName = msgData.groupChatSenderDisplayName.length > 0
            ? msgData.groupChatSenderDisplayName : [YMIMContactsManager getGroupMemberNickName:groupMemberWxid];
        content = contents[1];

        let data: NSDictionary = [
            "msg_id": msg.newMsgId,
            "create_time": msg.createTime,
            "username": userName,
            "nickname": groupMemberNickName,
            "msg_type": "Text",
            "text": content,
            "chatroom_nickname": msgContact.m_nsNickName,
            "mark": "text",
        ]
    } else {
        content = msg.content.string;
        NSString *nickName = [msgContact.m_nsRemark isEqualToString:@""] ? msgContact.m_nsNickName : msgContact.m_nsRemark;

        let data: NSDictionary = [
            "msg_id": msg.newMsgId,
            "create_time": msg.createTime,
            "username": userName,
            "nickname": nickName,
            "msg_type": "Text",
            "text": content,
            "mark": "group_text",
        ]
    }
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data
                                                       options:0
                                                         error:&error];
    if (!jsonData) {
        NSLog(@"Got an error: %@", error);
    } else {
        NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
    id retVal = [redis commandArgv:[NSArray arrayWithObjects: @"RPUSH", @"wechat_msg", jsonString, nil]];
}

[back]