페이스북을 통해서 포스팅을 하게 되면, 여러 사람들이 볼 수 있고 모바일 앱을 이용해 편하게 사용할 수 있긴 하지만, 내 생각과 자료들이 페이스북 플랫폼에 남게 되고 과거 글은 찾아보기 힘들어 불편한 점이 있습니다.
그래서 주기적으로 페이스북 포스팅들을 블로그에 Archive하기 위해 API를 사용하여 블로그에 저장하는 것을 시도해 보았습니다.
해당 결과물은 Facebook Posting Archive 에서 보실 수 있습니다.
순으로 진행해 보도록 하겠습니다.
이전편까지 wiki 페이지에 업로드 할 문서 템플릿을 만들어 보았다.
이제
을 해보도록 하겠다.
이전편#Image_처리 에서 사용한 get_images() 함수에 대해서 설명해 보겠다.
아주 간단하다.
def get_images(url, id): import requests import base64 path = 'imgs' headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', 'Connection': 'keep-alive'} req = requests.get(url, headers=headers) imgbin = req.content with open(f'{path}{id}.png','wb') as f: f.write(req.content) f.close() ftp_upload(f'{id}.png', filepath=path) return base64.b64encode(imgbin).decode('utf-8')
<img src='data:image/png;base64, [[base64 String]]'></img>로 사용하면 HTML 파일 내에 이미지가 포함된다.
다운 받은 Image 파일을 아래의 ftp_upload 함수를 통해서 업로드 하도록 한다.
def ftp_upload(filename,filepath, path="[[업로드할 path]]"): import ftplib #filename = "facebook_intro.txt" with ftplib.FTP() as ftp: ftp.connect("triviaz.net",[PORT]]) #Ftp 주소 Connect(주소 , 포트) ftp.login("[[[ID]]]]", "[[PW]]") #login (ID, Password) ftp.cwd(path) #파일 전송할 Ftp 주소 (받을 주소) myfile = open(filepath+filename, 'rb') #Open( ~ ,'r') <= Text파일은 됨, Open( ~ ,'rb') <= 이미지파일 됨 ftp.storbinary('STOR ' + filename, myfile) myfile.close() ftp.close()
간단히 ftplib 라는 라이브러리를 설치하여 위 코드를 이용하면 FTP로 업로드가 가능하다.
이제 다음으로 문서를 업로드하여 Archiving 문서를 완성해보도록 하자.
내가 사용하는 dokuwiki는 XML-RPC API를 사용해서 외부에서 접근/제어가 가능하다.
하지만, 이를 이용하기 위해서는 사이트 설정을 바꿔줘야 하고, 혹시 모르는 보안 상의 문제가 생기는 리스크가 있을 것 같아 간단히 Selenium을 통한 웹브라우저 제어를 통해 문서 작성을 하기로 했다.
이 방법을 사용하면, 나중에 블로깅 환경이 바뀌어도 조금만 수정하면 바로 적용이 가능할 것이다.
from selenium import webdriver with open(f'facebook.txt','r+', encoding='utf-8') as f: fcontent = f.read() f.close() id_input = [[로그인 ID]] pw_input = [[로그인 PW]] chrome_driver = "c:chromedriver.exe" # Your Chrome Driver path driver = webdriver.Chrome(chrome_driver) driver.get('[[로그인 page URL]]') id = driver.find_element_by_id('focus__this') id.send_keys(id_input) pw = driver.find_element_by_name('p') pw.send_keys(pw_input) submit = driver.find_element_by_xpath("//button[@class='btn btn-default btn-success']") submit.click() driver.get('[[페이지 작성 URL]]') text = driver.find_element_by_id('wiki__text') text.clear() #text.send_keys(fcontent.encode('unicode-escape').decode('ASCII')) #send_key 하면 너무 느림 driver.execute_script("arguments[0].value = arguments[1];", text, fcontent) driver.find_element_by_id('edbtn__save').click() driver.close()
F12
키를 눌러 개발자도구>element 에서 찾을 수 있다.아주
시간이 많이 걸린다. 따라서, Line 26과 같이 script를 직접실행하여 Textarea의 콘텐츠를 입력하도록 했다.이제 2-3편에서 알아본 코드를 실행시키면, 자동으로 페이스북 포스팅 목록을 가져와 페이지 템플릿을 만들고, 이미지 다운 및 업로드를 거쳐, wiki 페이지까지 자동으로 업데이트가 된다.
윈도에서 '작업스케줄러' 등을 이용해서 주기적으로 스크립트를 실행하도록 하면 항상 최신 현황을 보여주는 페이지를 만들 수 있을 것이다.
하지만, 현재 환경은
비 정기적으로 업로드할 수 밖에 없는 환경을 가지고 있다.
따라서 실시간 현황을 파악하기 위해 웹호스팅에서 지원하는 언어인 PHP를 사용해서
정도만 표시하는 기능을 개발하기로 했다. Archive 페이지 에서 아래 빨간색 부분이 바로 그 부분이다.
해당 내용은 다음편 - PHP에서 최신 상황 받아오기에서 살펴보도록 하겠다.