Skip to content
This repository has been archived by the owner on Feb 19, 2024. It is now read-only.

Commit

Permalink
1.7.0
Browse files Browse the repository at this point in the history
1. Добавлена функция удаления неактивных редакторов
2. Добавлена поддержка ruCaptcha
3. Добавлена поддержка списков из API
4. Изменены шаблонные настройки для создания групп
  • Loading branch information
likhner committed Jul 12, 2023
1 parent f21a682 commit d006cb8
Show file tree
Hide file tree
Showing 26 changed files with 733 additions and 101 deletions.
12 changes: 6 additions & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ jobs:
uses: actions/checkout@v3

- name: Setup .NET
uses: actions/setup-dotnet@v3.2.0
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
dotnet-version: 6

- name: Verify .NET
run: dotnet --info
Expand Down Expand Up @@ -46,7 +46,7 @@ jobs:
name: nng-one-win64
path: /home/runner/work/nng-one/nng-one/bin/Release/net6.0/win-x64/publish/

- name: Upload Windows Build
- name: Upload macOS build
uses: actions/upload-artifact@v3
with:
name: nng-one-osx-arm64
Expand Down Expand Up @@ -77,7 +77,7 @@ jobs:
name: nng-one-win64
path: win64

- name: Download macOS M1 build
- name: Download macOS build
uses: actions/download-artifact@v3
with:
name: nng-one-osx-arm64
Expand All @@ -96,8 +96,8 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: "1.6.0"
release_name: "1.6.0"
tag_name: "1.7.0"
release_name: "1.7.0"

- name: Upload Linux build to GitHub release
uses: actions/upload-release-asset@v1
Expand Down
90 changes: 90 additions & 0 deletions CaptchaSolver/RuCaptchaSolver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
using nng_one.ServiceCollections;
using nng.Enums;
using nng.Logging;
using TwoCaptcha.Captcha;
using VkNet.Utils.AntiCaptcha;

namespace nng_one.CaptchaSolver;

public class RuCaptchaSolver : ICaptchaSolver
{
private readonly TwoCaptcha.TwoCaptcha _twoCaptcha;
private readonly HttpClient _httpClient;

private readonly Logger _logger = ServiceCollectionContainer.GetInstance().GlobalLogger;

private string _lastCaptchaId = "";
private bool _lastCaptchaReported;

public RuCaptchaSolver(string apiKey)
{
_httpClient = new HttpClient();
_twoCaptcha = new TwoCaptcha.TwoCaptcha(apiKey);
_lastCaptchaReported = true;
}

public string Solve(string url)
{
if (!_lastCaptchaReported && !string.IsNullOrEmpty(_lastCaptchaId))
{
_logger.Log("Положительный репорт с ID отослан", LogType.Debug);
_twoCaptcha.Report(_lastCaptchaId, true);
_lastCaptchaReported = true;
}

DownloadCaptcha(url);

_logger.Log("Решаем капчту...");
var normal = new Normal("temp/captcha.jpg");

try
{
_twoCaptcha.Solve(normal).GetAwaiter().GetResult();
}
catch (Exception e)
{
_logger.Log($"Не удалось решить каптчу {normal.Id}: {e.GetType()}: {e.Message}", LogType.Error);
_lastCaptchaId = normal.Id;
_lastCaptchaReported = false;
return string.Empty;
}

_lastCaptchaId = normal.Id;
_lastCaptchaReported = false;

_logger.Log($"Ответ RuCaptcha: {normal.Code} | ID: {normal.Id}", LogType.Debug);
return normal.Code;
}

private void DownloadCaptcha(string url)
{
_logger.Log("Скачиваем каптчу", LogType.Debug);
var imageResult = _httpClient.Send(new HttpRequestMessage(HttpMethod.Get, url));
imageResult.EnsureSuccessStatusCode();
var image = imageResult.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult();

ClearPath();

var file = File.Create("temp/captcha.jpg");
file.Write(image);
_logger.Log("Каптча перезаписана в temp/captcha.jpg", LogType.Debug);
file.Close();
}

private void ClearPath()
{
if (!Directory.Exists("temp")) Directory.CreateDirectory("temp");

if (File.Exists("temp/captcha.jpg")) File.Delete("temp/captcha.jpg");
}

public void CaptchaIsFalse()
{
_logger.Log($"Неправильная каптча {_lastCaptchaId}", LogType.Error);
if (string.IsNullOrEmpty(_lastCaptchaId)) return;

_logger.Log("Отрицательный репорт с ID отослан", LogType.Debug);
_twoCaptcha.Report(_lastCaptchaId, false);
_lastCaptchaReported = true;
}
}
12 changes: 9 additions & 3 deletions Configs/Config.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,25 @@ namespace nng_one.Configs;

public class Config
{
public Config(string token, string banReason, string dataUrl, bool captchaBypass, bool switchCallback, bool sentry)
public Config(string token, string ruCaptchaToken, string banReason, bool captchaBypass, bool switchCallback,
bool sentry,
string bnndUrl, string groupsUrl)
{
Token = token;
RuCaptchaToken = ruCaptchaToken;
BanReason = banReason;
DataUrl = dataUrl;
CaptchaBypass = captchaBypass;
SwitchCallback = switchCallback;
Sentry = sentry;
BnndUrl = bnndUrl;
GroupsUrl = groupsUrl;
}

public string Token { get; set; }
public string RuCaptchaToken { get; set; }
public string BanReason { get; set; }
public string DataUrl { get; set; }
public string BnndUrl { get; set; }
public string GroupsUrl { get; set; }
public bool CaptchaBypass { get; init; }
public bool SwitchCallback { get; init; }
public bool Sentry { get; init; }
Expand Down
19 changes: 15 additions & 4 deletions Configs/ConfigDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace nng_one.Configs;
public static class ConfigDialog
{
private const string TokenUrl =
"https://oauth.vk.com/authorize?client_id=7436182&scope=270404&redirect_uri=https://oauth.vk.com/blank.html&display=page&response_type=token&revoke=1";
"https://oauth.vk.com/authorize?client_id=7436182&scope=271428&redirect_uri=https://oauth.vk.com/blank.html&display=page&response_type=token&revoke=1";

private static readonly InputHandler InputHandler = InputHandler.GetInstance();

Expand All @@ -16,19 +16,29 @@ public static void SetUpToken()
var token = InputHandler.GetStringInput("Токен (введите «token», чтобы получить)", 4);
while (token.ToLower() == "token")
{
Process.Start(new ProcessStartInfo {FileName = TokenUrl, UseShellExecute = true});
Process.Start(new ProcessStartInfo { FileName = TokenUrl, UseShellExecute = true });
token = InputHandler.GetStringInput("Токен");
}

config.Token = token;
ConfigProcessor.SaveConfig(config);
}

private static void SetUpApiKey()
{
var config = ConfigProcessor.LoadConfig();
var apiKey = InputHandler.GetStringInput("Ключ RuCaptcha", 0);
config.RuCaptchaToken = apiKey;
ConfigProcessor.SaveConfig(config);
}

private static void SetUpList()
{
var config = ConfigProcessor.LoadConfig();
var data = InputHandler.GetStringInput("Общий список", 4);
config.DataUrl = data;
var bnndUrl = InputHandler.GetStringInput("Список забаненных", 4);
var groupsUrl = InputHandler.GetStringInput("Список групп", 4);
config.BnndUrl = bnndUrl;
config.GroupsUrl = groupsUrl;
ConfigProcessor.SaveConfig(config);
}

Expand All @@ -45,5 +55,6 @@ public static void SetUpConfig()
SetUpToken();
SetUpList();
SetUpBanReason();
SetUpApiKey();
}
}
4 changes: 4 additions & 0 deletions Controllers/FunctionController.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
using nng_one.Extensions;
using nng_one.FunctionParameters;
using nng_one.Functions;
using nng_one.Interfaces;
using nng_one.ServiceCollections;
using nng.Enums;
using nng.Logging;
using nng.VkFrameworks;

namespace nng_one.Controllers;

public static class FunctionController
{
private static readonly VkFramework VkFramework = ServiceCollectionContainer.GetInstance().VkFramework;
private static readonly Logger Logger = ServiceCollectionContainer.GetInstance().GlobalLogger;

public static void ProcessFunction(IFunctionParameter parameter)
{
VkFramework.SetCaptchaBasedOnConfig();
Logger.Clear();
switch (parameter)
{
Expand Down
10 changes: 10 additions & 0 deletions Enums/Priority.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace nng_one.Enums;

public enum Priority
{
White = 0,
Green = 1,
Teal = 2,
Orange = 3,
Red = 4
}
4 changes: 2 additions & 2 deletions Extensions/ServiceProviderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public static bool TryGetService<T>(this IServiceProvider provider, out T servic
service = default!;
try
{
service = (T) (provider.GetService(typeof(T)) ?? throw new InvalidOperationException());
service = (T)(provider.GetService(typeof(T)) ?? throw new InvalidOperationException());
return true;
}
catch (Exception)
Expand All @@ -18,6 +18,6 @@ public static bool TryGetService<T>(this IServiceProvider provider, out T servic

public static T ForceGetService<T>(this IServiceProvider provider)
{
return (T) (provider.GetService(typeof(T)) ?? throw new InvalidOperationException());
return (T)(provider.GetService(typeof(T)) ?? throw new InvalidOperationException());
}
}
26 changes: 26 additions & 0 deletions Extensions/VkFrameworkExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using nng_one.CaptchaSolver;
using nng_one.Configs;
using nng_one.Helpers;
using nng.VkFrameworks;

namespace nng_one.Extensions;

public static class VkFrameworkExtensions
{
private static readonly Config Config = ConfigProcessor.LoadConfig();

public static void SetCaptchaBasedOnConfig(this VkFramework vkFramework)
{
if (!Config.CaptchaBypass)
{
vkFramework.SetCaptchaSolver(new CaptchaHandler());
}
else
{
if (!string.IsNullOrEmpty(Config.RuCaptchaToken) && !string.IsNullOrWhiteSpace(Config.RuCaptchaToken))
vkFramework.SetCaptchaSolver(new RuCaptchaSolver(Config.RuCaptchaToken));
else
vkFramework.ResetCaptchaSolver();
}
}
}
10 changes: 8 additions & 2 deletions FunctionParameters/MiscParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,29 @@ public enum MiscFunctionType
{
Stats,
RepostStories,
RemoveBanned
RemoveBanned,
CreateCommunity,
Revoke
}

public class MiscParameters : IFunctionParameter
{
public MiscParameters(Config config, MiscFunctionType type, IEnumerable<Group>? groups, string? storyUrl)
public MiscParameters(Config config, MiscFunctionType type, IEnumerable<Group>? groups, string? storyUrl,
string? shortName)
{
Config = config;
Type = type;
Groups = groups;
StoryUrl = storyUrl;
ShortName = shortName;
}

public MiscFunctionType Type { get; }
public IEnumerable<Group>? Groups { get; }

public string? StoryUrl { get; }

public string? ShortName { get; }

public Config Config { get; }
}
8 changes: 4 additions & 4 deletions Functions/Block.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,13 @@ private static Dictionary<long, bool> GetUsersForBan(IEnumerable<long> users, lo
var workUsers = users.ToList();
try
{
var bannedUsers = VkFramework.GetBanned(group);
var bannedUsers = VkFramework.GetBanned(group).ToList();
var data = VkFramework.GetGroupData(group);
var dict = workUsers.Where(bannedUser => bannedUsers.All(x => x.Id != bannedUser))
var dict = workUsers
.Where(bannedUser => bannedUsers.All(x => x.Id != bannedUser))
.ToDictionary(bannedUser => bannedUser, _ => false);
foreach (var manager in data.Managers.Where(manager => workUsers.Contains(manager.Id)))
if (dict.ContainsKey(manager.Id)) dict[manager.Id] = true;
else dict.Add(manager.Id, true);
dict[manager.Id] = true;
return dict;
}
catch (VkApiException e)
Expand Down
Loading

0 comments on commit d006cb8

Please sign in to comment.