nntplib.md
1> **Источник:** https://python-all.ru/3.3/library/nntplib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 21.16. [`nntplib`](https://python-all.ru/3.3/library/nntplib.html#module-nntplib) – клиент протокола NNTP89**Исходный код:** [Lib/nntplib.py](https://python-all.ru/src/3.3/Lib/nntplib.py)1011---1213Этот модуль определяет класс [`NNTP`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP), который реализует клиентскую часть протокола передачи сетевых новостей (Network News Transfer Protocol). Его можно использовать для создания программы чтения новостей, отправки новостей или автоматизированной обработки новостей. Он совместим с [**RFC 3977**](https://python-all.ru/3.3/library/nntplib.html), а также с более старыми [**RFC 977**](https://python-all.ru/3.3/library/nntplib.html) и [**RFC 2980**](https://python-all.ru/3.3/library/nntplib.html).1415Вот два небольших примера использования. Чтобы вывести статистику по группе новостей и напечатать темы последних 10 статей:1617```python18>>> s = nntplib.NNTP('news.gmane.org')19>>> resp, count, first, last, name = s.group('gmane.comp.python.committers')20>>> print('Group', name, 'has', count, 'articles, range', first, 'to', last)21Group gmane.comp.python.committers has 1096 articles, range 1 to 109622>>> resp, overviews = s.over((last - 9, last))23>>> for id, over in overviews:24... print(id, nntplib.decode_header(over['subject']))25...261087 Re: Commit privileges for Łukasz Langa271088 Re: 3.2 alpha 2 freeze281089 Re: 3.2 alpha 2 freeze291090 Re: Commit privileges for Łukasz Langa301091 Re: Commit privileges for Łukasz Langa311092 Updated ssh key321093 Re: Updated ssh key331094 Re: Updated ssh key341095 Hello fellow committers!351096 Re: Hello fellow committers!36>>> s.quit()37'205 Bye!'38```3940Чтобы опубликовать статью из двоичного файла (предполагается, что статья содержит корректные заголовки и у вас есть права на публикацию в данной группе новостей):4142```python43>>> s = nntplib.NNTP('news.gmane.org')44>>> f = open('article.txt', 'rb')45>>> s.post(f)46'240 Article posted successfully.'47>>> s.quit()48'205 Bye!'49```5051Сам модуль определяет следующие классы:5253#### `class nntplib.NNTP(host, port=119, user=None, password=None, readermode=None, usenetrc=False[, timeout])`5455Возвращает новый объект [`NNTP`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP), представляющий соединение с NNTP-сервером, работающим на узле *host*, прослушивающим порт *port*. Для сокетного соединения можно указать необязательный *timeout*. Если указаны необязательные *user* и *password*, или если подходящие учётные данные присутствуют в `/.netrc` и необязательный флаг *usenetrc* равен true, для идентификации и аутентификации пользователя на сервере используются команды `AUTHINFO USER` и `AUTHINFO PASS`. Если необязательный флаг *readermode* равен true, то перед выполнением аутентификации отправляется команда `mode reader`. Режим читателя иногда необходим, если вы подключаетесь к NNTP-серверу на локальной машине и собираетесь вызывать специфичные для читателя команды, такие как `group`. Если вы получаете неожиданные [`NNTPPermanentError`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTPPermanentError), возможно, потребуется установить *readermode*. Класс [`NNTP`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP) поддерживает оператор [`with`](https://python-all.ru/3.3/reference/compound_stmts.html#with) для безусловного перехвата исключений [`socket.error`](https://python-all.ru/3.3/library/socket.html#socket.error) и закрытия NNTP-соединения по завершении. Ниже приведён пример использования:5657```python58>>> from nntplib import NNTP59>>> with NNTP('news.gmane.org') as n:60... n.group('gmane.comp.python.committers')61...62('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')63>>>64```6566Изменено в версии 3.2: *usenetrc* теперь по умолчанию `False`.6768Изменено в версии 3.3: Добавлена поддержка оператора [`with`](https://python-all.ru/3.3/reference/compound_stmts.html#with).6970#### `class nntplib.NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False[, timeout])`7172Возвращает новый объект [`NNTP_SSL`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP_SSL), представляющий зашифрованное соединение с NNTP-сервером, работающим на узле *host*, прослушивающим порт *port*. Объекты [`NNTP_SSL`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP_SSL) имеют те же методы, что и объекты [`NNTP`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP). Если *port* опущен, используется порт 563 (NNTPS). *ssl\_context* также необязателен и представляет собой объект [`SSLContext`](https://python-all.ru/3.3/library/ssl.html#ssl.SSLContext). Все остальные параметры ведут себя так же, как для [`NNTP`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP).7374Обратите внимание, что SSL на порту 563 не рекомендуется согласно [**RFC 4642**](https://python-all.ru/3.3/library/nntplib.html), вместо него следует использовать STARTTLS, как описано ниже. Однако некоторые серверы поддерживают только первый вариант.7576Новое в версии 3.2.7778#### `exception nntplib.NNTPError`7980Производный от стандартного исключения [`Exception`](https://python-all.ru/3.3/library/exceptions.html#Exception), это базовый класс для всех исключений, возбуждаемых модулем [`nntplib`](https://python-all.ru/3.3/library/nntplib.html#module-nntplib). Экземпляры этого класса имеют следующий атрибут:8182#### `response`8384Ответ сервера, если доступен, в виде объекта [`str`](https://python-all.ru/3.3/library/stdtypes.html#str).8586#### `exception nntplib.NNTPReplyError`8788Исключение, возникающее при получении неожиданного ответа от сервера.8990#### `exception nntplib.NNTPTemporaryError`9192Исключение возбуждается, когда получен код ответа в диапазоне 400–499.9394#### `exception nntplib.NNTPPermanentError`9596Исключение возбуждается, когда получен код ответа в диапазоне 500–599.9798#### `exception nntplib.NNTPProtocolError`99100Исключение возбуждается, когда от сервера получен ответ, который не начинается с цифры в диапазоне 1–5.101102#### `exception nntplib.NNTPDataError`103104Исключение возбуждается при наличии ошибки в данных ответа.105106## 21.16.1. Объекты NNTP107108При подключении объекты [`NNTP`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP) и [`NNTP_SSL`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP_SSL) поддерживают следующие методы и атрибуты.109110### 21.16.1.1. Атрибуты111112#### `NNTP.nntp_version`113114Целое число, представляющее версию протокола NNTP, поддерживаемую сервером. На практике должно быть равно `2` для серверов, заявляющих о соответствии [**RFC 3977**](https://python-all.ru/3.3/library/nntplib.html), и `1` для остальных.115116Новое в версии 3.2.117118#### `NNTP.nntp_implementation`119120Строка, описывающая название программного обеспечения и версию сервера NNTP, или [`None`](https://python-all.ru/3.3/library/constants.html#None), если сервер не сообщил эту информацию.121122Новое в версии 3.2.123124### 21.16.1.2. Методы125126*Ответ*, возвращаемый в качестве первого элемента кортежа результатов почти всех методов, – это ответ сервера: строка, начинающаяся с трёхзначного кода. Если ответ сервера указывает на ошибку, метод возбуждает одно из перечисленных выше исключений.127128Многие из следующих методов принимают необязательный аргумент, передаваемый только по ключу, *file*. Когда аргумент *file* указан, он должен быть либо [*файловый объект*](https://python-all.ru/3.3/glossary.html#term-file-object), открытым для бинарной записи, либо именем файла на диске для записи. В этом случае метод будет записывать все данные, возвращаемые сервером (за исключением строки ответа и завершающей точки), в файл; любой список строк, кортежей или объектов, который метод обычно возвращает, будет пуст.129130Изменено в версии 3.2: Многие из следующих методов были переработаны и исправлены, что делает их несовместимыми с их аналогами из версии 3.1.131132#### `NNTP.quit()`133134Отправляет команду `QUIT` и закрывает соединение. После вызова этого метода не следует вызывать другие методы объекта NNTP.135136#### `NNTP.getwelcome()`137138Возвращает приветственное сообщение, отправленное сервером в ответ на начальное подключение. (Это сообщение иногда содержит отказ от ответственности или справочную информацию, которая может быть полезна пользователю.)139140#### `NNTP.getcapabilities()`141142Return the [**RFC 3977**](https://python-all.ru/3.3/library/nntplib.html) capabilities advertised by the server, as a [`dict`](https://python-all.ru/3.3/library/stdtypes.html#dict) instance mapping capability names to (possibly empty) lists of values. On legacy servers which don’t understand the `CAPABILITIES` command, an empty dictionary is returned instead.143144```python145>>> s = NNTP('news.gmane.org')146>>> 'POST' in s.getcapabilities()147True148```149150Новое в версии 3.2.151152#### `NNTP.login(user=None, password=None, usenetrc=True)`153154Отправляет команды `AUTHINFO` с именем пользователя и паролем. Если *user* и *password* равны None, а *usenetrc* равен true, то по возможности будут использованы учётные данные из `~/.netrc`.155156Если намеренно не отложено, вход обычно выполняется во время инициализации объекта [`NNTP`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP), и отдельный вызов этой функции не требуется. Чтобы отложить аутентификацию, не указывайте *user* или *password* при создании объекта и установите *usenetrc* в False.157158Новое в версии 3.2.159160#### `NNTP.starttls(ssl_context=None)`161162Отправляет команду `STARTTLS`. Аргумент *ssl\_context* необязателен и должен быть объектом [`ssl.SSLContext`](https://python-all.ru/3.3/library/ssl.html#ssl.SSLContext). Это включит шифрование в NNTP-соединении.163164Обратите внимание, что это нельзя делать после передачи аутентификационных данных; аутентификация по умолчанию выполняется, если это возможно, во время инициализации объекта [`NNTP`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP). См. [`NNTP.login()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.login) для получения информации о том, как подавить это поведение.165166Новое в версии 3.2.167168#### `NNTP.newgroups(date, *, file=None)`169170Отправляет команду `NEWGROUPS`. Аргумент *date* должен быть объектом [`datetime.date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) или [`datetime.datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime). Возвращает пару `(response, groups)`, где *groups* – это список, представляющий группы, появившиеся после указанной даты *date*. Однако если указан *file*, то *groups* будет пустым.171172```python173>>> from datetime import date, timedelta174>>> resp, groups = s.newgroups(date.today() - timedelta(days=3))175>>> len(groups)17685177>>> groups[0]178GroupInfo(group='gmane.network.tor.devel', last='4', first='1', flag='m')179```180181#### `NNTP.newnews(group, date, *, file=None)`182183Отправляет команду `NEWNEWS`. Здесь *group* – это имя группы или `'*'`, а *date* имеет то же значение, что и для [`newgroups()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.newgroups). Возвращает пару `(response, articles)`, где *articles* – это список идентификаторов сообщений.184185Эта команда часто отключается администраторами NNTP-серверов.186187#### `NNTP.list(group_pattern=None, *, file=None)`188189Отправляет команду `LIST` или `LIST ACTIVE`. Возвращает пару `(response, list)`, где *list* – это список кортежей, представляющих все группы, доступные на этом сервере NNTP, при необходимости соответствующие строке шаблона *group\_pattern*. Каждый кортеж имеет вид `(group, last, first, flag)`, где *group* – имя группы, *last* и *first* – номера последнего и первого сообщений, а *flag* обычно принимает одно из следующих значений:190191- `y`: разрешены локальные публикации и сообщения от других серверов.192- `m`: группа модерируется, и все публикации должны быть одобрены.193- `n`: локальные публикации запрещены, разрешены только сообщения от других серверов.194- `j`: сообщения от других серверов вместо этого помещаются в группу junk.195- `x`: локальные публикации запрещены, а сообщения от других серверов игнорируются.196- `=foo.bar`: сообщения вместо этого помещаются в группу `foo.bar`.197198Если *flag* имеет другое значение, статус группы новостей следует считать неизвестным.199200Эта команда может возвращать очень большие результаты, особенно если *group\_pattern* не указан. Результаты лучше кэшировать в автономном режиме, если только нет реальной необходимости их обновлять.201202Изменено в версии 3.2: был добавлен *group\_pattern*.203204#### `NNTP.descriptions(grouppattern)`205206Отправляет команду `LIST NEWSGROUPS`, где *grouppattern* – это строка wildmat, как указано в [**RFC 3977**](https://python-all.ru/3.3/library/nntplib.html) (она по сути аналогична строкам шаблонов DOS или UNIX). Возвращает пару `(response, descriptions)`, где *descriptions* – это словарь, сопоставляющий имена групп с текстовыми описаниями.207208```python209>>> resp, descs = s.descriptions('gmane.comp.python.*')210>>> len(descs)211295212>>> descs.popitem()213('gmane.comp.python.bio.general', 'BioPython discussion list (Moderated)')214```215216#### `NNTP.description(group)`217218Получает описание для одной группы *group*. Если совпадает несколько групп (если ‘group’ – это строка шаблона wildmat), возвращается первое совпадение. Если ни одна группа не совпадает, возвращается пустая строка.219220Этот метод опускает код ответа сервера. Если код ответа нужен, используйте [`descriptions()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.descriptions).221222#### `NNTP.group(name)`223224Отправляет команду `GROUP`, где *name* – имя группы. Группа выбирается в качестве текущей, если она существует. Возвращает кортеж `(response, count, first, last, name)`, где *count* – (приблизительное) количество сообщений в группе, *first* – номер первого сообщения, *last* – номер последнего сообщения, а *name* – имя группы.225226#### `NNTP.over(message_spec, *, file=None)`227228Отправляет команду `OVER` или команду `XOVER` на устаревших серверах. *message\_spec* может быть либо строкой, представляющей идентификатор сообщения, либо кортежем `(first, last)` чисел, указывающим диапазон статей в текущей группе, либо кортежем `(first, None)`, указывающим диапазон статей от *first* до последней статьи в текущей группе, или [`None`](https://python-all.ru/3.3/library/constants.html#None) для выбора текущей статьи в текущей группе.229230Возвращает пару `(response, overviews)`. *overviews* – это список кортежей `(article_number, overview)`, по одному на каждое сообщение, выбранное *message\_spec*. Каждый *overview* – это словарь с одинаковым количеством элементов, но это количество зависит от сервера. Эти элементы могут быть либо заголовками сообщения (тогда ключ – имя заголовка в нижнем регистре), либо элементами метаданных (тогда ключ – имя метаданных с префиксом `":"`). Следующие элементы гарантированно присутствуют согласно спецификации NNTP:231232- заголовки `subject`, `from`, `date`, `message-id` и `references`233- метаданные `:bytes`: количество байтов во всём необработанном сообщении (включая заголовки и тело)234- метаданные `:lines`: количество строк в теле сообщения235236Значение каждого элемента – строка или [`None`](https://python-all.ru/3.3/library/constants.html#None), если он отсутствует.237238Рекомендуется использовать функцию [`decode_header()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.decode_header) для значений заголовков, которые могут содержать не-ASCII символы:239240```python241>>> _, _, first, last, _ = s.group('gmane.comp.python.devel')242>>> resp, overviews = s.over((last, last))243>>> art_num, over = overviews[0]244>>> art_num245117216246>>> list(over.keys())247['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']248>>> over['from']249'=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?= <martin@v.loewis.de>'250>>> nntplib.decode_header(over['from'])251'"Martin v. Löwis" <martin@v.loewis.de>'252```253254Новое в версии 3.2.255256#### `NNTP.help(*, file=None)`257258Отправляет команду `HELP`. Возвращает пару `(response, list)`, где *list* – это список строк справки.259260#### `NNTP.stat(message_spec=None)`261262Отправляет команду `STAT`, где *message\_spec* – это либо идентификатор сообщения (заключённый в `'<'` и `'>'`), либо номер сообщения в текущей группе. Если *message\_spec* опущен или равен [`None`](https://python-all.ru/3.3/library/constants.html#None), рассматривается текущее сообщение в текущей группе. Возвращает тройку `(response, number, id)`, где *number* – номер сообщения, а *id* – идентификатор сообщения.263264```python265>>> _, _, first, last, _ = s.group('gmane.comp.python.devel')266>>> resp, number, message_id = s.stat(first)267>>> number, message_id268(9099, '<20030112190404.GE29873@epoch.metaslash.com>')269```270271#### `NNTP.next()`272273Отправляет команду `NEXT`. Возвращаемое значение – как у [`stat()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.stat).274275#### `NNTP.last()`276277Отправляет команду `LAST`. Возвращаемое значение – как у [`stat()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.stat).278279#### `NNTP.article(message_spec=None, *, file=None)`280281Отправляет команду `ARTICLE`, где *message\_spec* имеет то же значение, что и для [`stat()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.stat). Возвращает кортеж `(response, info)`, где *info* – это [`namedtuple`](https://python-all.ru/3.3/library/collections.html#collections.namedtuple) с тремя атрибутами *number*, *message\_id* и *lines* (в указанном порядке). *number* – номер статьи в группе (или 0, если информация недоступна), *message\_id* – идентификатор сообщения в виде строки, а *lines* – список строк (без завершающих символов новой строки), составляющих исходное сообщение, включая заголовки и тело.282283```python284>>> resp, info = s.article('<20030112190404.GE29873@epoch.metaslash.com>')285>>> info.number2860287>>> info.message_id288'<20030112190404.GE29873@epoch.metaslash.com>'289>>> len(info.lines)29065291>>> info.lines[0]292b'Path: main.gmane.org!not-for-mail'293>>> info.lines[1]294b'From: Neal Norwitz <neal@metaslash.com>'295>>> info.lines[-3:]296[b'There is a patch for 2.3 as well as 2.2.', b'', b'Neal']297```298299#### `NNTP.head(message_spec=None, *, file=None)`300301То же, что и [`article()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.article), но отправляет команду `HEAD`. Возвращаемые *lines* (или записанные в *file*) будут содержать только заголовки сообщения, но не тело.302303#### `NNTP.body(message_spec=None, *, file=None)`304305То же, что и [`article()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.article), но отправляет команду `BODY`. Возвращаемые *lines* (или записанные в *file*) будут содержать только тело сообщения, а не заголовки.306307#### `NNTP.post(data)`308309Отправляет статью с помощью команды `POST`. Аргумент *data* может быть либо [*файловым объектом*](https://python-all.ru/3.3/glossary.html#term-file-object), открытым для двоичного чтения, либо любым итерируемым объектом из байтовых строк (представляющих исходные строки публикуемой статьи). Он должен представлять правильно оформленную новостную статью, включая необходимые заголовки. Метод [`post()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.post) автоматически экранирует строки, начинающиеся с `.`, и добавляет завершающую строку.310311В случае успеха возвращается ответ сервера. Если сервер отказывается принимать публикацию, возбуждается [`NNTPReplyError`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTPReplyError).312313#### `NNTP.ihave(message_id, data)`314315Отправляет команду `IHAVE`. *message\_id* – это идентификатор сообщения для отправки серверу (заключённый в `'<'` и `'>'`). Параметр *data* и возвращаемое значение такие же, как для [`post()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.post).316317#### `NNTP.date()`318319Возвращает пару `(response, date)`. *date* – это объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime), содержащий текущие дату и время сервера.320321#### `NNTP.slave()`322323Отправляет команду `SLAVE`. Возвращает *response* сервера.324325#### `NNTP.set_debuglevel(level)`326327Устанавливает уровень отладки экземпляра. Он управляет объёмом выводимых отладочных сообщений. Значение по умолчанию, `0`, не выводит отладочные сообщения. Значение `1` выдаёт умеренное количество отладочной информации, обычно одну строку на запрос или ответ. Значение `2` или больше выводит максимальный объём отладочной информации, регистрируя каждую отправленную и полученную строку соединения (включая текст сообщения).328329Ниже перечислены необязательные расширения NNTP, определённые в [**RFC 2980**](https://python-all.ru/3.3/library/nntplib.html). Некоторые из них заменены более новыми командами в [**RFC 3977**](https://python-all.ru/3.3/library/nntplib.html).330331#### `NNTP.xhdr(hdr, str, *, file=None)`332333Отправляет команду `XHDR`. Аргумент *hdr* – это ключевое слово заголовка, например, `'subject'`. Аргумент *str* должен иметь вид `'first-last'`, где *first* и *last* – первый и последний номера статей для поиска. Возвращает пару `(response, list)`, где *list* – это список пар `(id, text)`; *id* – номер статьи (в виде строки), а *text* – текст запрошенного заголовка для этой статьи. Если указан параметр *file*, выходные данные команды `XHDR` сохраняются в файл. Если *file* – строка, метод откроет файл с таким именем, запишет в него данные и закроет его. Если *file* – это [*файловый объект*](https://python-all.ru/3.3/glossary.html#term-file-object), он будет вызывать `write()` для него, чтобы сохранить строки выходных данных команды. Если *file* указан, то возвращаемый *list* будет пустым списком.334335#### `NNTP.xover(start, end, *, file=None)`336337Отправляет команду `XOVER`. *start* и *end* – это номера статей, определяющие диапазон статей для выбора. Возвращаемое значение такое же, как для [`over()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.over). Рекомендуется использовать [`over()`](https://python-all.ru/3.3/library/nntplib.html#nntplib.NNTP.over), так как он автоматически применит более новую команду `OVER`, если она доступна.338339#### `NNTP.xpath(id)`340341Возвращает пару `(resp, path)`, где *path* – это путь к каталогу статьи с идентификатором сообщения *id*. В большинстве случаев это расширение не включено администраторами серверов NNTP.342343Устарело с версии 3.3: Расширение XPATH активно не используется.344345## 21.16.2. Вспомогательные функции346347Модуль также определяет следующую вспомогательную функцию:348349#### `nntplib.decode_header(header_str)`350351Декодирует значение заголовка, снимая экранирование любых экранированных не-ASCII символов. *header\_str* должен быть объектом [`str`](https://python-all.ru/3.3/library/stdtypes.html#str). Возвращается нераскодированное значение. Эту функцию рекомендуется использовать для отображения некоторых заголовков в удобочитаемой форме:352353```python354>>> decode_header("Some subject")355'Some subject'356>>> decode_header("=?ISO-8859-15?Q?D=E9buter_en_Python?=")357'Débuter en Python'358>>> decode_header("Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=")359'Re: problème de matrice'360```361