• Час читання ~4 хв
  • 20.01.2023

Коли ми публікуємо нову публікацію тут, на Laravel News, у фоновому режимі відбувається багато речей, щоб вона автоматично розсилалася в усі місця в Інтернеті. У цій публікації розглянемо, як ми ділимося нею з усіма службами.

Ось базова блок-схема того, що відбувається в Laravel News, коли публікується публікація, яка показує всі задіяні служби:

Як бачите, ми користуємося багатьма різними службами, але коли їх налаштовано, це не те, з чим у нас було багато проблем, і все це відбувається автоматично.

Починаючи зліва направо, давайте пройдемося по кожному розділу та пояснимо, як його налаштувати:

Канали сповіщень Laravel

Канали сповіщень Laravel є фантастичними, і спільнота створила багато різних постачальників для використання. Ми використовуємо один для нашого обліковий запис Twitter, а інший для нашого лише для читання Телеграма account.

Для Telegram у нас є старіший, але все ще точний опис автоматична публікація в Telegram

Ось код для нашого сповіщення 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;
    }
}

електронні листи

У нас є два основні списки електронних адрес. Один надсилається щодня, і він містить усі нові публікації та нові посилання на спільноти. Потім другий список для щотижневих електронних листів, які надсилаються щонеділі, які наразі створено вручну. Ви можете підписатися на них на нашому Сторінка розсилки.

Щоденник повністю автоматизований, і він працює за допомогою запланованої консольної команди, яка запитує нашу Statamic бекенд для нових дописів і створює повну електронну пошту HTML у блейд-файлі. З цього ми використовуємо API моніторингу кампанії щоб створити чернетку, а потім миттєво надіслати електронний лист.

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

Ось код для фактичного надсилання...

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',
    ]);
}

RSS-канал

The RSS канал створюється вручну за допомогою того самого методу, який описано в нашому підручнику створення RSS-каналу з нуля, але ми йдемо далі й використовуємо сторонню службу під назвою Feedpress.

Використовуючи третю сторону, ми отримуємо певну статистику щодо читачів RSS, що, теоретично, є корисним, але не те, що ми перевіряємо дуже часто.

RSS до Zapier

Наступний основний розділ використовує Zapier для читання нових елементів у каналі RSS, а потім надсилає допис до інших служб.

Facebook і LinkedIn Zaps надсилаються в Buffer, а потім поширюються з Buffer. Спочатку ми використовували тут буфер, оскільки наш розділ посилань спільноти може мати багато затверджених в той самий день одночасно, тож замість того, щоб ділитися всіма одразу, ми можемо використовувати більш детальне планування.

For the Мастодонт part, I used цей підручник кілька тижнів тому, і з тих пір він працює гладко.

Канал JSON

Канал 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 повний підручник зі створення каналу JSON тут.

Стрічка новин Google

Остаточний канал призначено для Новин Google, які було складно налаштувати, оскільки їх багато обмеження про те, що вони вважають новиною, і якщо ви поділитеся з цим чимось, що вони не вважають новиною, вони можуть заблокувати вас.

Основи подання полягають у тому, що вам потрібно надати їм спеціальний XML-канал, але він може містити лише елементи, опубліковані за останні два дні, і лише новини.

Ось наш контролер для налаштування всіх цих даних із нашого сервера 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');
}

Потім файл перегляду 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>

Закриття

Таким чином ми ділимося з багатьма різними службами, коли публікуємо нову публікацію. Ця установка вироблялася майже десять років і була надійною. Під час написання цього я помітив, як ми можемо спростити деякі з них завдяки новим Канали сповіщень і може повністю видалити крок буфера. Звичайно, можна також використовувати різні API напряму, але я виявив, що Zapier передає зміни API замість того, про що мені потрібно турбуватися.

Якщо ви хочете стежити за нами на будь-якій із зазначених служб, ось наші сторінки:

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

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...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297