Найти - Пользователи
Полная версия: Ldap3 Active Directory Unicode
Начало » Python для новичков » Ldap3 Active Directory Unicode
1
artisstm
Здравствуйте, я полный ноль в Python (наверное часто это пишут)
На работе внедряю IP-телефонию и решил сделать телефонную книгу, для этого решил брать информацию из Active Directory и сразу же столкнулся с проблемой.
С помощью библиотеки ldap3 я подключаюсь к AD и вывожу в консоль нужную информацию, однако данные на английском языке выводятся без проблем, но русский выводится в виде Unicode.
Как мне преобразовать полученную кашу в читабельный вид?
Получаю вот такую ерунду
     "entries": [
        {
            "attributes": {
                "name": "\u0410\u0440\u0442\u0435\u043c \u0417\u0432\u0435\u0440\u0435\u0432",
                "telephoneNumber": "105"
            },
        },
Теперь вы знаете, как меня зовут и надеюсь поможете))
Мне бы хотя бы на русский это перевести, а дальше, как это в нормальный документ доделать надеюсь додумаюсь
py.user.next
Поставь третий питон.
  
>>> s = "\u0410\u0440\u0442\u0435\u043c \u0417\u0432\u0435\u0440\u0435\u0432"
>>> s
'Артем Зверев'
>>>
artisstm
После выходных решил проверить, вот что выдает sys.version
3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:57:36)
Если что - я работаю в PyCharm

upd. Проверил сейчас в консоли питона - тоже самое
artisstm
При этом если строку добавить в переменную и вывести на экран, как сделали вы, то все отлично
py.user.next
  
>>> data = \
... {
...     "attributes": {
...         "name": "\u0410\u0440\u0442\u0435\u043c \u0417\u0432\u0435\u0440\u0435\u0432",
...         "telephoneNumber": "105"
...     }
... }
>>> 
>>> data
{'attributes': {'name': 'Артем Зверев', 'telephoneNumber': '105'}}
>>>

Приведи код, через который получаешь данные.
artisstm
 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()
artisstm
Вывел через print(c.entries) и все заработало, буду думать как это теперь в нужном мне виде вывести
Спасибо за помощь, если подскажете, как имя и телефон в переменную присвоить - буду счастлив
py.user.next
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? Этот формат не для человека сделан, а для компьютера. Поэтому разницы нет, как оно выглядит; главное, чтобы хранилось правильно.
artisstm
py.user.next
Зачем ты вообще читаешь данные в json? Этот формат не для человека сделан, а для компьютера. Поэтому разницы нет, как оно выглядит, главное, чтобы хранилось правильно.
Понял, спасибо. Не буду глупые вопросы задавать, пойду читать интернеты
artisstm
Оставлю для кого нибудь то, что у меня вышло, думаю теперь как в 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]

Может кому то поможет
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB