스팀잇 댓글 모니터링 with Python

in #kr-dev7 years ago (edited)

안녕하세요, @tmkor 입니다. 오늘은 특정 계정의 댓글을 모니터링 하는 방법에 대하여 적어보려 합니다. 언제나처럼 steem-python과 함께합니다.

20180105 python title-3.png

스팀잇 댓글 모니터링

스팀잇에는 웹 브라우저를 이용해서 어느정도 activity를 push해주는 기능이 있는 것 같습니다. 근데 저는 무슨 짓을 했는지 모르겠지만 영 오지가 않네요 -_-..

이가 없으면 잇몸으로 먹는게 아니라, 이를 만들면 됩니다!

계정의 모든 activity를 추적 가능하지만, 오늘은 댓글을 모니터링 하는 방법에 대해서 알아보려 합니다.

how to?

모니터링 하기 위해 필요한 것은 다음과 같습니다.

  1. 특정 계정의 히스토리를 가져온다.
  2. 처음 보는 댓글이 있는지 확인한다.
  3. 처음 보는 댓글이 있으면 사용자에게 알려준다.

자, 차근차근 알아봅시다.

특정 계정의 히스토리 가져오기

steem-python의 Account 클래스로 특정 계정의 정보를 열람할 수 있습니다. 그리고 history 혹은 history_reverse 함수를 이용해서 상향식 혹은 하향식 히스토리 generator를 가져올 수 있습니다.

예를 들어, @tmkor의 history를 가져오려면...

from steem.account import Account

a = Account("tmkor")
for record in a.history():
    print(record)

steemd와 유사하게 계정의 모든 활동을 볼 수 있습니다.

history 함수 인자

history 함수 인자는 여러개가 존재하지만, 그 중에서 중요한 것은 startfilter_by 인자 입니다.

인자명설명예시
start수집 시작 레코드 index, start 값 보다 작은 index를 가지는 record는 skipstart=4328
filter_by수집 대상 타입 필터filter_by="comment"

주의 해야 하는 것은, 활동 레코드의 index는 해당 계정의 활동에 종속적인 값 입니다. 예를 들어, 제가 기존에 보팅을 2300번 하고, 댓글을 1000개 달았다면, 이번 글의 index는 3301번이 됩니다. 블록 index와는 다릅니다.

마지막 index 구하기

모니터링 시작 시점에서 최신 댓글의 index 값을 start 인자에 사용하여 새로 발생하는 글을 모니터링 할 수 있습니다. 그러기 위해 마지막 index를 구해봅시다.

def find_last_index(u):
        a = Account(u['id'])
        for record in a.history_reverse(filter_by="comment"):
            u['last_index'] = record['index']
            break

가장 최근 index 값 하나만 알면 되기 때문에 역순으로 정렬하는 것이 빠릅니다. 그러므로 history_reverse 함수를 사용하면 됩니다.

새로운 댓글 발생 확인

마지막 index 값을 알고 있으므로, 새로운 댓글이 있는지 확인하는 것은 쉽습니다. account의 history를 뒤지면 되는데, 그 때 start 값이 기존 index보다 +1 인 것부터 보면 됩니다.

for comment in a.history(start=u['last_index']+1, filter_by="comment"):
            print("NEW COMMENT FROM %s -> %s" % (comment['author'], u['id']))
            u['last_index'] = comment['index']

새로운 댓글 사용자에게 알려주기 (optional)

자, 새로운 댓글이 발생된 것은 아는데, python 프로그램을 계속 보라고 하면 스마트 하지 않습니다.

push하는 방법은 엄청 다양하게 있는데, 편리함을 위해 slack 을 사용하였습니다.

slack에 bot을 만들고, key를 발급한 다음 slacker을 이용하면 간편하게 push 서비스를 만들 수 있습니다.

예를 들어, 아래와 같이 코드를 짜면..

from slacker import Slacker

token = '[슬랙 봇 토큰]'
slack = Slacker(token)

text = comment['body']
url = "https://steemit.com/@%s/%s" % (comment['parent_author'], comment['parent_permlink'])
attachments_dict = dict()
attachments_dict['title'] = "%s -> %s" % (comment['author'], u['id'])
attachments_dict['title_link'] = url
attachments_dict['text'] = text
attachments_dict['mrkdwn_in'] = ["text"]
attachments = [attachments_dict]
slack.chat.post_message(channel="#%s" % u['id'], text=None, attachments=attachments)

뭔가 복잡해 보이지만, 핵심 코드는, import -> slack 개체 생성 -> post_message 입니다.

핸드폰에 슬랙 앱을 깔면...

이런식으로 이쁘게 push 메시지가 오는 것을 확인할 수 있습니다.

결론

스팀잇의 다양한 활동을 누군가 알려주는 서비스가 필요할 때가 있습니다. 여러분의 취향에 맞는 모니터링 프로그램 하나 장만하시면 스팀잇 생활의 새로운 활력소가 되지 않을까... 싶습니다. :D

본 예제의 소스코드는 https://github.com/taeminlee/steem.monitor 에서 확인하실 수 있습니다.

Sort:  

감사합니다. 엄청나네요.ㅎㅎ

댓글 감사드립니다! ^^
근데 프로그램 만들어도 여전히 댓글 보는건 느리네요 ㅠㅠ)

스팀앱이 나오면 참 좋을 것 같네요~^^

댓글을 보고 생각해보니.. 써드파트 앱으로 esteem 이 있습니다.

읭?! push notification이 제공되네요 'ㅁ')!

아하 그렇군요~^^

좋은 정보 감사합니다. 늘 배우고 있습니다^^