====== Facebook API 포스팅 가져오기 #3 Image FTP 문서작성 ====== {{tag>blogs 페이스북API Facebook API 자동화 Python}} {{section>blog:facebook_api_get_posting_1_api#intro &noindent&nolink&nouser&noeditbtn&nocomments¬ags&nodate}} [[blog:facebook_api_get_posting_2_python|이전편]]까지 wiki 페이지에 업로드 할 문서 템플릿을 만들어 보았다. 이제 - 문서 내에 들어갈 Image를 다운로드 받고, - 이 이미지들을 FTP를 통해 서버에 업로드하고, - 만들어진 템플릿으로 문서 작성 을 해보도록 하겠다. ===== Image 다운로드 ===== [[blog:facebook_api_get_posting_2_python#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') * 간단히 requests.get 에서 이전편에서 구한 Image URL 상의 콘텐츠를 받아오면 된다. header가 없으면 서버에서 거부하는 경우가 있으므로 추가해 주도록 한다. * 콘텐츠는 Image로서, binary 형식으로 되어 있다. 따라서 Image를 저장할 때는 open함수의 'wb' 옵션을 이용해서 binary 쓰기를 해주어야 한다. * Line 19의 ftp_upload 를 통해서 해당 파일을 서버에 업로드 하도록 한다. (다음 섹션) * 참고로 base64 라이브러리를 이용해서 추후 HTML에서 바로 사용할 경우를 대비하여 저장하기로 했다. * 컴퓨터 분야에서 쓰이는 Base 64란 8비트 바이너리 데이터(예를 들어 실행파일이나, ZIP파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 스트링으로 바꾸는 인코딩 방식을 가리키는 개념이다. (출처: https://arabiannight.tistory.com/entry/IT용어-Base64-란) * base64로 인코딩된 Image String을 로 사용하면 HTML 파일 내에 이미지가 포함된다. ===== 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는 [[https://www.dokuwiki.org/devel:xmlrpc|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() * selenium 라이브러리를 통해서 우리가 웹 상에서 할 수 있는 거의 모든 행동을 자동으로 제어할 수 있다. * Line 10-11 : chrome, IE, Firefox 등 여러 브라우저를 제어가 가능한데, 브라우저별로 selenium이 제어할 수 있도록 driver 파일을 다운로드 받아야 한다. * https://chromedriver.chromium.org/downloads 에서 Chrome webdriver를 다운받을 수 있다. * Line 13-20 : 로그인 페이지에서 각각 ID, PW DOM객체를 찾아서 ID, PW를 send_keys함수를 이용해서 입력한 후 'Submit' 버튼을 누르도록 하였다. * 참고로, DOM객체를 찾기 위해서는 Chrome 페이지에서 ''F12'' 키를 눌러 개발자도구>element 에서 찾을 수 있다. * 찾고자 하는 Text input 또는 버튼을 우클릭하여 가장 아래에 있는 '검사'를 선택하면 해당 객체의 코드를 볼 수 있다. {{blog:pasted:20200220-192957.png?400|해당 객체의 id='' 값 또는 class='', 태그 이름 등을 통해서 찾을 수 있다.}} * Line 22- : 마찬가지로 페이지를 작성하는 URL로 이동하여 아래와 같이 Textarea 태그를 찾아서, 이전편에서 만들고 저장했던 페이지 내용을 입력하고, 'Save'버튼을 누르도록 했다. * 참고로, 보통 selenium에서 사용하는 send_keys 함수를 사용하면 문서 내용이 길기 때문에 ''아주'' 시간이 많이 걸린다. 따라서, Line 26과 같이 script를 직접실행하여 Textarea의 콘텐츠를 입력하도록 했다. {{blog:pasted:20200220-193426.png?400}} ===== 다음 ===== 이제 2-3편에서 알아본 코드를 실행시키면, 자동으로 페이스북 포스팅 목록을 가져와 페이지 템플릿을 만들고, 이미지 다운 및 업로드를 거쳐, wiki 페이지까지 자동으로 업데이트가 된다. 윈도에서 '작업스케줄러' 등을 이용해서 주기적으로 스크립트를 실행하도록 하면 항상 최신 현황을 보여주는 페이지를 만들 수 있을 것이다. 하지만, 현재 환경은 * 매일 컴퓨터를 키고 있지 않고, * 인터넷 접속도 매일 하고 있지 않아, 비 정기적으로 업로드할 수 밖에 없는 환경을 가지고 있다. 따라서 실시간 현황을 파악하기 위해 웹호스팅에서 지원하는 언어인 PHP를 사용해서 - 최신 글이 언제인지, - 지금까지 Archiving한 글보다 몇 개가 더 있는지 정도만 표시하는 기능을 개발하기로 했다. [[blog:facebook_posting|Archive 페이지]] 에서 아래 빨간색 부분이 바로 그 부분이다. 해당 내용은 [[blog:facebook_api_get_posting_4_php|다음편 - PHP에서 최신 상황 받아오기]]에서 살펴보도록 하겠다. {{blog:pasted:20200220-194409.png}} ==== 참고 ==== https://m.blog.naver.com/PostView.nhn?blogId=thenaru2&logNo=220750742029 : FTP 업로드 코드 ~~DISCUSSION~~