Kibor |
Отправлено: 23 Мая, 2020 - 02:40:38
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
На данный момент многие сайты дают возможность взаимодействовать с ними через Api.
Наиболее частый формат взаимодействия является JSON.
В разработке инструмент, который позволит создавать боты общающиеся с сайтами через Api разработчиков сайтов.
На данный момент реализуется парсер JSON формата для возможности получать и выделять необходимую информацию с ответа.
У кого есть желание, тестируется не описанная на данный момент функция parserjson.
Код для тестирования:
CODE:string исходник="";
string Tt;
if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}
messagebox (исходник);
messagebox (parserjson(Rez_Json, исходник));
В файле json.txt должен находиться формат JSON.
Пример:
CODE:{
"firstName": "Иван",
"lastName": "Иванов",
"address":
{
"streetAddress": "Московское ш., 101, кв.101",
"city": "Ленинград",
"postalCode": 101101
},
"phoneNumbers":
[
"812 123-1234",
"916 123-4567",
{
"Info":"No",
"MobPhone":"Yes"
}
]
}
При запуске вышеуказанного кода с таким файлом, Кибор будет выводить распарсенную информацию.
Вывод состоит из пары Ключ = Значение
Доступ к элементам JSON реализован похожим образом как это сделано в JavaScript.
Пример вывода:
lastName ключ. Иванов значение этого ключа
Цитата: lastName = Иванов
address.city состоит из двух ключей. address и элемента объекта city
Цитата: address.city = Ленинград
phoneNumbers это массив. phoneNumbers[1] указывает на второй элемент массива.
Цитата: phoneNumbers[1]=916 123-4567
phoneNumbers[2].Info указывает на третий элемент массива phoneNumbers, в состав которого входит объект. По элементу объекта Info мы узнаем значение.
Цитата: phoneNumbers[2].Info = No
Пример сложного формата:
products[1].options.15[0] = 47
Цитата: {
"user_id" : 10,
"session_id" : "2c2l3h4ii271aojentejtdcmh3",
"products":
[
{
"product_id" : 15,
"options" :
{
"15" : [45, 47],
"18" : 52
},
"quantity" : 1,
"price" : 1500
},
{
"product_id" : 16,
"options" :
{
"15" : [47,48],
"18" : 51
},
"quantity" : 2,
"price" : 1000
}
]
}
data[0].images[1].url =(для просмотра ссылки Вам необходимо авторизоваться)
data[0].attributes[1].value = 2015
Цитата: {
"data": [
{
"id": 123,
"status": "active",
"url": "https://www.olx.ua/oferta/url.html",
"created_at": "2018-02-02 09:35:16",
"activated_at": "2018-02-02 09:32:52",
"valid_to": "2018-03-04 09:32:52",
"title": "This is title",
"description": "This is description",
"category_id": 123,
"advertiser_type": "private",
"external_id": 12345,
"external_url": "http://myshop.com/advert/123",
"contact": {
"name": "John",
"phone": 123123123,
"location": {
"city_id": 1,
"district_id": null,
"latitude": 53.123,
"longitude": 17.123
}
},
"images": [
{
"url": "https://www.olx.ua/advert-picture-1.jpg"
},
{
"url": "https://www.olx.ua/advert-picture-2.jpg"
}
],
"price": {
"value": 123,
"currency": "PLN",
"negotiable": false,
"trade": false
},
"salary": null,
"attributes": [
{
"code": "model",
"value": "cts",
"values": null
},
{
"code": "year",
"value": 2015,
"values": null
}
],
"courier": null
}
]
}
В случае успеха функция по очереди вернет все ключи и значения. Возврат функции 1.
Проверить валидность записи JSON можно тут
В случае ошибки выкладывайте JSON и в каком месте неверно выводит. |
|
|
Dantes3000 |
Отправлено: 23 Мая, 2020 - 14:46:22
|
Эксперт
Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016
Репутация: 58
|
В самом конце ошибка.
json (Отобразить){
"update_id": 923393302,
"message": {
"message_id": 306890,
"from": {
"id": 72397035,
"is_bot": false,
"first_name": "фів",
"last_name": "Мasd",
"username": "trusd",
"language_code": "en"
},
"chat": {
"id": 1,
"first_name": "sd",
"last_name": "sd",
"username": "asd",
"type": "private"
},
"date": 1590067726,
"forward_from": {
"id": 82,
"is_bot": true,
"first_name": "Python Bot",
"username": "pdgfhot"
},
"forward_date": 1590067651,
"photo": [
{
"file_id": "AgACAgsdfoheLYNsdfbQAD6pkAAhkE",
"file_unique_id": "AQADTfnXky4AA-qZAAI",
"file_size": 22617,
"width": 288,
"height": 320
},
{
"file_id": "AgACAgIAAxkBAAsdfAgADeAAD65kAAhkE",
"file_unique_id": "AQADTfnXky4AA-uZAAI",
"file_size": 90278,
"width": 719,
"height": 800
},
{
"file_id": "AgACAgIAAxkBAsdf-deTLgADAQADAgADeQAD6JkAAhkE",
"file_unique_id": "AQADTfnXky4AA-iZAAI",
"file_size": 123144,
"width": 971,
"height": 1080
}
],
"caption": "Канал: ??TEST\nId: 454\nДобавлено на: 2020-5-24 9:37\nОписание: sd\nКоманды:\n/delete_test\n\n/post_now\n/reset_default_channel\n/set_default_channel",
"caption_entities": [
{
"offset": 73,
"length": 12,
"type": "bot_command"
},
{
"offset": 87,
"length": 9,
"type": "bot_command"
},
{
"offset": 97,
"length": 22,
"type": "bot_command"
},
{
"offset": 120,
"length": 20,
"type": "bot_command"
}
]
}
} (Отредактировано автором: 23 Мая, 2020 - 14:48:35) |
|
|
Kibor |
Отправлено: 23 Мая, 2020 - 14:50:48
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Dantes3000 пишет: В самом конце ошибка.
Функция возвращает число, а не текст.
Запускайте код как есть. Сообщения выводятся внутри Кибор. Это тест.
(Добавление)
В формате ошибка
Цитата: "id": 1
"first_name": "sd",
После 1 нет запятой.
Проверяйте на валидность JSON |
|
|
Kibor |
Отправлено: 02 Июня, 2020 - 23:42:45
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Реализован доступ к объектам JSON
Парсер JSON формата осуществляется функцией
parserjson(Rez_Json, исходник);
где
Rez_Json - Символьное имя объекта
исходник - string, в котором записан Json формат
Затем по символьному имени можно обращаться к структуре Json:
Цитата: parserjson(Rez_Json, исходник);
Rez_Json.products[1].options.15[2]
Если элемента не существует, вернется ERROR_SEARCH_JSON
В дальнейшем появятся функции вычисления размеров массивов и тд.
Можно одновременно загружать и создавать несколько Json объектов:
Цитата: parserjson(Rez_Json, исходник);
parserjson(Rez_Json_2, исходник1);
Пример:
CODE:string исходник="";
string исходник1="";
string Tt;
if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}
if (fopen ("C:\json - 1.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник1=исходник1+Tt;
fclose();
}
messagebox (исходник);
messagebox (исходник1);
parserjson(Rez_Json, исходник);
parserjson(Rez_Json_2, исходник1);
//Объект Rez_Json
int n=0;
loop()
{
Tt=Rez_Json.products[1].options.15[n];
if (Tt=="ERROR_SEARCH_JSON")break;//Перебор всего массива до ошибки 47,48, 25, 79, 95
messagebox(Tt);
n++;
}
//Объект Rez_Json_2
messagebox(Rez_Json_2.data[0].attributes[1].value);//2015
messagebox(Rez_Json_2.data[0].images[0].url);//https://www.olx.ua/advert-picture-1.jpg
Соответственно файлы
json.txt
CODE:{
"user_id" : 10,
"session_id" : "2c2l3h4ii271aojentejtdcmh3",
"products":
[
{
"product_id" : 15,
"options" :
{
"15" : [45, 47],
"18" : 52
},
"quantity" : 1,
"price" : 1500
},
{
"product_id" : 16,
"options" :
{
"15" : [47,48, 25, 79, 95],
"18" : 51
},
"quantity" : 2,
"price" : 1000
}
]
}
json - 1.txt
CODE:{
"data": [
{
"id": 123,
"status": "active",
"url": "https://www.olx.ua/oferta/url.html",
"created_at": "2018-02-02 09:35:16",
"activated_at": "2018-02-02 09:32:52",
"valid_to": "2018-03-04 09:32:52",
"title": "This is title",
"description": "This is description",
"category_id": 123,
"advertiser_type": "private",
"external_id": 12345,
"external_url": "http://myshop.com/advert/123",
"contact": {
"name": "John",
"phone": 123123123,
"location": {
"city_id": 1,
"district_id": null,
"latitude": 53.123,
"longitude": 17.123
}
},
"images": [
{
"url": "https://www.olx.ua/advert-picture-1.jpg"
},
{
"url": "https://www.olx.ua/advert-picture-2.jpg"
}
],
"price": {
"value": 123,
"currency": "PLN",
"negotiable": false,
"trade": false
},
"salary": null,
"attributes": [
{
"code": "model",
"value": "cts",
"values": null
},
{
"code": "year",
"value": 2015,
"values": null
}
],
"courier": null
}
]
}
Вложенные массивы
Перебор всех массивов Rez_Json.members[?].powers[?] в Json
Файл
Цитата: {
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
},
{
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"
]
},
{
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": [
"Immortality",
"Heat Immunity",
"Inferno",
"Teleportation",
"Interdimensional travel"
]
}
]
}
Скрипт перебора
CODE:string исходник="";
string Tt;
if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}
messagebox (исходник);
parserjson(Rez_Json, исходник);
//Объект Rez_Json
int n=0;
int n1=0;
loop()
{
Tt=Rez_Json.members[n].powers[n1];//Перебор всех массивов Rez_Json.members[?].powers[?] в Json
if (Tt=="ERROR_SEARCH_JSON")
{
if (n1==0) break;
n++;
n1=0;
}
else
{
messagebox(Tt);
n1++;
}
}
Узнаем age объекта у которого powers "Damage resistance"
CODE:string исходник="";
string Tt;
if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}
messagebox (исходник);
parserjson(Rez_Json, исходник);
//Объект Rez_Json
int n=0;
int n1=0;
loop()
{
Tt=Rez_Json.members[n].powers[n1];//Перебор всех массивов Rez_Json.members[?].powers[?] в Json
if (Tt=="ERROR_SEARCH_JSON")
{
if (n1==0) break;
n++;
n1=0;
}
else
{
//messagebox(Tt);
if (Tt=="Damage resistance")
{
messagebox(Rez_Json.members[n].age);
break;
}
n1++;
}
}
|
|
|
Kibor |
Отправлено: 03 Июня, 2020 - 11:11:26
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Узнать все name и value массива stats
Цитата: {
"playerstats": {
"steamID": "76561198050187807",
"gameName": "ValveTestApp260",
"stats": [
{
"name": "total_kills",
"value": 35179
},
{
"name": "total_deaths",
"value": 30241
},
{
"name": "total_time_played",
"value": 2444377
}
]
}
}
CODE:string исходник="";
string Tt;
if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}
parserjson(Rez_Json, исходник);
int n=0;
while (Rez_Json.playerstats.stats[n].name!="ERROR_SEARCH_JSON")
{
messagebox (Rez_Json.playerstats.stats[n].name+" = "+Rez_Json.playerstats.stats[n].value);
n++;
} |
|
|
Zireael |
Отправлено: 04 Июня, 2020 - 04:01:36
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
json.txt:
Цитата: {"code": 200,"lang": "en-ru","text": ["Здравствуй, Мир!"]}
CODE:string text="Тук, тук";
string исходник="";
string Tt;
if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}
messagebox (исходник);
parserjson(Rez_Json, исходник);
messagebox(Rez_Json.code);
messagebox(Rez_Json.lang);
messagebox(Rez_Json.text[0]); // обращение к переменной text, а не объекту json |
|
|
|