Рубрики
Без рубрики

Разработать и развернуть сервер меньше приложения Python, который обновляет баннер Twitter в режиме реального времени

Эй, надеюсь, вы остаетесь положительным и тестированием негативным в пандемии 🙌🏻 Давайте проверим шаг на … Теги с Python, Serverless, Twitter, Showdev.

Эй, надеюсь, вы остаетесь положительным и тестированием негативным в пандемии 🙌 🏻

Давайте проверим шаг за шагом, как сделать приложение Python Serverless, которое обновляет ваш баннер Twitter или вы можете сделать что угодно, это имеет огромный потенциал.

Мы будем использовать сервис под названием ДЕТА Поскольку их Tagline говорит: «Создайте свои приложения в часы, разверните их в считанные секунды. «Мы будем делать то же самое: D Кстати, теперь это совершенно бесплатно, так что не стесняйтесь использовать его 🔥

Это все началось с этого твита моей

потом это

Мы будем покрывать последнее краткое приложение Tweet здесь, если вы тоже хотите понятие, дайте мне знать в комментариях ниже

Итак, давайте распустим его шаг за шагом и сделайте приложение.

Давайте сделаем список требований

Учетная запись Developer Twitter

Подать заявку на учетную запись Developer Twitter, если вы еще этого не сделали, они займут некоторое время для проверки, но после того, как вы будете приятно идти.

Шаг 1 – Создайте новое приложение Twitter

Перейти к Проекты и приложения вкладка и создать новое приложение

Шаг 2 – Назовите ваше приложение

Шаг 3 – Ключи потребителей и секрет

Это важный, вы получите свои ключи и токены, поэтому обратите внимание на их.

Шаг 4 – Разрешения

После того, как вы перейдете к панели инструментов проекта. Перейдите к разрешениям приложений, нажмите «Изменить и» сделать приложение Читать и писать Отказ

Шаг 5 – Доступ к токену и секрет доступа

Шаг вы все ждали, чтобы получить токены.

К концу этого процесса мы будем иметь

Две ключи от шага 3

  • Thumber_key.
  • Thumber_Secret.

Две ключи от шага 5

  • Access_token.
  • Access_token_secret.

Детенция

Документы Из ДЕТА Удивительно, вы можете проверить, что если у вас есть какие-либо проблемы с приложением.

Шаг 0 – Установить ДЕТА

Установите ДЕТА на основе вашей ОС.

TL; DR для Mac и Linux

curl -fsSL https://get.deta.dev/cli.sh | sh

Для окон

iwr https://get.deta.dev/cli.ps1 -useb | iex

Тогда, пожалуйста, сделайте ДЕТА ВХОДА В вашем предпочтительном терминале.

Существует известная проблема с сафари и храбрым браузером, поэтому, пожалуйста, используйте Chrome при выполнении этого шага.

Шаг 1 – Создать новый проект

Мы будем создавать новый ДЕТА Микро

Чтобы создать новый Micro с Python, запустите следующую команду.

Deta New – python banner_update

Здесь banner_update это имя приложения.

Чтобы постоянно проверять обновления и развернуть их в облако ДЕТА предлагает команду, это называется Детские часы .

Откройте новый терминал и запустите Детские часы и оставить его в сторону, пока не закончим проект: D

Шаг 2 – Установите зависимости

Создать требования .txt Файл в корневом каталоге и иметь необходимые пакеты, перечисленные в файле.

Вы можете использовать следующие пакеты для этого приложения.

requests
fastapi
python-dotenv
tweepy
Pillow

Шаг 3 – Переменные среды

Создать .env. Файл Ваш .env Файл должен выглядеть что-то похожее на это

CONSUMER_KEY="your key"
CONSUMER_SECRET="your secret"
ACCESS_TOKEN="your token"
ACCESS_TOKEN_SECRET="your secret"

Создать .detaonhore Файл и добавить ! .env. к этому.

ДЕТА игнорирует .env Файл по умолчанию.

Шаг 4 Код Python

Вы можете отправиться в Заголовки меня и создать базу для вашего баннера Twitter.

Я создал свою базу, и это выглядит так

Скачать шрифт по вашему выбору .ttf формат. Нам нужен шрифт для написания на изображении.

Весь код выглядит что-то подобное, не волнуйтесь, давайте перейдем на него шаг за шагом.

from deta import App
from fastapi import FastAPI
from dotenv import load_dotenv
from os.path import join, dirname
import os
import tweepy
import shutil
import tempfile
from PIL import Image, ImageDraw, ImageFont


# Connecting to twitter service
AUTH = tweepy.OAuthHandler(
    os.environ.get("CONSUMER_KEY"), os.environ.get("CONSUMER_SECRET")
)
AUTH.set_access_token(
    os.environ.get("ACCESS_TOKEN"), os.environ.get("ACCESS_TOKEN_SECRET")
)

api = tweepy.API(AUTH,parser=tweepy.parsers.JSONParser())
upload_api =  tweepy.API(AUTH)

consolas_font = ImageFont.truetype("fonts/Consolas.ttf", 48)


dotenv_path = join(dirname(__file__), ".env")
load_dotenv(dotenv_path)

app = App(FastAPI())



# Helpers
def text_wrap(text, font, max_width):

    lines = []
    # If the width of the text is smaller than image width
    # we don't need to split it, just add it to the lines array
    # and return
    if font.getsize(text)[0] <= max_width:
        lines.append(text) 
    else:
        # split the line by spaces to get words
        words = text.split(' ')  
        i = 0
        # append every word to a line while its width is shorter than image width
        while i < len(words):
            line = ''         
            while i < len(words) and font.getsize(line + words[i])[0] <= max_width:                
                line = line + words[i] + " "
                i += 1
            if not line:
                line = words[i]
                i += 1
            # when the line gets longer than the max width do not append the word, 
            # add the line to the lines array
            lines.append(line)    
    return lines


@app.get("/")
def http():
    return "Hello DEV Community"


@app.lib.run()
@app.lib.cron()
def driver(e=None):
    data = api.followers()
    followers = data['users'][:3]
    shutil.copy('base.png', '/tmp/')
    img = Image.open('/tmp/base.png')
    image_editable = ImageDraw.Draw(img)
    initial_x = 42
    initial_y = 64
    image_size = img.size 
    for follower in followers:
        screen_name =follower["screen_name"]
        description = follower["description"]
        message = f"{screen_name} : {description}"
        lines = text_wrap(message, consolas_font, image_size[0] * 0.48)
        for val in lines:
            image_editable.text(
            (initial_x, initial_y), val, font=consolas_font, fill=(255, 255, 255)
        )
            initial_y = initial_y + 48
        initial_y = initial_y + 48

    edited_temp = tempfile.NamedTemporaryFile(suffix=".png")
    img.save(edited_temp.name)
    upload_api.update_profile_banner(edited_temp.name)
    return followers

Это по существу, запускает быструю службу API в капюшоне, так что это также можно использовать для развертывания ваших API и забыл о масштабировании, потому что он не будет меньше, они позаботятся обо всем: D

Конструкция кода 1.

# Connecting to twitter service
AUTH = tweepy.OAuthHandler(
    os.environ.get("CONSUMER_KEY"), os.environ.get("CONSUMER_SECRET")
)
AUTH.set_access_token(
    os.environ.get("ACCESS_TOKEN"), os.environ.get("ACCESS_TOKEN_SECRET")
)

api = tweepy.API(AUTH,parser=tweepy.parsers.JSONParser())
upload_api =  tweepy.API(AUTH)

consolas_font = ImageFont.truetype("fonts/Consolas.ttf", 48)


dotenv_path = join(dirname(__file__), ".env")
load_dotenv(dotenv_path)

app = App(FastAPI())

Здесь мы инициализируем Twitter API, быстрые API, шрифт и переменные среды для загрузки.

Поломка кода 2.

# Helpers
def text_wrap(text, font, max_width):

    lines = []
    # If the width of the text is smaller than image width
    # we don't need to split it, just add it to the lines array
    # and return
    if font.getsize(text)[0] <= max_width:
        lines.append(text) 
    else:
        # split the line by spaces to get words
        words = text.split(' ')  
        i = 0
        # append every word to a line while its width is shorter than image width
        while i < len(words):
            line = ''         
            while i < len(words) and font.getsize(line + words[i])[0] <= max_width:                
                line = line + words[i] + " "
                i += 1
            if not line:
                line = words[i]
                i += 1
            # when the line gets longer than the max width do not append the word, 
            # add the line to the lines array
            lines.append(line)    
    return lines

Это функция помощника, которая помогает нам разбить линии в данном пространстве. Я нашел его онлайн, пытаясь найти источник, чтобы дать кредит, но не нашел его. Обновит, как только я найду это.

Половина кода 3.

@app.lib.run()
@app.lib.cron()
def driver(e=None):
    data = api.followers()
    followers = data['users'][:3]
    shutil.copy('base.png', '/tmp/')
    img = Image.open('/tmp/base.png')
    image_editable = ImageDraw.Draw(img)
    initial_x = 42
    initial_y = 64
    image_size = img.size 
    for follower in followers:
        screen_name =follower["screen_name"]
        description = follower["description"]
        message = f"{screen_name} : {description}"
        lines = text_wrap(message, consolas_font, image_size[0] * 0.48)
        for val in lines:
            image_editable.text(
            (initial_x, initial_y), val, font=consolas_font, fill=(255, 255, 255)
        )
            initial_y = initial_y + 48
        initial_y = initial_y + 48

    edited_temp = tempfile.NamedTemporaryFile(suffix=".png")
    img.save(edited_temp.name)
    upload_api.update_profile_banner(edited_temp.name)
    return followers

@ app.lib.run () и @ app.lib.cron () специфичны для детей, и вы можете посмотреть их здесь Беги Смягчать

TL; DR версия CRON и RUN запущена – это запустить конкретную часть приложения Cron – это запустить часть для каждого заданного интервала времени, например, запускать функцию один раз в 2 минуты.

data.followers () Возвращает объект JSON ваших последователей.

подписчики [«пользователи» [: 3] Возвращает последние три подписчика и сохраняет их в списке подписчиков.

shutil.copy('base.png', '/tmp/')
img = Image.open('/tmp/base.png')
image_editable = ImageDraw.Draw(img)

Это будет немного сложно понять, поэтому, пожалуйста, внимательно прочитайте.

Так что вы не можете прочитать файл с Напишите Разрешения в корневой папке, но ImagedRaw требует от нас, чтобы открыть файл в Напишите Режим, потому что ему нужно нарисовать изображение => Написание на изображении. Но у нас всегда есть /tmp/ Папка, где мы можем иметь разрешения на запись, потому что она часто очищается. Итак, мы копируем наше базовое изображение в /TMP папка с забил библиотека. Затем откройте изображение с Ума

    initial_x = 42
    initial_y = 64
    image_size = img.size 
    for follower in followers:
        screen_name =follower["screen_name"];
        description = follower["description"];
        message = f"{screen_name} : {description}"
        lines = text_wrap(message, consolas_font, image_size[0] * 0.48)
        for val in lines:
            image_editable.text(
            (initial_x, initial_y), val, font=consolas_font, fill=(255, 255, 255)
        )
            initial_y = initial_y + 48
        initial_y = initial_y + 48

Здесь мы итарируемся через 3 последних подписчиков, которые мы имеем и сохраняем их имя пользователя и био, написав их на базовом изображении, мы используем image_editable.text Команда и после каждой строки мы обновляем ось Y курсора.

edited_temp = tempfile.NamedTemporaryFile(suffix=".png")
img.save(edited_temp.name)
upload_api.update_profile_banner(edited_temp.name)
return followers

Шаг 5 Код Python

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

Deta Cron установить «2 минуты»

Да, это так просто запустить работу CRON в DETA.

Woohoo, поздравляю о добывании до конца поста.

Не стесняйтесь пометить меня в Twitter, когда это сделано, я постараюсь быть вашим первым тестером, вы можете найти меня @Gillarohith

Также, пожалуйста, прокомментируйте, если вы застряли где угодно, или вы можете связаться со мной в Twitter, мои DMS открыты.

Спасибо, Rohith Gilla

Оригинал: “https://dev.to/gillarohith/develop-and-deploy-a-server-less-python-application-that-updates-twitter-banner-in-real-time-21hg”