PHP로 피드 리더 봇 만들기(2)

이전 부분에서는 봇의 주요 기능에 대해 생각하고 피드 목록을 보고, 새 피드를 추가하고, 추가된 피드를 제거하는 세 가지 명령을 구현했습니다.

이 부분에서는 피드를 읽는 다른 파일을 만듭니다. Telegram 서버에 의해 호출되도록 생성bot.php했지만 5분마다(또는 원하는 시간 간격) 작업 스케줄러(예: cron)에 의해 호출되어야 하는 또 다른 부분이 있습니다. 나는 그것을 위해 cron-job.org을 사용합니다. 무료이며 사용하기 쉽습니다.

cron.php 생성



프로젝트 디렉터리에 cron.php라는 파일을 만들고 autoload.php 및 구성 파일을 가져오고 TeleBot 인스턴스를 만듭니다.

<?php

use TeleBot\TeleBot;

require_once __DIR__ . '/vendor/autoload.php';

$config = require_once __DIR__ . '/config/bot.php';
$feeds = json_decode(file_get_contents(__DIR__ . '/config/feeds.json'))->feeds;

$tg = new TeleBot($config['bot_token']);


피드 읽기



다음으로 다음 코드를 추가합니다.

$links = "<b>🆕 New posts:</b>\n\n";
$linkCount = 0;
foreach ($feeds as $feed) {    
    $context = stream_context_create([
        "http" => [
            "method" => "GET",
            "header" => "User-Agent: FeedReaderBot",
        ],
    ]);

    $feedContent = new SimpleXMLElement(file_get_contents($feed->url, false, $context));

    foreach ($feedContent->channel->item as $item) {
        $links .= "<a href=\"{$item->link}\">▪️ {$item->title}</a>\n";
        $linkCount++;
    }
}

if ($linkCount === 0) {
    die();
}

$tg->sendMessage([
    'chat_id' => $config['owner_user_id'],
    'text' => $links,
    'parse_mode' => 'html',
    'disable_web_page_preview' => true,
]);


  • Dev.to는 피드를 로드하지 못하게 합니다. User-Agent 헤더를 추가하고 더 이상 봇처럼 보이지 않습니다. 😎
  • SimpleXMLElement 클래스를 사용하여 XML 콘텐츠를 구문 분석합니다. JSON을 쉽게 구문 분석하고 패키지를 설치할 필요가 없기 때문에 이것은 PHP의 내부 기능입니다.
  • foreach 루프에서 목록을 만듭니다.
  • 모든 피드 개체를 반복하는 첫 번째 루프 후에 메시지를 보냅니다. (<a> 태그가 있기 때문에) HTML 형식을 사용하고 포함된 링크를 비활성화합니다.

  • 이제 웹 브라우저에 cron.php의 주소를 입력하십시오. 다음과 같은 우아한 목록이 표시됩니다.


    Oh, wait! If I refresh the page, it sends the same list! It is unacceptable, because we only want the new posts, not the latest posts!


    새 게시물 만!



    예, 당신이 완전히 옳습니다! 이 문제를 방지하려면 피드 개체에 마지막 링크를 저장해야 합니다.

    {
        "url": "feed-url-here",
        "reader": "dev.to",
    +    "last_item_url": "some-url-here"
    }
    

    bot.php에 새 필드를 추가합니다.

    $feeds[] = [
        'url' => $url,
        'reader' => 'dev.to',
        'last_item_url' => '',
    ];
    


    또한 cron.php에서 일부 변경이 필요합니다.

    $links = "<b>🆕 New posts:</b>\n\n";
    $linkCount = 0;
    foreach ($feeds as $feed) {
        $context = stream_context_create([
            "http" => [
                "method" => "GET",
                "header" => "User-Agent: FeedReaderBot",
            ],
        ]);
    
        $feedContent = new SimpleXMLElement(file_get_contents($feed->url, false, $context));
    
        $latestPostLink = (string) $feedContent->channel->item[0]->link;
    
        if ($latestPostLink === $feed->last_item_url) {
            break;
        }
    
        foreach ($feedContent->channel->item as $item) {
            if ((string) $item->link === $feed->last_item_url) {
                break;
            }
    
            $links .= "<a href=\"{$item->link}\">▪️ {$item->title}</a>\n";
            $linkCount++;
        }
    
        $feed->last_item_url = $latestPostLink;
    }
    
    if ($linkCount === 0) {
        die();
    }
    
    file_put_contents(__DIR__ . '/config/feeds.json', json_encode(['feeds' => $feeds]));
    
    $tg->sendMessage([
        'chat_id' => $config['owner_user_id'],
        'text' => $links,
        'parse_mode' => 'html',
        'disable_web_page_preview' => true,
    ]);
    
    


    마지막 게시물 링크가 feeds.json에 이미 저장된 것과 동일한 경우 현재 피드 개체를 건너뛰고 다음 항목을 확인합니다. 그렇지 않으면 저장된 마지막 게시물 링크에 도달할 때까지 목록 끝에 추가합니다. 마지막으로 $latestPostLink를 피드 개체의 last_item_url 속성에 할당하고 $feeds 배열(업데이트된 개체 포함)을 루프 외부의 feeds.json에 저장합니다.

    크론 작업 추가



    우리는 5분마다 URL을 입력하고 싶지 않습니다. 그렇게 많은 시간이 있다면 RSS/Atom/JSON 피드가 필요하지 않기 때문입니다! 따라서 5분마다 스크립트에 요청을 보내도록 cron 작업을 만들어야 합니다.


    만세! 업데이트를 기다리세요...
    튜토리얼을 따라 주셔서 감사합니다. 즐거운 시간 되셨기를 바랍니다.


    TeleBot을 사용하여 이 봇을 구축했습니다. 당신은 저장소를 응시하여 저를 지원할 수 있습니다:
    https://github.com/WebPajooh/TeleBot

    그리고 지금까지 우리가 한 일은 다음과 같습니다.
    https://github.com/WebPajooh/FeedReaderBot/tree/d238ac8429db6777b24a51f8618d17c2547a7254

    좋은 웹페이지 즐겨찾기