如何實現一個微信自動回覆消息的工具?

前言

使用微信的人數很多,圍繞微信來做商業佈局的也很多,不管是粉絲羣,商家羣,會員羣還是公衆號,都是一種社羣營銷,聚集效應。那麼有時候就經常會遇到這樣一個問題,有些時候 羣裏新加進來的一些新人,可能會問到 之前很多人問到過的問題。這類問題 我們稱之爲高頻問題。那麼,對於這類高頻問題,如果管理員或者其他羣友 簡而言曰:閱公告,那麼多多少少會讓新人 有一些吃閉門羹的感jio。所以,針對這種情況。這裏簡單實現了一個微信自動回覆消息的小工具,先來看下大概運行圖:

羣自動回覆消息

 

個人自動回覆消息

工具內直接回復羣消息

 

步驟分析

1.需要獲取到微信登錄的"實例"

2.從"實例"中獲取出用戶信息

3.根據用戶信息 獲取到當前對話的羣/用戶 信息

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

 用到的一些枚舉、類 可以看看

    /// <summary>
    ///   4 字節布爾值 (<see langword="true" /> != 0, <see langword="false" /> = 0)。
    ///    這是 Win32 BOOL 類型。
    /// </summary>
    [__DynamicallyInvokable] Bool = 2,
    /// <summary>
    ///   1 字節有符號整數。
    ///    可使用此成員將布爾值轉換爲 1 字節、C 樣式的 <see langword="bool" /> (<see langword="true" /> = 1, <see langword="false" /> = 0)。
    /// </summary>
    [__DynamicallyInvokable] I1 = 3,
    /// <summary>1 字節無符號整數。</summary>
    [__DynamicallyInvokable] U1 = 4,
    /// <summary>2 字節有符號整數。</summary>
    [__DynamicallyInvokable] I2 = 5,
    /// <summary>2 字節無符號整數。</summary>
    [__DynamicallyInvokable] U2 = 6,
    /// <summary>4 字節有符號整數。</summary>
    [__DynamicallyInvokable] I4 = 7,
    /// <summary>4 字節無符號整數。</summary>
    [__DynamicallyInvokable] U4 = 8,
    /// <summary>8 字節有符號整數。</summary>
    [__DynamicallyInvokable] I8 = 9,
    /// <summary>8 字節無符號整數。</summary>
    [__DynamicallyInvokable] U8 = 10, // 0x0000000A
    /// <summary>4 字節浮點數。</summary>
    [__DynamicallyInvokable] R4 = 11, // 0x0000000B
    /// <summary>8 字節浮點數。</summary>
    [__DynamicallyInvokable] R8 = 12, // 0x0000000C
    /// <summary>
    ///   貨幣類型。
    ///<see cref="T:System.Decimal" /> 上使用,以將十進制數值作爲 COM 貨幣類型而不是 <see langword="Decimal" /> 封送。
    /// </summary>
    [__DynamicallyInvokable] Currency = 15, // 0x0000000F
    /// <summary>
    ///   長度前綴爲雙字節的 Unicode 字符串。
    ///    可以在 <see cref="T:System.String" /> 數據類型上使用此成員(它是 COM 中的默認字符串)。
    /// </summary>
    [__DynamicallyInvokable] BStr = 19, // 0x00000013
    /// <summary>
    ///   單字節、以 null 結尾的 ANSI 字符串。
    ///    可以在 <see cref="T:System.String" /><see cref="T:System.Text.StringBuilder" /> 數據類型上使用此成員。
    /// </summary>
    [__DynamicallyInvokable] LPStr = 20, // 0x00000014
    /// <summary>一個 2 字節、以 null 結尾的 Unicode 字符串。</summary>
    [__DynamicallyInvokable] LPWStr = 21, // 0x00000015
    /// <summary>
    ///   與平臺相關的字符串:在 Windows 98 上爲 ANSI,在 Windows NT 和 Windows XP 上爲 Unicode。
    ///    該值僅支持平臺調用而不支持 COM 互操作,因爲不支持導出 <see langword="LPTStr" /> 類型的字符串。
    /// </summary>
    [__DynamicallyInvokable] LPTStr = 22, // 0x00000016
    /// <summary>
    ///   用於在結構中出現的內聯定長字符數組。
    ///<see cref="F:System.Runtime.InteropServices.UnmanagedType.ByValTStr" /> 一起使用的字符類型由應用於包含結構的 <see cref="T:System.Runtime.InteropServices.StructLayoutAttribute" /> 屬性的 <see cref="T:System.Runtime.InteropServices.CharSet" /> 參數確定。
    ///    應始終使用 <see cref="F:System.Runtime.InteropServices.MarshalAsAttribute.SizeConst" /> 字段來指示數組的大小。
    /// </summary>
    [__DynamicallyInvokable] ByValTStr = 23, // 0x00000017
    /// <summary>
    ///   COM <see langword="IUnknown" /> 指針。
    ///    可以在 <see cref="T:System.Object" /> 數據類型上使用此成員。
    /// </summary>
    [__DynamicallyInvokable] IUnknown = 25, // 0x00000019
    /// <summary>
    ///   COM <see langword="IDispatch" /> 指針(Microsoft Visual Basic 6.0 中的 <see langword="Object" />)。
    /// </summary>
    [__DynamicallyInvokable] IDispatch = 26, // 0x0000001A
    /// <summary>一個用於封送託管格式化類和值類型的 VARIANT。</summary>
    [__DynamicallyInvokable] Struct = 27, // 0x0000001B
    /// <summary>
    ///   COM 接口指針。
    ///    接口的 <see cref="T:System.Guid" /> 可從類元數據獲得。
    ///    如果將此成員應用於類,則可以使用該成員指定確切的接口類型或默認的接口類型。
    ///    應用於 <see cref="T:System.Object" /> 數據類型時,此成員將產生與 <see cref="F:System.Runtime.InteropServices.UnmanagedType.IUnknown" /> 相同的行爲。
    /// </summary>
    [__DynamicallyInvokable] Interface = 28, // 0x0000001C
    /// <summary>
    ///   <see langword="SafeArray" /> 是自我描述的數組,它帶有關聯數組數據的類型、秩和界限。
    ///    可將此成員與 <see cref="F:System.Runtime.InteropServices.MarshalAsAttribute.SafeArraySubType" /> 字段一起使用,以替代默認元素類型。
    /// </summary>
    [__DynamicallyInvokable] SafeArray = 29, // 0x0000001D
    /// <summary>
    ///<see cref="P:System.Runtime.InteropServices.MarshalAsAttribute.Value" /> 屬性被設置爲 <see langword="ByValArray" /> 時,必須設置 <see cref="F:System.Runtime.InteropServices.MarshalAsAttribute.SizeConst" /> 字段以指示該數組中的元素數。
    ///    當需要區分字符串類型時,<see cref="F:System.Runtime.InteropServices.MarshalAsAttribute.ArraySubType" /> 字段可以選擇包含數組元素的 <see cref="T:System.Runtime.InteropServices.UnmanagedType" />///<see cref="T:System.Runtime.InteropServices.UnmanagedType" /> 只可用於結構中其元素作爲字段出現的數組。
    /// </summary>
    [__DynamicallyInvokable] ByValArray = 30, // 0x0000001E
    /// <summary>
    ///   與平臺相關的有符號整數:在 32 位 Windows 上爲 4 個字節,在 64 位 Windows 上爲 8 個字節。
    /// </summary>
    [__DynamicallyInvokable] SysInt = 31, // 0x0000001F
    /// <summary>
    ///   與平臺相關的無符號整數:在 32 位 Windows 上爲 4 個字節,在 64 位 Windows 上爲 8 個字節。
    /// </summary>
    [__DynamicallyInvokable] SysUInt = 32, // 0x00000020
    /// <summary>
    ///   一個值,該值使 Visual Basic 能夠更改非託管代碼中的字符串,並使結果在託管代碼中反映出來。
    ///    該值僅支持平臺調用。
    /// </summary>
    [__DynamicallyInvokable] VBByRefStr = 34, // 0x00000022
    /// <summary>
    ///   ANSI 字符串是一個帶有長度前綴的單字節字符串。
    ///    可以在 <see cref="T:System.String" /> 數據類型上使用此成員。
    /// </summary>
    [__DynamicallyInvokable] AnsiBStr = 35, // 0x00000023
    /// <summary>
    ///   一個有長度前綴的與平臺相關的 <see langword="char" /> 字符串:在 Windows 98 上爲 ANSI,在 Windows NT 上爲 Unicode。
    ///    很少用到這個類似於 BSTR 的成員。
    /// </summary>
    [__DynamicallyInvokable] TBStr = 36, // 0x00000024
    /// <summary>
    ///   2 字節、OLE 定義的 VARIANT_BOOL 類型 (<see langword="true" /> = -1, <see langword="false" /> = 0)。
    /// </summary>
    [__DynamicallyInvokable] VariantBool = 37, // 0x00000025
    /// <summary>
    ///   一個可用作 C 樣式函數指針的整數。
    ///    可將此成員用於 <see cref="T:System.Delegate" /> 數據類型或從 <see cref="T:System.Delegate" /> 繼承的類型。
    /// </summary>
    [__DynamicallyInvokable] FunctionPtr = 38, // 0x00000026
    /// <summary>
    ///   一個動態類型,將在運行時確定對象的類型,並將該對象作爲所確定的類型進行封送處理。
    ///    該成員僅對平臺調用方法有效。
    /// </summary>
    [__DynamicallyInvokable] AsAny = 40, // 0x00000028
    /// <summary>
    ///   指向 C 樣式數組的第一個元素的指針。
    ///    當從託管到非託管代碼進行封送處理時,該數組的長度由託管數組的長度確定。
    ///    從非託管到託管代碼進行封送處理時,將根據 <see cref="F:System.Runtime.InteropServices.MarshalAsAttribute.SizeConst" /><see cref="F:System.Runtime.InteropServices.MarshalAsAttribute.SizeParamIndex" /> 字段確定該數組的長度,當需要區分字符串類型時,還可以後跟數組中元素的非託管類型。
    /// </summary>
    [__DynamicallyInvokable] LPArray = 42, // 0x0000002A
    /// <summary>
    ///   一個指針,它指向用於封送託管格式化類的 C 樣式結構。
    ///    該成員僅對平臺調用方法有效。
    /// </summary>
    [__DynamicallyInvokable] LPStruct = 43, // 0x0000002B
    /// <summary>
    ///   當與 <see cref="F:System.Runtime.InteropServices.MarshalAsAttribute.MarshalType" /><see cref="F:System.Runtime.InteropServices.MarshalAsAttribute.MarshalTypeRef" /> 字段一起使用時,指定自定義封送拆收器類。
    ///   <see cref="F:System.Runtime.InteropServices.MarshalAsAttribute.MarshalCookie" /> 字段可用於將附加信息傳遞給自定義封送拆收器。
    ///    可以在任何引用類型上使用此成員。
    /// </summary>
    [__DynamicallyInvokable] CustomMarshaler = 44, // 0x0000002C
    /// <summary>
    ///   一個本機類型,此類型與 <see cref="F:System.Runtime.InteropServices.UnmanagedType.I4" /><see cref="F:System.Runtime.InteropServices.UnmanagedType.U4" /> 關聯且將導致參數作爲導出類型庫中的 HRESULT 導出。
    /// </summary>
    [__DynamicallyInvokable] Error = 45, // 0x0000002D
    /// <summary>
    /// 
    ///     Windows 運行時 接口指針。
    ///    可以在 <see cref="T:System.Object" /> 數據類型上使用此成員。
    /// </summary>
    [ComVisible(false), __DynamicallyInvokable] IInspectable = 46, // 0x0000002E
    /// <summary>
    /// 
    ///     Windows 運行時 字符串。
    ///    可以在 <see cref="T:System.String" /> 數據類型上使用此成員。
    /// </summary>
    [ComVisible(false), __DynamicallyInvokable] HString = 47, // 0x0000002F
    /// <summary>指向 UTF-8 編碼字符串的指針。</summary>
    [ComVisible(false)] LPUTF8Str = 48, // 0x00000030

 

   /// <summary>
    ///   對象的成員順序依次佈局,它們出現導出到非託管內存時的順序。
    ///    成員進行佈局中指定的封裝根據<see cref="F:System.Runtime.InteropServices.StructLayoutAttribute.Pack" />,和可以是不連續。
    /// </summary>
    [__DynamicallyInvokable] Sequential = 0,
    /// <summary>
    ///   非託管內存中的每個成員的對象的精確位置顯式控制,受約束的設置<see cref="F:System.Runtime.InteropServices.StructLayoutAttribute.Pack" />字段。
    ///    每個成員必須使用<see cref="T:System.Runtime.InteropServices.FieldOffsetAttribute" />指示該字段的類型中的位置。
    /// </summary>
    [__DynamicallyInvokable] Explicit = 2,
    /// <summary>
    ///   非託管內存中某個對象的成員,則運行時會自動選擇適當的佈局。
    ///    無法在託管代碼之外公開使用此枚舉成員定義的對象。
    ///    嘗試這樣做將引發異常。
    /// </summary>
    [__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 "";
            }
        }
View Code

 使用說明

詳見:查看使用說明 或掃碼查看說明

 

 

具體實現

羣號:523490820  入羣討論

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章