• Czas czytania ~4 min
  • 20.01.2023

Kiedy publikujemy nowy post tutaj, w Laravel News, wiele rzeczy dzieje się w tle, aby został on automatycznie wysłany do wszystkich miejsc w Internecie. W tym poście przyjrzyjmy się, jak udostępniamy to wszystkim usługom.

Oto podstawowy schemat tego, co dzieje się w Laravel News po opublikowaniu posta, pokazujący wszystkie zaangażowane usługi:

Jak widać, korzystamy z wielu różnych usług, ale po ich skonfigurowaniu nie mamy z tym większych problemów i wszystko dzieje się automatycznie.

Zaczynając od lewej do prawej, przejrzyjmy każdą sekcję i omówmy jej konfigurację:

Kanały powiadomień Laravel

Kanały powiadomień Laravel są fantastyczne, a społeczność stworzyła wielu różnych dostawców do użytku. Używamy jednego dla naszego Konto Świergot, a drugi tylko do odczytu Konto telegramowe.

W przypadku Telegrama mamy starszy, ale wciąż dokładny opis automatyczne publikowanie w Telegramie

Oto kod naszego powiadomienia PostPublished:

class PostPublished extends Notification
{
    public function via($notifiable)
    {
        return [TelegramChannel::class, TwitterChannel::class];
    }
    public function toTelegram($post)
    {
        return TelegramMessage::create()
            ->to('@laravelnews')
            ->content($post->routes['title'].' https://laravel-news.com/'.$post->routes['uri']);
    }
    public function toTwitter($post)
    {
        $tweet = $post->routes['title'].' https://laravel-news.com/'.$post->routes['uri'];
        if ($post->routes['category'] == 'sponsor') {
            $tweet = $post->routes['title'].' [SPONSOR] https://laravel-news.com/'.$post->routes['uri'];
        } else if ($handle = $this->twitterHandle($post->routes['twitter_handle'])) {
            $tweet = $tweet.' posted by '.$handle;
        }
        return new TwitterStatusUpdate($tweet);
    }
    /**
     * Add the twitter handle is they are not a mod.
     */
    protected function twitterHandle($twitter)
    {
        if (! $twitter) {
            return false;
        }
        if ($twitter and ! Str::startsWith($twitter, '@')) {
            $twitter = '@'.$twitter;
        }
        return $twitter;
    }
}

e-maile

Mamy dwie podstawowe listy e-mailowe. Jeden jest wysyłany codziennie i zawiera wszelkie nowe posty i nowe linki do społeczności. Następnie druga lista dla cotygodniowego e-maila wysyłanego w każdą niedzielę, który jest obecnie tworzony ręcznie. Możesz je subskrybować na naszym Strona biuletynu.

Dziennik jest całkowicie zautomatyzowany, a jego działanie polega na wykorzystaniu zaplanowanego polecenia konsoli, które wysyła zapytanie do naszego Statamiczny zaplecza dla nowych postów i tworzy kompletny e-mail w formacie HTML w pliku typu blade. Z tego korzystamy Interfejs API monitora kampanii aby utworzyć wersję roboczą, a następnie natychmiast wysłać wiadomość e-mail.

protected function schedule(Schedule $schedule)
{
    $schedule->command('ln:daily')->daily()->at('15:00');

Oto kod do rzeczywistego wysyłania ...

protected function sendEmail($posts)
{
    $auth = ['api_key' => config('services.campaign-monitor.key')];
    $cm = new CS_REST_Campaigns(null, $auth);

        // Create a draft from the API
    $draft = $cm->create(config('services.campaign-monitor.client_id'), [
        'Subject' => $posts[0]['title']->raw(), // first post of the day, usually only one.
        'Name' => 'Laravel News Daily ('.date('Y-m-d').')',
        'FromName' => 'Laravel News',
        'FromEmail' => '[email protected]',
        'ReplyTo' => '[email protected]',
        'HtmlUrl' => '/full/path/to/daily/html/file',
        'ListIDs' => [config('services.campaign-monitor.daily_id')],
    ]);
    // grab the draft id and set it to the campaign
    $cm->set_campaign_id($draft->response);

    // now send it
    $cm->send([
        'ConfirmationEmail' => '[email protected]',
        'SendDate' => 'immediately',
    ]);
}

Kanał RSS

The kanał RSS jest budowany ręcznie przy użyciu tej samej metody, jak opisano w naszym samouczku tworzenie kanału RSS od podstaw, ale idziemy o krok dalej i korzystamy z usługi innej firmy o nazwie Prasa zasilająca.

Korzystając z usług strony trzeciej, uzyskujemy pewne statystyki dotyczące czytelnictwa RSS, co teoretycznie jest korzystne, ale nie jest to coś, co sprawdzamy zbyt często.

RSS do Zapiera

Następna główna sekcja wykorzystuje Zapier do odczytywania nowych elementów w kanale RSS, a następnie wysyła pocztę do innych usług.

Facebook and Linkedin Zaps both get sent to Buffer and then shared from Buffer. We initially used Buffer here because our sekcja linków społecznościowych możemy mieć wiele zatwierdzonych tego samego dnia w tym samym czasie, więc zamiast udostępniać je wszystkie na raz, możemy zastosować bardziej szczegółowe planowanie.

For the Mastodont part, I used ten samouczek kilka tygodni temu i od tamtej pory działa bez zarzutu.

Kanał JSON

Kanał JSONs was a hot topic a few years ago, so we had to have it. This is pretty simple to build, and we have a pełny samouczek dotyczący generowania kanału JSON tutaj.

Kanał wiadomości Google

Ostatni kanał jest przeznaczony dla Wiadomości Google, które były trudne do skonfigurowania, ponieważ mają ich dużo ograniczenia o tym, co uważają za wiadomości, a jeśli udostępnisz coś, czego nie uważają za wiadomości, mogą cię zablokować.

Podstawy przesyłania polegają na tym, że musisz dać im specjalny kanał XML, ale może on zawierać tylko artykuły opublikowane w ciągu ostatnich dwóch dni i mogą to być tylko wiadomości.

Oto nasz kontroler do konfigurowania wszystkich tych danych z naszego zaplecza Statamic:

public function news()
{
    $posts = Collection::find('articles')
        ->queryEntries()
        ->where('date', '>', Carbon::now()->subDays(2)->startOfDay())
        ->where('date', '<', Carbon::now())
        ->where('published', true)
        ->get()
        ->toAugmentedArray();

    return response()->view('sitemap.google.news', [
        'posts' => $posts,
    ])->header('Content-Type', 'text/xml');
}

Następnie plik widoku Blade:

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:news="http://www.google.com/schemas/sitemap-news/0.9">

    @foreach ($posts as $post)
    <url>
        <loc>{{ $post['permalink'] }}</loc>
        <news:news>
            <news:publication>
                <news:name>Laravel News</news:name>
                <news:language>en</news:language>
            </news:publication>
            <news:genres>Blog</news:genres>
            <news:publication_date>{{ $post['date']->raw()->format("Y-m-d") }}</news:publication_date>
            <news:title>{{ $post['title'] }}</news:title>
            @if ($post['tag']->raw())
                <news:keywords>{{ implode(',', $post['tag']->raw()) }}</news:keywords>
            @endif
            <news:stock_tickers></news:stock_tickers>
        </news:news>
    </url>
    @endforeach
</urlset>

Zamknięcie

W ten sposób udostępniamy wiele różnych usług, gdy publikowany jest nowy post. Ta konfiguracja była produkowana przez prawie dekadę i była solidna. Pisząc to, zauważyłem, jak moglibyśmy uprościć niektóre z nich z powodu nowszego Kanały powiadomień i może całkowicie usunąć krok Buffer. Oczywiście można również bezpośrednio korzystać z różnych interfejsów API, ale odkryłem, że przeglądanie przepustek Zapiera dotyczących zmian w interfejsach API zamiast czegoś, o co muszę się martwić.

Jeśli chcesz śledzić nas w którejkolwiek z wymienionych usług, oto nasze strony:

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297