Table of Contents

Facebook API 포스팅 가져오기 #3 Image FTP 문서작성

Intro

페이스북을 통해서 포스팅을 하게 되면, 여러 사람들이 볼 수 있고 모바일 앱을 이용해 편하게 사용할 수 있긴 하지만, 내 생각과 자료들이 페이스북 플랫폼에 남게 되고 과거 글은 찾아보기 힘들어 불편한 점이 있습니다.

그래서 주기적으로 페이스북 포스팅들을 블로그에 Archive하기 위해 API를 사용하여 블로그에 저장하는 것을 시도해 보았습니다.
해당 결과물은 Facebook Posting Archive 에서 보실 수 있습니다.

  1. Python 으로 데이터 업로드하기 - Image다운, FTP 및 웹제어

순으로 진행해 보도록 하겠습니다.

 

이전편까지 wiki 페이지에 업로드 할 문서 템플릿을 만들어 보았다.
이제

  1. 문서 내에 들어갈 Image를 다운로드 받고,
  2. 이 이미지들을 FTP를 통해 서버에 업로드하고,
  3. 만들어진 템플릿으로 문서 작성

을 해보도록 하겠다.

Image 다운로드

이전편#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')

FTP 업로드

다운 받은 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()

해당 객체의 id='' 값 또는 class='', 태그 이름 등을 통해서 찾을 수 있다.

다음

이제 2-3편에서 알아본 코드를 실행시키면, 자동으로 페이스북 포스팅 목록을 가져와 페이지 템플릿을 만들고, 이미지 다운 및 업로드를 거쳐, wiki 페이지까지 자동으로 업데이트가 된다.

윈도에서 '작업스케줄러' 등을 이용해서 주기적으로 스크립트를 실행하도록 하면 항상 최신 현황을 보여주는 페이지를 만들 수 있을 것이다.

하지만, 현재 환경은

비 정기적으로 업로드할 수 밖에 없는 환경을 가지고 있다.

따라서 실시간 현황을 파악하기 위해 웹호스팅에서 지원하는 언어인 PHP를 사용해서

  1. 최신 글이 언제인지,
  2. 지금까지 Archiving한 글보다 몇 개가 더 있는지

정도만 표시하는 기능을 개발하기로 했다. Archive 페이지 에서 아래 빨간색 부분이 바로 그 부분이다.
해당 내용은 다음편 - PHP에서 최신 상황 받아오기에서 살펴보도록 하겠다.

참고

https://m.blog.naver.com/PostView.nhn?blogId=thenaru2&logNo=220750742029 : FTP 업로드 코드