거친 wikipedia에서 오늘의 사건을 무작위로 얻는 slackbot

(2017/02/27 단계)
Elixir-Slack을 베이스로 개조를 더한 bot를 사내 slack에 상주시키고 있습니다.
최근에는 신기능 추가 자료에 곤란하고 있었습니다만, 문득 매일 아침 bot에 인사를 시켜, 드디어 wikipedia의 오늘의 사건을 투고시키려고 생각했습니다.
거칠기 때문에 상정한 wikipedia의 기술 룰 등이 무너지면 파탄합니다··.
  • Elixir-Slack : htps : // 기주 b. 코 m / B ぁ ぃ ぃ

  • wikipedia 오늘의 이벤트 페이지



    wikipedia에는 ​​월일로 검색하면 그 날에 일어난 사건 일람의 페이지를 표시할 수 있습니다.
    URL로서는 「 https://ko.wikipedia.org/wiki/2월 27일 」(2월 27일의 경우)가 됩니다.
    이 페이지에는, 이 월일에 일어난 역사적인 사건과 유명인의 생일 등이 실려 있습니다.
    생일을 취득해도 재미있을 것 같았습니다만, 이번은 사건에 짜고 있습니다.
    (bot의 출력으로, 「~의 날입니다」라고 편하게 내고 싶었습니다만, 생일은 인물명으로 문장이 끝나고 맞지 않았기 때문에)

    HTML 보기



    어떠한 법칙으로 퍼스 할 수 없는지 베가 서 있지 않는 베가 앉아서 완조하면서 HTML 전체를 바라봅니다.
    실 서비스로 이용하는 것은 아니기 때문에, 가능한 한 저비용으로 편하게 만들고 싶다는 기분이 매우 강한 상태입니다.

    퍼스 방법 결정



    이 근처가 거친 부분.
    실수로 다음 법칙을 깨닫습니다.
  • 이벤트와 생일은 <li> 태그로 표현됩니다 (다른 항목 포함)
  • 이벤트와 생일은 행의 시작부터 <li> 태그
  • 사건이나 생일에는 "-"라는 3자를 포함합니다
  • 사건은 ". </li>"로 끝납니다

  • 이런 느낌입니까?
    String.match?(x, ~r/^<li>.*/) && String.match?(x, ~r/。<\/li>/) && String.match?(x, ~r/ - /)
    

    HTML을 처리하는 방법



    여기도 거칠다··.
  • HTML을 개행 마다 split해 array를 작성
  • array에 대한 사건 행만을 얻도록 filter
  • filter 결과로부터 1 개를 random으로 취득
  • 취득한 행을 bot가 말하는 형태로 성형
  • response.body
    |> String.split("\n")
    |> Enum.filter(fn(x) ->
      String.match?(x, ~r/^<li>.*/) && String.match?(x, ~r/。<\/li>/) && String.match?(x, ~r/ - /)
    end)
    |> Enum.random()
    

    그리고 잡혔다. · (땀

    이벤트 행 처리



    bot는 아래의 형태로 결국 이야기하고 싶습니다.
    「出来事(XXX年) の日」
    

    그러나 실제로 취할 수 있는 것은 이런 형태
    <li><a href="/wiki/xxxxxxxxxx" title="YYYY年">YYYY年</a> - <a href="/wiki/xxxxxxxxxxxxxxxxxxxxxxxxx" title="hoge">hoge</a>: 出来事</li>
    

    이런 식으로 처리합니다.
    # 年と本文を切り分けてそれぞれ整形する(タグを除去)
    splitLi = String.split(randomLi, " - ")
    year = Enum.at(splitLi, 0)
    year = String.replace(year, ~r/<.*?>/, "")
    
    dekigoto = Enum.at(splitLi, 1)
    dekigoto = String.replace(dekigoto, ~r/<.*?>/, "")
    
    # 連結して結果を作成(長すぎるときは頭だけ返すようにしたい) TODO
    result = dekigoto <> "(" <> year <> ")"
    

    결과



    거칠게 했던 것보다는 움직이고 있네요··.
    단지 조금 평화적인 내용이 좋다··.




    언제나 같은 투고를 반복하는 bot은 어미라든지 일부를 바꾸면 조금뿐입니다만 재미가 된다고 생각합니다.
    예를 들면 이 기능의 경우는 「안녕하세요 부」 「오늘도 노력합시다 부」가 변화하게 되어 있습니다.
     @ohayo ["おはようござます。", "おはようござます!", "おはようござます(^o^)", "おはようござます(-_-)", "おはようござます(^_^)"]
      @gobi ["今日も一日頑張りましょう!p(^_^)q", "さて仕事仕事..", "今日も一日頑張りましょう!♪( ´▽`)", "今日も一日頑張りましょう!( ̄▽ ̄)"]
    
    def hogehoge() 
      Enum.random(@ohayo) <> "\n"
      ...
      <> Enum.random(@gobi)
    end
    

    좋은 웹페이지 즐겨찾기