Hipchat에 입력한 내용을 API로 취득하여 Day One에 원라이너로 붙여넣기

7322 단어 hipchatjq그렇다.
최근 Day One 되는 Mac 일기 앱을 사용하고 있습니다.
평상시는 집에서도 밖에서도 Hipchat 를 사용해 메모를 취하고 있습니다만, 이것을 제휴할 수 없을까라고 생각해 조사해 보았습니다.

환경


  • Mac Book Air
  • OS X Mavericks (10.9.1)

  • 하고 싶은 일


  • Hipchat에서 입력 한 내용을 하루 단위로 검색하여 텍스트 데이터로 만듭니다.
  • 검색된 텍스트 데이터를 Day One에 붙여 넣습니다

  • Hipchat에서 데이터를 검색하는 방법



    Hipchat API 가 있었습니다.

    TOKEN을 취득하면, 그 후는 rooms/history API로 갈 수 있을 것 같습니다.

    궁극적으로 {room_id}, {date}, {token}의 변수를 확인하면 응답이 json 형식으로 반환됩니다.
    https://api.hipchat.com/v1/rooms/history?room_id={room_id}&date={date}&timezone=JST&format=json&auth_token={token}
    
    {"messages":[{"date":"2014-02-06T10:01:07+0900","from":{"name":"daxanya (-v-)","user_id":544xxx},"message":"https:\/\/github.com\/bowery\/orchestrate.js"},{"date":"2014-02-06T10:01:11+0900","from":{"name":"daxanya (-v-)","user_id":544xxx},"message":"orchestrate.js"},{"date":"2014-02-06T10:01:18+0900","from":{"name":"daxanya (-v-)","user_id":544xxx},"message":"http:\/\/www.slideshare.net\/who_you_me\/neo4j-24294061"},{"date":"2014-02-06T10:01:22+0900","from":{"name":"daxanya (-v-)","user_id":544xxx},"message":"\u30b0\u30e9\u30d5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u300cNeo4j\u300d\u306e \u5c0e\u5165\u306e\u5c0e\u5165"}]}
    

    여기까지는 좋을 것 같습니다.

    검색된 텍스트 데이터를 Day One에 붙여넣기



    Day One에 붙여넣기 위한 Command Line Interface이 있으므로 이를 이용합니다.

    그 전에 Hipchat API의 응답은 json 형식이므로 형식화해야합니다.

    json 형식에서 텍스트로 성형



    jq 이라는 명령줄에서 json을 처리하는 도구가 편리했기 때문에 사용해 보겠습니다. 설치는 Homebrew에서 했습니다.

    방금 응답 결과를 example.json이라는 이름으로 저장한다고 가정합니다.
    $ cat example.json  | jq '.messages[]'
    

    그렇다면,
    {
      "message": "https://github.com/bowery/orchestrate.js",
      "from": {
        "user_id": 544xxx,
        "name": "daxanya (-v-)"
      },
      "date": "2014-02-06T10:01:07+0900"
    }
    {
      "message": "orchestrate.js",
      "from": {
        "user_id": 544xxx,
        "name": "daxanya (-v-)"
      },
      "date": "2014-02-06T10:01:11+0900"
    }
    {
      "message": "http://www.slideshare.net/who_you_me/neo4j-24294061",
      "from": {
        "user_id": 544xxx,
        "name": "daxanya (-v-)"
      },
      "date": "2014-02-06T10:01:18+0900"
    }
    {
      "message": "グラフデータベース「Neo4j」の 導入の導入",
      "from": {
        "user_id": 544xxx,
        "name": "daxanya (-v-)"
      },
      "date": "2014-02-06T10:01:22+0900"
    }
    

    와 같이 messages 배열의 내용이 구조화되어 출력됩니다.
    원하는 것은 date와 message이므로 이러한 값을 추출하도록 작성합니다.
    $ cat example.json | jq '.messages[] | [.date, .message]'
    
    [
      "2014-02-06T10:01:07+0900",
      "https://github.com/bowery/orchestrate.js"
    ]
    [
      "2014-02-06T10:01:11+0900",
      "orchestrate.js"
    ]
    [
      "2014-02-06T10:01:18+0900",
      "http://www.slideshare.net/who_you_me/neo4j-24294061"
    ]
    [
      "2014-02-06T10:01:22+0900",
      "グラフデータベース「Neo4j」の 導入の導入"
    ]
    

    이것을 한 줄로 하고 싶네요.
    $ cat example.json | jq '.messages[] | [.date, .message] | add'
    
    "2014-02-06T10:01:07+0900https://github.com/bowery/orchestrate.js"
    "2014-02-06T10:01:11+0900orchestrate.js"
    "2014-02-06T10:01:18+0900http://www.slideshare.net/who_you_me/neo4j-24294061"
    "2014-02-06T10:01:22+0900グラフデータベース「Neo4j」の 導入の導入"
    

    오, 했어. 라고 생각했지만, 날짜와 메시지 사이에 공간이 필요하네요. 배열의 요소 사이에 공백을 넣어 보겠습니다.
    $ cat example.json | jq '.messages[] | [.date, ' ', .message] | add'
    
    "2014-02-06T10:01:07+0900 https://github.com/bowery/orchestrate.js"
    "2014-02-06T10:01:11+0900 orchestrate.js"
    "2014-02-06T10:01:18+0900 http://www.slideshare.net/who_you_me/neo4j-24294061"
    "2014-02-06T10:01:22+0900 グラフデータベース「Neo4j」の 導入の導入"
    

    대부분 성형되었습니다. 다만, 날짜가 중복 형식이군요. 하루 단위로 검색하므로 각 행에 날짜가 필요하지 않습니다.

    여기서부터는 jq로 가공하는 방법을 모르기 때문에 sed에 의지하고 있습니다.
    $ cat example.json | jq '.messages[] | [.date, " ", .message] | add' | sed -e "s/^\"[0-9-]\{10\}T//" | sed -e "s/^\([0-9:]\{8\}\)+0900/\1/" | sed s/\"$//
    
    10:01:07 https://github.com/bowery/orchestrate.js
    10:01:11 orchestrate.js
    10:01:18 http://www.slideshare.net/who_you_me/neo4j-24294061
    10:01:22 グラフデータベース「Neo4j」の 導入の導入
    

    제목 붙이기



    Day One은 Markdown 방식으로 기술할 수 있는 것과, 1행째가 타이틀 취급이 되므로, 타이틀이 동시에 표시할 수 있도록 합니다.

    제목에 날짜가 포함되고 싶었기 때문에 awk 인수 (-v)로 날짜를 변수로 지정합니다. 날짜는 자동으로 전날이 되도록 합시다.

    파이프에 의한 커멘드 연결의 도중에서, 선행에 텍스트를 넣는 방법을 모르기 때문에, awk 사용해 보았습니다. 구분자를 탭으로 하고 있으므로 이상한 구분되는 방법은 하지 않을까라고.
    $ cat example.json | jq '.messages[] | [.date, " ", .message] | add' | sed -e "s/^\"[0-9-]\{10\}T//" | sed -e "s/^\([0-9:]\{8\}\)+0900/\1/" | sed s/\"$// | awk -v p=`date -v-1d +%Y-%m-%d` -F'\t' 'BEGIN{print "# hipchat-log",p} {print}'
    
    # hipchat-log 2014-02-07
    10:01:07 https://github.com/bowery/orchestrate.js
    10:01:11 orchestrate.js
    10:01:18 http://www.slideshare.net/who_you_me/neo4j-24294061
    10:01:22 グラフデータベース「Neo4j」の 導入の導入
    

    좋아 보인다.

    요약



    API에 의한 데이터 취득으로부터 끝까지, 정리해 원라이너하면 이렇게 되었습니다. {room_id}{token}은 적절하게 교체하십시오.
    $ curl -s -X GET 'https://api.hipchat.com/v1/rooms/history?room_id={room_id}&date='`date -v-1d +%Y-%m-%d`'&timezone=JST&format=json&auth_token={token}' | jq '.messages[] | [.date, " ", .message] | add' | sed -e "s/^\"[0-9-]\{10\}T//" | sed -e "s/^\([0-9:]\{8\}\)+0900/\1/" | sed s/\"$// | awk -v p=`date -v-1d +%Y-%m-%d` -F'\t' 'BEGIN{print "# hipchat-log",p} {print}' | dayone new
    

    마지막으로, dayone new 부분은 표준 입력을 Day One의 새로운 기사로 만드는 명령 줄 인터페이스입니다.

    위의 명령 한 번으로 Day One에 일기가 작성됩니다. Day One에서는 이런 멋진 화면이 됩니다.



    그럼, 충실한 Day One 라이프를!

    좋은 웹페이지 즐겨찾기