안녕하세요 가야태자 @talkit 입니다.
우리는 거의 매일 매일 블로그에 글을 작성하고 있습니다.
하지만, 스팀잇이 방문자수가 적네요. 방문자 수가 많은 사이트로 만들고 나만의 광고를 달 수 있는 Blogger.com 스팀잇의 글을 전송해보고자 합니다.
티스토리에 전송하고 싶지만, 티스토리가 API를 막았습니다. T.T
셀레니움으로도 해보려고 하는데 제 블로그는 캡차로 막혀 있습니다 T.T
그래서, 블러그 사이트를 변경하려고 합니다.
블로거닷컴은?
구글에서 운영하는 블로그 입니다.
관리 사이트는 https://blogger.com 입니다.
그리고, 사용자들을 만나는 페이지는 사용자아이디.blogspot.com 입니다.
그래서 제 블로거 주소는 가야태자의 구글 블로그 입니다.
구글 클라우드 API 활성화
블로그 닷컴에 글을 보내려면 구글 클라우드를활성화 해야 합니다.
API 및 서비스 – kjh0523 Cloud – Google Cloud Console
위 사이트에서 보면 blogger api가 있고 저 API를 활성화 해야 합니다.
구글 API 시크릿 키 획득
+ 사용자 인증정보 만들기를 클릭 하시구요.
저기서 OAuth 클라이언트ID를 선택하십시오.
어플리케이션 유형을 데스크톱으로 저는 진행 했습니다.
만들기를 누르십시오.
위 그림에서 JSON 다운로드를 클릭하시면 됩니다.
이렇게 하면 일단 API 상으로 블로그에 포스팅할 준비가 되었습니다.
블로그 아이디 확인하기
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
import pickle
import os
def authenticate_google():
scopes = ["https://www.googleapis.com/auth/blogger"]
credentials = None
if os.path.exists("token.pickle"):
with open("token.pickle", "rb") as token:
credentials = pickle.load(token)
if not credentials or not credentials.valid:
flow = InstalledAppFlow.from_client_secrets_file(
"다운받은시크릿키파일명및경로로", scopes
)
credentials = flow.run_local_server(port=0)
with open("token.pickle", "wb") as token:
pickle.dump(credentials, token)
return build("blogger", "v3", credentials=credentials)
def list_blogs():
service = authenticate_google()
response = service.blogs().listByUser(userId="self").execute()
for blog in response.get("items", []):
print(f"Blog Name: {blog['name']}, Blog ID: {blog['id']}")
if __name__ == "__main__":
list_blogs()
위 코드를 check_blogger.py
로 저장 하십시오.
conda activate steemit
pip install pymysql steem google-auth google-auth-oauthlib google-api-python-client
스팀잇 가상환경을 활성화하고 필요한 라이버래리를 설치 합니다.
블로그에 포스팅 하기
import pymysql
from markdown import markdown
#from steem.utils import markdown_to_html
import google.auth
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import pickle
import os
class BloggerUploader:
def __init__(self, db_config, blogger_blog_id, google_credentials_file):
self.db_config = db_config
self.blogger_blog_id = blogger_blog_id
self.google_credentials_file = google_credentials_file
self.service = self.authenticate_google()
def authenticate_google(self):
"""Authenticate to Google API and return the Blogger API service object."""
scopes = ["https://www.googleapis.com/auth/blogger"]
credentials = None
# Load credentials if they exist
if os.path.exists("token.pickle"):
with open("token.pickle", "rb") as token:
credentials = pickle.load(token)
# If credentials are not valid, reauthenticate
if not credentials or not credentials.valid:
if credentials and credentials.expired and credentials.refresh_token:
credentials.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
self.google_credentials_file, scopes
)
credentials = flow.run_local_server(port=0)
# Save credentials for future use
with open("token.pickle", "wb") as token:
pickle.dump(credentials, token)
return build("blogger", "v3", credentials=credentials)
def fetch_pending_posts(self):
"""Fetch posts with `blogger_yn = 'N'` and tags containing 'dev'."""
connection = pymysql.connect(**self.db_config)
try:
with connection.cursor(pymysql.cursors.DictCursor) as cursor:
query = """
SELECT post_id, title, body, tags
FROM postings
WHERE user_id = 'talkit' AND tags LIKE '%dev%' AND blogger_yn = 'N'
ORDER BY created_at DESC
LIMIT 1
"""
print(query)
cursor.execute(query)
return cursor.fetchall()
finally:
connection.close()
def post_to_blogger(self, title, content):
"""Post content to Blogger."""
post_body = {
"kind": "blogger#post",
"title": title,
"content": content,
}
try:
post = (
self.service.posts()
.insert(blogId=self.blogger_blog_id, body=post_body)
.execute()
)
print(f"Post published: {post['url']}")
return True
except Exception as e:
print(f"An error occurred: {e}")
return False
def update_post_status(self, post_id):
"""Update the blogger_yn column to 'Y' for the given post_id."""
connection = pymysql.connect(**self.db_config)
try:
with connection.cursor() as cursor:
query = "UPDATE postings SET blogger_yn = 'Y' WHERE post_id = %s"
cursor.execute(query, (post_id,))
connection.commit()
finally:
connection.close()
def run(self):
"""Fetch pendings posts and upload them to Blogger."""
pending_posts = self.fetch_pending_posts()
if not pending_posts:
print("No pending posts to upload.")
return
for post in pending_posts:
print(f"Uploading post: {post['title']}")
content = post["body"]
# Convert Markdown to HTML
content_html = markdown(content)
if self.post_to_blogger(post["title"], content_html):
self.update_post_status(post["post_id"])
print(f"Post {post['post_id']} marked as uploaded.")
if __name__ == "__main__":
# MySQL Database configuration
DB_CONFIG = {
"host": "디비서버주소",
"user": "디비아이디",
"password": "디비비밀번호",
"database": "데이터베이스명",
"charset": "utf8mb4",
}
# Blogger and Google API configuration
BLOGGER_BLOG_ID = "앞에서확인한블로그아이디"
GOOGLE_CREDENTIALS_FILE = "다운로드받은시크릿키위치및파일명"
uploader = BloggerUploader(DB_CONFIG, BLOGGER_BLOG_ID, GOOGLE_CREDENTIALS_FILE)
uploader.run()
위 파일을 steemit_post_to_blogger.py
로 저장하십시오.
위에서 수정하실꺼 수정하시고 돌리시면 됩니다.
conda activate steemit
python steemit_post_to_blogger.py
위와 같이 합니다.
SELECT post_id, title, body, tags
FROM postings
WHERE user_id = 'talkit' AND tags LIKE '%dev%' AND blogger_yn = 'N'
ORDER BY created_at DESC
LIMIT 1
위코드를 수정 하셔야 합니다.
talkit은 제아이디니까 본인 아이디로 %dev% 는 개발이어서 다른 주제를 원하시면 태그를 바꾸시면 됩니다.
감사합니다.
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
프로그램나오면좋겟네요
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
한번 서비스로 만들어 보겠습니다. ^^
하지만, API Key는 구글에서 받으셔야 할 것 같습니다. ^^
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
스팀에 쓴 글이 블로그에 자동 업로드 되면 진짜 편하고 좋겠네요.
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
저 같은 개발자는 ^^ 코드가 나올수 밖에 없습니다.
말씀 하신 내용중에 ㅋㅋㅋ 지난 번에 교수님이랑 작업하는데 프로그램을 작성해달라고 하셔서 ^^
저는 수포자인데
물리 공식을 주시고 이거 개발해 주세요
당황 스러웠습니다.
이것하고 비슷하실까요 ^^
조금씩 서비스로 만들어 보겠습니다.
네이버로 보내는 기능도 지금 한번 만들어 보려고 하고 있습니다. ㅎㅎㅎ
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit