[개발이야기#011] STEEMFEST 발표 2번째 주제 스팀스토리 만들기 001 - 2차 도메인 포워드 서비스
Anaconda
2차 도메인 포워드 서비스
안녕하세요 가야태자 @talkit 입니다.
관련 글
001 도메인 포워딩 서비스 - https://steemit.com/kr/@talkit/011-steemfest-2-001-2
위글을 읽어 보시고 포워드 서비스가 필요하신 분은 댓글 주시면 계속 셋팅 해드리고 있습니다.
본문
오늘은 백엔드 중에서 스팀의 글을 수집하는 부분을 만들어 보려고 합니다.
다음에는 살짝 UI를 만들어 볼까 해서 UI를 만드려면 아래무래도 글이 있어야 하니까요 ^^
STEEM API와 Pyhton 그리고 몽고 디비를 써서 이번 글을 작성할 예정입니다.
보통 MySQL 등 관계형 디비를 이요하면 테이블 구조도 또는 명세서를 작성하게 됩니다.
사용자 디비라든지 여러가지가 있겠지만 아직 저는 사용자 디비는 필요가 없어서 ^^
글만 수집하는 프로그램이라서 관계형 디비의 테이블에 해당하는 아이가 No SQL 데이터베이스에서는 콜렉션이라서 콜렉션 구조를 한번 우선 생각해봤습니다.
제가 생각하는 콜렉션 구조는 그림과 같습니다.
보통은 스팀잇에 있는 구조이고, uuid, 카테고리와 수집일시만 제가 넣은것입니다.
카테고리는 일반적인 블로그 처럼 카테고리 서비스를 만들어 드리려고 만들었구요.
pdate는 글작성하시고 제가 수집은 언제 해왔는지 확인하려고 넣었습니다.
그리고 콘텐츠는 AI를 이용해서 글을 요약하는 프로그램을 작성해보려고 하는데(꿈이 크다 ^^)
요약 프로그램이 만들어 지기 전까지는 전체 글을 일단 수집 해보겠습니다.
지난 번에도 말씀 드렸지만, 포워드 서비스를 신청하신 또는 신청 당하신 분들의 글만 수집할꺼라서 ^^ 일단 괜찮지 않을까 생각되고, 혹시 너무 디비가 커지면 ^^ 강제로 글을 짤라서 가져다 넣을 생각 입니다. ^^
수집 프로그램 작성하기
앞으로는 몽고디비 UI를 작성하게 되면 사용자를 추가하고 몽고 디비에서 불러오도록 할껍니다.
그런데, 현재는 그런 UI가 없기 때문에 노가다로 프로그램에 노출 시키겠습니다.
from steem import Steem
from pymongo import MongoClient
from datetime import datetime
import uuid
import json # json 모듈 추가
# MongoDB 사용자 이름, 비밀번호, 서버 주소, 포트
username = '몽고디비 사용자 계정'
password = '몽고디비 비밀번호'
server = '몽고디비 주소'
#port = '몽고디비 포트'
#본 프로그램에서는 사용하지 않음
# MongoDB 클라이언트 생성
client = MongoClient(f'mongodb+srv://{username}:{password}@{server}/')
# steemit_article 데이터베이스 선택 (없으면 생성)
db = client['steemit_article']
# 사용자 목록
users = ['talkit', 'kayap', 'ayogom', 'newiz']
s = Steem()
for user in users:
# 사용자의 최근 게시물 가져오기
posts = s.get_discussions_by_blog({"tag": user, "limit": 100})
for post in posts:
#print(post["tags"])
# 게시물 정보 추출
metadata = json.loads(post["json_metadata"])
data = {
'uuid': str(uuid.uuid4()),
'steem_account': user,
'url': post['url'],
'title': post['title'],
'contents': post['body'],
'category': '',
'tag': metadata.get("tags", []),
'wdate': post['created'],
'pdate': datetime.now()
}
# MongoDB에서 동일한 URL을 가진 게시물 찾기
existing_post = db.posts.find_one({'url': post['url']})
if existing_post is None:
# 게시물이 없으면 새로 추가
print('New post:', data)
db.posts.insert_one(data)
else:
# 게시물이 있지만 제목, 내용, 태그가 다르면 업데이트
if existing_post['title'] != post['title'] or existing_post['contents'] != post['body']:
db.posts.update_one({'_id': existing_post['_id']}, {'$set': data})
일단 수집기를 작성 했습니다.
위 수집기는일단 노가다로 users 부분을 추가 해주어야 합니다.
게으른 저로서는 용납이 안되는 프로그램이어서 ㅋㅋㅋ 조만간 수정 하겠습니다.
그리고 게시물이 없으면 생성하고 , 게시물이 있고, 제목과 내용이 변경되었으면 수정하도록 하는 기능은 추가 해두었습니다.
저기에 또 조금 수정 되어야할 프로그램이 태그를 추가해야해서 태그를 조금 다르게 처리를 해줘야 하더라구요 T.T
다음 프로그랜은?
다음 프로그램은 이 수집기를 한시간에 한번씩 동작시키도록 하겠습니다.
그리고, 그 다음 프로그램 php와 몽고디비를 연동하고, 화면에 수집한 내용을 도메인에 뒤에 살짝 URL을 넣어서 접속하면 게시글 제목이 보이게 해보겠습니다. ^^
https://www.mongodb.com/ko-kr/docs/php-library/current/tutorial/connecting/
위 주소와 같이 php관련 코드가 존재 하는 것으로 봐서 몽고디비와 php가 연동이 되는 것 같습니다. ^^
프로그램 실행 결과
400개의 아티클이 수집 되었습니다.
그중에서 제일 마지막글이 제가 어제 작성한 글이네요 ^^
감사합니다.
Posted through the ECblog app (https://blog.etain.club)
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
안녕하세요.
SteemitKorea팀에서 제공하는 'steemit-enhancer'를 사용해 주셔서 감사합니다. 개선 사항이 있으면 언제나 저에게 연락을 주시면 되고, 관심이 있으신 분들은 https://cafe.naver.com/steemitkorea/425 에서 받아보실 수 있습니다. 사용시 @응원해 가 포함이 되며, 악용시에는 모든 서비스에서 제외될 수 있음을 알려드립니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
안녕하세요.
이 글은 SteemitKorea팀(@ayogom)님께서 저자이신 @talkit님을 응원하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
와~ 너무 멋진 작업 이십니다! 👋👋👋
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
멋지게 봐주셔서 감사합니다.
자동 수집 이후에 안 예쁘지만 각자 도메인으로 글을 서비스를 해보겠습니다. ^^
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit