/* code block */
반응형
1
2
3
4
5
6
from selenium import webdriver
from datetime import datetime
from PIL import Image
import time
import configparser
import urllib

이전 글에서 설치했던 모듈을 포함해 이번 프로젝트에 필요한 모듈들을 임포트한다.

1
2
3
4
myCity = '광주 광산구 첨단1동'
AlertTime = 8 #매일 날씨를 알려줄 시간 (오전 여덟시)

myCity에 날씨정보가 필요한 동네 이름을 쓰자. myCity를 이용해 네이버 날씨에 검색할 것이다.

AlertTime은 매일 한 번 메시지를 보낼 시간이다. 아침 여덟시에 알림을 받도록 하겠다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
while True:
    
    if (datetime.now().hour == AlertTime) and (datetime.now().minute == 0):
 
        #알리기
        Config = configparser.ConfigParser()
 
        #카카오 아이디, 비밀번호 불러옴
        Config.read('./info.conf')
        Config = Config['MAIN']
 
        id = Config['kakaoid']
        pw = Config['kakaopw']
 
 
        ChatRoom = '채팅방 주소'
        options = webdriver.ChromeOptions()
 
 
        #user-agent 변경
        options.add_argument("user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
 
        #크롬 드라이버 로드
        driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver', options=options)
        driver.implicitly_wait(3)
 
 
        #날씨 페이지 로드
        driver.get(WeatherURL)
 
 
        #스크린샷 저장
        screenshot_name = "/home/pi/robot/weather.png"
        driver.save_screenshot(screenshot_name)
 
        #스크린샷 불러오기
        img = Image.open('/home/pi/robot/weather.png')
        cutted_img = img.crop((39,210,622,677))
        cutted_img.save('/home/pi/robot/weather.png')
 
 
        #카카오 메인 페이지 로드
        driver.get(KaKaoURL)
        time.sleep(3)
 
        #로그인 
        driver.find_element_by_id('loginEmail').send_keys(id)
        driver.find_element_by_id('loginPw').send_keys(pw)
        driver.find_element_by_id('countryCodeRequired').find_element_by_xpath("//button[@type='submit']").click()
        time.sleep(3)
 
 
 
        #채팅방 로드
        driver.get(ChatRoom)
        time.sleep(3)
 
        #글 작성
        driver.find_element_by_id('chatWrite').send_keys('라즈베리로봇 테스트 메시지입니다')  #메시지 작성
        driver.find_element_by_xpath("//input[@class='custom uploadInput']").send_keys('/home/pi/robot/weather.png'#날씨 사진 전송
        time.sleep(1)
        driver.find_element_by_xpath("//div[@class='wrap_inp']//button[@type='button']").click()  #전송버튼
   
        driver.quit()
        time.sleep(60)
 

매일 반복시키기 위해 While True:로 무한 루프를 돌려주었다.

라즈베리가 카카오톡에 로그인하기 위해 사용할 자신의 카카오 아이디와 비밀번호를 불러오기 위해

info.conf 파일을 만들어 파이썬 파일과 같은 경로에 위치시키자.

필자는 /home/pi/robot/rasprobot.py 경로에 스크립트를 저장해뒀기때문에 

info.conf 파일 경로는 /home/pi/robot/info.conf 이다.

 

터미널에서 vi 명령어로 info.conf 파일을 생성한다.

아래는 안에 넣을 내용이다.

1
2
3
[MAIN]
kakoid = 내 카카오 아이디
kakopw = 내 카카오 비밀번호

 

그다음 필요한 것은 라즈베리가 메시지를 보낼 채팅방의 주소이다.

카카오톡은 각 채팅방마다 고유한 주소를 가진다.

 

카카오톡에 등록된 자신의 플러스친구에게 메시지를 보낸다.

(메시지를 보내기 위해서는 플러스친구 관리자 화면에서 설정에 들어가 홈 공개를 해야한다.)

그러면 관리자 화면에서도 이렇게 1:1채팅이 생긴 것을 확인할 수 있다.

이 채팅방에 들어가보자

채팅방 화면 상단에 있는 채팅방의 주소를 복사해 ChatRoom 변수에 넣어주자.

(ChatRoom = 'https://xxxxxxxxxxx')

 

user-agent 변경 파트는 경우에 따라 필요 없는 경우도 많지만

이 파트의 유무에 따라 접속이 막히는 홈페이지가 있을 수 있으니 넣어뒀다.

 

네이버에 날씨를 검색한 후 화면을 캡쳐해 저장하고, 날씨 파트만 crop 함수로 잘라내어

다시 저장한 파일을 카카오톡으로 보내준다.

 

이후 60초를 기다림으로써 8시 01분이 되어 if (datetime.now().hour == AlertTime) and (datetime.now().minute == 0): 조건의 결과가 False가 되므로 다음날 8시 정각이 될 때까지 기다린다.

 

이제 이 스크립트를 자동실행하게 해 날씨 알리미 라즈베리로봇을 완성시켜보자.

 

터미널에서 /etc/profile.d 폴더로 이동한다.

cd /etc/profile.d

이 폴더 안에 스크립트를 만들면 부팅시 자동실행된다.

sudo vi run.sh

run.sh 파일을 만들어주자. 스크립트 이름은 다르게 해도 상관 없다.

1
2
#!/bin/bash
python3 /home/pi/robot/rasprobot.py

위 두줄을 입력한다. 파이썬 파일의 이름과 경로가 다르다면 그 경로에 맞게 써주도록 하자.

bash에서 파이썬 파일을 실행할 수 있어야 하므로 파이썬 파일이 있는 폴더로 이동해 권한설정을 바꿔준다.

cd /home/pi/robot
chmod 777 rasprobot.py

 

마지막으로 파이썬 파일 맨 윗줄(모듈을 임포트하는 줄보다도 더 위)에

1
#!/usr/bin/env python

이렇게 적어주자. 

터미널에서 reboot 명령어로 재부팅 시켜주면 자동실행 스크립트와 함께 로봇이 일하기 시작한다.

reboot

 

이제 라즈베리파이를 집안 구석 (와이파이가 닿는 곳이라면 어디든) 신경쓰이지 않는곳에 두고 전원을 연결시켜두자.

 

내일 아침, 라즈베리가 당신의 두피를 산성비로부터 지키기 위해 날씨를 알려줄 것이다.

 

[결과]

나만을 위한 라즈베리로봇 탄생

사진은 테스트를 위해 메시지를 보낸 후 찍은거라 오전 8시가 아니지만, 위 코드대로 동작한다면 오전 8시에 알려준다.

 

 

 

 

반응형
반응형

파이썬에서 플러스친구를 컨트롤하기 위해서, 웹브라우저를 컨트롤할 수 있게 해주는 selenium을 이용하겠다.

 

sudo pip3 install selenium
sudo pip3 install datetime
sudo pip3 install Image

위 모듈들을 설치해준다.

datetime은 메시지를 매일 아침마다 한 번씩 보내게 하기 위해 필요하고, Image는 날씨 정보를 찍은 사진을 보내기 전에 깔끔하게 편집하기 위해 필요하다.

dpkg -l | grep chromium

라즈비안에 설치돼있는 크롬 브라우저의 버전을 확인한 후

http://ports.ubuntu.com/pool/universe/c/chromium-browser/

 

Index of /pool/universe/c/chromium-browser

 

ports.ubuntu.com

여기서 맞는 버전의 driver를 다운받는다.

chromium-chromedriver xx.x.xxxx.xx-0ubuntux.xx.xx.x armhf.deb 이런식의 이름으로 되어있다.

 

다운받은 deb 파일은

 sudo dpkg -i xxx.deb

명령어로 설치한다.

 

이로써 개발에 필요한 모듈들이 준비되었다.

 

본격적으로 프로그램을 만들어보자.

반응형
반응형

요즘 들어 아침마다 날씨 확인하는게 번거로워서 확인도 안하고 우산 없이 나갔다가 된통 당하는 경우가 많다.

 

그래서 우리의 친구 라즈베리파이가 아침마다 카카오톡으로 오늘의 날씨를 알려주도록 만들어 보겠다.

 

준비 환경 - 라즈베리파이3B+, 마이크로SD카드, 무선 공유기, 파이썬3 개발환경

라즈베리파이 3B+, 집에 하는일 없이 뒹굴던 라즈베리의 모델명이다. 많은 성능을 필요로 하는 일을 시키지 않을 것이기 때문에 wifi 모듈만 달려있다면 3B+가 아니어도 충분하다.

이외에 라즈베리에 사용할 키보드, 마우스, 모니터는 데스크탑에서 잠시 뽑아 사용하도록 한다.

 

우선 라즈베리파이에 라즈비안을 설치한다.

https://www.raspberrypi.org/downloads/raspbian/

 

Download Raspbian for Raspberry Pi

Raspbian is the Foundation's official supported operating system. You can install it with NOOBS or download the image below.

www.raspberrypi.org

recommended software를 다운 받는다.

다운받은 라즈비안은 balenaEtcher 프로그램을 이용해 마이크로sd카드에 설치해준다.

https://www.balena.io/etcher/

 

balena - Home

Infrastructure to develop, deploy, and manage connected devices at scale

www.balena.io

라즈비안 설치가 완료됐으면 라즈비안의 터미널(Ctrl + Alt + T)을 켠다.

 

앞으로 이용할 파이썬3의 모듈들을 설치하기 위해 pip3를 우선 설치한다.

1
Python3    sudo apt-get install python3-pip

라즈베리는 이정도로 준비가 끝났다.

 

다음 준비할 것은 카카오톡이다. 라즈베리파이가 카카오톡으로 날씨를 알려주게 하기 위해서는 

 

라즈베리가 카카오로 로그인을 해서 나에게 톡을 보내게 해야 할 것이다. 

 

그런데 카카오 계정을 라즈베리를위해 또 만들 수는 없는 노릇이니 카카오톡의 플러스친구 기능을 이용해보겠다.

 

 

카카오톡 아이디로 로그인해서 플러스친구를 만들자.

플러스친구를 만들면 볼 수 있는 관리자센터 화면이다.

 

직접 만든 플러스친구를 카카오톡에서 검색해 친구추가하면 준비가 끝난다.

 

우리는 여기서 플러스친구의 1:1채팅 기능으로 나만을 위한 로봇을 만들어볼 것이다.

 

 

준비 끝!

반응형

+ Recent posts