340 lines
15 KiB
C#
340 lines
15 KiB
C#
|
using Api.Framework;
|
|||
|
using Api.Framework.Model;
|
|||
|
using Api.Framework.SDK;
|
|||
|
using Api.Framework.Tools;
|
|||
|
using Chat.Framework;
|
|||
|
using Chat.Framework.WXSdk.Implement;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Drawing;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Text.RegularExpressions;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using 监听违规.Entitys;
|
|||
|
using 监听违规.Properties;
|
|||
|
|
|||
|
namespace 监听违规
|
|||
|
{
|
|||
|
public class Class1 : Plugin
|
|||
|
{
|
|||
|
public Class1()
|
|||
|
{
|
|||
|
this.Name = "维护工具";
|
|||
|
this.Note = "维护工具";
|
|||
|
this.Logo = Resources._3;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#region 自定义变量
|
|||
|
public static Config Config;
|
|||
|
private MainForm mainForm = null;
|
|||
|
#endregion
|
|||
|
|
|||
|
public override void Start()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var session = ApiClient.GetSession();
|
|||
|
|
|||
|
#region 判断表是否存在,不存在创建表
|
|||
|
if (!session.TableExist<UserLists_db>())
|
|||
|
{
|
|||
|
session.CreateTable<UserLists_db>();
|
|||
|
session.AddIndex<UserLists_db>("wxid");//增加索引.以后数据多了.查询速度会比较快
|
|||
|
session.AddUnique<UserLists_db>("wxid");//增加唯一约束
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
//创建配置文件
|
|||
|
Config = this.ReadConfig<Config>();
|
|||
|
|
|||
|
SDK.ReciveIMEvent += SDK_ReciveIMEvent;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
this.OnLog(ex.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private List<string> GetSplit(string str)
|
|||
|
{
|
|||
|
if (string.IsNullOrWhiteSpace(str)) return null;
|
|||
|
try
|
|||
|
{
|
|||
|
return str.Replace(",", ",").Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(f => f.Trim()).ToList();
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
this.OnLog(ex.Message);
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private string Reg_CheckIsUrl = @"(?<链接>((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?)";
|
|||
|
|
|||
|
private void SDK_ReciveIMEvent(object sender, ReciveIMEvent e)
|
|||
|
{
|
|||
|
if (!string.IsNullOrWhiteSpace(e.Groupid))
|
|||
|
{
|
|||
|
if (Regex.IsMatch(e.Message.Trim(), @"<msg>(\s*)?<emoji(.+)</msg>") || (e.Message.Trim().StartsWith(@"<?xml version=") && Regex.IsMatch(e.Message.Trim(), @"<emoticonmd5>(.*?)</emoticonmd5>"))) return;
|
|||
|
|
|||
|
var session = ApiClient.GetSession();
|
|||
|
//var white = session.FindSingle<UserLists_db>("wxid = @wxid and user_type", new { wxid = e.Username, user_type = UserType.白名单 });
|
|||
|
if (Common.IsWhite(e.Username))
|
|||
|
return;
|
|||
|
|
|||
|
Task.Run(() =>
|
|||
|
{
|
|||
|
var db = ApiClient.GetSession();
|
|||
|
try
|
|||
|
{
|
|||
|
var client = e.Sender as WeixinBase;
|
|||
|
if (client == null) return;
|
|||
|
|
|||
|
var black = db.FindSingle<UserLists_db>("wxid = @wxid and user_type", new { wxid = e.Username, user_type = UserType.黑名单 });
|
|||
|
if (black != null)
|
|||
|
{
|
|||
|
Action(e, client, false);
|
|||
|
this.OnLog($"{e.NickName}({e.Username}) 发送消息的用户为黑名单,踢出");
|
|||
|
var member = e.GetMemberinfo();
|
|||
|
if (member != null)
|
|||
|
{
|
|||
|
member.status = Api.Framework.Enums.MemberType.黑名单;
|
|||
|
//e.SendMessage(new VariateReplace().CommonReplace(Config.expelmess, e.GetMemberinfo(), e.RobotInfo));
|
|||
|
db.SaveOrUpdate(member);
|
|||
|
|
|||
|
var user = db.FindSingle<UserLists_db>("wxid = @wxid", new { wxid = e.Username });
|
|||
|
if (user == null)
|
|||
|
db.Insertable(new UserLists_db() { user_type = UserType.黑名单, wxid = e.Username, nick_name = e.NickName }).ExecuteCommand();
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
#region 关键词昵称踢人
|
|||
|
if (Config.is_nickkey)
|
|||
|
{
|
|||
|
var list = GetSplit(Config.nickkey);
|
|||
|
if (list != null && list.FirstOrDefault(f => e.NickName.Contains(f)) != null)
|
|||
|
{
|
|||
|
Action(e, client, false);
|
|||
|
//e.SendMessage(new VariateReplace().CommonReplace(Config.expelmess, e.GetMemberinfo(), e.RobotInfo));
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 关键词消息踢人
|
|||
|
if (Config.is_messkey && !e.Message.StartsWith(@"<?xml version=") && !e.Message.StartsWith("[图片=") && !e.Message.StartsWith("[视频="))
|
|||
|
{
|
|||
|
var list = GetSplit(Config.messkey);
|
|||
|
if (list != null && list.FirstOrDefault(f => e.Message.Contains(f)) != null)
|
|||
|
{
|
|||
|
Action(e, client);
|
|||
|
this.OnLog($"{e.NickName}({e.Username}) 发送的消息包含关键词,踢出");
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
if (!e.Message.Trim().StartsWith(@"<?xml version=", StringComparison.OrdinalIgnoreCase) && !e.Message.Trim().StartsWith("[图片=") && !e.Message.StartsWith("[视频=") && !e.Message.Trim().StartsWith("<msg>", StringComparison.OrdinalIgnoreCase) && !e.Message.Trim().EndsWith("</msg>", StringComparison.OrdinalIgnoreCase))
|
|||
|
{
|
|||
|
#region 消息大于多少行踢人
|
|||
|
var rows = e.Message.Split('\n').Length;
|
|||
|
if (Config.is_messrows && rows >= Config.messrows)
|
|||
|
{
|
|||
|
Action(e, client);
|
|||
|
this.OnLog($"{e.NickName}({e.Username}) 发送的消息行数大于{Config.messrows},踢出");
|
|||
|
return;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 消息大于多少字踢人
|
|||
|
if (Config.is_messwords && e.Message.Trim().Length >= Config.messwords)
|
|||
|
{
|
|||
|
Action(e, client);
|
|||
|
this.OnLog($"{e.NickName}({e.Username}) 发送的消息字数大于{Config.messwords},踢出");
|
|||
|
return;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#region 发链接、小程序踢人
|
|||
|
if (Config.is_link && ((e.Message.Contains(@"<appmsg appid=") && e.Message.StartsWith(@"<?xml version=")) || Regex.IsMatch(e.Message.Replace("&", "&"), @"(?<链接>((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?)")))
|
|||
|
{
|
|||
|
Action(e, client);
|
|||
|
this.OnLog($"{e.NickName}({e.Username}) 发送连接或小程序,踢出");
|
|||
|
return;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 发名片踢人
|
|||
|
if (Config.is_card)
|
|||
|
{
|
|||
|
if (Regex.IsMatch(e.Message, @"^<\?xml version=.+antispamticket=(.+) />$"))
|
|||
|
{
|
|||
|
Action(e, client);
|
|||
|
this.OnLog($"{e.NickName}({e.Username}) 发送名片,踢出");
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 图片二维码踢人
|
|||
|
if (Config.is_qrcord)
|
|||
|
{
|
|||
|
//var regs = Regex.Matches(e.Message, Reg_CheckIsUrl);
|
|||
|
//if (regs.Count != 0)
|
|||
|
//{
|
|||
|
// foreach (Match reg in regs)
|
|||
|
// {
|
|||
|
// var link = reg.Groups["链接"].Value;
|
|||
|
// Bitmap img = null;
|
|||
|
// Image mainpic = null;
|
|||
|
// try
|
|||
|
// {
|
|||
|
// string imagePath = string.Empty;
|
|||
|
// try
|
|||
|
// {
|
|||
|
// mainpic = null;
|
|||
|
// imagePath = Util.MapFile(DateTime.Now.Ticks.ToString() + ".jpg", "Cache\\image");
|
|||
|
// if (!link.StartsWith("http")) link = "http:" + link;
|
|||
|
// mainpic = FileTools.DownloadImage(link, imagePath);
|
|||
|
// img = new Bitmap(mainpic);
|
|||
|
// var QRCodeData = Util.DecodeQRCode(img);//解析机器人二维码,获取到二维码的链接
|
|||
|
// if (!string.IsNullOrWhiteSpace(QRCodeData))
|
|||
|
// {
|
|||
|
// client.DeleteGroupMember(e.Username, e.Groupid);
|
|||
|
// return;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// catch (Exception ex)
|
|||
|
// {
|
|||
|
// throw new Exception($"读取文件异常:图片路径 = {imagePath} .{ex.Message} - {ex.StackTrace}");
|
|||
|
// }
|
|||
|
// if (mainpic == null) throw new Exception($"下载失败:url = {link}");
|
|||
|
// }
|
|||
|
// catch (Exception)
|
|||
|
// {
|
|||
|
// if (img != null) img.Dispose();
|
|||
|
// if (mainpic != null) mainpic.Dispose();
|
|||
|
// }
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
var reg = Regex.Match(e.Message, @"\[图片=(.+?)\]");
|
|||
|
if (reg.Success)
|
|||
|
{
|
|||
|
var file = reg.Groups[1].Value;
|
|||
|
if (!File.Exists(file)) return;
|
|||
|
|
|||
|
Bitmap img = null;
|
|||
|
//Image mainpic = null;
|
|||
|
try
|
|||
|
{
|
|||
|
string imagePath = string.Empty;
|
|||
|
try
|
|||
|
{
|
|||
|
//mainpic = null;
|
|||
|
//imagePath = Util.MapFile(DateTime.Now.Ticks.ToString() + ".jpg", "Cache\\image");
|
|||
|
//if (!link.StartsWith("http")) link = "http:" + link;
|
|||
|
//mainpic = FileTools.DownloadImage(link, imagePath);
|
|||
|
//img = new Bitmap(mainpic);
|
|||
|
|
|||
|
img = Util.ReadImageFile(file);
|
|||
|
var QRCodeData = Util.DecodeQRCode(img);//解析机器人二维码,获取到二维码的链接
|
|||
|
if (!string.IsNullOrWhiteSpace(QRCodeData))
|
|||
|
{
|
|||
|
//client.DeleteGroupMember(e.Username, e.Groupid);
|
|||
|
//e.SendMessage(new VariateReplace().CommonReplace(Config.expelmess, e.GetMemberinfo(), e.RobotInfo));
|
|||
|
Action(e, client);
|
|||
|
this.OnLog($"{e.NickName}({e.Username}) 发送的图片中带有二维码,踢出");
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
throw new Exception($"读取文件异常:图片路径 = {imagePath} .{ex.Message} - {ex.StackTrace}");
|
|||
|
}
|
|||
|
//if (mainpic == null) throw new Exception($"下载失败:url = {link}");
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{
|
|||
|
if (img != null) img.Dispose();
|
|||
|
//if (mainpic != null) mainpic.Dispose();
|
|||
|
}
|
|||
|
//}
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
this.OnLog(ex.Message);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Action(ReciveIMEvent e, WeixinBase client, bool isSend = true)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
string key = "fl_jianting_key_" + e.Username;
|
|||
|
var falg = ApiClient.Cache.Get<string>(key);
|
|||
|
if (!string.IsNullOrWhiteSpace(falg)) return;
|
|||
|
client.DeleteGroupMember(e.Username, e.Groupid);
|
|||
|
if (isSend)
|
|||
|
e.SendMessage(new VariateReplace().CommonReplace(Config.expelmess, e.GetMemberinfo(), e.RobotInfo));
|
|||
|
ApiClient.Cache.Set(key, "1", 2);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
this.OnLog("缓存异常:" + ex.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public override void ShowForm()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if (mainForm == null || mainForm.IsDisposed)
|
|||
|
{
|
|||
|
mainForm = new MainForm();
|
|||
|
mainForm.Show();
|
|||
|
}
|
|||
|
mainForm.TopMost = true;
|
|||
|
mainForm.TopMost = false;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
this.OnLog(ex.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void Stop()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if (mainForm != null)
|
|||
|
{
|
|||
|
mainForm.CloseForm();
|
|||
|
mainForm = null;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
this.OnLog(ex.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|