def get_context_user_id(msg, max_len=32, re_sub=r'[^a-zA-Z\d]'):
    """
    | 通过消息对象获取 Tuling, XiaoI 等聊天机器人的上下文用户 ID
    | 上下文用户 ID: 为群聊时，取群员的 user_name；非群聊时，取聊天对象的 user_name

    :param msg: 消息对象
    :param max_len: 最大长度 (从末尾截取)
    :param re_sub: 需要移除的字符的正则表达式 (为符合聊天机器人的 API 规范)
    :return: 上下文用户 ID
    """

    from wxpy.api.messages import Message
    from wxpy.api.chats import Group

    # 当 msg 不为消息对象时，返回 None
    if not isinstance(msg, Message):
        return

    if isinstance(msg.sender, Group):
        user = msg.member
    else:
        user = msg.sender

    user_id = re.sub(re_sub, '', user.user_name)

    return user_id[-max_len:]
| 通过消息对象获取 Tuling, XiaoI 等聊天机器人的上下文用户 ID
| 上下文用户 ID: 为群聊时，取群员的 user_name；非群聊时，取聊天对象的 user_name

:param msg: 消息对象
:param max_len: 最大长度 (从末尾截取)
:param re_sub: 需要移除的字符的正则表达式 (为符合聊天机器人的 API 规范)
:return: 上下文用户 ID
wxpy/ext/talk_bot_utils.py