Slack에게 일기 예보를 흘리고 싶었을 뿐이야

2019/8/14 추가



현재 태풍 정보 등에 대응하기 위해 코드를 수정 중입니다.
잠시 기다려주세요 m(._.)m

다음은 수정 전의 코드입니다.
정상적인 날씨의 경우 올바르게 움직이지만,
재해 등이 발생한 경우에는 올바르게 데이터 출력을 할 수 없습니다.

TL;DL



최근 개인 개발 메모용으로 Slack을 사용하고 있으며,
「어라, 시보적으로 날씨 예보 흘러 오면 편리하잖아?」
라고 생각해 자력으로 고차고차 노력한 기록입니다.

Motivation


  • Slack에 일기 예보를 보내고 싶습니다.
  • 항상 시작하는 서버가 있으므로 cron를 사용하여 정기적으로 Slack에 게시하고 싶습니다.
  • 평소 「Yahoo! 날씨」를 보고 있으므로, 그 정보를 Slack에 흘리고 싶다.
  • 그리고, 쉘의 공부.

  • 메커니즘


  • "Yahoo! 날씨"에서 정보를 가져옵니다
  • 쉘 스크립트로 출력 정렬
  • Slack에 게시

  • 이것을 cron에서 정기적으로 실행합니다.
    더 쉬운 방법이 있다고 말하지 않는다.

    구현



    「Yahoo!



    @arabian9ts 님의 「 리눅스 커맨드로 일기 예보를 얻고 표시하는 원라인(on Mac) 」를 참고로.

    먼저 날씨 예보를 가져오는 URL을 찾습니다.
    Yahoo! 개인 날씨로 이동하여 우편 번호를 입력하십시오.
    예를 들면, 교토부 교토시 시모교구라면 「〒600-8216」이므로
    URL은 ぇtps : // 우에 아테 r. 야호오. 이. jp / ぇ あぇ r / 26/6110/26106. HTML입니다.

    그래서 제가 만든 쉘 스크립트는 다음과 같습니다.
    상당히 더러워진 것 같다.

    Kyoto.sh
    #!/bin/bash
    
    function txt_edit(){
        array=()
        for i in `seq 9`
        do
            array+=(`awk "NR==$i" tmp$1.txt`)
        done
        echo -e ${array[*]} >> data.txt
        sed -e '1,9d' tmp$1.txt > tmp`expr $1 \+ 1`.txt
    }
    
    url=https://weather.yahoo.co.jp/weather/26/6110/26106.html #ここを、さっきのURLにする
    
    curl -s $url | sed -e 's/<[^>]*>//g' | grep -v '^\s*$' > tmp.txt
    
    head -n 1 tmp.txt > weather.txt
    sed -e '1,33d' tmp.txt > tmp0.txt
    
    head -n 3 tmp0.txt > weather.txt
    sed -e '1,3d' tmp0.txt > tmp1.txt 
    
    for i in `seq 5`
    do
        txt_edit $i
    done
    
    array=()
    array2=("--")
    for i in `seq 1 2 17`
    do
        array+=(`awk "NR==$i" tmp6.txt`)
        j=`expr $i \+ 1`
        array2+=(`awk "NR==$j" tmp6.txt`)
    done
    echo -e ${array2[*]} >> data.txt
    echo -e ${array[*]} >> data.txt
    sed -e '1,17d' tmp6.txt > tmp7.txt
    
    N=$(head -n 1 data.txt | wc -w)
    for i in `seq 1 $N`
    do
        awk '{print $'$i'}' < data.txt | tr '\n' '\t' >> weather.txt
        echo >> weather.txt
    done
    
    head -n 4 tmp7.txt >> weather.txt
    echo $url >> weather.txt
    
    rm tmp*
    rm data.txt
    

    어쩌면 스크립트의 내용으로
  • URL에서 정보를 차분하게 가져옵니다
  • 필요한 정보를 쉽게 얻을 수 있도록 아래 성형 → tmp.txt
  • 행을 지정하고, 문자열 정보를 좋은 느낌으로 배열에 넣어 간다 → data.txt ※임시 파일은 tmp(번호).txt
  • data.txt의 상태로 보이지 않기 때문에, 행과 열을 바꾸어(전치) 해 최종 파일에 → weather.txt
  • 더 이상 필요하지 않은 파일을 삭제했습니다.

  • 전치는 htp // 켄베 l. 하테나 bぉg. 코m/엔트리/20130604/1370308018를 참고로 했습니다.

    터미널에서
    $ chmod +x Kyoto.sh
    $ ./Kyoto.sh
    

    그건 그렇고, 출력은

    weather.txt
    2019年8月3日 18時00分発表
    今日の天気
     - 8月3日(土)
    時刻    天気    気温(℃)       湿度(%)      降水量(mm)    --      風向風速(m/s) 
    0時     晴れ    30      72      0       北東    1       
    3時     晴れ    29      74      0       静穏    0       
    6時     晴れ    28      76      0       北東    2       
    9時     晴れ    31      64      0       南西    2       
    12時    晴れ    35      48      0       東      2       
    15時    晴れ    37      38      0       東      3       
    18時    晴れ    34      51      0       南東    3       
    21時    晴れ    30      73      0       北西    1       
            京都市の警報・注意報                            
                            注意報
                            大雨、雷
    京都市下京区の今の天気はどうですか?
    https://weather.yahoo.co.jp/weather/26/6110/26106.html
    

    Slack에 흘릴 때 Tab이 무너지므로, 들여쓰기 어긋남이라든지 세로가 어긋나 있는 건지는 신경쓰지 않는다!

    슬랙에 흘리다



    @ik-fib 님의 "Slack의 Incoming Webhooks를 쓰러뜨리다"근처를 참고로.

    curl URL과 기타 옵션은 적절히 변경.

    Slack_weather.sh
    #!/bin/bash
    if [ $# != 0 ] ; then
        numLine=1
        cat $1 | while read line
        do
            #echo $numLine: $line # 出力
            numLine=$((numLine + 1)) # 行数を1増やす
    
            str=$line
            curl -X POST --data-urlencode "payload={\"channel\": \"#general\", \"username\": \"Weather bot\", \"text\": \"$str\", \"icon_emoji\": \":robot_face:\"}" https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX
        done
    else
        echo ERROR: Please input argument.
    fi
    

    h tp://스엔g. 웨 b. FC2. 작은 m/쟈/p로g등 m/장 sh/레어 d-에어 ch-ぃ네. html 을 조금 참고했습니다.

    터미널에서
    $ chmod +x Slack_weather.sh
    $ ./Slack_weather.sh weather.txt
    

    그렇다면 Slack으로 보내지고,,,


    cron으로 정기 실행


    cron 를 사용하면, 아침 낮 저녁이라도 1시간마다도 1분마다라도 뭐든지 할 수 있군요!

    수고하셨습니다 & 반성회


  • 「몇 행째로부터 몇 행째」로 정보를 정리하고 있으므로, Yahoo 측에서 사양이 바뀌면 무섭다.
  • 라고 할까 역기감,,,,
  • 경보·주의보 근처가 경우에 따라서는 잘 출력되지 않을지도?
  • Slack에 송신할 때, 1행마다 통지가 되어 버린다(이번이라면, 단번에 16통지 정도).

  • 좀 더 정진하네요.
    깨끗하고 우아한 프로그램을 작성할 수 있기를 바랍니다.

    「이렇게 하면 더 좋아진다!」등등 있으면 가르쳐 주시면 좋겠습니다!

    좋은 웹페이지 즐겨찾기