본문 바로가기
PHP/라라벨-루멘

텔레그램 봇으로 특정키워드 구글 뉴스 받아보기

by 2세1의 행복한 개발 2020. 4. 27.
반응형

안녕하세요

오늘은 텔레그램 봇으로 매시간 구글 뉴스를 받아볼까 합니다

이걸 만들게된 이유는 특정키워드로 내가 원하는 뉴스를 주기적으로 받기 위해서 입니다

 

우선 봇을 만드는건 생략하고 프레임워크는 라라벨 루멘을 기준으로 설명하겠습니다.

 

1. 뉴스 가져오기

처음에는 크롤링을 통하여 가져오려고 했으나

생각해보니 rss를 지원해주지 않을까하여 찾아본 결과

역시나 rss를 지원하였습니다

 

EX URL : https://news.google.com/rss/search?cf=all&hl=ko&q=%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80and%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8&cf=all&gl=KR&ceid=KR:ko

이렇게 rss를 지원해주면 정말 편하게 개발이 가능합니다

데이터를 다 가져왔으니 이제 PHP에서 처리만하면 끝입니다

2. Laravel Lumen 

public function news(){

    $qArr = [
        'intitle:크롬',
        'intitle:파이어폭스',
        'intitle:사파리',
        'intitle:브라우저',
        'intitle:웹사이트',
        'intitle:ssl',
        'intitle:인터넷',
        'intitle:쿠키정책',
        'intitle:세션정책',
        'intitle:5G',
        'intitle:네이버'
    ];

    $q = implode(' OR ' ,$qArr);
    $q .= ' when:1h';
    $q = urlencode($q);
    $url = 'https://news.google.com/rss/search?cf=all&hl=ko&q='.$q.'&cf=all&gl=KR&ceid=KR:ko';
    $xml=simplexml_load_file($url) or die("Error: Cannot create object");

    $chatId = '';
    $news = array();
    $i = 0;
    $msg = '';
    foreach ($xml as $k => $v) {
        foreach ($v as $sk => $sv) {
            if ($sk == 'item') {
                $news[$i] = (array)$sv;
                $i++;
                if($i > 4) {
                    break;
                }
            }
        }
    }

    foreach ($news as $k => $v) {
        $num = $k + 1;
        $msg .= "{$num}. {$v['title']}
{$v['link']}";
        $msg .= '
        
';
    }

    if ($i > 0) {
        $telegram = new Api($this->token);
        $telegram->sendMessage([
            'chat_id' => $chatId,
            'text' => $msg
        ]);
    }
}

제가 만든 news 메소드입니다

여기서 chatId를 바꾸시고 돌리시면 잘나오실겁니다

 

중간에 when:1h가 보이는데

이건 최근 몇시간전에 데이터를 가져올지 정하는겁니다

저는 최근 1시간 데이터를 기준으로 받아오고 있습니다.

 

ChatId는 여러가지 방식으로 얻으실 수 있는데

제일 쉬운방법은

https://api.telegram.org/bot토큰/getUpdates

를 이용하시는걸 추천드립니다

 

이렇게 데이터가 나오게 됩니다

이걸 kernul schedule를 통하여 crontab을 돌려줍니다

위치는

/app/Console/Kernel.php

입니다

$schedule->call(function(){

    $newsHourly = [0,1,2,3,5,6,7,8];
    $teleController = new TelegramBotController();

    if(in_array(date('H'),$newsHourly)) {
        $teleController->news();
    }
})->hourly()->weekdays();

여기서 수정하실 곳은

시간과, 컨트롤러 선언입니다

저는 UTC+0기준으로 서버가 세팅되어서

0,1,2,3,5,6,7,8로 해두었는데

이걸 본인의 서버시간으로 바꾸시고

 

hourly로 매시간 돌며

weekdays로 평일에만 동작합니다

 

이렇게 세팅이 끝났습니다

보시고 수정할점이나 궁금하신점 있으면 연락주세요

 

'PHP > 라라벨-루멘' 카테고리의 다른 글

[PHP] 라라벨 루멘 로그인 middleware 사용  (0) 2020.04.22

댓글