2022-09-20 03:10:29 +00:00
using Api.Framework ;
using Api.Framework.Enums ;
using Api.Framework.SDK ;
using Api.Framework.Tools ;
using Chat.Framework.WXSdk ;
using Chat.Framework.WXSdk.Implement ;
using CsharpHttpHelper ;
using System ;
using System.Collections ;
2022-09-22 02:01:50 +00:00
using System.Collections.Concurrent ;
2022-09-20 03:10:29 +00:00
using System.Collections.Generic ;
using System.Linq ;
using System.Text.RegularExpressions ;
using System.Threading ;
using System.Threading.Tasks ;
using Weixin.CircleTools ;
2022-09-22 02:01:50 +00:00
using Weixin.CircleTools.Data ;
2022-09-20 03:10:29 +00:00
using Weixin.CircleTools.Entitys ;
using static CircleFriendsTools . Enums ;
namespace CircleFriendsTools
{
/// <summary>
/// 评语
/// </summary>
2022-09-22 02:01:50 +00:00
public class Comment
2022-09-20 03:10:29 +00:00
{
public long CreateTime { get ; set ; }
public string Content { get ; set ; }
}
/// <summary>
/// 监听朋友圈列表转发内容
/// </summary>
class MonitorThread : TimerTask
{
private string [ ] Day = new string [ ] { "周末" , "周一" , "周二" , "周三" , "周四" , "周五" , "周六" } ;
private long count ;
//private bool isSend = false;//是否进入发送状态,成没成功和这个没关系
private string cache_key = "cache_key" ;
2022-09-22 02:01:50 +00:00
private static TbApi tbApi = new TbApi ( ) ;
2022-09-20 03:10:29 +00:00
private bool IsRun = false ;
public MonitorThread ( ) { }
internal Class1 plugin ;
private static readonly Object ObjLock = new Object ( ) ;
2022-09-22 02:01:50 +00:00
/// <summary>
/// 等待发送的朋友圈任务
/// </summary>
private static BlockingCollection < WaitSendCircleInfo > waitSendCircleInfoList = new BlockingCollection < WaitSendCircleInfo > ( ) ;
2022-09-22 03:39:51 +00:00
public void Init ( )
2022-09-22 02:01:50 +00:00
{
var th = new Thread ( ( ) = >
{
2022-09-22 03:39:51 +00:00
foreach ( var circleInfo in waitSendCircleInfoList . GetConsumingEnumerable ( ) )
2022-09-22 02:01:50 +00:00
{
try
{
//内容
var objectDesc = circleInfo . CircleContent ;
//评论
var comments = circleInfo . Comments ;
var clients = Chat . Framework . ChatClient . WXClient . Values . ToList ( ) ;
foreach ( var _item in clients )
{
var item = _item ;
2023-01-29 10:07:38 +00:00
if ( Class1 . Config . transpond_send_usernames . Count ! = 0 & & ! Class1 . Config . transpond_send_usernames . Contains ( item . WeixinHao ) )
2022-09-22 02:01:50 +00:00
{
continue ;
}
try
{
if ( ( item . WeixinType = = WeixinType . Grpc微信 | | item . WeixinType = = WeixinType . Hook微信 ) & & item . Status = = WxStatus . 在 线 )
{
EventClient . OnEvent ( "" , $"【朋友圈工具】 => {item.User.Nick}({item.WeixinHao}),准备开始发送朋友圈~" ) ;
List < tbinfo_temp > tbInfoTempGroups = ApiClient . GetSession ( ) . FindTbInfoTempGroups ( ) ; //获取tb数据数据集合缓存
var infoTemp = tbInfoTempGroups . FirstOrDefault ( f = > f . name . Trim ( ) = = item . WeixinHao . Trim ( ) & & ! f . onoff ) ;
if ( infoTemp = = null ) return ;
if ( Class1 . Config . TransmitStyle = = TransmitStyleType . 仅 转 发 原 文 )
item . SendCircle ( objectDesc ) ; //发送朋友圈的主内容
else
{
var _comment = new List < string > ( ) ;
if ( Class1 . Config . AutoTurn )
{
#region
var tb = CpsClient . Members . FirstOrDefault ( f = > f . cpstype = = CpsType . 阿 里 妈 妈 & & f . username = = infoTemp . adzone_pid_cps_name ) ; //用户设置的推广位
if ( tb = = null ) throw new Exception ( "阿里妈妈推广位异常,请检测后重试!" ) ;
#region 淘 宝 转 链
if ( tb ! = null )
{
var api = CpsClient . CreateAlimamaRequest ( tb ) ;
foreach ( var comment in comments )
{
var regs = Regex . Matches ( comment . Content , "(?<口令符号_前缀>[^A-Za-z0-9]?(?<淘口令>[A-Za-z0-9]{11})(?<口令符号_后缀>)[^A-Za-z0-9]?)" ) ;
if ( regs . Count > 0 )
{
foreach ( Match temp in regs )
{
try
{
if ( temp . Success )
{
var first_fuhao = temp . Groups [ "口令符号_前缀" ] . Value ; //口令符号
var tklInfo = tbApi . TKLToOwnTKL ( temp . Groups [ "淘口令" ] . Value , infoTemp . adzone_pid , api ) ; //获取新的淘口令信息
if ( tklInfo ! = null )
{
//淘口令的前/后符号有没有设置.有设置将替换掉
var tkl = new TBHelper . TbAnalysis ( ) . ReplaceTklModifier ( tklInfo . tkl ) ;
if ( ! string . IsNullOrWhiteSpace ( Class1 . Config . AppendComment ) )
_comment . Add ( Class1 . Config . AppendComment . Replace ( "[转链口令]" , tkl ) ) ;
else
_comment . Add ( tkl ) ;
//_comment.Add(comment.Content.Replace(first_fuhao, tkl));
break ;
}
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( "" , $"机器人:{item.WeixinHao},评语转换淘口令失败 - {comment.Content},{ex.Message},{ex.StackTrace}" ) ;
}
}
}
else
_comment . Add ( comment . Content ) ;
}
}
#endregion
#endregion
}
else
_comment = comments . Select ( f = > f . Content ) . ToList ( ) ;
var json = item . SendCircle ( objectDesc ) ; //发送朋友圈的主内容
if ( string . IsNullOrWhiteSpace ( json ) )
EventClient . OnEvent ( "" , $"【朋友圈工具】 => {item.WeixinHao},转发失败" ) ;
else
EventClient . OnEvent ( "" , $"【朋友圈工具】 => {item.WeixinHao},转发成功" ) ;
var reg = Regex . Match ( json . Replace ( "<![CDATA[" , "" ) . Replace ( "]]>" , "" ) , @"<id>(?<id>\d{15,})</id>" ) ; //获取返回的朋友圈id
if ( reg . Success )
{
var id = reg . Groups [ "id" ] . Value ;
//EventClient.OnEvent(this, $"【朋友圈工具】 => {item.WeixinHao}_{id}");
var commentStr = string . Join ( "[分段]" , _comment ) ;
if ( ! string . IsNullOrWhiteSpace ( commentStr ) )
{
EventClient . OnEvent ( "" , $"【朋友圈工具】 => {item.WeixinHao},{commentStr}" ) ;
item . SendCircleComment ( item . User . Username , id , commentStr ) ;
}
}
else
{
//EventClient.OnEvent(this, $"【朋友圈工具】 => {item.WeixinHao},{json}");
}
}
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( "" , $"朋友圈工具 - 朋友圈检测 - 转发:{item.User.Nick}({item.WeixinHao}){ex.Message},{ex.StackTrace}" ) ;
}
}
//});
EventClient . OnEvent ( "" , "【朋友圈工具】 => 转发完毕" ) ;
}
catch ( Exception e )
{
EventClient . OnEvent ( "" , $"【朋友圈工具】 => 转发异常:{e.Message}" ) ;
}
}
} ) ;
th . IsBackground = true ;
th . Start ( ) ;
}
2022-09-20 03:10:29 +00:00
// static List<string> weixinhaos = new List<string>() { "liu454097", "zhengbaolingshipu520", "Cmeiliy", "WY1164314651", "L13291035216", "z15982388678" };
public override async void Run ( object state , bool timedOut )
{
try
{
count + + ;
//朋友圈检测
2022-09-22 02:01:50 +00:00
if ( ! string . IsNullOrWhiteSpace ( Class1 . Config . MonitorCrowd ) & & ( ( state ! = null & & state . ToString ( ) = = "立即检测" ) | | count % ( Class1 . Config . MonitorIntervalTime * 60 ) = = 0 ) )
2022-09-20 03:10:29 +00:00
{
2022-09-23 02:25:48 +00:00
//EventClient.OnEvent(this, $"【朋友圈工具】 => 定时执行朋友圈跟发,状态:{(IsRun ? "历史任务还在执行中" : "历史任务未执行")}");
2022-09-20 03:10:29 +00:00
if ( ! IsRun )
{
IsRun = true ;
2022-09-22 02:01:50 +00:00
var clients = GetRandomList ( Chat . Framework . ChatClient . WXClient . Values . ToList ( ) ) ; //获取机器人集合
2022-09-20 03:10:29 +00:00
try
{
string objectDesc = string . Empty ; //要转发的朋友圈内容
List < Comment > comments = new List < Comment > ( ) ; //评论内容
var isNews = false ; //判断是否有新的动态
#region 这 里 主 要 是 检 索 所 有 在 线 的 机 器 人 列 表 中 , 监 听 用 户 的 朋 友 圈 内 容 以 及 评 论 数 据
lock ( ObjLock )
{
string newestTime = string . Empty ;
int ii = 1 ;
foreach ( var item in clients )
{
try
{
if ( ( item . WeixinType = = WeixinType . Grpc微信 | | item . WeixinType = = WeixinType . Hook微信 ) & & item . Status = = WxStatus . 在 线 )
{
//if (!weixinhaos.Contains(item.WeixinHao)) continue;
var monitorCrowd = Class1 . Config . MonitorCrowd . Trim ( ) ; //undone 获取用户真正的微信id
var news = item . FindCircle ( monitorCrowd ) ; //获取朋友圈的动态
if ( news ! = null & & news . Count = = 0 & & ( state ! = null & & state . ToString ( ) = = "立即检测" ) )
EventClient . OnEvent ( this , $"【朋友圈工具】 => 朋友圈检测({item.WeixinHao}): {Class1.Config.MonitorInfoHistoryTime} - {news.Count}" ) ;
if ( news ! = null & & news . Count ! = 0 )
{
if ( news [ 0 ] . ContainsKey ( "CreateTime" ) )
newestTime = news [ 0 ] [ "CreateTime" ] . ToString ( ) ; //监听的微信id最新动态发送时间
//StringBuilder strb = new StringBuilder();
//if ((state != null && state.ToString() == "立即检测"))
//{
// strb.AppendLine($"{item.WeixinHao} - {Class1.Config.MonitorInfoHistoryTime} - {newestTime}");
// if (news[0].ContainsKey("ObjectDesc"))
// objectDesc = news[0]["ObjectDesc"].ToString(); //新动态的内容部分
// strb.AppendLine($"objectDesc = {objectDesc}");
// ArrayList _commentUserList = null;
// if (news[0].ContainsKey("CommentUserList"))
// _commentUserList = news[0]["CommentUserList"] as ArrayList; //评论用户列表
// strb.AppendLine();
// strb.AppendLine($"commentUserList = {_commentUserList}");
// ApiClient.SendNewDingdingMessage(strb.ToString(), "https://oapi.dingtalk.com/robot/send?access_token=3d1e19c2965752d07ade14cf99abb940d6bd0ddcf1b7aaebd831b95d339a0a78");
//}
if ( ! string . IsNullOrEmpty ( Class1 . Config . MonitorInfoHistoryTime ) & & long . Parse ( Class1 . Config . MonitorInfoHistoryTime ) > = long . Parse ( newestTime ) ) //没有最新的动态
{
if ( ( state ! = null & & state . ToString ( ) = = "立即检测" ) )
EventClient . OnEvent ( this , $"【朋友圈工具】 => 朋友圈检测({item.WeixinHao}):没有新动态({newestTime})" ) ;
if ( ii > 3 )
break ;
else
{
Thread . Sleep ( 500 ) ;
ii + + ;
continue ;
}
}
if ( news [ 0 ] . ContainsKey ( "ObjectDesc" ) )
objectDesc = news [ 0 ] [ "ObjectDesc" ] . ToString ( ) ; //新动态的内容部分
var reg = Regex . Match ( objectDesc , @"(?<地址信息>\<location.*?\</location\>)" ) ;
if ( reg . Success )
{
var location = reg . Groups [ "地址信息" ] . Value ;
var locationContent = string . Empty ;
if ( ! string . IsNullOrWhiteSpace ( Class1 . Config . LocationContent ) )
{
//<location poiAddress="" poiScale="0" city="成都" poiName="成都 · 88888888888888888888888" latitude="30.791265" poiClickableStatus="0" poiClassifyId="UgcPoiEx_4900258511" poiClassifyType="2" longitude="103.89912" poiAddressName="88888888888888888888888" country="中国"></location>
//Regex.Replace(“<img>abc</img>”,@“<img>(?<str>.*?)</img>”,"[图片]${str}");
locationContent = @"<location poiAddress="""" poiScale=""0"" city="""" poiName ="""" latitude =""0"" poiClickableStatus =""1"" poiClassifyId =""" + Class1 . Config . LocationContent + @""" poiClassifyType =""2"" longitude =""0"" poiAddressName ="""" country =""中国"" ></location>""" ;
}
objectDesc = objectDesc . Replace ( location , locationContent ) ;
}
if ( Class1 . Config . TransmitStyle = = TransmitStyleType . 仅 转 发 原 文 )
{
isNews = true ;
2022-09-22 02:01:50 +00:00
waitSendCircleInfoList . TryAdd ( new WaitSendCircleInfo ( )
{
CircleContent = objectDesc ,
Comments = comments
} ) ;
2022-09-20 03:10:29 +00:00
break ; //设置为仅转发原文
}
ArrayList commentUserList = null ;
if ( news [ 0 ] . ContainsKey ( "CommentUserList" ) )
commentUserList = news [ 0 ] [ "CommentUserList" ] as ArrayList ; //评论用户列表
else
{
if ( Class1 . Config . TransmitStyle = = TransmitStyleType . 原 文 及 评 论 )
{
isNews = false ;
continue ;
}
}
if ( commentUserList ! = null & & commentUserList . Count ! = 0 )
{
for ( int i = 0 ; i < commentUserList . Count ; i + + )
{
try
{
2022-09-22 02:01:50 +00:00
if ( commentUserList [ i ] is Dictionary < string , object > user & & user . Count ! = 0 )
2022-09-20 03:10:29 +00:00
{
var username = string . Empty ;
if ( user . ContainsKey ( "Username" ) )
username = user [ "Username" ] . ToString ( ) ;
if ( monitorCrowd = = username | | Class1 . Config . MonitorCrowd = = username ) //发送者给自己评论时.
{
if ( user . ContainsKey ( "Content" ) )
comments . Add ( new Comment { Content = user [ "Content" ] . ToString ( ) , CreateTime = long . Parse ( user [ "CreateTime" ] . ToString ( ) ) } ) ;
}
}
}
catch ( Exception ex )
{
throw ex ;
}
}
//评论不为空
if ( comments . Count ! = 0 )
{
2022-09-22 02:01:50 +00:00
comments . Sort ( ( c1 , c2 ) = > c1 . CreateTime . CompareTo ( c2 . CreateTime ) ) ;
isNews = true ;
waitSendCircleInfoList . TryAdd ( new WaitSendCircleInfo ( )
2022-09-20 03:10:29 +00:00
{
2022-09-22 02:01:50 +00:00
CircleContent = objectDesc ,
Comments = comments
2022-09-20 03:10:29 +00:00
} ) ;
break ;
}
}
if ( Class1 . Config . Turn_Obstinate & & ! string . IsNullOrEmpty ( objectDesc ) )
{
isNews = true ;
2022-09-22 02:01:50 +00:00
waitSendCircleInfoList . TryAdd ( new WaitSendCircleInfo ( )
{
CircleContent = objectDesc ,
Comments = comments
} ) ;
2022-09-20 03:10:29 +00:00
break ;
}
}
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( this , $"朋友圈工具 - 朋友圈检测 - 采集:{ex.Message} - {ex.StackTrace}" ) ;
}
}
if ( isNews )
{
2022-09-22 03:39:51 +00:00
EventClient . OnEvent ( this , $"朋友圈工具 - 采集到新朋友圈内容 等待发送数量 => {waitSendCircleInfoList.Count}" ) ;
2022-09-20 03:10:29 +00:00
if ( ! string . IsNullOrWhiteSpace ( newestTime ) )
{
Class1 . Config . MonitorInfoHistoryTime = newestTime ;
Util . Save ( Class1 . Config ) ; //更新记录时间
}
}
}
#endregion
#region 这 里 主 要 是 让 在 线 的 机 器 人 都 转 发 上 面 获 取 到 的 最 新 动 态
if ( isNews )
{
2022-09-22 02:01:50 +00:00
return ;
2022-09-20 03:10:29 +00:00
foreach ( var _item in clients )
{
var item = _item ;
if ( Class1 . Config . transpond_send_usernames . Count ! = 0 & & ! Class1 . Config . transpond_send_usernames . Contains ( item . WeixinHao ) )
continue ;
await Task . Run ( ( ) = >
{
try
{
if ( ( item . WeixinType = = WeixinType . Grpc微信 | | item . WeixinType = = WeixinType . Hook微信 ) & & item . Status = = WxStatus . 在 线 )
{
EventClient . OnEvent ( "" , $"【朋友圈工具】 => {item.User.Nick}({item.WeixinHao}),准备开始发送朋友圈~" ) ;
List < tbinfo_temp > tbInfoTempGroups = ApiClient . GetSession ( ) . FindTbInfoTempGroups ( ) ; //获取tb数据数据集合缓存
var infoTemp = tbInfoTempGroups . FirstOrDefault ( f = > f . name . Trim ( ) = = item . WeixinHao . Trim ( ) & & ! f . onoff ) ;
if ( infoTemp = = null ) return ;
if ( Class1 . Config . TransmitStyle = = TransmitStyleType . 仅 转 发 原 文 )
item . SendCircle ( objectDesc ) ; //发送朋友圈的主内容
else
{
var _comment = new List < string > ( ) ;
if ( Class1 . Config . AutoTurn )
{
#region
var tb = CpsClient . Members . FirstOrDefault ( f = > f . cpstype = = CpsType . 阿 里 妈 妈 & & f . username = = infoTemp . adzone_pid_cps_name ) ; //用户设置的推广位
if ( tb = = null ) throw new Exception ( "阿里妈妈推广位异常,请检测后重试!" ) ;
#region 淘 宝 转 链
if ( tb ! = null )
{
var api = CpsClient . CreateAlimamaRequest ( tb ) ;
foreach ( var comment in comments )
{
var regs = Regex . Matches ( comment . Content , "(?<口令符号_前缀>[^A-Za-z0-9]?(?<淘口令>[A-Za-z0-9]{11})(?<口令符号_后缀>)[^A-Za-z0-9]?)" ) ;
if ( regs . Count > 0 )
{
foreach ( Match temp in regs )
{
try
{
if ( temp . Success )
{
var first_fuhao = temp . Groups [ "口令符号_前缀" ] . Value ; //口令符号
var tklInfo = tbApi . TKLToOwnTKL ( temp . Groups [ "淘口令" ] . Value , infoTemp . adzone_pid , api ) ; //获取新的淘口令信息
if ( tklInfo ! = null )
{
//淘口令的前/后符号有没有设置.有设置将替换掉
var tkl = new TBHelper . TbAnalysis ( ) . ReplaceTklModifier ( tklInfo . tkl ) ;
if ( ! string . IsNullOrWhiteSpace ( Class1 . Config . AppendComment ) )
_comment . Add ( Class1 . Config . AppendComment . Replace ( "[转链口令]" , tkl ) ) ;
else
_comment . Add ( tkl ) ;
//_comment.Add(comment.Content.Replace(first_fuhao, tkl));
break ;
}
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( this , $"机器人:{item.WeixinHao},评语转换淘口令失败 - {comment.Content},{ex.Message},{ex.StackTrace}" ) ;
}
}
}
else
_comment . Add ( comment . Content ) ;
}
}
#endregion
#endregion
}
else
_comment = comments . Select ( f = > f . Content ) . ToList ( ) ;
var json = item . SendCircle ( objectDesc ) ; //发送朋友圈的主内容
if ( string . IsNullOrWhiteSpace ( json ) )
EventClient . OnEvent ( this , $"【朋友圈工具】 => {item.WeixinHao},转发失败" ) ;
else
EventClient . OnEvent ( this , $"【朋友圈工具】 => {item.WeixinHao},转发成功" ) ;
var reg = Regex . Match ( json . Replace ( "<![CDATA[" , "" ) . Replace ( "]]>" , "" ) , @"<id>(?<id>\d{15,})</id>" ) ; //获取返回的朋友圈id
if ( reg . Success )
{
var id = reg . Groups [ "id" ] . Value ;
//EventClient.OnEvent(this, $"【朋友圈工具】 => {item.WeixinHao}_{id}");
var commentStr = string . Join ( "[分段]" , _comment ) ;
if ( ! string . IsNullOrWhiteSpace ( commentStr ) )
{
EventClient . OnEvent ( this , $"【朋友圈工具】 => {item.WeixinHao},{commentStr}" ) ;
item . SendCircleComment ( item . User . Username , id , commentStr ) ;
}
}
else
{
//EventClient.OnEvent(this, $"【朋友圈工具】 => {item.WeixinHao},{json}");
}
}
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( this , $"朋友圈工具 - 朋友圈检测 - 转发:{item.User.Nick}({item.WeixinHao}){ex.Message},{ex.StackTrace}" ) ;
}
} ) ;
}
//});
EventClient . OnEvent ( this , $"【朋友圈工具】 => 转发完毕" ) ;
}
#endregion
}
catch ( Exception )
{ }
finally
{
IsRun = false ;
}
}
}
#region web接口检测
if ( count % ( Class1 . Config . CustomWebApiIntervalTime * 60 ) = = 0 )
{
if ( ! string . IsNullOrWhiteSpace ( Class1 . Config . CustomWebApi ) )
{
try
{
var http = new HttpHelper ( ) ;
var text = http . GetHtml ( HttpExtend . GetItem ( http , Class1 . Config . CustomWebApi . Replace ( ".txt" , ".php" ) ) ) . Html ;
if ( ! string . IsNullOrWhiteSpace ( text ) )
{
var text_MD5 = Api . Framework . Tools . Util . GetMd5_32byte ( text ) ;
if ( Class1 . Config . CustomWebApiTextMD5 ! = text_MD5 )
{
Class1 . Config . CustomWebApiTextMD5 = text_MD5 ;
Util . Save ( Class1 . Config ) ;
var clients = Chat . Framework . ChatClient . WXClient . Values . ToList ( ) ;
var values = text . Split ( new string [ ] { "[评语]" } , StringSplitOptions . RemoveEmptyEntries ) ;
if ( values . Length ! = 0 )
{
var decided_tkl = string . Empty ;
foreach ( WeixinBase item in clients )
{
try
{
if ( ( item . WeixinType = = WeixinType . Grpc微信 | | item . WeixinType = = WeixinType . Hook微信 ) & & item . Status = = WxStatus . 在 线 )
{
var jsonObject = item . SendCircle ( values [ 0 ] ) ;
if ( jsonObject = = null ) throw new Exception ( "请检测是否包含图片地址" ) ;
if ( values . Length = = 2 )
{
var reg = Regex . Match ( jsonObject . Replace ( "<![CDATA[" , "" ) . Replace ( "]]>" , "" ) , @"<id>(?<id>\d{15,})</id>" ) ; //获取返回的朋友圈id
if ( reg . Success )
{
var id = reg . Groups [ "id" ] . Value ;
if ( ! string . IsNullOrWhiteSpace ( values [ 1 ] ) )
{
var session = ApiClient . GetSession ( ) ;
var tbInfoTempGroups = session . FindTbInfoTempGroups ( ) ; //获取tb数据数据集合缓存
var infoTemp = tbInfoTempGroups . FirstOrDefault ( f = > f . name . Trim ( ) = = item . WeixinHao . Trim ( ) & & ! f . onoff ) ;
var tb = CpsClient . Members . FirstOrDefault ( f = > f . cpstype = = CpsType . 阿 里 妈 妈 & & f . username = = infoTemp . adzone_pid_cps_name ) ; //用户设置的推广位
if ( tb = = null ) throw new Exception ( "阿里妈妈推广位异常,请检测后重试!" ) ;
#region 淘 宝 转 链
if ( tb ! = null )
{
var finally_comment = values [ 1 ] ; ;
if ( Class1 . Config . AutoTurn )
{
var api = CpsClient . CreateAlimamaRequest ( tb ) ;
var tempstr = string . IsNullOrWhiteSpace ( decided_tkl ) ? values [ 1 ] : decided_tkl ;
var regs = Regex . Matches ( tempstr , "(?<口令符号_前缀>[^A-Za-z0-9]?(?<淘口令>[A-Za-z0-9]{11})(?<口令符号_后缀>)[^A-Za-z0-9]?)" ) ;
if ( regs . Count > 0 )
{
foreach ( Match temp in regs )
{
try
{
if ( temp . Success )
{
var first_fuhao = temp . Groups [ "口令符号_前缀" ] . Value ; //口令符号
var suspicious_tkl = temp . Groups [ "淘口令" ] . Value ;
var tklInfo = tbApi . TKLToOwnTKL ( suspicious_tkl , infoTemp . adzone_pid , api ) ; //获取新的淘口令信息
if ( tklInfo ! = null )
{
decided_tkl = first_fuhao ;
//淘口令的前/后符号有没有设置.有设置将替换掉
var tkl = new TBHelper . TbAnalysis ( ) . ReplaceTklModifier ( tklInfo . tkl ) ;
finally_comment = values [ 1 ] . Replace ( first_fuhao , tkl ) ;
break ;
}
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( this , $"机器人:{item.WeixinHao},评语转换淘口令失败 - {values[1]},{ex.Message},{ex.StackTrace}" ) ;
}
}
}
}
item . SendCircleComment ( item . User . Username , id , finally_comment ) ;
#endregion
}
}
}
}
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( this , $"朋友圈工具 - web接口: ({item.WeixinHao}) => {ex.Message}" ) ;
}
}
}
}
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( this , $"朋友圈工具 - web接口: {ex.Message}" ) ;
}
}
}
#endregion
#region 自 动 点 赞
if ( Class1 . Config . AutoPraise & & count % ( Class1 . Config . AutoPraiseInterval * 60 ) = = 0 )
{
var robots = Chat . Framework . ChatClient . WXClient . Where ( item = > ( item . Value . WeixinType = = WeixinType . Grpc微信 | | item . Value . WeixinType = = WeixinType . Hook微信 ) & & item . Value . Status = = WxStatus . 在 线 ) ;
Parallel . ForEach ( robots , item = >
{
var robot = item . Value ;
try
{
var circles = robot . FindCircles ( ) ;
foreach ( var temp in circles )
{
try
{
var likeUserList = temp [ "LikeUserList" ] as ArrayList ;
if ( likeUserList ! = null & & likeUserList . Count ! = 0 )
{
var query = from Dictionary < string , object > likeUser in likeUserList
where likeUser [ "Username" ] . ToString ( ) = = robot . User . Username
select likeUser ;
if ( query ! = null )
robot . SendCirclePraise ( temp [ "Username" ] . ToString ( ) , temp [ "Id" ] . ToString ( ) ) ;
}
else
robot . SendCirclePraise ( temp [ "Username" ] . ToString ( ) , temp [ "Id" ] . ToString ( ) ) ;
Thread . Sleep ( 1521 ) ;
}
catch ( Exception ex )
{
EventClient . OnEvent ( this , $"朋友圈工具 - 自动点赞:{ex.Message}" ) ;
}
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( this , $"朋友圈工具 - 自动点赞:{ex.Message}" ) ;
}
} ) ;
}
#endregion
#region 定 时 发 送 任 务
if ( count % 60 = = 0 )
{
var session = ApiClient . GetSession ( ) ;
var pddinfo_temp_groups = session . FindTaskInfosTempGroups ( ) ; //读取缓存中的数据
if ( pddinfo_temp_groups ! = null & & pddinfo_temp_groups . Count ! = 0 )
{
string week = Day [ Convert . ToInt32 ( DateTime . Now . DayOfWeek . ToString ( "d" ) ) ] . ToString ( ) ; //获取到今天是星期几
var isSend = false ; //还原
foreach ( var item in pddinfo_temp_groups )
{
try
{
if ( item . task_working_day . Contains ( week ) )
{
var result = ApiClient . Cache . Get < List < long > > ( cache_key ) ;
if ( result ! = null & & result . Contains ( item . id ) ) continue ;
var task_time = DateTime . Parse ( item . task_time ) ;
var now = DateTime . Now ;
var dValue = ( now - task_time ) . TotalMinutes ;
if ( 0 < dValue & & dValue < 5 )
{
if ( result = = null ) result = new List < long > ( ) ;
result . Add ( item . id ) ;
ApiClient . Cache . Set ( cache_key , result , 5 ) ;
var clients = Chat . Framework . ChatClient . WXClient . Values . ToList ( ) . Where ( f = > ( f . WeixinType = = WeixinType . Grpc微信 | | f . WeixinType = = WeixinType . Hook微信 ) & & f . Status = = WxStatus . 在 线 ) ;
var robotnames = item . robotnames . Split ( new string [ ] { "," } , StringSplitOptions . RemoveEmptyEntries ) . Select ( f = > f . Trim ( ) ) . ToList ( ) ;
foreach ( var client in clients )
{
try
{
if ( ! robotnames . Contains ( client . WeixinHao . Trim ( ) ) ) continue ;
isSend = true ;
EventClient . OnEvent ( this , "定时任务:" + client . WeixinHao + ":准备发了" ) ;
var json = client . SendCircle ( item . task_sendtext ) ; //发送朋友圈的主内容
if ( string . IsNullOrWhiteSpace ( json ) )
EventClient . OnEvent ( this , "定时任务:" + client . WeixinHao + ":发送失败" ) ;
else
EventClient . OnEvent ( this , "定时任务:" + client . WeixinHao + ":已经发了" ) ;
var reg = Regex . Match ( json . Replace ( "<![CDATA[" , "" ) . Replace ( "]]>" , "" ) , @"<id>(?<id>\d{15,})</id>" ) ; //获取返回的朋友圈id
if ( reg . Success )
{
var id = reg . Groups [ "id" ] . Value ;
if ( ! string . IsNullOrWhiteSpace ( item . task_comment ) )
client . SendCircleComment ( client . User . Username , id , item . task_comment ) ; //替换淘口令
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( this , $"朋友圈工具 - 定时发送任务:{ex.Message},{ex.StackTrace}" ) ;
}
}
if ( isSend & & item . is_circulate = = Enums . ChooseType . 否 ) //不是循环发送的任务,将本次发送的工作日给删除了.
{
var workingDays = item . task_working_day . Replace ( " " , "" ) . Split ( new string [ ] { "," } , StringSplitOptions . RemoveEmptyEntries ) . ToList ( ) ;
workingDays . Remove ( week ) ;
if ( workingDays . Count = = 0 ) //任务中的所有工作日都已经执行完成,删除该任务
session . Deleteable ( item ) . ExecuteCommand ( ) ;
else //任务中的工作还存在,将本次工作日删除后进行更新
{
var task_working_day = string . Join ( "," , workingDays ) ;
item . task_working_day = task_working_day ;
//session.Updateable(item).ExecuteCommand();
session . ExcuteSQL ( "update fl_plugin_circletools_taskinfos set task_working_day = @task_working_day where id = @id" , new { task_working_day = task_working_day , id = item . id } ) ;
}
session . FindTaskInfosTempGroups ( true ) ;
}
}
}
}
catch ( Exception ex )
{
EventClient . OnEvent ( this , $"朋友圈工具 - 定时发送任务:{ex.Message}" ) ;
}
}
}
}
#endregion
}
catch ( Exception ex )
{
SessionExt . Clear ( ) ;
EventClient . OnEvent ( this , $"朋友圈工具:{ex.Message}\r\n{ex.StackTrace}" ) ;
}
}
private static List < T > GetRandomList < T > ( List < T > inputList )
{
try
{
//Copy to a array
T [ ] copyArray = new T [ inputList . Count ] ;
inputList . CopyTo ( copyArray ) ;
//Add range
List < T > copyList = new List < T > ( ) ;
copyList . AddRange ( copyArray ) ;
//Set outputList and random
List < T > outputList = new List < T > ( ) ;
Random rd = new Random ( DateTime . Now . Millisecond ) ;
while ( copyList . Count > 0 )
{
//Select an index and item
int rdIndex = rd . Next ( 0 , copyList . Count - 1 ) ;
T remove = copyList [ rdIndex ] ;
//remove it from copyList and add it to output
copyList . Remove ( remove ) ;
outputList . Add ( remove ) ;
}
return outputList ;
}
catch ( Exception ex )
{ }
return inputList ;
}
}
}