Как получить данные из программы

В этом учебнике рассказывается, как создать приложение, которое отправляет HTTP-запросы к службе REST на GitHub. Приложение считывает информацию в формате JSON и преобразовывает ее в объекты C#. Преобразование из данных JSON в объекты C# называется десериализацией.

В этом учебнике вы научитесь следующему:

  • отправлять HTTP-запросы;
  • десериализовать JSON-ответы;
  • настраивать десериализацию с использованием атрибутов.

Если вы хотите поработать с примером окончательного кода по этому учебнику, вы можете загрузить такой пример. Инструкции по загрузке см. в разделе Просмотр и скачивание примеров.

Предварительные требования

  • Пакет SDK для .NET 6.0 или более поздней версии
  • Редактор кода, например [Visual Studio Code (кроссплатформенный редактор с открытым кодом). Пример приложения можно запускать в ОС Windows, Linux, macOS или в контейнере Docker.

Создание клиентского приложения

  1. Откройте командную строку и создайте каталог для приложения. Перейдите в этот каталог.
  2. Введите следующую команду в окне консоли:

dotnet new console —name WebAPIClient
cd WebAPIClient
dotnet run

Создание HTTP-запросов

Это приложение вызывает API GitHub для получения сведений о проектах под зонтичным брендом .NET Foundation. Конечная точка имеет значение https://api.github.com/orgs/dotnet/repos. Для получения сведений создается HTTP-запрос get.

Импорт табличных данных из PDF в Excel

Браузеры также используют HTTP-запросы get, поэтому вы можете указать этот URL-адрес в адресной строке браузера и увидеть, какие сведения вы будете получать и обрабатывать.

Используйте класс HttpClient, чтобы выполнять HTTP-запросы. HttpClient поддерживает только асинхронные методы для длительно выполняющихся API-интерфейсов. Следующие шаги позволяют создать асинхронный метод и вызывают его из метода Main.

    Откройте файл в каталоге Program.cs проекта и замените его содержимое следующим:

await ProcessRepositoriesAsync(); static async Task ProcessRepositoriesAsync(HttpClient client)

  • заменяет оператор Console.WriteLine вызовом ProcessRepositoriesAsync , в котором используется ключевое слово await .
  • Определяет пустой ProcessRepositoriesAsync метод.

using System.Net.Http.Headers; using HttpClient client = new(); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue(«application/vnd.github.v3+json»)); client.DefaultRequestHeaders.Add(«User-Agent», «.NET Foundation Repository Reporter»); await ProcessRepositoriesAsync(client); static async Task ProcessRepositoriesAsync(HttpClient client)

  • задает заголовки HTTP для всех запросов, а именно
  • Accept для приема ответов в формате JSON;
  • Название объекта User-Agent . Код сервера GitHub проверяет эти заголовки, они необходимы для извлечения сведений из GitHub;

static async Task ProcessRepositoriesAsync(HttpClient client) < var json = await client.GetStringAsync( «https://api.github.com/orgs/dotnet/repos»); Console.Write(json); >

  • Ожидает задачу, возвращенную вызовом HttpClient.GetStringAsync(String) метода . Этот метод отправляет HTTP-запрос GET на указанный URI. В качестве текста ответа возвращаются данные типа String. Они доступны по завершении задачи;
  • Строка json ответа выводится в консоль.

dotnet run

Десериализация результата JSON

Шаги ниже позволяют преобразовать ответ в формате JSON в объекты C#. Используйте класс System.Text.Json.JsonSerializer, чтобы десериализовать данные JSON в объекты.

JavaScript получаем данные из input, select, checkbox, range, radio, textarea, form

    Создайте файл с именем Repository.cs и добавьте следующий код:

public record class Repository(string name);
await using Stream stream = await client.GetStreamAsync(«https://api.github.com/orgs/dotnet/repos»); var repositories = await JsonSerializer.DeserializeAsync>(stream);
Console.Write(json);
на новый код:
foreach (var repo in repositories ?? Enumerable.Empty()) Console.Write(repo.name);
using System.Net.Http.Headers; using System.Text.Json;
dotnet run

Настройка десериализации

  1. В файле Repository.cs замените содержимое файла следующим кодом C#.

using System.Text.Json.Serialization; public record class Repository( [property: JsonPropertyName(«name»)] string Name);

  • изменяет имя свойства name на Name ;
  • Добавляет , JsonPropertyNameAttribute чтобы указать, как это свойство отображается в JSON.

foreach (var repo in repositories) Console.Write(repo.Name);

Рефакторинг кода

Метод ProcessRepositoriesAsync может выполнять работу в асинхронном режиме и возвращает коллекцию репозиториев. Измените этот метод, чтобы вернуть Task> и переместите код, который записывает данные в консоль рядом с вызывающим.

    Измените сигнатуру ProcessRepositoriesAsync , чтобы этот метод возвращал задачу, результатом которой является список объектов Repository :

static async Task> ProcessRepositoriesAsync()
await using Stream stream = await client.GetStreamAsync(«https://api.github.com/orgs/dotnet/repos»); var repositories = await JsonSerializer.DeserializeAsync>(stream); return repositories ?? new();
var repositories = await ProcessRepositoriesAsync(client); foreach (var repo in repositories) Console.Write(repo.Name);

Десериализация дополнительных свойств

Следующие шаги добавляют код для обработки дополнительных свойств в полученном пакете JSON.

Вы, вероятно, не будете обрабатывать каждое свойство, но добавление еще нескольких свойств позволит продемонстрировать другие возможности C#.

    Замените содержимое Repository класса следующим record определением:
Читайте также:
Подготовка к егэ по русскому языку программа курса

using System.Text.Json.Serialization; public record class Repository( [property: JsonPropertyName(«name»)] string Name, [property: JsonPropertyName(«description»)] string Description, [property: JsonPropertyName(«html_url»)] Uri GitHubHomeUrl, [property: JsonPropertyName(«homepage»)] Uri Homepage, [property: JsonPropertyName(«watchers»)] int Watchers);
foreach (var repo in repositories) < Console.WriteLine($»Name: «); Console.WriteLine($»Homepage: «); Console.WriteLine($»GitHub: «); Console.WriteLine($»Description: «); Console.WriteLine($»Watchers: «); Console.WriteLine(); >

Добавление свойства даты

Дата последней операции push-уведомления в ответе JSON имеет следующий формат:

2016-02-08T21:27:00Z

Этот формат предназначен для времени в формате UTC, поэтому результатом десериализации является значение DateTime, свойство Kind которого равно Utc.

Чтобы получить дату и время в вашем часовом поясе, вам необходимо написать пользовательский метод преобразования.

    В файле Repository.cs добавьте свойство для представления даты и времени в формате UTC и свойство только LastPush для чтения, которое возвращает дату, преобразованную в местное время. Файл должен выглядеть следующим образом:

using System.Text.Json.Serialization; public record class Repository( [property: JsonPropertyName(«name»)] string Name, [property: JsonPropertyName(«description»)] string Description, [property: JsonPropertyName(«html_url»)] Uri GitHubHomeUrl, [property: JsonPropertyName(«homepage»)] Uri Homepage, [property: JsonPropertyName(«watchers»)] int Watchers, [property: JsonPropertyName(«pushed_at»)] DateTime LastPushUtc) < public DateTime LastPush =>LastPushUtc.ToLocalTime(); >
Console.WriteLine($»Last push: «);

using System.Net.Http.Headers; using System.Text.Json; using HttpClient client = new(); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue(«application/vnd.github.v3+json»)); client.DefaultRequestHeaders.Add(«User-Agent», «.NET Foundation Repository Reporter»); var repositories = await ProcessRepositoriesAsync(client); foreach (var repo in repositories) < Console.WriteLine($»Name: «); Console.WriteLine($»Homepage: «); Console.WriteLine($»GitHub: «); Console.WriteLine($»Description: «); Console.WriteLine($»Watchers: «); Console.WriteLine($»»); Console.WriteLine(); > static async Task> ProcessRepositoriesAsync(HttpClient client) < await using Stream stream = await client.GetStreamAsync(«https://api.github.com/orgs/dotnet/repos»); var repositories = await JsonSerializer.DeserializeAsync>(stream); return repositories ?? new(); >

Дальнейшие действия

В этом руководстве вы создали приложение, которое выполняет веб-запросы и анализирует результаты. Теперь версия вашего приложения должна совпадать с полной версией примера.

Источник: learn.microsoft.com

Поиск и редактирование значений в памяти сторонней программы на C++

Часто возникает необходимость найти и поменять какие-либо строки/числа в чужой программе. С этой задачей лучше всего справляется ArtMoney. Для тех, кто не умеет или не хочет использовать отладчики, это на сегодня, наверное, единственный вариант, так как нормальных аналогов просто нету.

Хотя ArtMoney и поддерживает очень много возможностей для работы с памятью, весь процесс происходит вручную, без возможности создания действий по алгоритму. Если значений много и их надо, например, менять при каждом запуске программы, то время, затрачиваемое на эту работу, превышает всякие допустимые пределы. Выход один — написать свой редактор памяти!

Ищем исходники

В свое время у меня возникла задача, требующая модификации значений в памяти другой программы постоянно во время ее работы. Одним из условий было, что программа будет работать и на других машинах, а это значит, что вариант записи в память по заранее определенным адресам не подходил бы: адреса для разных машин будут разные и нужно реализовывать именно поиск адресов в памяти.

Я принялся за написание загрузчика и стал искать информацию по этому вопросу. К сожалению я не владею Delphi, и когда обнаружилось, что большинство исходников именно на этом языке, я немного растерялся. Переписывать огромное количество кода на C++ у меня не было ни времени, ни возможности. Еще одним открытием стало, что ни один из найденных мной исходников не работал корректно: программа либо висла, либо работала с ошибками. К тому же работа всех этих программ по поиску в памяти занимала гораздо больше времени, чем должна (раз в 15-20 дольше ArtMoney).

Поиск по форумам (в т.ч. и английским) так же не был радостным: в темах, связанных с сабжем по C++ были обрывки кода (явно без необходимого функционала). Не помню тем, где бы автор успешно решил свой вопрос. Тем не менее я вынес определенные знания про устройство оперативной памяти в Windows и узнал о функциях, используемых в работе.

После нескольких дней мучений я нашел один полезный топик. Автор приводит вполне рабочую программу на C++, к сожалению работала она очень медленно. Решение есть там же в предпоследнем посте. Осталось только скомпоновать два кода и снабдить их комментариями. Думаю, приведенная ниже программа многим поможет решить задачу поиска по памяти процесса, ну и узнать что-то новое.

Поиск и редактирование значений в памяти программы

Программа для теста

#include char szText[] = «Hello world.», szTitle[] = «Information»; main() < while (TRUE) MessageBox(NULL, szText, szTitle, MB_ICONINFORMATION); return EXIT_SUCCESS; >/*Просто выведем окошко, в котором через память будем менять текст*/

Читайте также:
Векторные редакторы список программ
Сам редактор

#include #include #include # define PROC_NAME «n00b.exe»# define MAX_READ 128 int fMatchCheck(char * mainstr, int mainstrLen, char * checkstr, int checkstrLen) < /* Проверка наличия подстроки в строке.

При этом под «строкой» подразумевается просто последовательность байт. */ BOOL fmcret = TRUE; int x, y; for (x = 0; x < mainstrLen; x++) < fmcret = TRUE; for (y = 0; y < checkstrLen; y++) < if (checkstr[y] != mainstr[x + y]) < fmcret = FALSE; break; >> if (fmcret) return x + checkstrLen; > return -1; > char * getMem(char * buff, size_t buffLen, int from, int to) < /* Выделяем у себя память, в которой будем хранить копию данных из памяти чужой программы. */ size_t ourSize = buffLen * 2; char * ret = (char * ) malloc(ourSize); memset(ret, 0, ourSize); memcpy(ret, memset( return ret; >char * delMem(char * buff, size_t buffLen, int from, int to) < /* Освобождаем память. */ size_t ourSize = buffLen * 2; char * ret = (char * ) malloc(ourSize); int i, x = 0; memset(ret, 0, ourSize); for (i = 0; i < buffLen; i++) < if (!(i >= from i < to)) < ret[x] = buff[i]; x++; >> return ret; > char * addMem(char * buff, size_t buffLen, char * buffToAdd, size_t addLen, int addFrom) < /* Запись в память. */ size_t ourSize = (buffLen + addLen) * 2; char * ret = (char * ) malloc(ourSize); int i, x = 0; memset(ret, 0, ourSize); memcpy(ret, getMem(buff, buffLen, 0, addFrom), addFrom); x = 0; for (i = addFrom; i < addLen + addFrom; i++) < ret[i] = buffToAdd[x]; x++; >x = 0; for (i; i < addFrom + buffLen; i++) < ret[i] = buff[addFrom + x]; x++; >return ret; > char * replaceMem(char * buff, size_t buffLen, int from, int to, char * replaceBuff, size_t replaceLen) < /* Заменяем найденную «строку» на свою. */ size_t ourSize = (buffLen) * 2; char * ret = (char * ) malloc(ourSize); memset(ret, 0, ourSize); memcpy(ret, buff, buffLen); // copy ‘buff’ into ‘ret’ ret = delMem(ret, buffLen, from, to); // delete all memory from ‘ret’ betwen ‘from’ and ‘to’ ret = addMem(ret, buffLen — to + from, replaceBuff, replaceLen, from); return ret; >DWORD fGetPID(char * szProcessName) < PROCESSENTRY32 pe = < sizeof(PROCESSENTRY32) >; HANDLE ss; DWORD dwRet = 0; ss = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (ss) < if (Process32First(ss, pe)) < if (!strcmp(pe.szExeFile, szProcessName)) < dwRet = pe.th32ProcessID; break; >> CloseHandle(ss); > return dwRet; > BOOL DoRtlAdjustPrivilege() < /* Важная функция. Получаем привилегии дебаггера.

Именно это позволит нам получить нужную информацию о доступности памяти. */ # define SE_DEBUG_PRIVILEGE 20 L# define AdjustCurrentProcess 0 BOOL bPrev = FALSE; LONG(WINAPI * RtlAdjustPrivilege)(DWORD, BOOL, INT, PBOOL); *(FARPROC * ) ntdll.dll»), «RtlAdjustPrivilege»); if (!RtlAdjustPrivilege) return FALSE; RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, AdjustCurrentProcess, return TRUE; >main() < /*** VARIABLES ***/ HANDLE hProc; MEMORY_BASIC_INFORMATION mbi; SYSTEM_INFO msi; ZeroMemory( GetSystemInfo( /* Получаем информацию о памяти в текущей системе. */ DWORD dwRead = 0; char * lpData = (VOID * ) GlobalAlloc(GMEM_FIXED, MAX_READ), lpOrig[] = «Information», // что ищем lpReplacement[] = «habrahabr.ru»; // на что меняем int x, at; /*****************/ if (!lpData) return -1; ZeroMemory(lpData, MAX_READ); // открываем процесс do < hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, fGetPID(PROC_NAME)); if (!hProc) < Sleep(500); puts(«Cant open process!n» «Press any key to retry.n»); getch(); >> while (!hProc); if (DoRtlAdjustPrivilege()) < /* Привилегии отладчика для работы с памятью. */ puts(«Process opened sucessfullyn» «Scanning memory. n»); for (LPBYTE lpAddress = (LPBYTE) msi.lpMinimumApplicationAddress; lpAddress puts(«n»); at = fMatchCheck(lpData, dwRead, lpOrig, sizeof(lpOrig) — 1); if (at != -1) < at -= sizeof(lpOrig) — 1; lpData = replaceMem(lpData, dwRead, at, at + sizeof(lpOrig) — 1, lpReplacement, /*sizeof(lpReplacement)-1*/ sizeof(lpOrig) — 1); puts(«REPLACEMENT DATA:»); for (x = 0; x < dwRead — sizeof(lpOrig) — 1 + sizeof(lpReplacement) — 1; x++) < printf(«%c», lpData[x]); >puts(«n»); puts(«Replacing memory. «); if (WriteProcessMemory(hProc, (LPVOID) lpAddress, lpData, /*dwRead-sizeof(lpOrig)-1+sizeof(lpReplacement)-1*/ dwRead, puts(«Success.n»); >else puts(«Error.n»); > else puts(«Error.n»); > > > > else puts(«Error.n»); > else puts(«Error.n»); > > else puts(«Error.n»); // // // // // // Cleanup if (hProc) CloseHandle(hProc); if (lpData) GlobalFree(lpData); /////////////// puts(«Done. Press any key to quit. «); return getch(); >

В заключении

Код сыроват, есть над чем поработать, но это, видимо, единственный готовый пример решения задачи на C++ в рунете. Я намеренно не стал делать здесь все исправления и освещать все ньюансы, т.к. это сильно раздуло бы статью (а она и так не маленькая получилась). В любом случае он будет полезен, как каркас для написания редактора памяти под свои нужды, а так же дает понимание, как надо производить поиск в памяти, чтобы он занимал несколько секунд, а не минут.

Читайте также:
Как вычислить на компьютере шпионские программы

Еще раз упомяну топик из которого взяты исходники и принципы работы.

P.S. За инвайт благодарю donnerjack13589

Источник: habr.com

Как получить данные из командной строки из программы Python?

Я хочу запустить программу командной строки из python script и получить вывод. Как получить информацию, отображаемую foo, чтобы я мог использовать ее в моем script? Например, я вызываю foo file1 из командной строки и выводит

Size: 3KB Name: file1.txt Other stuff: blah
Как я могу получить имя файла, сделав что-то вроде filename = os.system(‘foo file1’) ?
user1058492 21 нояб. 2011, в 21:38
Поделиться
возможный дубликат выполнения программ командной строки из Python
Daenyth 21 нояб. 2011, в 20:24
Поделиться:
command-line

5 ответов

Лучший ответ

Используйте модуль подпроцесса:

import subprocess command = [‘ls’, ‘-l’] p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.IGNORE) text = p.stdout.read() retcode = p.wait()

Затем вы можете делать все, что хотите, с переменной text : регулярное выражение, разделение и т.д.

Второй и третий параметры subprocess.Popen являются необязательными и могут быть удалены.

koblas 21 нояб. 2011, в 20:12
Поделиться
. где command должна быть [‘foo’, ‘file1’, ‘file2’, . ] . +1.
Fred Foo 21 нояб. 2011, в 19:50

Спасибо! Итак, вывод foo весь в тексте . Теперь, как мне получить имя файла из этого? Это как массив или что-то, где я могу получить текст [1]? Или я могу найти в нем «Имя:»? Или начать со строки № 2 символа № 7 до новой строки?

user1058492 21 нояб. 2011, в 20:00

Посмотрите на модуль re и напишите простое регулярное выражение, которое вытягивает его в pat = re.compile(r’Name:s+(.*)$’) m = pat.search(text) if m: m.group(1) (вам нужно добавить несколько новых строк)

koblas 21 нояб. 2011, в 21:15

Я только что понял, что должен использовать Python v2.4, который не позволяет мне делать stdout = subprocess.PIPE. Как еще можно это сделать?

user1058492 21 нояб. 2011, в 21:37

подпроцесс и PIPE должны быть там в 2.4 — docs.python.org/release/2.4/lib/node227.html игнорируемый stderr отсутствует.

koblas 21 нояб. 2011, в 21:41

Ах, понял это. Это проблема только в Windows. Не уверен, что это правильный способ исправить, но я нашел некоторые обходные пути.

user1058492 21 нояб. 2011, в 22:13
У объекта ‘module’ нет атрибута ‘IGNORE’
Hardik Gajjar 24 нояб. 2016, в 07:12

Показать ещё 5 комментариев

Самый простой способ получить вывод инструмента, который вызывается через ваш Python script, — это использовать модуль subprocess в стандартном библиотека. Посмотрите subprocess.check_output.

>>> subprocess.check_output(«echo «foo»», shell=True) ‘foon’

(Если ваш инструмент попадает из ненадежных источников, убедитесь, что вы не используете аргумент shell=True .)

josePhoenix 21 нояб. 2011, в 20:25
Поделиться
Как получить код ответа, используя этот метод
Prakash Pandey 09 сен.

2018, в 22:08

В Python вы можете передать обычную команду OS с пробелами, подкатегорами и символами новой строки в модуль subcommand , чтобы мы могли проанализировать текст ответа следующим образом:

    Сохраните это в test.py:

#!/usr/bin/python import subprocess command = (‘echo «this echo command’ + ‘ has subquotes, spaces,nn» echo «and newlines!»‘) p = subprocess.Popen(command, universal_newlines=True, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) text = p.stdout.read() retcode = p.wait() print text;
python test.py
this echo command has subquotes, spaces, and newlines!

Если это не работает для вас, это может быть проблемой с версией python или операционной системой.

Я использую Python 2.7.3 для Ubuntu 12.10 для этого примера.

Eric Leschinski 08 дек. 2013, в 18:55
Поделиться

Обычно это тема для bash script, которую вы можете запустить в python:

#!/bin/bash # vim_ts=4:sw=4 for arg; do size=$(du -sh «$arg» | awk ») date=$(stat -c «%y» «$arg») cat Date: $date EOF done

Изменить: как использовать его: откройте pseuso-terminal, затем скопируйте-вставьте это:

cd wget http://pastie.org/pastes/2900209/download -O info-files.bash
import os import sys myvar = («/bin/bash ~/info-files.bash ‘<>'»).format(sys.argv[1]) myoutput = os.system(myvar) # myoutput variable contains the whole output from the shell print myoutput

Источник: overcoder.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru