Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 8, 2017 15:59:11

artisstm
Зарегистрирован: 2017-12-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Ldap3 Active Directory Unicode

Здравствуйте, я полный ноль в Python (наверное часто это пишут)
На работе внедряю IP-телефонию и решил сделать телефонную книгу, для этого решил брать информацию из Active Directory и сразу же столкнулся с проблемой.
С помощью библиотеки ldap3 я подключаюсь к AD и вывожу в консоль нужную информацию, однако данные на английском языке выводятся без проблем, но русский выводится в виде Unicode.
Как мне преобразовать полученную кашу в читабельный вид?
Получаю вот такую ерунду

     "entries": [
        {
            "attributes": {
                "name": "\u0410\u0440\u0442\u0435\u043c \u0417\u0432\u0435\u0440\u0435\u0432",
                "telephoneNumber": "105"
            },
        },
Теперь вы знаете, как меня зовут и надеюсь поможете))
Мне бы хотя бы на русский это перевести, а дальше, как это в нормальный документ доделать надеюсь додумаюсь

Отредактировано artisstm (Дек. 8, 2017 15:59:31)

Офлайн

#2 Дек. 8, 2017 16:12:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Ldap3 Active Directory Unicode

Поставь третий питон.

  
>>> s = "\u0410\u0440\u0442\u0435\u043c \u0417\u0432\u0435\u0440\u0435\u0432"
>>> s
'Артем Зверев'
>>>



Офлайн

#3 Дек. 11, 2017 07:36:33

artisstm
Зарегистрирован: 2017-12-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Ldap3 Active Directory Unicode

После выходных решил проверить, вот что выдает sys.version
3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:57:36)
Если что - я работаю в PyCharm

upd. Проверил сейчас в консоли питона - тоже самое

Отредактировано artisstm (Дек. 11, 2017 07:43:09)

Офлайн

#4 Дек. 11, 2017 07:44:50

artisstm
Зарегистрирован: 2017-12-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Ldap3 Active Directory Unicode

При этом если строку добавить в переменную и вывести на экран, как сделали вы, то все отлично

Офлайн

#5 Дек. 11, 2017 08:16:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Ldap3 Active Directory Unicode

  
>>> data = \
... {
...     "attributes": {
...         "name": "\u0410\u0440\u0442\u0435\u043c \u0417\u0432\u0435\u0440\u0435\u0432",
...         "telephoneNumber": "105"
...     }
... }
>>> 
>>> data
{'attributes': {'name': 'Артем Зверев', 'telephoneNumber': '105'}}
>>>

Приведи код, через который получаешь данные.



Отредактировано py.user.next (Дек. 11, 2017 08:18:43)

Офлайн

#6 Дек. 11, 2017 09:09:11

artisstm
Зарегистрирован: 2017-12-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Ldap3 Active Directory Unicode

 from ldap3 import Server, Connection, AUTO_BIND_NO_TLS, SUBTREE
def get_ldap_info():
    with Connection(Server('SERVER_IP', port=389, use_ssl=False),
                    auto_bind=AUTO_BIND_NO_TLS,
                    user='DOMAIN\\User', password='Pass') as c:
        c.search(search_base='OU=OU,OU=OU,DC=CORP,DC=CORP,DC=ru',
                 search_filter='(&(objectClass=user))',
                 search_scope=SUBTREE,
                 attributes=['name', 'telephoneNumber'],
                 get_operational_attributes=True)
    print(c.response_to_json())
get_ldap_info()

Офлайн

#7 Дек. 11, 2017 09:14:08

artisstm
Зарегистрирован: 2017-12-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Ldap3 Active Directory Unicode

Вывел через print(c.entries) и все заработало, буду думать как это теперь в нужном мне виде вывести
Спасибо за помощь, если подскажете, как имя и телефон в переменную присвоить - буду счастлив

Офлайн

#8 Дек. 11, 2017 09:28:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Ldap3 Active Directory Unicode

http://ldap3.readthedocs.io/connection.html#responses

Responses are received and stored in the connection.response as a list of dictionaries. You can get the search result entries of a Search operation iterating over the response attribute.
  
>>> import json
>>> 
>>> data_string = """[{"abc": 1, "абв": 2}]"""
>>> 
>>> print(json.dumps(json.loads(data_string)))
[{"abc": 1, "\u0430\u0431\u0432": 2}]
>>> 
>>> print(json.dumps(json.loads(data_string), ensure_ascii=False))
[{"abc": 1, "абв": 2}]
>>> 
  
>>> import json
>>> 
>>> s = """[{"abc": 1, "\\u0430\\u0431\\u0432": 2}]"""
>>> 
>>> print(s)
[{"abc": 1, "\u0430\u0431\u0432": 2}]
>>> 
>>> json.loads(s)
[{'abc': 1, 'абв': 2}]
>>>

Зачем ты вообще читаешь данные в json? Этот формат не для человека сделан, а для компьютера. Поэтому разницы нет, как оно выглядит; главное, чтобы хранилось правильно.



Отредактировано py.user.next (Дек. 11, 2017 09:34:47)

Офлайн

#9 Дек. 11, 2017 09:40:41

artisstm
Зарегистрирован: 2017-12-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Ldap3 Active Directory Unicode

py.user.next
Зачем ты вообще читаешь данные в json? Этот формат не для человека сделан, а для компьютера. Поэтому разницы нет, как оно выглядит, главное, чтобы хранилось правильно.
Понял, спасибо. Не буду глупые вопросы задавать, пойду читать интернеты

Офлайн

#10 Дек. 11, 2017 13:15:43

artisstm
Зарегистрирован: 2017-12-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Ldap3 Active Directory Unicode

Оставлю для кого нибудь то, что у меня вышло, думаю теперь как в html все это записать

[code python]from ldap3 import Server, Connection, AUTO_BIND_NO_TLS, SUBTREE


def get_ldap_info():
with Connection(Server('IP Адресс AD', port=389, use_ssl=False),
auto_bind=AUTO_BIND_NO_TLS,
user='Домин\\логин', password='Пароль') as c:
c.search(search_base='OU=ОУ,OU=ОУ,DC=corp,DC=ДС,DC=ru',
search_filter='(&(objectClass=user))',
search_scope=SUBTREE,
attributes=['name', 'telephoneNumber'],
get_operational_attributes=True)
for i in range(len(c.response)):
uname = str(c.response[i]['attributes']['name'])
uphone = str(c.response[i]['attributes']['telephoneNumber'])
if uphone[0] is '[':
print(uname + ' - Нет номера')
else:
print(uname + ' - ' + uphone)
get_ldap_info()[/code]

Может кому то поможет

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version