1

Python библиотека для Remote Api от Gurtam

Тема: Python библиотека для Remote Api от Gurtam

C недавнего времени на сервисе GitHub (хостинга проектов и их совместная разработка) доступна python библиотека  для работы на сервере с remote API.

Ссылка на страницу: https://github.com/wialon/python-wialon

Denis Strakh, Gurtam
2

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

О, круто. Классная задумка. Вот бы еще на Яве че-нить сделали wink

3

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Java в работе

Denis Strakh, Gurtam
4

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

stde пишет:

Java в работе

Вау! Я тапер прям уся горю в нетерпении... Испробовать хоцца.

5

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Здравствуйте.
Подскажите как использовать данный пакет:


Взял сорцы. Проверил на тестовом - работает.
Теперь решил использовать свои логин и пароль, изменил в классе

class Wialon(object):
    def __init__(self, scheme='http',  host="hst-api.wialon.com", port=80, sid=None, **extra_params):

значение параметра host на свой.  Пытаюсь подконнектиться - не идет. 

Предположения:
1) Не верно указываю свой хост
2) Не подключен sdk
3) Что-то еще?

С чего рекомендуете начать расследование?

P.S. Если заходит через браузер на мой хост, то через форму заходит спокойно.

6

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

SapronovAlexander

Здравствуйте.

По предположениям:

Первое вполне может быть. (Отпишите в личку  для проверки вместе с логином и паролем).
По второму пункту - модуль sdk должен быть подключен иначе при попытки логина будет возвращен код ошибки 7 (Access denied).
По третьему - маловероятно - думаю проблемы в вышеуказанных пунктах.

7

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Возможно ли привести на python пример search_items с условиями поиска? Например, вывести все доступные машины.

8

Python библиотека для Remote Api от Gurtam

(02/09/2013 08:45:34 отредактировано chal)

Re: Python библиотека для Remote Api от Gurtam

nbush

from wialon import Wialon, flags

def main():    
    wialon = Wialon()
    try:
        login = wialon.core_login(user='wialon_test', password='test')        
    except WialonError as e:
        print e
        return
    wialon.sid = login['eid']
    
    spec = {
        'itemsType': 'avl_unit',    
        'propName': 'sys_name',    
        'propValueMask': '*',    
        'sortType': 'sys_name'
    }
    interval = {"from": 0, "to": 0}
    try:
        units = wialon.core_search_items(spec=spec, force=1, flags=flags.ITEM_DATAFLAG_BASE, **interval)
    except WialonError as e:
        print e
        return

    print units

if __name__ == '__main__':
    main()
9

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Спасибо
Просто я пробовал вызов типа

units = wialon.core_search_items(spec=spec, force=1, from = 0, to=0, flags=flags.ITEM_DATAFLAG_BASE)

Понятно, при этом python ругался на ключевое слово from в параметрах smile

10

Python библиотека для Remote Api от Gurtam

(12/01/2014 14:50:11 отредактировано solveMe)

Re: Python библиотека для Remote Api от Gurtam

Нашел небольшой баг. В функции __unicode__() класса WialonError при каждом вызове (а следовательно и функций __str__() , __repr__()) будет наращиваться значение self._text на строку error[self._code]. Т.е. будет такой вывод например:

WialonError(Error performing request Ho-ho (5))
WialonError(Error performing request Error performing request Ho-ho (5))
WialonError(Error performing request Error performing request Error performing request Ho-ho (5))

Я решил что пусть self._text остается таки каким его передали в конструктор и поправил это следующи образом:

    def __unicode__(self):
        if (self._code in wError.errors):
            explanation = " ".join([wError.errors[self._code], self._text])
        message = u'{explanation} ({code})'.format(explanation=explanation, code=self._code)
        return u'WialonError({message})'.format(message=message)

Вот собственно и все. Кстати наверняка у автора либы будут мысли получше чем мои.

P.S. Очень понравилась ваша идея с вызовом команд Виалону, как будто они методы экземпляра Wialon(). Я ввиду своей неопытности в ближайшие года бы до такого не додумался.

11

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

solveMe пишет:

Нашел небольшой баг. В функции __unicode__() класса WialonError при каждом вызове (а следовательно и функций __str__() , __repr__()) будет наращиваться значение self._text на строку error[self._code]. Т.е. будет такой вывод например:

WialonError(Error performing request Ho-ho (5))
WialonError(Error performing request Error performing request Ho-ho (5))
WialonError(Error performing request Error performing request Error performing request Ho-ho (5))

Я решил что пусть self._text остается таки каким его передали в конструктор и поправил это следующи образом:

    def __unicode__(self):
        if (self._code in wError.errors):
            explanation = " ".join([wError.errors[self._code], self._text])
        message = u'{explanation} ({code})'.format(explanation=explanation, code=self._code)
        return u'WialonError({message})'.format(message=message)

Вот собственно и все. Кстати наверняка у автора либы будут мысли получше чем мои.

P.S. Очень понравилась ваша идея с вызовом команд Виалону, как будто они методы экземпляра Wialon(). Я ввиду своей неопытности в ближайшие года бы до такого не додумался.

Да, действительно есть такой баг. И ваше решение вполне подходит. Спасибо.

12

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Сегодня просматривал код данной библиотеки и заступорился на методе getattr(...). В частности никак не могу понять что делает данное выражение:

return get.__get__(self)

Ну т.е. я понимаю что оно возвращает в итоге функцию которую нужно вызвать вместо Wialon.action_name(...). Но на каких механизмах основывается работа данного кода понять не могу. Почитал про дескрипторы Python (метод __get__() вроде только для них применим), но осталось недопонимание откуда у метода

def get(self, *args, **kwargs)

взялся метод __get__()? Он ведь вроде по умолчанию не существует и его необходимо переопределять, да и вызывается он тоже неявно.
Был бы признателен если бы кто-нибудь объяснил где мои рассуждения свернули не туда. Интерес у меня чисто академический так сказать. Так получилось что подвернулась данная библиотека по работе, а я с Python'ом даже не то чтобы на "Вы", а скорее даже на "Ваше превосходительство" поэтому решил, что разбор использующихся тут приемов будет хорошим началом для изучения языка.

13

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Библиотеку писал не я, но ответить попробую. Академический интерес заразителен)

solveMe пишет:

откуда ... взялся метод __get__()? Он ведь вроде по умолчанию не существует и его необходимо переопределять ... да и вызывается он тоже неявно

Простая проверка показывает что метод очень даже существует у обычной функции.

>>> def test(var): print var
>>> test.__get__
<method-wrapper '__get__' of function object at 0x7f4f75798320>
>>>test.__get__('go')
<bound method ?.test of 'go'>

Документация гласит, что данный метод вызывается для получения атрибута owner класса, т.е. в нашем случае у Wialon. И вызвать функцию явно никто не запрещает.

Вообще мне очень нравится идея вызова не объявленных явно методов. Логика примерно следующая (на примере 'core_login'):
1) создается объект wialon класса Wialon
2) вызывается wialon.core_login(...)
3) функция 'core_login' явно не объявлена - вызывается wialon.__getattr__(self, 'core_login')
4) объявляется функция get(), которая по сути вызывает метод call('core/login')
5) вызывается get.__get__(...), которая вызывает get() owner'a (т.е. wialon)
6) результат ретурнится

Та же логика в библиотеке php-wialon, но выглядит прозрачнее)

14

Python библиотека для Remote Api от Gurtam

(11/02/2014 13:59:52 отредактировано solveMe)

Re: Python библиотека для Remote Api от Gurtam

Большое спасибо за ответ. Оказывается мой больной разум, все это время глядя в документации на слово owner, воспринимал его как parent. Остался непонятен только один момент: если в функции __getattr__(..) мы подсовываем вместо вызванной функции метод call() то зачем было запиливать функцию get и потом вызывать get.__get__()? Можно ли сразу напрямую сделать так:

def __getattr__(self, action_name):
     return self.call

Или я опять что-то упустил?

15

Python библиотека для Remote Api от Gurtam

(11/02/2014 19:18:57 отредактировано chal)

Re: Python библиотека для Remote Api от Gurtam

Спасибо за ваш интерес.

Метод __getattr__http://u.to/vi83Bg вызывается, если не найден подходящий метод (свойство) в объекте или в классах родителях. И, следовательно, он должен вернуть либо значение, если это свойство объекта или, так называемый, callable объект, что и просходит в нашем случаи. Этот callable объект и будет вызываться с параметрами. Пример ниже.

wialon_api = Wialon()
result = wialon_api.core_login(user='wialon_test', password='test')

Т.е. в цепочка вызова будет такая:
- __getattr__(self, 'core_login') - который и должен вернуть callable объект - назовем его callable_login
- вызовется callable_login в который, собственно, и передастся параметры user и password в словаре.

Вот для того, что бы __getattr__ и вернул callable объект и нужна нижеуказанная манипуляция.

def __getattr__(self, action_name):
        """
        Enable the calling of Wialon API methods through Python method calls
        of the same name.
        """
        def get(self, *args, **kwargs):
            return self.call(action_name, *args, **kwargs)

        return get.__get__(self)

Про __get__ можно почитать по ссылке http://u.to/lTA3Bg.

А по поводу вызова напрямую:

def __getattr__(self, action_name):
        return self.call

В таком случаи в метод call ни как не передается action_name. Можно было бы сделать это так:

from  functools import partial

def __getattr__(self, action_name):
        return partial(self.call, action_name)

Но мне, как автору, решение, которое и реализовано, показалось более прозначным и близким smile

Надеюсь вам стало понятнее.

16

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

chal пишет:

nbush

from wialon import Wialon, flags

def main():    
    wialon = Wialon()
    try:
        login = wialon.core_login(user='wialon_test', password='test')        
    except WialonError as e:
        print e
        return
    wialon.sid = login['eid']
    
    spec = {
        'itemsType': 'avl_unit',    
        'propName': 'sys_name',    
        'propValueMask': '*',    
        'sortType': 'sys_name'
    }
    interval = {"from": 0, "to": 0}
    try:
        units = wialon.core_search_items(spec=spec, force=1, flags=flags.ITEM_DATAFLAG_BASE, **interval)
    except WialonError as e:
        print e
        return

    print units

if __name__ == '__main__':
    main()

Добрый день,
Данный пример проверил, работает.

По аналогии пытаюсь выполнить загрузку сообщений, пример взят с документации https://sdk.wialon.com/wiki/ru/sidebar/ … s/messages
Далее собираю в следующий скрипт:

# -*- coding: utf-8 -*-
from wialon import Wialon, WialonError, flags
def main():    
    wialon = Wialon()
    try:
        result = wialon.token_login(token='token')        
    except WialonError as e:
        print e
        return
    wialon.sid = result['eid']

    params = {"itemId":928675,"timeFrom":1478147204,"timeTo":1478518392,"flags":0x0000,"flagsMask":0xFF00,"loadCount":0xffffffff}

    try:
        units = wialon.messages_load_interval(params)
    except WialonError as e:
        print e
        return
    print units
if __name__ == '__main__':
    main()

Вопрос, что тут не правильно, подскажите пожалуйста..

17

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Здравствуйте, togachev!

units = wialon.messages_load_interval(params)

Вам необходимо распаковать params при передаче функции:

units = wialon.messages_load_interval(**params)
18

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

asal пишет:

Здравствуйте, togachev!

units = wialon.messages_load_interval(params)

Вам необходимо распаковать params при передаче функции:

units = wialon.messages_load_interval(**params)

Сработало!
Спасибо!

19

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

смотрю сейчас на строчку

wialon.sid = login['eid']

очередная магия ?

"eid":<long>,    /* login operations count of current user */

подпись сломали .. впрочем не удивительно
20

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

tdt66 пишет:

смотрю сейчас на строчку

wialon.sid = login['eid']

очередная магия ?

"eid":<long>,    /* login operations count of current user */

В eid идентификатор сессии содержится и, видимо, в Pro он был просто числом.

В актуальной версии:

"eid":<text>,            /* session ID */

Вопрос, почему в ответе при логине он называется eid, а в запросы подаётся как sid — интересный.

21

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Здравствуйте. Подскажите, пожалуйста, как получить значения из таблицы отчета. Привожу свой код, который, к сожалению, выдает ошибки. Отчет units выполняется и выводит список таблиц, мне нужно получить данные из третьей таблицы, что я и пытаюсь сделать с помощью units1 = wialon.report_select_result_rows.

from wialon import Wialon, flags
import json
def main():    
    wialon = Wialon()
    try:
        login = wialon.token_login(token='***')        
    except WialonError as e:
        print (e)
        return
    wialon.sid = login['eid']

                            
    try:
        units = wialon.report_exec_report({
        'reportResourceId': 13503585,    
        'reportTemplateId': 8,    
        'reportObjectId': 13676716,    
        'reportObjectSecId': 0,
        'interval':{'from':1554836400,'to':1554919200,'flags':0x00}})
        
         units1 = wialon.report_select_result_rows({
            'tableIndex':2,
            'config':{
            'type':'range',
            'data':{
                'from':1554836400,
                'to':1554919200,
                'level':2}}})  
    except WialonError as e:
        print (e)
        return
      
    print (units['reportResult']['tables'][2])
    print (units1)
if __name__ == '__main__':
    main()
22

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Добрый день тт.

Из замечаний:
1) Нет импорта WialonError;
2) Не верно передаются параметры в report_exec_report и report_select_result_rows;
3) Вы не делаете logout и из-за этого у Вас в будущем могут быть проблемы при частом использовании скрипта (много активных сессий);
4) В report_select_result_rows не верный параметры from и to, Вы передаете время, а это на самом деле индексы строк отчета

+ Пример правильной работы
from wialon import Wialon, WialonError


TOKEN = '...'


def execute_report(wialon):

    report_params = {
        'reportResourceId': 13503585,
        'reportTemplateId': 8,
        'reportObjectId': 13676716,
        'reportObjectSecId': 0,
        'reportTemplate': None,
        'interval': {
            # from - unix timestamp
            'from': 1554836400,
            # to - unix timestamp
            'to': 1554919200,
            'flags': 0
        }
    }

    units = wialon.report_exec_report(**report_params)

    result_rows_params = {
        'tableIndex': 2,
        'config': {
            'type': 'range',
            'data': {
                # from - index of first row, not a unix timestamp
                'from': 0,  # This is jsut for example, please change it
                # to - index of last row, not a unix timestamp
                'to': 10,  # This is jsut for example, please change it
                'level': 2
            }
        }
    }

    units_rows = wialon.report_select_result_rows(**result_rows_params)

    print(units['reportResult']['tables'][2])
    print(units_rows)


def main():
    wialon = Wialon()

    try:
        login = wialon.token_login(token=TOKEN)
    except WialonError as e:
        print("Error while login:", e)
        return

    wialon.sid = login['eid']

    try:
        execute_report(wialon)
    except WialonError as e:
        print("Error while execturing report:", e)

    # logout is necessary, for preventing error with a lot of session from one ip
    try:
        wialon.core_logout()
    except WialonError as e:
        print("Error while logout")


if __name__ == '__main__':
    main()
23

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

никогда не отрабатывались ошибки в данном модуле.. поскольку в большинстве сслучаев работало без ошибок ..сейчас обработка поработала и вывалило "name 'unicode' is not defined " .. то есть по сути не получаю код ошибки виалона ..

я так понимаю это в связи с третьим питоном ? как то это доработать можно ?  я конечно подъуработал исходик для себя ..

подпись сломали .. впрочем не удивительно
24

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Добрый день tdt66

Мы обновили python-wialon и поправили данное поведение. Обновите пожалуйста у себя библиотеку (версия 1.1.5)

+ Как обновить
# если вы используете python2
python2 -m pip install -U python-wialon
# если вы используете python3
python3 -m pip install -U python-wialon
25

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

есть ли возможность сделать exchange_export_messages и обратную операцию ?

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

подпись сломали .. впрочем не удивительно
26

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Добрый день, tdt66!

Спасибо за обращение, там была ошибка, а именно - ответ был бинарным, а библиотека пыталась его декодировать как utf8, из-за этого и получался "битый" zip файл. Мы поправили это и Вы можете обновить ее и попробовать снова.

Про импорт - для импорта необходимо послать запрос c content-type: multipart/form-data, на данный момент библиотека этого не позволяет.

27

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

mitu пишет:

Добрый день, tdt66!

Спасибо за обращение, там была ошибка, а именно - ответ был бинарным, а библиотека пыталась его декодировать как utf8, из-за этого и получался "битый" zip файл. Мы поправили это и Вы можете обновить ее и попробовать снова.

Про импорт - для импорта необходимо послать запрос c content-type: multipart/form-data, на данный момент библиотека этого не позволяет.

да , все работает ! спасибо .
и будет ли доработка чтобы импорт был возможен ?
иначе насколько я понимаю надо в обход импорт организовывать ?

подпись сломали .. впрочем не удивительно
28

Python библиотека для Remote Api от Gurtam

(24/03/2020 18:44:02 отредактировано mitu)

Re: Python библиотека для Remote Api от Gurtam

Добрый день, tdt66!

Да, на данный момент только в обход (про доработку - увы сказать не могу когда будет)

Но это можно быстро реализовать своими руками с помощью библиотеки requests

import requests
import wialon


def upload(api, file, unit_id):
    files = {'file': file}
    base_url = 'https://hst-api.wialon.com/wialon/ajax.html?'

    url = base_url + 'svc=exchange/import_messages&params={"itemId":%s}&sid=%s'
    r = requests.post(url % (unit_id, api.sid), files=files)
    print(r.text)


def main(token):
    api = wialon.Wialon(scheme='https', port=443)
    unit_id = YOUR_UNIT_ID
    response = api.token_login({'token': token})
    api.sid = response['eid']
    try:
        with open('filename.zip', 'rb') as f:
            upload(api, f, unit_id)
    finally:
        api.core_logout()
29

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

понял , спасибо за пример , воспользуемся ..

подпись сломали .. впрочем не удивительно
30

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

В чем преимущество использования данной либы в сравнении с обычным requests?

Independent Expert
31

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

dmytro.yaroshenko пишет:

В чем преимущество использования данной либы в сравнении с обычным requests?

Либа - просто обёртка над RemoteAPI. Из плюсов - она сохраняет сессию (sid) и автоматом подставляет её в запросы.

Если requests решает ваши задачи - используйте его.

32

Python библиотека для Remote Api от Gurtam

(23/01/2021 13:50:46 отредактировано gpe)

Re: Python библиотека для Remote Api от Gurtam

Здравствуйте.

Помогите пожалуйста отключить проверку SSL,
нужно для работы с Local серверами на которых нет сертификатов, вот ошибка:

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)>

Python 3.6.9
urllib3==1.22

Спасибо!

33

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

gpe пишет:

Здравствуйте.

Помогите пожалуйста отключить проверку SSL,
нужно для работы с Local серверами на которых нет сертификатов, вот ошибка:

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)>

Python 3.6.9
urllib3==1.22

Спасибо!

Если нет сертификатов, попробуйте обращаться по http вместо https.

34

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

shmi пишет:
gpe пишет:

Здравствуйте.

Помогите пожалуйста отключить проверку SSL,
нужно для работы с Local серверами на которых нет сертификатов, вот ошибка:

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)>

Python 3.6.9
urllib3==1.22

Спасибо!

Если нет сертификатов, попробуйте обращаться по http вместо https.

На них закрыт http, только через https, изменить на Local я ничего не могу.

35

Python библиотека для Remote Api от Gurtam

(22/01/2022 19:31:16 отредактировано dmytro.yaroshenko)

Re: Python библиотека для Remote Api от Gurtam

Сделал асинхронный форк библиотеки на aiohttp
py-aiowialon

Добавил Wialon.start_poling() метод и декоратор Wialon.event_handler() для отслеживания avl_evts,
token теперь можно указать прямо при создании объекта класса Wialon

+ Установка
pip install aiohttp
pip install py-aiowialon
+ Пример использования
import asyncio
from aiowialon import Wialon, WialonEvents, WialonEvent, flags


is_init = True


def run():

    wialon_session = Wialon(host='TEST HOST', token='TEST TOKEN')

    async def add_evts_to_session():
        spec = {
            'itemsType': 'avl_unit',
            'propName': 'sys_name',
            'propValueMask': '*',
            'sortType': 'sys_name'
        }
        interval = {"from": 0, "to": 100}
        units = await wialon_session.core_search_items(spec=spec, force=1, flags=5, **interval)
        ids = [u['id'] for u in units['items']]

        spec = [
            {
                "type": "col",
                "data": ids,
                "flags": flags.ITEM_DATAFLAG_BASE + flags.ITEM_UNIT_DATAFLAG_POS,
                "mode": 0
            }
        ]
        await wialon_session.core_update_data_flags(spec=spec)

    @wialon_session.event_handler
    async def event_handler(events: WialonEvents):
        global is_init
        if is_init:
            await add_evts_to_session()
            is_init = False

        if 116106 in events.data:
            item_event: WialonEvent = events.data[116106]
            print(item_event.item, item_event.e_type, item_event.desc)

    @wialon_session.event_handler
    async def event_handler(events: WialonEvents):
        spec = {
            'itemsType': 'avl_unit',
            'propName': 'sys_name',
            'propValueMask': '*',
            'sortType': 'sys_name'
        }
        interval = {"from": 0, "to": 0}
        units = await wialon_session.core_search_items(spec=spec, force=1, flags=5, **interval)
        print(events.__dict__, units['totalItemsCount'])

    wialon_session.start_poling()


if __name__ == '__main__':
    run()
Independent Expert
36

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Не проще ли используя threading держать сессию в рамках приложения.... И подставлять sid в запросы...

gps-report.ru
Разработка приложений для Wialon
Мы расширяем возможности мониторинга!
Telegram: @dire77
37

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

А в классе Виалон, желательно ещё метод получения токена, путем предоставления логина/пароля/урл_апи.

gps-report.ru
Разработка приложений для Wialon
Мы расширяем возможности мониторинга!
Telegram: @dire77
38

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

developer77 пишет:

А в классе Виалон, желательно ещё метод получения токена, путем предоставления логина/пароля/урл_апи.

этот метод не доступен уже очень давно, токен можно получить только через токен менеджер, через веб-форму авторизации или из уже открытой сессии, в веб-форму не возможно подставить пароль заведомо, только ввести ручками.

Independent Expert
39

Python библиотека для Remote Api от Gurtam

(22/01/2022 19:50:43 отредактировано dmytro.yaroshenko)

Re: Python библиотека для Remote Api от Gurtam

developer77 пишет:

Не проще ли используя threading держать сессию в рамках приложения.... И подставлять sid в запросы...


Проще с помощью event_handler реагировать на ивенты, если нужно отслеживать изменения в рамках одной сессии, по аналогии с тем как это делает wialon.js.

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

Опять же зависит от того какой подход написания кода вы предпочли, мне удобнее работать с async методами объекта, чем держать запущенным еще один поток

Independent Expert
40

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

developer77 пишет:

Не проще ли используя threading держать сессию в рамках приложения.... И подставлять sid в запросы...

к примеру, для приложения на базе PyQt5 правильно будет объявить QThread и внутри него вызывать класс WIalon из wialon-python, на каком-то асинхронном фреймворке типа aiogram - лучше воспользоваться моим форком py-aiowialon

Independent Expert
41

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

dmytro.yaroshenko пишет:

Сделал асинхронный форк библиотеки на aiohttp
py-aiowialon

Добавил Wialon.start_poling() метод и декоратор Wialon.event_handler() для отслеживания avl_evts,
token теперь можно указать прямо при создании объекта класса Wialon

+ Установка
pip install aiohttp
pip install py-aiowialon
+ Пример использования
import asyncio
from aiowialon import Wialon, WialonEvents, WialonEvent, flags


is_init = True


def run():

    wialon_session = Wialon(host='TEST HOST', token='TEST TOKEN')

    async def add_evts_to_session():
        spec = {
            'itemsType': 'avl_unit',
            'propName': 'sys_name',
            'propValueMask': '*',
            'sortType': 'sys_name'
        }
        interval = {"from": 0, "to": 100}
        units = await wialon_session.core_search_items(spec=spec, force=1, flags=5, **interval)
        ids = [u['id'] for u in units['items']]

        spec = [
            {
                "type": "col",
                "data": ids,
                "flags": flags.ITEM_DATAFLAG_BASE + flags.ITEM_UNIT_DATAFLAG_POS,
                "mode": 0
            }
        ]
        await wialon_session.core_update_data_flags(spec=spec)

    @wialon_session.event_handler
    async def event_handler(events: WialonEvents):
        global is_init
        if is_init:
            await add_evts_to_session()
            is_init = False

        if 116106 in events.data:
            item_event: WialonEvent = events.data[116106]
            print(item_event.item, item_event.e_type, item_event.desc)

    @wialon_session.event_handler
    async def event_handler(events: WialonEvents):
        spec = {
            'itemsType': 'avl_unit',
            'propName': 'sys_name',
            'propValueMask': '*',
            'sortType': 'sys_name'
        }
        interval = {"from": 0, "to": 0}
        units = await wialon_session.core_search_items(spec=spec, force=1, flags=5, **interval)
        print(events.__dict__, units['totalItemsCount'])

    wialon_session.start_poling()


if __name__ == '__main__':
    run()

а зачем ? виалон же однопоточное изделие . нельзя одновременно несколько запросов делать иначе БАН !

подпись сломали .. впрочем не удивительно
42

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Почему.....

gps-report.ru
Разработка приложений для Wialon
Мы расширяем возможности мониторинга!
Telegram: @dire77
43

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

tdt66 пишет:

а зачем ? виалон же однопоточное изделие . нельзя одновременно несколько запросов делать иначе БАН !

А как-же batch-запросы?

44

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Да и sid можно сменить и слать несколько параллельных запросов

gps-report.ru
Разработка приложений для Wialon
Мы расширяем возможности мониторинга!
Telegram: @dire77
45

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

SanderAMC пишет:
tdt66 пишет:

а зачем ? виалон же однопоточное изделие . нельзя одновременно несколько запросов делать иначе БАН !

А как-же batch-запросы?

в чем проблема бача и однопоточности ?

подпись сломали .. впрочем не удивительно
46

Python библиотека для Remote Api от Gurtam

(13/12/2023 23:56:05 отредактировано kenesg12)

Re: Python библиотека для Remote Api от Gurtam

Всем привет!
Создаю следующий скрипт для отправки команды на ТС. В настройках ТС команды созданы, запрос unit/get_command_definition_data отрабатывает и возвращает список добавленных команд. На самом сайте команды отправляются и корректно выполняются на устройствах, а вот через api не хочет работать. Делаю так:

    param = {"itemId": 27602522, "commandName": "output_off", "linkType": "tcp", "param": "1|", "timeout": 15}
    try:
        r = wialon_api.unit_exec_cmd(param)
        print(r)
    except WialonError as e:
        print(e)

Но возвращает ошибку error: 5
Что я делаю не так?

  • Python библиотека для Remote Api от Gurtam
47

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

kenesg12 пишет:

Всем привет!
Создаю следующий скрипт для отправки команды на ТС. В настройках ТС команды созданы, запрос unit/get_command_definition_data отрабатывает и возвращает список добавленных команд. На самом сайте команды отправляются и корректно выполняются на устройствах, а вот через api не хочет работать. Делаю так:

    param = {"itemId": 27602522, "commandName": "output_off", "linkType": "tcp", "param": "1|", "timeout": 15}
    try:
        r = wialon_api.unit_exec_cmd(param)
        print(r)
    except WialonError as e:
        print(e)

Но возвращает ошибку error: 5
Что я делаю не так?


UP! UP! UP!
Ребята помогите пожалуйста, любая информация, направьте, очень прошу!

48

Python библиотека для Remote Api от Gurtam

(16/12/2023 18:59:33 отредактировано kalaschnikow)

Re: Python библиотека для Remote Api от Gurtam

Сорри, если не в тему - я ни в Пайтоне, ни в Wialon SDK библиотеке ничего не понимаю - но в качестве идеи (вдруг поможет):

https://sdk.wialon.com/wiki/en/pro/remo … t/exec_cmd

Там вроде речь о "unit/exec_cmd", а не "unit_exec_cmd".

И еще идея: покрути значение param. Что-то оно подозрительное какое-то smile Да и называется в документации "cmdParam", а не просто "param".

49

Python библиотека для Remote Api от Gurtam

(16/12/2023 19:03:21 отредактировано kenesg12)

Re: Python библиотека для Remote Api от Gurtam

kalaschnikow пишет:

Сорри, если не в тему - я ни в Пайтоне, ни в Wialon SDK библиотеке ничего не понимаю - но в качестве идеи (вдруг поможет):

https://sdk.wialon.com/wiki/en/pro/remo … t/exec_cmd

Там вроде речь о "unit/exec_cmd", а не "unit_exec_cmd".

И еще идея: покрути значение param. Что-то оно подозрительное какое-то smile

Спасибо за ответ. По поводу "unit/exec_cmd" ошибок нет, это особенность библиотеки "python-wialon", там нужно писать именно так как я указал.
Да я тоже подозреваю что в параметрах, но где и как? CmdParam или param зависит от типа версии wialon, в моей именно param, иначе сразу сообщает в самом ответе, что название параметра неверное и нужно указать именно param.  Вроде все остальное  перепробовал.
Прошу помочь!

50

Python библиотека для Remote Api от Gurtam

(16/12/2023 20:46:31 отредактировано kalaschnikow)

Re: Python библиотека для Remote Api от Gurtam

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

Ты намекал, что мол "пешком команда выполняется". Пришли что выполняется собссно. Какие команды с какими параметрами и т.д.

Как я уже говорил, я не спецулист, но может просто у тебя "глаз замылился" и вдргу я (или кто-то другой)  что-нибудь увижу...

51

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

Команда выполняется с сайта. Там просто нажимаем кнопочку и все. Параметров я не вижу. Это как подтверждение того, что все настроено правильно. Через апи у меня не получается.

52

Python библиотека для Remote Api от Gurtam

(17/12/2023 18:49:10 отредактировано kalaschnikow)

Re: Python библиотека для Remote Api от Gurtam

Пойди в браузере в "DevTools" (или как оно там по-русски называется) и посмотри какие запросы выполняются и с какими параметрами. В Хроме эти DevTools вызываются нажатием "Ctrl+Shift+I". В закладке "Network" все должно быть видно.
Если что тут туториал по этому делу: https://developer.chrome.com/docs/devtools/network

То, что ты хочешь сделать через АПИ собссно точно так же и делается. Т.е. через http запросы.

53

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

kalaschnikow спасибо за советы, я все таки разобрался. Вы правильно предположили что проблема в параметрах, проблема была в названии команды commandName  вместо "output_off", надо было указать именно название которое я дал при создании команды на ТС, т.е. "Разблокировать". И все заработало без ошибок.

54

Python библиотека для Remote Api от Gurtam

Re: Python библиотека для Remote Api от Gurtam

kenesg12 пишет:

kalaschnikow спасибо за советы, я все таки разобрался. Вы правильно предположили что проблема в параметрах, проблема была в названии команды commandName  вместо "output_off", надо было указать именно название которое я дал при создании команды на ТС, т.е. "Разблокировать". И все заработало без ошибок.

Рад, что получилось разобраться. У меня тож часто такая петрушка. Букву не такую поставишь и потом полдня мучаешься....

И этааа... давай "на ты". Как программер программеру smile

П.С. Кстати, ты не из Казахстана случаем?