Блог про ZennoPoster от volody00

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93
Раз в неделю буду выкладывать небольшие видео про ZennoPoster.

Подписывайтесь также в телеграмм канал - https://t.me/zennovolody00
 
  • Спасибо
Реакции: ZennoCat и Dmitriy Ka

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93
Решил я тут поизучать конкретные классы из .Net Framework, но не знаю, надолго ли меня хватит. Довольно скучно, долго и непонятно, где применять большую часть методов / свойств.

Начал я с класса String - https://learn.microsoft.com/en-us/dotnet/api/system.string?view=net-8.0 . Да, по сути пересказ справки (возможны неточности), но сильно урезанный, на русском и примеры адаптированы под зеннопостер.

Все эти методы вы можете использовать для своих "зенковских переменных" используя project.Variables["имя_переменной"].Value


Методы (часть 1)

public object Clone() – метод Clone() для строк возвращает ссылку на тот же объект, а не создаёт независимую копию. По сути вот эти два подхода будут одинаковы:

C#:
//1 подход
string str1 = "строка 1";
string str2 = str1.Clone().ToString();
str2 = "12345";
project.SendInfoToLog(str1); //строка 1 (не изменилась, хоть и ссылается на тот же объект)

//2 подход
string ostr1 = "строка 2";
string ostr2 = ostr1;
public static int Compare (…)– метод позволяет сравнивать две строки. Много нюансов, много перегрузок. Сравнение идёт по символам. Там учитывается их расположение в Unicode (https://en.wikipedia.org/wiki/List_of_Unicode_characters), регистр и др. https://learn.microsoft.com/en-us/dotnet/api/system.string.compare?view=net-8.0
C#:
string str1 = "hello";
string str2 = "Hello";
int result = string.Compare(str1, str2, true);
project.SendInfoToLog(result.ToString()); //0 , т.к. игнорируем регистр

result = string.Compare(str1, str2, false);
project.SendInfoToLog(result.ToString()); //-1, несмотря на то, что h имеет большее число чем H. Если не ошибаюсь, то заглавные буквы считаются большими чем строчные
public int CompareTo (string str) – сравнение двух строк исключительно по "весу" в таблице Unicode. Берется по одному символу. Если они одинаковы (вес равен) берется следующий и сравнивается.
C#:
string str1 = "hello";
string str2 = "Hdfhdfhdfhfdh";

int result = str1.CompareTo(str2);
project.SendInfoToLog(result.ToString()); //1, т.к. h имеет большее число по unicode чем H
public static int CompareOrdinal (string str1, string str2) – разница в весах по таблице Unicode

C#:
string str1 = "hello";
string str2 = "Hdfhdfhdfhfdh";

int result = string.CompareOrdinal(str1, str2);
project.SendInfoToLog(result.ToString()); //32, т.к. разница между h и H по unicode будет 32. остальные символы игнорируются
public static string Concat (…) – объединяет строки. Можно передать строки (до 4 шт), object (до 4 шт), массив, список (любого типа).
C#:
string result1 = string.Concat(new string[] {"1", "2", "3"});
string result2 = string.Concat(new object[] {"123", 123, true});

object o1 = 123;
object o2 = "123";
string result3 = string.Concat(o1, o2);

List<int> list = new List<int>() {
            123,
            456,
            789
};
string result4 = string.Concat(list); //123456789
public bool Contains (…) – содержится ли указанное значение в строке. можно проверять строку или символ
C#:
string s1 = "The quick brown fox jumps over the lazy dog";
string s2 = "fox";
StringComparison comp = StringComparison.Ordinal;
bool b = s1.Contains(s2);
char symb = '&';
bool bb = s1.Contains(symb);
public static string Copy (string str) – создает независимую копию строки. Не рекомендуется к использованию
C#:
string sourceString = "Hello, World!";
string copy = string.Copy(sourceString);
return copy;
public void CopyTo (int sourceIndex, char[] destination, int destinationIndex, int count) - метод позволяет вытащить какой-то кусок из строки и поместить в массив символов
C#:
string sourceString = "Hello, World!";
char[] destinationArray = new char[20];

sourceString.CopyTo(7, destinationArray, 2, 5); //с какого символа копируем в исходной строке, куда помещаем результат, куда вставляем результат (с какого индекса), сколько копируем из исходной строки
foreach(var s in destinationArray)
{
            project.SendInfoToLog(s.ToString());
}
[1 перегрузка] public bool EndsWith (string value, bool ignoreCase, System.Globalization.CultureInfo? culture) – заканчивается ли строка указанным значением. Параметры: искомое значение, игнорировать ли регистр, Culture Info

[2 перегрузка] public bool EndsWith (string value, StringComparison comparisonType)

[3 перегрузка] public bool EndsWith (string value)
C#:
string msg1 = "Search for the target string";
bool result1 = msg1.EndsWith("string");
bool result2 = msg1.EndsWith("STRING", true, CultureInfo.CurrentCulture);
bool result3 = msg1.EndsWith("asdf", StringComparison.CurrentCulture);

project.SendInfoToLog($"{result1.ToString()}\n{result2.ToString()}\n{result3.ToString()}");
Класс CultureInfo учитывает специфику конкретной страны / языка. Про CultureInfo- https://learn.microsoft.com/en-us/dotnet/fundamentals/runtime-libraries/system-globalization-cultureinfo

public bool StartsWith (…) – аналогично методу EndsWith(…), только поиск идет в начале строки.

Equals(…) - сравнивает строки. Можно передать string, object, указать StringComparison
C#:
StringBuilder sb = new StringBuilder("abcd");
string str1 = "abcd";
string str2 = "abcd";
object o2 = "abcd";

bool result1 = str1.Equals(sb); //False
bool result2 = str2.Equals(o2); //True
public static string Format (…) – позволяет преобразовать строку в указанном формате. Им активно пользовались раньше. Сейчас же обычно используют интерполяцию строк. Но здесь больше настроек. Пример использования

C#:
string result = string.Format("Имя нашего персонажа {0}, а фамилия {1}", str1, str2);
return result;
Мы можем вставлять не только строки, но и другие базовые типы

double d = 2.05;
bool b = true;
string str = string.Format("это double {0}, а это bool {1}", d, b);
return str;
Можно добавить пробелов к началу строки. Для этого надо посчитать длину строки и к этому числу прибавить столько пробелов, сколько нам нужно
C#:
string str = "Вася Пупкин пошёл гулять"; //длина строки 24 символа
string result = string.Format("результат: {0, 30}", str); //добавим 6 пробелов в начало строки
return result;
Можно преобразовывать числовые типы и DateTime с помощью форматных спецификаторов. Почитать какие они бывают можно тут
C#:
double d = 1.05;
string result = string.Format("результат: {0:p}", d);
return result; //105, 00%
Можно использовать CultureInfo для задания нужного формата конкретного языка
C#:
DateTime now = DateTime.Now;
CultureInfo cultureUs = new CultureInfo("en-US");
CultureInfo cultureRu = new CultureInfo("ru-Ru");

string resultUs = string.Format(cultureUs, "время для en-us: {0}", now);
project.SendInfoToLog(resultUs); // время для en-us: 7/12/2024 8:20:40 AM

string resultRu = string.Format(cultureRu, "время для ru: {0}", now);
project.SendInfoToLog(resultRu);  // время для ru: 12.07.2024 8:20:40
public CharEnumerator GetEnumerator () – возвращает объект CharEnumerator. Это своего рода коллекция, где для перехода к следующему элементу надо использовать метод MoveNext()
C#:
string str = "вася";
CharEnumerator ch = str.GetEnumerator();

//принцип работы
ch.MoveNext(); //переходим к первому элементу в коллекции
project.SendInfoToLog(ch.Current.ToString()); //в
project.SendInfoToLog(ch.Current.ToString()); //в

ch.MoveNext(); //теперь к следующему
project.SendInfoToLog(ch.Current.ToString()); //а

//метод reset() сбрасывает действие метода MoveNext() и возвращает нас к началу
ch.Reset();

//пример перебора в цикле
while (ch.MoveNext())
{
            project.SendInfoToLog(ch.Current.ToString()); //будет выводить по одному символу за круг, пока не пройдется по всем
}

//высвобождаем память (может и необязательно хз)
ch.Dispose();

//теперь наш ch уже не существует
try {
            ch.MoveNext();
}
catch{
            project.SendInfoToLog("ошибка, т.к. мы его уничтожили");
}
public static int GetHashCode() - получает hash code элемента. hash code представляет собой числовое значение, которое вычисляется на основе содержимого объекта и служит для быстрого сравнения объектов или для использования в коллекциях

C#:
string str = "вася";
int result = str.GetHashCode();
return result;
public TypeCode GetTypeCode () – возвращает перечисление TypeCode, позволяющее понять нам, с каким типом данных мы работаем.Может быть полезно, если метод в качестве параметра принимает object, и мы точно не знаем, какой тип будет в него передан.
C#:
string str = "вася";
TypeCode tc = str.GetTypeCode();
project.SendInfoToLog(tc.ToString()); //String

dynamic eks1 = "петя";
TypeCode eks1Tc = eks1.GetTypeCode();
project.SendInfoToLog(eks1Tc.ToString()); //String

var eks2 = "петя";
TypeCode eks2Tc = eks2.GetTypeCode();
project.SendInfoToLog(eks2Tc.ToString()); //String
 
  • Спасибо
Реакции: Денчик и Dmitriy Ka

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
782
Благодарностей
529
Баллы
93
Удачи в начинаниях, буду следить!
Лайк, подписка :-)
 

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93
Последние пару недель изучал я LINQ. До этого избегал этой темы, да и зря наверное. На самом деле всё оказалось довольно просто. @KolkaPetkinSyn в своём блоге опубликовал пост, как он на python с помощью нейросети реализовал следующий код. У нас есть два списка:
"вася", "петя", "коля"
"иван", "лена", "петя", "вася"

наша задача сформировать 3-й список, в котором будут только уникальные значения из второго списка (т.е. "иван", "лена"). Так вот, в LINQ есть специальный метод для этого - Except().

Считать из файла на пк в список можно следующим образом:
C#:
var list = File.ReadAllLines(project.Path + "test.txt"); //в скобках путь к файлу
А записать с помощью File.WriteAllLines(); где мы в скобках передаем путь к файлу

Я этого делать не буду, дабы вы могли запустить код без "танцев с бубном". Я просто создам два списка, заполню их значениями и продемонстрирую работу метода Except.

C#:
List<string> listStart = new List<string>() {
    "строка 1",
    "строка 2",
    "строка 3",
    "строка 4",
    "строка 5",
    "строка 6",
    "строка 7"
};
List<string> listTwo = new List<string>() {
    "строка 2",
    "строка 321",
    "строка 5",
    "строка 5433",
    "строка 4335345",
    "строка 7"
};

//получаем только уникальные значения списка №2
var result = listTwo.Except(listStart).ToList();

//выводим в лог
result.ForEach(x=>project.SendInfoToLog(x)); //"строка 321", "строка 5433", "строка 4335345"
P.S. Ну а если вам тяжело даётся изучение c#, то приглашаю на свой курс. Старт в сентябре. Ссылка в подписи
 

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93
Ну не чудо ли этот ChatGpt?

Вот такой вопрос на форуме нашёл:

124797


Вспомнил, что Radzhab писал о word документах. Открыл статью (https://zenno.club/discussion/threads/sozdanie-word-dokumentov.15666/), посмотрел, что за библиотека используется. Это docx.

Пошёл к chatGpt и спрашиваю: "Как скопировать word с помощью docx c#"? Получаю ответ:

C#:
using System;

using Xceed.Words.NET;



class Program

{

    static void Main()

    {

        string filePath = @"path\to\your\document.docx"; // Укажите путь к вашему документу



        using (var document = DocX.Load(filePath))

        {

            // Чтение всего текста из документа

            string allText = document.Text;



            // Вывод текста на консоль или использование в других целях

            Console.WriteLine(allText);

        }

    }

}
Скачал библиотеку из Nuget, закинул в externalAssemblies и в ссылки из GAC. Вставил код, подправив путь к документу и куда сохранять. И готово!

А если бы не chatGpt, пришлось бы хрен знает сколько документацию к библиотеке читать. И неизвестно ещё, разобрался бы или нет. А может там вообще не было бы этого метода и пришлось бы гуглить другие библиотеки. А так красота! На всё про всё ушло минут 10-20 вместо нескольких часов, если бы сам пытался разобраться.

Конечно, не всегда всё так легко и просто, да и результат наверное не совсем тот, который человек ожидал. Но тем не менее...

Пару недель назад общался с человеком, который без знаний c# смог целую программу для себя написать с помощью chatGpt, которая pdf создает в нужном ему формате. Так что учите основы c# и используйте chatGpt, пока возможность есть.

Шаблон и библиотеку прикрепил. библиотеку кидаем по пути ZennoPoster Pro V7\7.7.16.0\Progs\ExternalAssemblies

P.S. А библиотеку то нельзя прикрепить. Ограничение на форуме сделали для dll файлов. Печально, ибо зенка у нас немного древняя, не все библиотеки из Nuget заводится будут. А теперь их и на форуме не скачаешь. Эх... Закинул пока на диск, но долго ли она там пролежит не знаю - https://cloud.mail.ru/public/M5f4/A3aEZ7Ci7
 

Вложения

  • Спасибо
Реакции: VladV777 и санчил

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
782
Благодарностей
529
Баллы
93
  • Спасибо
Реакции: volody00

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93
Дайджест недели:
  • Залит ролик на ютуб -
  • Залит 2-й выпуск по моим попыткам освоить телеграмм ботов - https://t.me/zennovolody00
Постараюсь больше не пропадать и раз в неделю что-нибудь да выпускать. Хотя бы для себя, ну а если кому-то будет полезно, то тоже хорошо
 

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93
Дайджест недели (все файлы в https://t.me/zennovolody00):
  • Вышел 3-й выпуск по моим попыткам освоить телеграмм ботов
  • По зеннопостер вместо видео у нас обзор сниппета по ожиданию смены айпи адреса (для мобильных прокси)
 

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93
Дайджест недели (все файлы в https://t.me/zennovolody00):
  • Вышел 4-й выпуск по моим попыткам освоить телеграмм ботов
  • По зеннопостер вышел 1-й выпуск по Telegram BOT API
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 587
Благодарностей
1 385
Баллы
113
Дайджест недели (все файлы в https://t.me/zennovolody00):
  • Вышел 4-й выпуск по моим попыткам освоить телеграмм ботов
  • По зеннопостер вышел 1-й выпуск по Telegram BOT API
Верно ли я понял, блог на форуме закончился, пора бы и телеграм группу раскручивать, а здесь уже ничего не будет кроме ссылки на группу?
 

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93
Верно ли я понял, блог на форуме закончился, пора бы и телеграм группу раскручивать, а здесь уже ничего не будет кроме ссылки на группу?
Вы очень проницательны и всё верно поняли
 

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93
Дайджест недели (все файлы в https://t.me/zennovolody00):
  • Вышел 5-й выпуск по моим попыткам освоить телеграмм ботов. Начинаем разбираться с Aiogram
  • По зеннопостер вышел 2-й выпуск по Telegram BOT API. Пробуем разбираться с документацией
Ах да, мне же тут сделал замечание многоуважаемый любитель ганжубаса. В чём-то он прав, конечно. Ай-яй-яй, нехорошо использовать форум для рекламы своих ресурсов. Правда, другие блогеры почему-то тоже так делают (только рекламят ютуб, а не телегу). Надо наверное нам всем переезжать в рекламный раздел и вести блог там, тогда всё будет по правилам.

Что ж, держите уникальный контент для блога. Ремонтировал я тут один шаблончик из бесплатного раздела. Там нужно прокрутить ютуб комментарии вниз, дабы они прогружались (на мобильной версии ютуба). Да только почти ничего не работает (нажатие стрелки вниз, прокрутка колесиком, ScrollIntoview), сработала только прокрутка свайпом. Реализовал я её таким образом:


C#:
//параметры свапа (откуда будет двигаться палец)
var panelComment = instance.ActiveTab.FindElementByXPath("//ytm-engagement-panel", 0);
int x = panelComment.DisplacementInBrowser.X;
int y = panelComment.DisplacementInBrowser.Y;

int xCoordinat = (panelComment.Width / 2) + x;
int yCoordinat = (panelComment.Height / 2) + y;
project.SendInfoToLog($"подобрали параметры свапа: x - {xCoordinat}, y - {yCoordinat}");

//свапаем
instance.ActiveTab.Touch.SwipeBetween(xCoordinat, yCoordinat, xCoordinat, 0);
 
  • Спасибо
Реакции: MisterDi, Live9up и sw_sw

volody00

Client
Регистрация
06.09.2016
Сообщения
938
Благодарностей
1 033
Баллы
93
Дайджест недели (все файлы в https://t.me/zennovolody00):
  • Вышел 6-й выпуск по моим попыткам освоить телеграмм ботов. Изучаем фильтры
  • По зеннопостер вышел 3-й выпуск по Telegram BOT API. Получаем обновления
Делал я тут небольшой парсер для ozon. Надо было сложить данные в таблицу. Всё бы ничего, да только в project maker всё работало корректно, а вот в зеннопостер в таблицу писались какие-то кракозябры (при чем частично). Решения зенковскими методами (как и причина проблемы) не было найдено, так что пришлось переписать на библиотеке epplus.dll.

Пример парсинга цены и описания со страницы поиска ozon с исп-м epplus


C#:
var package = new ExcelPackage(new FileInfo(project.Variables["table"].Value));
ExcelWorksheet table = package.Workbook.Worksheets[1];
project.SendInfoToLog("1", true);
Thread.Sleep(10000);
var cards = instance.ActiveTab.FindElementsByXPath("//div[contains(@data-widget, 'searchResultsV2')]/div/div");
project.SendInfoToLog("2", true);
int i=1;
foreach(var s in cards)
{
    i++;
    string text = s.FindChildByXPath(".//div/div//a//span[text()]", 0).InnerText;
    string price = s.FindChildByXPath(".//a/following-sibling::div//span[contains(@class, 'tsHead')]", 0).InnerText;
    project.SendInfoToLog($"{text}:{price}", true);
    table.Cells[i,1].Value = text;
    table.Cells[i,2].Value = price;
}
package.Save();
package.Dispose();
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)