如何实现一个微信自动回复消息的工具?


前言

使用微信的人数很多,围绕微信来做商业布局的也很多,不管是粉丝群,商家群,会员群还是公众号,都是一种社群营销,聚集效应。那么有时候就经常会遇到这样一个问题,有些时候 群里新加进来的一些新人,可能会问到 之前很多人问到过的问题。这类问题 我们称之为高频问题。那么,对于这类高频问题,如果管理员或者其他群友 简而言曰:阅公告,那么多多少少会让新人 有一些吃闭门羹的感jio。所以,针对这种情况。这里简单实现了一个微信自动回复消息的小工具,先来看下大概运行图:

群自动回复消息

个人自动回复消息

工具内直接回复群消息

步骤分析

1.需要获取到微信登录的"实例"

2.从"实例"中获取出用户信息

3.根据用户信息 获取到当前对话的群/用户 信息

4.根据解析出来的信息 做一些特定事情

 用到的一些枚举、类 可以看看

    /// 
    ///   4 字节布尔值 ( != 0,  = 0)。
    ///    这是 Win32 BOOL 类型。
    /// 
    [__DynamicallyInvokable] Bool = 2,
    /// 
    ///   1 字节有符号整数。
    ///    可使用此成员将布尔值转换为 1 字节、C 样式的  ( = 1,  = 0)。
    /// 
    [__DynamicallyInvokable] I1 = 3,
    /// 1 字节无符号整数。
    [__DynamicallyInvokable] U1 = 4,
    /// 2 字节有符号整数。
    [__DynamicallyInvokable] I2 = 5,
    /// 2 字节无符号整数。
    [__DynamicallyInvokable] U2 = 6,
    /// 4 字节有符号整数。
    [__DynamicallyInvokable] I4 = 7,
    /// 4 字节无符号整数。
    [__DynamicallyInvokable] U4 = 8,
    /// 8 字节有符号整数。
    [__DynamicallyInvokable] I8 = 9,
    /// 8 字节无符号整数。
    [__DynamicallyInvokable] U8 = 10, // 0x0000000A
    /// 4 字节浮点数。
    [__DynamicallyInvokable] R4 = 11, // 0x0000000B
    /// 8 字节浮点数。
    [__DynamicallyInvokable] R8 = 12, // 0x0000000C
    /// 
    ///   货币类型。
    /// 上使用,以将十进制数值作为 COM 货币类型而不是  封送。
    /// 
    [__DynamicallyInvokable] Currency = 15, // 0x0000000F
    /// 
    ///   长度前缀为双字节的 Unicode 字符串。
    ///    可以在  数据类型上使用此成员(它是 COM 中的默认字符串)。
    /// 
    [__DynamicallyInvokable] BStr = 19, // 0x00000013
    /// 
    ///   单字节、以 null 结尾的 ANSI 字符串。
    ///    可以在  数据类型上使用此成员。
    /// 
    [__DynamicallyInvokable] LPStr = 20, // 0x00000014
    /// 一个 2 字节、以 null 结尾的 Unicode 字符串。
    [__DynamicallyInvokable] LPWStr = 21, // 0x00000015
    /// 
    ///   与平台相关的字符串:在 Windows 98 上为 ANSI,在 Windows NT 和 Windows XP 上为 Unicode。
    ///    该值仅支持平台调用而不支持 COM 互操作,因为不支持导出  类型的字符串。
    /// 
    [__DynamicallyInvokable] LPTStr = 22, // 0x00000016
    /// 
    ///   用于在结构中出现的内联定长字符数组。
    /// 一起使用的字符类型由应用于包含结构的  属性的  参数确定。
    ///    应始终使用  字段来指示数组的大小。
    /// 
    [__DynamicallyInvokable] ByValTStr = 23, // 0x00000017
    /// 
    ///   COM  指针。
    ///    可以在  数据类型上使用此成员。
    /// 
    [__DynamicallyInvokable] IUnknown = 25, // 0x00000019
    /// 
    ///   COM  指针(Microsoft Visual Basic 6.0 中的 )。
    /// 
    [__DynamicallyInvokable] IDispatch = 26, // 0x0000001A
    /// 一个用于封送托管格式化类和值类型的 VARIANT。
    [__DynamicallyInvokable] Struct = 27, // 0x0000001B
    /// 
    ///   COM 接口指针。
    ///    接口的  可从类元数据获得。
    ///    如果将此成员应用于类,则可以使用该成员指定确切的接口类型或默认的接口类型。
    ///    应用于  数据类型时,此成员将产生与  相同的行为。
    /// 
    [__DynamicallyInvokable] Interface = 28, // 0x0000001C
    /// 
    ///    是自我描述的数组,它带有关联数组数据的类型、秩和界限。
    ///    可将此成员与  字段一起使用,以替代默认元素类型。
    /// 
    [__DynamicallyInvokable] SafeArray = 29, // 0x0000001D
    /// 
    /// 属性被设置为  时,必须设置  字段以指示该数组中的元素数。
    ///    当需要区分字符串类型时, 字段可以选择包含数组元素的 /// 只可用于结构中其元素作为字段出现的数组。
    /// 
    [__DynamicallyInvokable] ByValArray = 30, // 0x0000001E
    /// 
    ///   与平台相关的有符号整数:在 32 位 Windows 上为 4 个字节,在 64 位 Windows 上为 8 个字节。
    /// 
    [__DynamicallyInvokable] SysInt = 31, // 0x0000001F
    /// 
    ///   与平台相关的无符号整数:在 32 位 Windows 上为 4 个字节,在 64 位 Windows 上为 8 个字节。
    /// 
    [__DynamicallyInvokable] SysUInt = 32, // 0x00000020
    /// 
    ///   一个值,该值使 Visual Basic 能够更改非托管代码中的字符串,并使结果在托管代码中反映出来。
    ///    该值仅支持平台调用。
    /// 
    [__DynamicallyInvokable] VBByRefStr = 34, // 0x00000022
    /// 
    ///   ANSI 字符串是一个带有长度前缀的单字节字符串。
    ///    可以在  数据类型上使用此成员。
    /// 
    [__DynamicallyInvokable] AnsiBStr = 35, // 0x00000023
    /// 
    ///   一个有长度前缀的与平台相关的  字符串:在 Windows 98 上为 ANSI,在 Windows NT 上为 Unicode。
    ///    很少用到这个类似于 BSTR 的成员。
    /// 
    [__DynamicallyInvokable] TBStr = 36, // 0x00000024
    /// 
    ///   2 字节、OLE 定义的 VARIANT_BOOL 类型 ( = -1,  = 0)。
    /// 
    [__DynamicallyInvokable] VariantBool = 37, // 0x00000025
    /// 
    ///   一个可用作 C 样式函数指针的整数。
    ///    可将此成员用于  数据类型或从  继承的类型。
    /// 
    [__DynamicallyInvokable] FunctionPtr = 38, // 0x00000026
    /// 
    ///   一个动态类型,将在运行时确定对象的类型,并将该对象作为所确定的类型进行封送处理。
    ///    该成员仅对平台调用方法有效。
    /// 
    [__DynamicallyInvokable] AsAny = 40, // 0x00000028
    /// 
    ///   指向 C 样式数组的第一个元素的指针。
    ///    当从托管到非托管代码进行封送处理时,该数组的长度由托管数组的长度确定。
    ///    从非托管到托管代码进行封送处理时,将根据  字段确定该数组的长度,当需要区分字符串类型时,还可以后跟数组中元素的非托管类型。
    /// 
    [__DynamicallyInvokable] LPArray = 42, // 0x0000002A
    /// 
    ///   一个指针,它指向用于封送托管格式化类的 C 样式结构。
    ///    该成员仅对平台调用方法有效。
    /// 
    [__DynamicallyInvokable] LPStruct = 43, // 0x0000002B
    /// 
    ///   当与  字段一起使用时,指定自定义封送拆收器类。
    ///    字段可用于将附加信息传递给自定义封送拆收器。
    ///    可以在任何引用类型上使用此成员。
    /// 
    [__DynamicallyInvokable] CustomMarshaler = 44, // 0x0000002C
    /// 
    ///   一个本机类型,此类型与  关联且将导致参数作为导出类型库中的 HRESULT 导出。
    /// 
    [__DynamicallyInvokable] Error = 45, // 0x0000002D
    /// 
    /// 
    ///     Windows 运行时 接口指针。
    ///    可以在  数据类型上使用此成员。
    /// 
    [ComVisible(false), __DynamicallyInvokable] IInspectable = 46, // 0x0000002E
    /// 
    /// 
    ///     Windows 运行时 字符串。
    ///    可以在  数据类型上使用此成员。
    /// 
    [ComVisible(false), __DynamicallyInvokable] HString = 47, // 0x0000002F
    /// 指向 UTF-8 编码字符串的指针。
    [ComVisible(false)] LPUTF8Str = 48, // 0x00000030
   /// 
    ///   对象的成员顺序依次布局,它们出现导出到非托管内存时的顺序。
    ///    成员进行布局中指定的封装根据,和可以是不连续。
    /// 
    [__DynamicallyInvokable] Sequential = 0,
    /// 
    ///   非托管内存中的每个成员的对象的精确位置显式控制,受约束的设置字段。
    ///    每个成员必须使用指示该字段的类型中的位置。
    /// 
    [__DynamicallyInvokable] Explicit = 2,
    /// 
    ///   非托管内存中某个对象的成员,则运行时会自动选择适当的布局。
    ///    无法在托管代码之外公开使用此枚举成员定义的对象。
    ///    尝试这样做将引发异常。
    /// 
    [__DynamicallyInvokable] Auto = 3,
public static string DownImage(string fileName)
        {
            string result = "";
            try
            {
                String FileType = "";

                byte[] data = File.ReadAllBytes(fileName);
                byte[] data2 = new byte[data.Length];
                int key = 0;
                //PNG
                for (int i = 0; i <= 0xFF; i++)
                {
                    int dataA = (byte)(data[0] ^ (byte)i);
                    if ((data[0] ^ (byte)i) == (byte)0x89)
                    {
                        if ((data[1] ^ (byte)i) == (byte)0x50)
                        {
                            if ((data[2] ^ (byte)i) == (byte)0x4E)
                            {
                                if ((data[3] ^ (byte)i) == (byte)0x47)
                                {
                                    FileType = "png";
                                    key = i;
                                    break;
                                }
                            }
                        }
                    }
                }

                if (key == 0)
                {
                    //JPG
                    for (int i = 0; i <= 0xFF; i++)
                    {
                        int dataA = (byte)(data[0] ^ (byte)i);
                        if ((data[0] ^ (byte)i) == (byte)0xFF)
                        {
                            if ((data[1] ^ (byte)i) == (byte)0xD8)
                            {
                                if ((data[2] ^ (byte)i) == (byte)0xFF)
                                {
                                    if ((data[3] ^ (byte)i) == (byte)0xE0 || (data[3] ^ (byte)i) == (byte)0xD9 || (data[3] ^ (byte)i) == (byte)0xE1 || (data[3] ^ (byte)i) == (byte)0xDF)
                                    {
                                        FileType = "jpg";
                                        key = i;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }

                if (key == 0)
                {
                    LogHelper.WriteLog("解密图片失败." + fileName);
                    if(File.Exists(fileName.Replace("dat", "jpg")))
                    {
                        return fileName.Replace("dat", "jpg");
                    }
                    if (File.Exists(fileName.Replace("dat", "png")))
                    {
                        return fileName.Replace("dat", "png");
                    }
                    return "";
                }
                else
                {
                    //this.textBox2.Text = "0x" + key.ToString("X");
                }


                for (int i = 0; i < data.Length; i++)
                {
                    data2[i] = (byte)(data[i] ^ key);
                }

                string picPath = fileName.Replace("dat", "") + FileType;
                File.WriteAllBytes(picPath, data2);

                ExistPic(picPath);

                return picPath;
            }
            catch (Exception e)
            {
                LogHelper.WriteLog("解密图片失败!"+ fileName, e);
                return "";
            }
        }

 使用说明

详见:查看使用说明 或扫码查看说明

 下载体验地址

微信自动回复消息工具

链接:https://pan.baidu.com/s/12aIcoGXiBdg94IuQdaEASQ
提取码:clbv

图文教程:http://response.fuyue.xyz/document/wechat
视频教程:http://wexin.fuyue.xyz/Demonstration/index

具体实现

群号:523490820  入群讨论

C