370 lines
16 KiB
C#
370 lines
16 KiB
C#
using Api.Framework;
|
||
using Api.Framework.Enums;
|
||
using Api.Framework.Model;
|
||
using Api.Framework.SDK;
|
||
using Api.Framework.Tools;
|
||
using Chat.Framework.WXSdk;
|
||
using Chat.Framework.WXSdk.Implement;
|
||
using MessageSupervises.Entitys;
|
||
using MessageSupervises.Properties;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace MessageSupervises
|
||
{
|
||
public class Class1 : Plugin
|
||
{
|
||
public Class1()
|
||
{
|
||
this.Logo = Resources.智能拦截;
|
||
this.Name = Resources.PluginName;
|
||
this.Note = Resources.PluginNote;
|
||
}
|
||
|
||
#region 自定义变量
|
||
public static Config Config = null;
|
||
private MainForm mainForm = null;
|
||
#endregion
|
||
|
||
public override void Start()
|
||
{
|
||
try
|
||
{
|
||
var session = ApiClient.GetSession();
|
||
#region 判断表是否存在,不存在创建表
|
||
if (!session.TableExist<fl_plugin_messagesupervises_messinfo>())
|
||
{
|
||
session.CreateTable<fl_plugin_messagesupervises_messinfo>();
|
||
session.AddIndex<fl_plugin_messagesupervises_messinfo>("member_id");
|
||
}
|
||
#endregion
|
||
|
||
//创建配置文件
|
||
Config = this.ReadConfig<Config>();
|
||
SDK.ReciveIMEvent += SDK_ReciveIMEvent;
|
||
SDK.WXApplyGroupEvent += SDK_WXApplyGroupEvent;
|
||
SDK.WXApplyFriendEvent += SDK_WXApplyFriendEvent;
|
||
SDK.WXNewFriendEvent += SDK_WXNewFriendEvent;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
this.OnLog(ex.Message);
|
||
}
|
||
}
|
||
private void Ding(string message)
|
||
{
|
||
if (Config.auth_dingding_swich)
|
||
ApiClient.SendNoticeMessage(message, Config.notice_robotname);
|
||
}
|
||
|
||
|
||
private bool _check_insert_black(fl_member_info info, WeixinBase client, string remark, string message = "")
|
||
{
|
||
if (info.status == MemberType.白名单) return false;
|
||
if (Config.auth_black_swich && client != null)
|
||
{
|
||
var session = ApiClient.GetSession();
|
||
//15天内自动跳过
|
||
if (session.TemporaryBypassedBlack(info))
|
||
return false;
|
||
|
||
bool flag = false;
|
||
|
||
var time = DateTime.Now - info.crt_time;
|
||
if (time.TotalDays >= Config.auto_black_day && info.finish_order <= Config.auto_black_order)
|
||
{
|
||
var alimama_order = session.Queryable<fl_order_alimama>().Where(f => f.db_userid == info.id).Count();
|
||
var pinduoduo_order = session.Queryable<fl_order_pinduoduo>().Where(f => f.db_userid == info.id).Count();
|
||
var jingdong_order = session.Queryable<fl_order_jingdong>().Where(f => f.db_userid == info.id).Count();
|
||
var count = alimama_order + pinduoduo_order + jingdong_order;
|
||
if (Config.auto_black_order >= count)
|
||
{
|
||
// this.OnLog("订单数量:" + count);
|
||
flag = true;
|
||
}
|
||
}
|
||
|
||
if (!flag && !string.IsNullOrEmpty(Config.auto_black_message) && Regex.Match(message, Config.auto_black_message).Success)
|
||
flag = true;
|
||
|
||
if (flag)
|
||
{
|
||
info.status = MemberType.黑名单;
|
||
info.blackout_time = DateTime.Now;
|
||
session.SaveOrUpdate(info);
|
||
session.FindBlacklistMemberInfos(true);//刷新黑名单缓存
|
||
Ding($"增加黑名单提醒\r\n————\r\n事件类型:{"收到消息"}\r\n微信账号:{client.WeixinHao}\r\n微信昵称:{client.User.Nick}\r\n客户账号:{info.username}\r\n客户昵称:{info.usernick}\r\n添加时间:{info.crt_time.ToString("yyyy-MM-dd HH:mm:ss")}");
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 禁止黑名单操作
|
||
/// </summary>
|
||
private bool _ForbidBlacklist(string username, string usernick, string remark, WeixinBase client)
|
||
{
|
||
if (client == null) return false;
|
||
try
|
||
{
|
||
var session = ApiClient.GetSession();
|
||
var info = session.Queryable<fl_member_info>().First(f => f.username == username && f.robot_type == (client.WeixinType == WeixinType.QYHook微信 ? ChatType.企业微信 : ChatType.微信)/*f.robot_type == ChatType.微信*/);
|
||
if (info != null)
|
||
{
|
||
|
||
if (info.status == MemberType.白名单) return false;
|
||
|
||
if (info.status == MemberType.黑名单)
|
||
{
|
||
Ding($"增加黑名单提醒\r\n————\r\n事件类型:{"收到消息"}\r\n微信账号:{client.WeixinHao}\r\n微信昵称:{client.User.Nick}\r\n客户账号:{username}\r\n客户昵称:{usernick}");
|
||
return true;
|
||
}
|
||
|
||
if (Config.FrequencyCloudBlack)
|
||
{
|
||
CloudBlack cloud = new CloudBlack();
|
||
var black = cloud.QueryBlack(info);
|
||
if (black != null)
|
||
{
|
||
Ding($"云黑名单提醒\r\n————\r\n事件类型:{"收到消息"}\r\n微信账号:{client.WeixinHao}\r\n微信昵称:{client.User.Nick}\r\n客户账号:{username}\r\n客户昵称:{usernick}\r\n拉黑原因:{black.remark}");
|
||
if (black.iscloud)
|
||
{
|
||
info.status = MemberType.黑名单;
|
||
ApiClient.GetSession().SaveOrUpdate(info);
|
||
}
|
||
return true;
|
||
}
|
||
else
|
||
return false;
|
||
}
|
||
return _check_insert_black(info, client, remark);
|
||
}
|
||
else
|
||
{
|
||
CloudBlack cloud = new CloudBlack();
|
||
return cloud.QueryBlack(username, (client.WeixinType == WeixinType.QYHook微信 ? ChatType.企业微信 : ChatType.微信)) != null;
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{ }
|
||
return false;
|
||
}
|
||
|
||
private void SDK_WXNewFriendEvent(object sender, Chat.Framework.WXSdk.Events.WXNewFriend e)
|
||
{
|
||
e.Cancel = _ForbidBlacklist(e.Friend.UserName, e.Friend.NickName, $"新增好友事件", e.Client);
|
||
}
|
||
|
||
private void SDK_WXApplyFriendEvent(object sender, Chat.Framework.WXSdk.Events.WXApplyFriend e)
|
||
{
|
||
e.Cancel = _ForbidBlacklist(e.NewFriendWxid, e.NewFriendNick, $"申请添加好友", e.Client);
|
||
}
|
||
|
||
private void SDK_WXApplyGroupEvent(object sender, Chat.Framework.WXSdk.Events.WXApplyGroup e)
|
||
{
|
||
e.Cancel = _ForbidBlacklist(e.Wxid, e.Usernick, $"申请入群", e.Client);
|
||
}
|
||
|
||
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);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 收到通用消息
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void SDK_ReciveIMEvent(object sender, ReciveIMEvent e)
|
||
{
|
||
try
|
||
{
|
||
var client = e.Sender as WeixinBase;
|
||
//屏蔽机器人之间的消息
|
||
if (Chat.Framework.ChatClient.WXClient.Values.ToList().FirstOrDefault(f => f.User.Username == e.Username) != null)
|
||
{
|
||
e.Cancel = true;
|
||
return;
|
||
}
|
||
var member = e.GetMemberinfo();
|
||
if (Config.ProhibitSL && string.IsNullOrEmpty(e.Groupid))
|
||
{
|
||
e.Cancel = true; return;
|
||
}
|
||
if (Config.ProhibitQL && !string.IsNullOrEmpty(e.Groupid))
|
||
{
|
||
e.Cancel = true; return;
|
||
}
|
||
if (member.status == MemberType.白名单)
|
||
return;
|
||
else if (member.status == MemberType.黑名单)
|
||
{
|
||
//白名单关键词
|
||
if (!string.IsNullOrWhiteSpace(Config.WhiteListWords))
|
||
{
|
||
var strs = Config.WhiteListWords.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(f => f.Trim()).ToList();
|
||
if (strs.FirstOrDefault(f => e.Message.Contains(f)) != null)
|
||
return;
|
||
}
|
||
if (string.IsNullOrEmpty(e.Groupid) && Class1.Config.auth_delete_black)
|
||
{
|
||
var wechat = e.Sender as WXClientImpl_IPAD;
|
||
if (wechat != null)
|
||
{
|
||
this.OnLog($"自动删除黑名单好友:{e.NickName}({e.Username})");
|
||
wechat.DeleteFriend(e.Username);
|
||
}
|
||
}
|
||
if (client != null) Ding($"黑名单警告\r\n————\r\n事件类型:{"收到消息"}\r\n微信账号:{client.WeixinHao}\r\n微信昵称:{client.User.Nick}\r\n客户账号:{e.Username}\r\n客户昵称:{e.NickName}");
|
||
e.Cancel = true;
|
||
return;
|
||
}
|
||
else if (Config.FrequencyCloudBlack)
|
||
{
|
||
CloudBlack cloud = new CloudBlack();
|
||
var black = cloud.QueryBlack(member);
|
||
if (black != null)
|
||
{
|
||
if (client != null)
|
||
Ding($"云黑名单警告\r\n————\r\n事件类型:{"收到消息"}\r\n微信账号:{client.WeixinHao}\r\n微信昵称:{client.User.Nick}\r\n客户账号:{e.Username}\r\n客户昵称:{e.NickName}\r\n拉黑原因:{black.remark}");
|
||
e.Cancel = true;
|
||
|
||
if (black.iscloud)
|
||
{
|
||
member.status = MemberType.黑名单;
|
||
ApiClient.GetSession().SaveOrUpdate(member);
|
||
}
|
||
return;
|
||
}
|
||
}
|
||
//if (!string.IsNullOrEmpty(e.Groupid) && !Config.WhiteListSwitch && !Config.GroupWhiteList.Contains(e.Groupid))
|
||
//{ e.Cancel = true; return; }
|
||
if (!string.IsNullOrEmpty(e.Groupid))
|
||
{
|
||
if (!Config.WhiteListSwitch)
|
||
{
|
||
if ((Config.GroupResponseType && !Config.GroupWhiteList.Contains(e.Groupid)) || (!Config.GroupResponseType && Config.GroupWhiteList.Contains(e.Groupid)))
|
||
{ e.Cancel = true; return; }
|
||
}
|
||
|
||
if (Config.ProhibitWxid && Config.ProhibitWxidList.Length != 0)
|
||
{
|
||
if (Config.ProhibitWxidList.ToList().Contains(e.Username))
|
||
{
|
||
e.Cancel = true;
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (Config.ProhibitNick && Config.ProhibitNickList.Length != 0)
|
||
{
|
||
var result = Config.ProhibitNickList.FirstOrDefault(f => e.NickName.Contains(f));
|
||
if (!string.IsNullOrEmpty(result))
|
||
{
|
||
e.Cancel = true;
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
else if (string.IsNullOrEmpty(e.Groupid))
|
||
{
|
||
if (Config.ProhibitWxid && Config.ProhibitWxidList.Length != 0)
|
||
{
|
||
if (Config.ProhibitWxidList.ToList().Contains(e.Username))
|
||
{
|
||
e.Cancel = true;
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (Config.ProhibitNick && Config.ProhibitNickList.Length != 0)
|
||
{
|
||
var result = Config.ProhibitNickList.FirstOrDefault(f => e.NickName.Contains(f));
|
||
if (!string.IsNullOrEmpty(result))
|
||
{
|
||
e.Cancel = true;
|
||
return;
|
||
}
|
||
}
|
||
|
||
var session = ApiClient.GetSession();
|
||
int mess_count = 1;
|
||
var _flag = true;
|
||
if (mess_count < Config.FrequencyIntervalSendNum) //用户发送消息
|
||
{
|
||
mess_count = int.Parse(session.FindRow("select count(*) as num from fl_plugin_messagesupervises_messinfo where member_id = @id and send_time >= @time ", new { id = member.id, time = DateTime.Now.AddSeconds(-Config.FrequencyIntervalSecs) })["num"].ToString()) + 1;
|
||
if (mess_count < Config.FrequencyIntervalSendNum) //为超出了频率限制,插入数据库
|
||
{
|
||
session.ExcuteSQL("insert into fl_plugin_messagesupervises_messinfo (member_id,send_time) values (@member_id,@send_time)", new { member_id = member.id, send_time = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")) });
|
||
_flag = false;
|
||
}
|
||
}
|
||
|
||
if (_flag)
|
||
{
|
||
e.SendMessage(Class1.Config.FrequencyDetentionTip);
|
||
member.status = MemberType.黑名单; //拉入黑名单
|
||
session.SaveOrUpdate(member);
|
||
session.FindBlacklistMemberInfos(true);//刷新黑名单缓存
|
||
e.Cancel = true;
|
||
return;
|
||
}
|
||
}
|
||
|
||
e.Cancel = _check_insert_black(e.GetMemberinfo(), client, "收到聊天消息", e.Message);
|
||
if (e.Cancel)
|
||
{
|
||
if (string.IsNullOrEmpty(e.Groupid) && Class1.Config.auth_delete_black)
|
||
{
|
||
var wechat = e.Sender as Chat.Framework.WXSdk.Implement.WXClientImpl_IPAD;
|
||
if (wechat != null)
|
||
{
|
||
wechat.DeleteFriend(e.Username);
|
||
this.OnLog($"自动删除黑名单好友:{e.NickName}({e.Username})");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
this.OnLog(ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
}
|
||
}
|