[야매코딩] 누구나 야매로 만드는 스팀봇, 강화! - (1) 스팀봇, 똑똑한 댓글을 달아줘!

in #kr-dev7 years ago

0. 똑같은 댓글은 재미없잖아요?

반가워요 프린이 여러분! 함께 스팀봇을 만들어봐요. '누구나' 만들 수 있는 야매코딩 시리즈 심화편 첫 번째 강좌입니다.

A. 스팀봇, 똑똑한 댓글을 달아줘! ☜
B. 스팀봇, 업보팅도 해야지!
C. 스팀봇, 스달 송금해줘!
D. 스팀봇, 데일리 리포팅 해줘!
E. 스팀봇, 또 뭘 할 수 있지?

기본편에서 완성한 스팀봇은 '@명령어' 댓글을 인식하고 자동으로 댓글을 달았지만, 똑같은 댓글만 달면 재미없잖아요?

그래서 이번에는 '똑똑해 보이는' 댓글을 달도록 스팀봇을 강화해보겠습니다.

스티미언이라면, 스팀봇 하나쯤은 있어야 하지 않겠어요? (찡긋)

혹시 야매코딩이 처음이신가요? 기본편도 있으니 참고해주세요!

☞ (이전) 야매코딩 - '누구나 만들어보는 스팀봇!'

A. 개발 환경설정 따라하기 I - Google Cloud 세팅
B. 개발 환경설정 따라하기 II - Conda 세팅
C. 스팀 API 설치 및 살펴보기 101
D. 스팀 API 심화, 블록체인 & 포스트
E. 예제로 따라하는 스팀봇 뚝딱
F. nohup으로 자동화, 알아서 언제나 24/7

자, 그럼 시작해볼까요?

이미지 출처: https://dribbble.com/shots/4029449-Desk

1. 그래도 복습은 간단히!

기본편에서 아래와 같은 내용까지 함께 만들어서 blockpost.py에 저장해뒀었죠?

그리고 keys 안에는 프린이 여러분의 키가 들어가고, '@야매코딩' 대신 본인이 원하는 명령어를 사용했고, 호출되면 무조건 "Hi there!"라고 천편일률적인 스팀봇 댓글을 달았죠.

댓글 부분에서 hellocrypto 대신 프린이의 유저명을 써야하는거, 잊지 말고요!

from steem.blockchain import Blockchain
from steem.post import Post
from steem import Steem
s = Steem(nodes=["https://rpc.buildteam.io"], keys=["Key Goes Here!"])
b = Blockchain(s)
while True:
    try:
        stream = map(Post, b.stream(filter_by=['comment']))
        for post in stream:
            if "@야매코딩" in post.export()['body']:
                if post.is_comment():
                    print(post.export()['body'])
                    post.reply("Hi there!","","hellocrypto")
    except:
        print("Error!")

2. 유저를 언급하자!

어떻게 해야 좀 더 재밌는 댓글이 완성될까요?

다양한 방법이 있겠지만, 2가지 요소를 추가해볼게요. 스팀봇을 이용한 유저 언급 & 랜덤 댓글 선택.

유저 언급은 기존 코드를 참고하면 쉽게 추가할 수 있어요.

post.export()특정 댓글/포스트의 세세한 정보를 스팀 API 통해서 확인하는 부분이었죠. 그리고 기존에 본문만 보기 위해 뒤에 post.export()['body']를 썼다면, 작성자는 post.export()['author']로 확인할 수 있죠.

그렇다면 본래 코드에서 아래처럼 바꿔주면 스팀봇을 호출한 유저를 언급할 수 있습니다.

for post in stream:
            if "@야매코딩" in post.export()['body']:
                if post.is_comment():
                    print(post.export()['body'])
                    post.reply("Hi there!","","hellocrypto")

=>

for post in stream:
            if "@야매코딩" in post.export()['body']:
                if post.is_comment():
                    print(post.export()['body'])
                    author = post.export()['author']
                    post.reply("Hi there! @%s!" % author,"","hellocrypto")

혹시 문자열 포매팅(formatting)이 처음이라면, author = post.export()['author']를 통해서 author에다가 호출자 유저명을 저장했죠? 이를 기존 "Hi there!" 뒤에다가 넣기 위해 %s를 이용합니다 (s는 string 즉 문자열 약자). % author은 그 %s 자리에 처음에 저장해둔 author을 이용해 넣어두라는 뜻이죠.

즉, "Hi there! @%s!" % author => "Hi there! @hellocrypto!"가 됩니다.

혹은 단순히 + 더하기를 써도 됩니다.

                    post.reply("Hi there! " + author,"","hellocrypto")

다만 + author"" 밖에 있다는 점 주의해주시고, "Hi there! " 보면 뒤에 한 칸 띄어쓰기 되어 있죠? 바로 이어붙여지기 때문에 그렇습니다.

3. 랜덤 댓글을 남기자!

항상 Hi there! (혹은 프린이가 커스텀한) 댓글만 남기면 질리겠죠?

여러 댓글을 준비하고, 랜덤 요소를 넣어봅시다 :)

흠. 예를 들어, "Howdy!", "Hey what's up!" ,"How ya doin'"을 추가해보죠.

우선 랜덤 요소를 쓰기 위해 기존 코드 상단에 import random을 추가해야 합니다.

from steem.blockchain import Blockchain
from steem.post import Post
from steem import Steem

=>

from steem.blockchain import Blockchain
from steem.post import Post
from steem import Steem
import random

그럼, 준비한 문구들을 '배열'로 준비하죠. [] 안에 콤마로 구분해서 넣어주면 되요.

answers = ["Hi there!", "Howdy!", "Hey what's up!" ,"How ya doin'"]

그리고 방금 import로 준비해둔 random를 쓰면 됩니다. random.choice()는 주어진 배열에서 랜덤으로 하나를 선택해줍니다.

answers 배열을 넣어서, random.choice(answers)를 본문 코드에 넣어보겠습니다.

from steem.blockchain import Blockchain
from steem.post import Post
from steem import Steem
import random
s = Steem(nodes=["https://rpc.buildteam.io"], keys=["Key Goes Here!"])
b = Blockchain(s)
answers = ["Hi there!", "Howdy!", "Hey what's up!" ,"How ya doin'"]
while True:
    try:
        stream = map(Post, b.stream(filter_by=['comment']))
        for post in stream:
            if "@야매코딩" in post.export()['body']:
                if post.is_comment():
                    print(post.export()['body'])
                    author = post.export()['author']
                    answer = random.choice(answers)
                    post.reply(answer + " "  + author,"","hellocrypto")
    except:
        print("Error!")

  1. while True: 상단에 배열 answers = ["Hi there!", "Howdy!", "Hey what's up!" ,"How ya doin'"]이 들어갔고,
  2. 그 중에 하나를 선택해 answer에 저장하는 answer = random.choice(answers)가 추가 됐고,
  3. 댓글 다는 부분은 이제 post.reply(answer + " " + author,"","hellocrypto") 이렇게 생겼습니다.

랜덤으로 선택된 인사말과 유저명 사이에 띄어쓰기를 위해 + " " +가 있습니다.

4. 응용을 해봐요 (숙제)

랜덤 댓글을 좀 더 응용해보면 재밌는 답변을 달 수 있습니다. 지금은 문장 전체를 준비해서 유저명과 이어붙였지만, 만약 문장 요소별로 랜덤화 시킨 후 재구성된 문장을 쓴다면?

zooeo = ["오늘은", "재밌는", "행복한"]
mogjukeo = ["스팀잇", "포스팅", "업보팅"]
seosooleo = ["하기 좋은 날이네요", "쓰기 귀찮아요", "함께 해요"]

예시 결과: "오늘은 업보팅 쓰기 귀찮아요"!?

주의! 번역체스러운 엉뚱한 답이 생성될 수도 있습니다ㅎㅎ

혹은 스팀봇 호출이 댓글 자체가 목적인 경우가 있을 수도 있습니다. 단순히 랜덤 문자열 댓글이 아닌, 좀 더 의미 있는 어떤 정보를 줘야 합니다.

예를 들어 '@주사위'가 있겠네요. 그런 경우에는 random.randrange(1,100)을 사용하면 됩니다. 1에서부터 100까지 중에서 랜덤으로 하나를 뽑는다는 뜻이죠.

여러분이 원하는 댓글 내용은 또 뭐가 있을까요? 숙제로 한 번 직접 응용을 해서 여기 포스팅 밑에 댓글을 달아봅시다 프린이 여러분!

5. 마무리, (스팀봇 +1)

스팀봇 첫 강화, 성공했나요? 1강 성공률은 높으니 주문서 필요없으시죠?

좀 더 다양한 댓글을 남기는 스팀봇을 함께 만들어봤습니다.

다음에는 B. 스팀봇, 업보팅도 해야지!편으로 돌아오겠습니다 :) 댓글 뿐만 아니라 원하는 비율로 업보팅을 하도록 스팀봇을 강화시켜 보죠!

궁금하신 점과 지적사항 댓글로 남겨주세요. 최대한 빨리 확인하겠습니다. 구닌이라 조금 많이(...) 늦을 수 있어요 하핳.

이만 상병 크립토 @hellocrypto였습니다. 필승!

Sort:  

랜덤 댓글 10개 만들어서 봇호출 명령어 성공했습니다. !!!!
감사합니다.

왠지 오치님이 생각나는 글이네요 ㅎ

앗 어떤 부분이 그렇게 느껴졌을까요ㅎㅎ 영광(?)입니다!

A. 스팀봇, 똑똑한 댓글을 달아줘! ☜
B. 스팀봇, 업보팅도 해야지!

짱짱맨 태그라든지 달아주실때 봇으로 돌리시는 느낌이라 ㅋㅋ
그러고 보니 먹스팀도 이렇게 만들어지겠네요 ㅎ 이번에도 잘 따라해볼께요

아하 그런 의미였군요(먼산)ㅎㅎㅎ 네 그쵸 다음편의 업보팅 기능까지 추가되면 짱짱맨 따라잡기 완룝니다 :)

ㅎㅎㅎ 저도 배워서 또 잘 해보겠습니다

보팅 봇을 만들어 보고 싶어요 ㅎ

어이쿠 지금 오셨군요 천천히 집가서 주말동안 연구해봐야겠습니다...ㅎㅎ

어익후 바로 찾아오셨군요 @qlfxkdla님 :) 넵 천천히 읽어보시구 그래도 막히는 부분 있으면 댓글로 문의 남겨주세요~

혹시 태그별로 댓글다는 보팅봇도 만들 수 있나요?

'태그별로 댓글다는'게 정확히 어떤 식일까요? 원하는 태그가 달려있는 포스팅만 보팅하는건가요? :)

kr-join 태그 최신글에 댓글다는 봇 같은걸 만들고 싶어요 :D

아하 태그편을 긴급 편성해서 넣도록 하겠습니다 :)

이거 따라 하다 보면 보팅 봇도 만들수 있나요? ㅋ

네 :) 기존에 연재한 기본편 부터 쭉 따라하시면 됩니다. 이번 심화편에서 나올 'B. 스팀봇, 업보팅도 해야지!'랑 'C. 스팀봇, 스달 송금해줘!' 합치면 충분히 보팅봇도 만들 수 있어요~

와 자동으로 되는군요~

넵ㅎㅎ 기회 되시면 한 번 같이 해요 :)

프로그램은 초보라서... ㅋㅋ

어랏 그동안 상병 크립토님의 포스팅을 못 쫓아오고 있었네요 이론 ㅠㅠ 다시 공부모드 돌입하겠습니다! 저같은 코딩 잘알못에게 눈높이를 맞춰주고 이끌어주시는 포스팅 감사합니다 :)ㅎㅎㅎ

돌아온 프린이 @donekim님 반가워요 :)ㅎㅎ 아닙니다 저야말로 감사합니디 도움이 조금이나마 되면 기쁜걸요! 열공 파이팅!!

믿고 따라하는 헬크(?)님 ㅋㅋ
아직 따라해보지는 못했다고 한다
나도 봇을 만들어보겠어...라는 꿈으로 두근두근하네요 ㅋㅋ
두근두근만...하 ㅜㅜ

다음 편이 시급합니다!
스팀봇의 댓글과 보팅으로 짱짱맨 따라하기가 가능해지는 날이 오다니...ㅠㅠ

신기하네요 ㅎㅎ 화이팅!!

위의 예시로 10일가량 매일 돌리고 있습니다.
저는 댓글 위주로
댓글이 작성되고 특정단어 찾기를 합니다.

  1. 처음에는 2분만에 하다가.. 갈수록 시간이 많이 걸립니다.
  2. 특정시간, 다시말해 1~2분사이 댓글이 몰리면, 일부댓글은 무시하고 넘어갑니다.

그래서 자구책으로
댓글봇을 5개 정도 한 5분차이로 돌리고 있습니다.

개선방안으로
특정단어가 있는 댓글 주소를 저장하고 그 댓글에 대댓글을 달았는지를 체크하기
20초 룰을 있으니까 다음 댓글은 저장된 목록에서 안달렸던걸 역순으로 차례로 달기
이런건 어떨까요?

따라해봅니다!
늘 감사드립니다~

일교차가 큰 날씨에요 감기조심하세요^^
오늘은 바람이 많이 부네요^^

저도 스팀봇을 활용하는 날이 왔으면~!

와우 천천히 잘 따라해보도록 하겠습니다 좋은글 감사합니다!

This post received a 74% upvote from @krwhale thanks to @hellocrypto! For more information, click here!
이 글은 @hellocrypto님의 소중한 스팀/스팀달러를 지원 받아 74% 보팅 후 작성한 글입니다. 이 글에 대한 자세한 정보를 원하시면, click here!

very entertaining your post brother I like the post with good text and nutrient content for readers ☆☆☆☆☆ @hellocrypto

어흑 크립토님 요즘 통 안보이시내요. 무슨일 있으신건 아니시죠? 크립토님 쉬운 설명 덕분에 따라하면서 많이 배웠는데 >.<

Congratulations @hellocrypto! You received a personal award!

1 Year on Steemit

Click here to view your Board

Support SteemitBoard's project! Vote for its witness and get one more award!

Congratulations @hellocrypto! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 2 years!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!
 7 years ago  Reveal Comment