TGTGInsighttelegram intelligenceLIVE / telegram public index
← Python Заметки

TGINSIGHT SIMILAR POSTS

Најди сличен содржај

Изворен канал @pythonotes · Post #121 · 20 јул.

Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для URL, имени файла, имени объекта в каком-то софте и тд. Требования совместимости простые: в тексте должны быть только допустимые символы. Обычно это a-z, 0-9 и "_" или "-". То есть, только прописные буквы латинского алфавита и цифры (как пример). Допустим, нам нужно название статьи в блоге преобразовать в slug для добавления его в URL этой статьи. Как это лучше всего сделать? В Django по умолчанию есть готовая функция slugify для таких случаев. Но я её никогда не использую. Почему? Потому что её недостаточно! Приведём пример >>> from django.utils.text import slugify >>> slugify('This is a Title') 'this-is-a-title' Пока всё отлично >>> slugify('This is a "Title!"') 'this-is-a-title' Спец символы удалились, всё хорошо. >>> slugify('Это заголовок статьи') '' Вот и приехали 😢. Если текст не английский то буквы просто игнорируются. Можно это поправить >>> slugify('Это заголовок статьи', allow_unicode=True) 'это-заголовок-статьи' Но тогда мы не вписываемся в условие. У нас появилась кириллица в тексте. Так как я часто пишу сайты для русскоязычных пользователей эта проблема весьма актуальна. Я не использую стандартную функцию и всегда пишу свою. Оригинал я не беру в расчёт и пишу полностью свою функцию. И так, по порядку: 🔸1. Исходный текст: >>> text = 'Мой заголовок №10 😁!' Взял специально посложней со специальными символами. 🔸2. Транслит Необходимо сделать транслит всех символов в латиницу. Здесь очень выручает библиотека unidecode. Помимо простого транслита кириллицы в латиницу она умеет преобразовывать спец символы и иероглифы в текстовые аналоги. from unidecode import unidecode >>> unidecode("Ñ Σ ® µ ¶ ¼ 月 山") 'N S (r) u P 1/4 Yue Shan' Очень крутая библиотека, советую👍 В нашем случае получаем такое преобразование: >>> text = unidecode(text) >>> print(text) 'Moi zagolovok No. 10 !' Отличный транслит. Смайл просто удалился, хотя я ждал что-то вроде :). Ну и ладно, всë равно невалидные символы. А еще наш код уже поддерживает любой язык, будь то хинди или корейский. 🔸4. Фильтр символов Unidecode не занимается фильтрацией по недопустимым символам. Это мы делаем в следующем шаге через regex. Просто заменим все символы на "_" если они вне указанного диапазона. >>> text = re.sub(r'[^a-zA-Z0-9]+', '_', text) >>> print(text) 'Moi_zagolovok_No_10_' Символ "+" в паттерне выручает когда несколько недопустимых символов идут рядом. Все они заменяются на один символ "_". 🔸5. Slugify Осталось удалить лишние символы по краям и сделать нижний регистр >>> text = text.strip('_').lower() >>> print(text) 'moi_zagolovok_no_10' Получаем отличный slug! 😎 🌎 Полный код в виде функции. ______________ PS. Проверку что в строке остался хоть один допустимый символ я бы вынес в отдельную функцию. #libs#tricks#django

Резултати

Пронајдени 4 слични објави

Пребарај: #technicaldetails

当前筛选 #technicaldetails清除筛选
Luckydonalds Bots: Development/Status

@luckydonaldsbots · Post #145 · 22.07.2018 г., 04:19

Why are there 5 buttons now? Technical details time (6am local) In order to switch to private chat we have to let the user click on a t.me/RulesRulesBot link with a start parameter. However, Telegram requires the first button to be a GameCallback button. It cannot be a normal url button. When that button is clicked, the bot gets an incoming update, which it can act upon. One way is to send a url to navigate to (open the game). I tried using the t.me start link there, but that doesn't work smoothly across all Telegram clients. Here is a summary: - Telegram Mac works without problem - Telegram on iOS works, but briefly shows a frame of the Telegram homepage before jumping to the chat - Telegram Android opens the Telegram website, and nothing happens - Telegram Desktop doesn't work at all, showing an error about the user not being found. Therefore I choose to disable the button showing the user an message he should use one of the plenty other buttons. Long answer short, with more buttons, the wrong one gets smaller, as does the chance to hit it. #TechnicalDetails

Luckydonalds Bots: Development/Status

@luckydonaldsbots · Post #188 · 24.02.2019 г., 01:05

If you docker refuses to start and sudo service docker status is showing logs like this: Feb 24 01:30:06 hostname dockerd[19544]: time="2019-02-24T01:30:06.718823877+01:00" level=error msg="stream copy error: reading from a closed fifo" It might be that /var/run/docker.sock is a mount in one of your containers. Therefore if that doesn't exist - and only shortly - it will be created as a folder, thus making it impossible for docker to start. Fix it with sudo rmdir /var/run/docker.sock, and sudo service docker start. #TechnicalDetails#downtime#in_progress

Luckydonalds Bots: Development/Status

@luckydonaldsbots · Post #166 · 25.11.2018 г., 14:47

Updated @YATubeBot to be more clear of errors related to upload size. Will now handle file size related upload errors more transparent, telling you exactly what's going on, instead of just stopping sending any updates after "Uploading...". Now it will check file size before uploading, and also handle rare errors raised (in an unspecified way) by telegram. Technical background: The telegram API returns a HTML error message instead of the usual json response, which of course isn't mentioned anywere in the API documentation. This broke pytgbot, the library used to interact with the API. The package was fixed to be able to handle that. Now also provides the file size of the file to upload in an easy accessable way, so that the upload size can be checked before uploading. #update#YATube#pytgbot#TechnicalDetails

Luckydonalds Bots: Development/Status

@luckydonaldsbots · Post #161 · 21.10.2018 г., 08:02

Downtime yesterday TL;DR: After a restart, not all services got back online. Turns out, when I refreshed my docker-machine certificates, which it uses to securely talk to my remote server, it had to restart docker. Those certificates work for 3 years and have to be recreated if they expire. (Wow, I'm working with telegram bots for a while now, huh?) Somehow some services (e.g. @YATubeBot, @ForwardWhitelistBot) didn't restart, and the @StickerTagBot even reverted to a old version from last year. Anyway I redeployed the correct version. If something else isn't running how it used to, please contact me personally @luckydonald. #downtime#TechnicalDetails#YATube#ForwardWhitelist#StickerTag