前言
使用微信的人數很多,圍繞微信來做商業佈局的也很多,不管是粉絲羣,商家羣,會員羣還是公衆號,都是一種社羣營銷,聚集效應。那麼有時候就經常會遇到這樣一個問題,有些時候 羣裏新加進來的一些新人,可能會問到 之前很多人問到過的問題。這類問題 我們稱之爲高頻問題。那麼,對於這類高頻問題,如果管理員或者其他羣友 簡而言曰:閱公告,那麼多多少少會讓新人 有一些吃閉門羹的感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 ""; } }
使用說明
詳見:查看使用說明 或掃碼查看說明
具體實現
羣號:523490820 入羣討論