mirror of
https://gitlab.com/Kwoth/nadekobot.git
synced 2025-09-10 17:28:27 -04:00
Nhentai removed as it's currently unfixable, closes #396
This commit is contained in:
@@ -22,6 +22,6 @@ public interface ISearchImagesService
|
|||||||
ValueTask<bool> ToggleBlacklistTag(ulong guildId, string tag);
|
ValueTask<bool> ToggleBlacklistTag(ulong guildId, string tag);
|
||||||
ValueTask<string[]> GetBlacklistedTags(ulong guildId);
|
ValueTask<string[]> GetBlacklistedTags(ulong guildId);
|
||||||
Task<UrlReply> Butts();
|
Task<UrlReply> Butts();
|
||||||
Task<Gallery> GetNhentaiByIdAsync(uint id);
|
// Task<Gallery> GetNhentaiByIdAsync(uint id);
|
||||||
Task<Gallery> GetNhentaiBySearchAsync(string search);
|
// Task<Gallery> GetNhentaiBySearchAsync(string search);
|
||||||
}
|
}
|
@@ -1,9 +1,9 @@
|
|||||||
using NadekoBot.Modules.Searches.Common;
|
// using NadekoBot.Modules.Searches.Common;
|
||||||
|
//
|
||||||
namespace NadekoBot.Modules.Nsfw;
|
// namespace NadekoBot.Modules.Nsfw;
|
||||||
|
//
|
||||||
public interface INhentaiService
|
// public interface INhentaiService
|
||||||
{
|
// {
|
||||||
Task<Gallery?> GetAsync(uint id);
|
// Task<Gallery?> GetAsync(uint id);
|
||||||
Task<IReadOnlyList<uint>> GetIdsBySearchAsync(string search);
|
// Task<IReadOnlyList<uint>> GetIdsBySearchAsync(string search);
|
||||||
}
|
// }
|
@@ -1,115 +1,115 @@
|
|||||||
using AngleSharp.Html.Dom;
|
// using AngleSharp.Html.Dom;
|
||||||
using AngleSharp.Html.Parser;
|
// using AngleSharp.Html.Parser;
|
||||||
using NadekoBot.Modules.Searches.Common;
|
// using NadekoBot.Modules.Searches.Common;
|
||||||
|
//
|
||||||
namespace NadekoBot.Modules.Nsfw;
|
// namespace NadekoBot.Modules.Nsfw;
|
||||||
|
//
|
||||||
public sealed class NhentaiScraperService : INhentaiService, INService
|
// public sealed class NhentaiScraperService : INhentaiService, INService
|
||||||
{
|
// {
|
||||||
private readonly IHttpClientFactory _httpFactory;
|
// private readonly IHttpClientFactory _httpFactory;
|
||||||
|
//
|
||||||
private static readonly HtmlParser _htmlParser = new(new()
|
// private static readonly HtmlParser _htmlParser = new(new()
|
||||||
{
|
// {
|
||||||
IsScripting = false,
|
// IsScripting = false,
|
||||||
IsEmbedded = false,
|
// IsEmbedded = false,
|
||||||
IsSupportingProcessingInstructions = false,
|
// IsSupportingProcessingInstructions = false,
|
||||||
IsKeepingSourceReferences = false,
|
// IsKeepingSourceReferences = false,
|
||||||
IsNotSupportingFrames = true
|
// IsNotSupportingFrames = true
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
public NhentaiScraperService(IHttpClientFactory httpFactory)
|
// public NhentaiScraperService(IHttpClientFactory httpFactory)
|
||||||
{
|
// {
|
||||||
_httpFactory = httpFactory;
|
// _httpFactory = httpFactory;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private HttpClient GetHttpClient()
|
// private HttpClient GetHttpClient()
|
||||||
{
|
// {
|
||||||
var http = _httpFactory.CreateClient();
|
// var http = _httpFactory.CreateClient();
|
||||||
http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36");
|
// http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36");
|
||||||
http.DefaultRequestHeaders.Add("Cookie", "cf_clearance=I5pR71P4wJkRBFTLFjBndI.GwfKwT.Gx06uS8XNmRJo-1657214595-0-150; csrftoken=WMWRLtsQtBVQYvYkbqXKJHI9T1JwWCdd3tNhoxHn7aHLUYHAqe60XFUKAoWsJtda");
|
// http.DefaultRequestHeaders.Add("Cookie", "cf_clearance=I5pR71P4wJkRBFTLFjBndI.GwfKwT.Gx06uS8XNmRJo-1657214595-0-150; csrftoken=WMWRLtsQtBVQYvYkbqXKJHI9T1JwWCdd3tNhoxHn7aHLUYHAqe60XFUKAoWsJtda");
|
||||||
return http;
|
// return http;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
public async Task<Gallery?> GetAsync(uint id)
|
// public async Task<Gallery?> GetAsync(uint id)
|
||||||
{
|
// {
|
||||||
using var http = GetHttpClient();
|
// using var http = GetHttpClient();
|
||||||
try
|
// try
|
||||||
{
|
// {
|
||||||
var url = $"https://nhentai.net/g/{id}/";
|
// var url = $"https://nhentai.net/g/{id}/";
|
||||||
var strRes = await http.GetStringAsync(url);
|
// var strRes = await http.GetStringAsync(url);
|
||||||
var doc = await _htmlParser.ParseDocumentAsync(strRes);
|
// var doc = await _htmlParser.ParseDocumentAsync(strRes);
|
||||||
|
//
|
||||||
var title = doc.QuerySelector("#info .title")?.TextContent;
|
// var title = doc.QuerySelector("#info .title")?.TextContent;
|
||||||
var fullTitle = doc.QuerySelector("meta[itemprop=\"name\"]")?.Attributes["content"]?.Value
|
// var fullTitle = doc.QuerySelector("meta[itemprop=\"name\"]")?.Attributes["content"]?.Value
|
||||||
?? title;
|
// ?? title;
|
||||||
var thumb = (doc.QuerySelector("#cover a img") as IHtmlImageElement)?.Dataset["src"];
|
// var thumb = (doc.QuerySelector("#cover a img") as IHtmlImageElement)?.Dataset["src"];
|
||||||
|
//
|
||||||
var tagsElem = doc.QuerySelector("#tags");
|
// var tagsElem = doc.QuerySelector("#tags");
|
||||||
|
//
|
||||||
var pageCount = tagsElem?.QuerySelector("a.tag[href^=\"/search/?q=pages\"] span")?.TextContent;
|
// var pageCount = tagsElem?.QuerySelector("a.tag[href^=\"/search/?q=pages\"] span")?.TextContent;
|
||||||
var likes = doc.QuerySelector(".buttons .btn-disabled.btn.tooltip span span")?.TextContent?.Trim('(', ')');
|
// var likes = doc.QuerySelector(".buttons .btn-disabled.btn.tooltip span span")?.TextContent?.Trim('(', ')');
|
||||||
var uploadedAt = (tagsElem?.QuerySelector(".tag-container .tags time.nobold") as IHtmlTimeElement)?.DateTime;
|
// var uploadedAt = (tagsElem?.QuerySelector(".tag-container .tags time.nobold") as IHtmlTimeElement)?.DateTime;
|
||||||
|
//
|
||||||
var tags = tagsElem?.QuerySelectorAll(".tag-container .tags > a.tag[href^=\"/tag\"]")
|
// var tags = tagsElem?.QuerySelectorAll(".tag-container .tags > a.tag[href^=\"/tag\"]")
|
||||||
.Cast<IHtmlAnchorElement>()
|
// .Cast<IHtmlAnchorElement>()
|
||||||
.Select(x => new Tag()
|
// .Select(x => new Tag()
|
||||||
{
|
// {
|
||||||
Name = x.QuerySelector("span:first-child")?.TextContent,
|
// Name = x.QuerySelector("span:first-child")?.TextContent,
|
||||||
Url = $"https://nhentai.net{x.PathName}"
|
// Url = $"https://nhentai.net{x.PathName}"
|
||||||
})
|
// })
|
||||||
.ToArray();
|
// .ToArray();
|
||||||
|
//
|
||||||
if (string.IsNullOrWhiteSpace(fullTitle))
|
// if (string.IsNullOrWhiteSpace(fullTitle))
|
||||||
return null;
|
// return null;
|
||||||
|
//
|
||||||
if (!int.TryParse(pageCount, out var pc))
|
// if (!int.TryParse(pageCount, out var pc))
|
||||||
return null;
|
// return null;
|
||||||
|
//
|
||||||
if (!int.TryParse(likes, out var lc))
|
// if (!int.TryParse(likes, out var lc))
|
||||||
return null;
|
// return null;
|
||||||
|
//
|
||||||
if (!DateTime.TryParse(uploadedAt, out var ua))
|
// if (!DateTime.TryParse(uploadedAt, out var ua))
|
||||||
return null;
|
// return null;
|
||||||
|
//
|
||||||
return new Gallery(id,
|
// return new Gallery(id,
|
||||||
url,
|
// url,
|
||||||
fullTitle,
|
// fullTitle,
|
||||||
title,
|
// title,
|
||||||
thumb,
|
// thumb,
|
||||||
pc,
|
// pc,
|
||||||
lc,
|
// lc,
|
||||||
ua,
|
// ua,
|
||||||
tags);
|
// tags);
|
||||||
}
|
// }
|
||||||
catch (HttpRequestException)
|
// catch (HttpRequestException)
|
||||||
{
|
// {
|
||||||
Log.Warning("Nhentai with id {NhentaiId} not found", id);
|
// Log.Warning("Nhentai with id {NhentaiId} not found", id);
|
||||||
return null;
|
// return null;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
public async Task<IReadOnlyList<uint>> GetIdsBySearchAsync(string search)
|
// public async Task<IReadOnlyList<uint>> GetIdsBySearchAsync(string search)
|
||||||
{
|
// {
|
||||||
using var http = GetHttpClient();
|
// using var http = GetHttpClient();
|
||||||
try
|
// try
|
||||||
{
|
// {
|
||||||
var url = $"https://nhentai.net/search/?q={Uri.EscapeDataString(search)}&sort=popular-today";
|
// var url = $"https://nhentai.net/search/?q={Uri.EscapeDataString(search)}&sort=popular-today";
|
||||||
var strRes = await http.GetStringAsync(url);
|
// var strRes = await http.GetStringAsync(url);
|
||||||
var doc = await _htmlParser.ParseDocumentAsync(strRes);
|
// var doc = await _htmlParser.ParseDocumentAsync(strRes);
|
||||||
|
//
|
||||||
var elems = doc.QuerySelectorAll(".container .gallery a")
|
// var elems = doc.QuerySelectorAll(".container .gallery a")
|
||||||
.Cast<IHtmlAnchorElement>()
|
// .Cast<IHtmlAnchorElement>()
|
||||||
.Where(x => x.PathName.StartsWith("/g/"))
|
// .Where(x => x.PathName.StartsWith("/g/"))
|
||||||
.Select(x => x.PathName[3..^1])
|
// .Select(x => x.PathName[3..^1])
|
||||||
.Select(uint.Parse)
|
// .Select(uint.Parse)
|
||||||
.ToArray();
|
// .ToArray();
|
||||||
|
//
|
||||||
return elems;
|
// return elems;
|
||||||
}
|
// }
|
||||||
catch (HttpRequestException)
|
// catch (HttpRequestException)
|
||||||
{
|
// {
|
||||||
Log.Warning("Nhentai search for {NhentaiSearch} failed", search);
|
// Log.Warning("Nhentai search for {NhentaiSearch} failed", search);
|
||||||
return Array.Empty<uint>();
|
// return Array.Empty<uint>();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
@@ -360,67 +360,65 @@ public partial class NSFW : NadekoModule<ISearchImagesService>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Cmd]
|
// [RequireNsfw(Group = "nsfw_or_dm")]
|
||||||
[RequireContext(ContextType.Guild)]
|
// [RequireContext(ContextType.DM, Group = "nsfw_or_dm")]
|
||||||
[RequireNsfw(Group = "nsfw_or_dm")]
|
// [Priority(1)]
|
||||||
[RequireContext(ContextType.DM, Group = "nsfw_or_dm")]
|
// public async Task Nhentai(uint id)
|
||||||
[Priority(1)]
|
// {
|
||||||
public async Task Nhentai(uint id)
|
// var g = await _service.GetNhentaiByIdAsync(id);
|
||||||
{
|
//
|
||||||
var g = await _service.GetNhentaiByIdAsync(id);
|
// if (g is null)
|
||||||
|
// {
|
||||||
if (g is null)
|
// await ReplyErrorLocalizedAsync(strs.not_found);
|
||||||
{
|
// return;
|
||||||
await ReplyErrorLocalizedAsync(strs.not_found);
|
// }
|
||||||
return;
|
//
|
||||||
}
|
// await SendNhentaiGalleryInternalAsync(g);
|
||||||
|
// }
|
||||||
await SendNhentaiGalleryInternalAsync(g);
|
//
|
||||||
}
|
// [Cmd]
|
||||||
|
// [RequireContext(ContextType.Guild)]
|
||||||
[Cmd]
|
// [RequireNsfw(Group = "nsfw_or_dm")]
|
||||||
[RequireContext(ContextType.Guild)]
|
// [RequireContext(ContextType.DM, Group = "nsfw_or_dm")]
|
||||||
[RequireNsfw(Group = "nsfw_or_dm")]
|
// [Priority(0)]
|
||||||
[RequireContext(ContextType.DM, Group = "nsfw_or_dm")]
|
// public async Task Nhentai([Leftover] string query)
|
||||||
[Priority(0)]
|
// {
|
||||||
public async Task Nhentai([Leftover] string query)
|
// var g = await _service.GetNhentaiBySearchAsync(query);
|
||||||
{
|
//
|
||||||
var g = await _service.GetNhentaiBySearchAsync(query);
|
// if (g is null)
|
||||||
|
// {
|
||||||
if (g is null)
|
// await ReplyErrorLocalizedAsync(strs.not_found);
|
||||||
{
|
// return;
|
||||||
await ReplyErrorLocalizedAsync(strs.not_found);
|
// }
|
||||||
return;
|
//
|
||||||
}
|
// await SendNhentaiGalleryInternalAsync(g);
|
||||||
|
// }
|
||||||
await SendNhentaiGalleryInternalAsync(g);
|
//
|
||||||
}
|
// private async Task SendNhentaiGalleryInternalAsync(Gallery g)
|
||||||
|
// {
|
||||||
private async Task SendNhentaiGalleryInternalAsync(Gallery g)
|
// var count = 0;
|
||||||
{
|
// var tagString = g.Tags.Shuffle()
|
||||||
var count = 0;
|
// .Select(tag => $"[{tag.Name}]({tag.Url})")
|
||||||
var tagString = g.Tags.Shuffle()
|
// .TakeWhile(tag => (count += tag.Length) < 1000)
|
||||||
.Select(tag => $"[{tag.Name}]({tag.Url})")
|
// .Join(" ");
|
||||||
.TakeWhile(tag => (count += tag.Length) < 1000)
|
//
|
||||||
.Join(" ");
|
// var embed = _eb.Create()
|
||||||
|
// .WithTitle(g.Title)
|
||||||
var embed = _eb.Create()
|
// .WithDescription(g.FullTitle)
|
||||||
.WithTitle(g.Title)
|
// .WithImageUrl(g.Thumbnail)
|
||||||
.WithDescription(g.FullTitle)
|
// .WithUrl(g.Url)
|
||||||
.WithImageUrl(g.Thumbnail)
|
// .AddField(GetText(strs.favorites), g.Likes, true)
|
||||||
.WithUrl(g.Url)
|
// .AddField(GetText(strs.pages), g.PageCount, true)
|
||||||
.AddField(GetText(strs.favorites), g.Likes, true)
|
// .AddField(GetText(strs.tags),
|
||||||
.AddField(GetText(strs.pages), g.PageCount, true)
|
// string.IsNullOrWhiteSpace(tagString)
|
||||||
.AddField(GetText(strs.tags),
|
// ? "?"
|
||||||
string.IsNullOrWhiteSpace(tagString)
|
// : tagString,
|
||||||
? "?"
|
// true)
|
||||||
: tagString,
|
// .WithFooter(g.UploadedAt.ToString("f"))
|
||||||
true)
|
// .WithOkColor();
|
||||||
.WithFooter(g.UploadedAt.ToString("f"))
|
//
|
||||||
.WithOkColor();
|
// await ctx.Channel.EmbedAsync(embed);
|
||||||
|
// }
|
||||||
await ctx.Channel.EmbedAsync(embed);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task InternalDapiCommand(
|
private async Task InternalDapiCommand(
|
||||||
string[] tags,
|
string[] tags,
|
||||||
|
@@ -19,17 +19,15 @@ public class SearchImagesService : ISearchImagesService, INService
|
|||||||
private readonly SearchImageCacher _cache;
|
private readonly SearchImageCacher _cache;
|
||||||
private readonly IHttpClientFactory _httpFactory;
|
private readonly IHttpClientFactory _httpFactory;
|
||||||
private readonly DbService _db;
|
private readonly DbService _db;
|
||||||
private readonly INhentaiService _nh;
|
|
||||||
|
|
||||||
private readonly object _taglock = new();
|
private readonly object _taglock = new();
|
||||||
|
|
||||||
public SearchImagesService(
|
public SearchImagesService(
|
||||||
DbService db,
|
DbService db,
|
||||||
SearchImageCacher cacher,
|
SearchImageCacher cacher,
|
||||||
IHttpClientFactory httpFactory,
|
IHttpClientFactory httpFactory
|
||||||
INhentaiService nh)
|
)
|
||||||
{
|
{
|
||||||
_nh = nh;
|
|
||||||
_db = db;
|
_db = db;
|
||||||
_rng = new NadekoRandom();
|
_rng = new NadekoRandom();
|
||||||
_cache = cacher;
|
_cache = cacher;
|
||||||
@@ -277,6 +275,7 @@ public class SearchImagesService : ISearchImagesService, INService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
#region Nhentai
|
#region Nhentai
|
||||||
|
|
||||||
public Task<Gallery?> GetNhentaiByIdAsync(uint id)
|
public Task<Gallery?> GetNhentaiByIdAsync(uint id)
|
||||||
@@ -294,4 +293,5 @@ public class SearchImagesService : ISearchImagesService, INService
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
*/
|
||||||
}
|
}
|
@@ -664,8 +664,6 @@ avatar:
|
|||||||
- av
|
- av
|
||||||
hentai:
|
hentai:
|
||||||
- hentai
|
- hentai
|
||||||
nhentai:
|
|
||||||
- nhentai
|
|
||||||
danbooru:
|
danbooru:
|
||||||
- danbooru
|
- danbooru
|
||||||
derpibooru:
|
derpibooru:
|
||||||
|
@@ -1117,11 +1117,6 @@ hentai:
|
|||||||
desc: "Shows a hentai image from a random website (gelbooru, danbooru, konachan or yandere) with a given tag. Tag(s) are optional but preferred. Maximum is usually 2 tags. Only 1 tag allowed."
|
desc: "Shows a hentai image from a random website (gelbooru, danbooru, konachan or yandere) with a given tag. Tag(s) are optional but preferred. Maximum is usually 2 tags. Only 1 tag allowed."
|
||||||
args:
|
args:
|
||||||
- "yuri"
|
- "yuri"
|
||||||
nhentai:
|
|
||||||
desc: "Shows basic information about a hentai with the specified id, or a valid nhentai search query."
|
|
||||||
args:
|
|
||||||
- "273426"
|
|
||||||
- "cute girl"
|
|
||||||
autohentai:
|
autohentai:
|
||||||
desc: "Posts a hentai every X seconds with a random tag from the provided tags. Use `|` to separate tag groups. Random group will be chosen every time the image is sent. Max 2 tags per group. 20 seconds minimum. Provide no parameters to disable."
|
desc: "Posts a hentai every X seconds with a random tag from the provided tags. Use `|` to separate tag groups. Random group will be chosen every time the image is sent. Max 2 tags per group. 20 seconds minimum. Provide no parameters to disable."
|
||||||
args:
|
args:
|
||||||
|
Reference in New Issue
Block a user