트위터 봇 개발 후기
TRANSCRIPT
2015-02-25
트위터 봇 개발 후기Clojure, AWS, Travis CI, Heroku와 함께한
ohyecloudy.com
어떤 얘기?
로 트위터 봇을 제작
에 올렸던 얘기
Clojure
로 이동한 얘기
에서
Heroku
인용구 빌드를 자동화한 얘기
섹시
Clojure로 트위터 봇을 제작봇 발사대는 AWS
봇이 트윗하는 인용구는 어떻게?
JVM 위에서 돌아가는 Lisp
Lisp 빠심이 충분
실용적으로 사용
Clojure에 대한 얘기는
언제 기회가 있으면 한번~
트위터 봇을 만드는데,
왜 Clojure를 사용했나?
Clojure로
왜 트위터 봇을 만들었는가?
뭘 만들까?
Clojure 공부하며 생각한
내가 필요한 것
다른 사람은 신경 안 쓴다
그리고 작은 것
인용구를 랜덤 트윗하는 봇
인용구 모아놓은 거 아깝다
생각날 때마다 찾아보긴 귀찮다
트위터 잘 사용 중이다
봇 발사대는 AWS봇이 트윗하는 인용구는 어떻게?
자동화는 섹시해
Clojure로 트위터 봇을 제작
Amazon EC2 t1.micro
AWS 프리티어 http://aws.amazon.com/ko/free/
가입 시점부터 1년 무료
미뤘던 가입을 이제
트위터 봇은 이걸로 충분
공짜니깐
CPU가 좀 놀아도 괜찮아
프로그램 내부에서 스케쥴링
이제 돌아간다
한 고비 넘었다
개선 고고
봇이 트윗하는 인용구는 어떻게?
자동화는 섹시해뭐라? Heroku 1 dynos는 공짜라고?
봇 발사대는 AWS
Clojure로 트위터 봇을 제작
인용구는 어디서 주워오나?
크롤링(crawling)? 노노
책 읽으면서 모아놨다
인용구 소스
[{:source "Modern C++ Design"
:quotes ["시스템 아키텍처의..."
"단위전략 인터페이스의..."]}
{:source ...
:quotes [“...”]}]
출처 책을 매번적기 귀찮아서 map 사용
인용구 빌드 결과물
["시스템 아키텍처의... http://..."
"단위전략 인터페이스의..."]
vector그냥 뽑아서 삼키면 된다.다 씹어놨다.
트윗 글자 제한이 넘으면?
140자
자르고 URL을 첨부하자
인용구가 있는 웹페이지
100자 정도로
(defn adjust-quote [quote url]
(if (<= (count quote) 140)
quote
(str (apply str (take 100 quote))
"... " url)))
앞에서부터 100자만살아 남는다
웹 페이지 빌드
github page 사용
페이지 이름은 hash value
인용구가 input
(defn append-hash-val [quotes]
(map (fn [q] {:key
(d/md5 q)
:quote
q})
quotes))
(“q1” “q2”)
({:key “h1” :quote “q1”} {:key “h2” :quote “q2”})
(map (fn [p]
(let [k (:key p)
q (:quote p)
out-path (str output-dir
"/"
k
".html")]
(with-open [w (io/writer out-path)]
(.write w (build-html
q
twitter-card-creator)))))
key-quote-pairs)
:key 값인hash value를html 이름으로 사용
잘린 인용구를볼 수 있다
하지만 매번 클릭해야 해?
나부터도 귀찮다
트위터 카드https://dev.twitter.com/cards/overview
URL이 있는 경우
추가 정보를 보여준다
(defn build-html [q twitter-card-creator](let [twitter-card-desc
(if (> (count q) 100)(apply str (drop 100 q))q)]
(hp/html5 {:lang "en"}[:head[:meta {:name
"twitter:description":contenttwitter-card-desc}]
...])))
100자 이후를메타 정보에 저장
이래도 넘치면?
클릭해야지 뭐.
이정도면 깔끔한 해결
자동화는 섹시해뭐라? Heroku 1 dynos는 공짜라고?
마무리
봇이 트윗하는 인용구는 어떻게?
봇 발사대는 AWS
로컬에서 인용구 업데이트
가끔이지만 귀찮다.
자동화 고고.
섹시하니깐
내 컴퓨터에서
master gh-pages
orphan branch
히스토리 공유 X
source output
language: clojure
...
install:
- git clone ... --branch=gh-pages result
- git clone ... builder
- cd builder;lein uberjar
script:
- cd ..;java -jar...
after_success:
...
- git commit -m "Travis build $TRAVIS_BUILD_NUMBER ..."
- git push -fq origin gh-pages
소스, 결과물 브랜치 클론
결과물 커밋, 푸시
리포지토리 루트에 있는 .travis.yml
클로저 무시 노노.
뭐라? Heroku 1 dynos는 공짜라고?
마무리
자동화는 섹시해
봇이 트윗하는 인용구는 어떻게?
AWS 프리 티어가 끝나고
그래 얼마나 나오는지 보자
10일이 되기 전에 USD 5
주인처럼 썼네
헤프게 썼어
컴퓨팅 리소스를 줄이려고
셋방살이 주제에
경험하려고 Heroku로
웃기고 있네. 공짜니깐 쓰지.
Dynos 하나가 공짜
다른 서비스도
트위터 봇은이것도 넘쳐요.
소스만 올리세요.
빌드해서 실행해 준다
dynos만 할당해주면 끝
-----> Clojure app detected
-----> Installing OpenJDK 1.8...done
-----> Using cached Leiningen 1.7.1
Downloading: rlwrap-0.3.7
Writing: lein script
-----> Building with Leiningen
Running: lein deps
-----> Discovering process types
Procfile declares types -> worker
-----> Compressing... done, 62.4MB
-----> Launching... done, v18
알아서 빌드해 줌
worker: lein trampoline run
트위터 봇 잘 돌고 있다
소스만 올리니 편하네
하지만 배워야 할 게 많다
마무리
뭐라? Heroku 1 dynos는 공짜라고?
자동화는 섹시해
HOT 한 거 마음껏 사용
쓰기 전 평가할 필요 X
내키면 고고
작고 내가 쓸 거니깐
완성할 수 있었던 것 같다
담엔 좀 더 큰 걸로?
개발 일기가 좋은 연료가 될 수 있어요.
기록하며 생각 정리.잘하고 있는 것 같은 착각.
http://ohyecloudy.com/ddiary/categories.html#tbot-800-ref
나보다 잘 나감
CC BY-NC-SA 3.0
진행중인 개인프로젝트 있나요?진행하는 데 도움되는 습관?
tbot-800https://github.com/ohyecloudy/tbot-800
tbot-quote-builderhttps://github.com/ohyecloudy/tbot-quote-builder
블로그에 쓴 후기http://ohyecloudy.com/pnotes/archives/1850/