1.Telegram Chatbot 설치

 

Telegram

텔레그램 이미지

텔레그램은 여러 플랫폼을 지원하면서 다양한 기기를 지원하는,
영리를 추구하지 않는 자유 클라우드 기반 인터넷 메신저이자 음성 인터넷 프로토콜이다.

설치 URL : https://desktop.telegram.org/

 

Telegram Desktop

Experience Telegram on your computer in a swift and seamless way.

desktop.telegram.org

 

2.Telegram 가입 후 로그인

telegram 시작 화면

 

3.BotFather 검색

telegram botfather 검색

BotFather : 텔레그램 챗봇의 기본적인 설정을 도와주는 텔레그램 봇

 

4./newbot 입력
newbot 이라고 채팅장에 입력하면 BotFather이 챗봇의 이름과 봇 검색 이름을 물어봅니다.

이름을 설정하고 나면 HTTP API token을 받을 수 있습니다.
확인 방법 : https://api.telegram.org/bot<제공받은API token>/getMe

예시) 내 토큰이 token "123123:sdfsdhf-sadh1jk231lk24" 이면
https://api.telegram.org/bot123123:sdfsdhf-sadh1jk231lk24/getMe

 

5.Python으로 봇 만들기

 

참고 사이트

 1)Telegram bot Git 주소
: https://github.com/python-telegram-bot/python-telegram-bot
 2)Telegram Bot Docs
: https://python-telegram-bot.readthedocs.io/en/stable/
 3)Telegram 예제
: https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/README.md

 

5-1.Telegram 봇 라이브러리 설치
   pip install python-telegram-bot --upgrade

 

오류 발생할 경우
Cannot find reference 'ext' in '__init__.py' 오류 발생시
$ python -m telegram
$ pip install --upgrade ipython

Solution for those who receives "cannot import 'TelegramError'" while using IPython
https://github.com/python-telegram-bot/python-telegram-bot/issues/1139

 

Echo 예제 1) 챗봇 채팅에 글을 쓰면 챗봇이 보낸 글을 따라하는 예제

https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/echobot2.py

 

python-telegram-bot/python-telegram-bot

We have made you a wrapper you can't refuse. Contribute to python-telegram-bot/python-telegram-bot development by creating an account on GitHub.

github.com

5-2.위 링크 소스 코드에서 TOKEN 부분만 수정!

"TOKEN" 부분에 자신의 토큰 입력

Echobot2 souce code

 

5-3.파이썬 실행 후 자신의 챗봇 채팅방에서 입력 테스트

 

돈은 주로 사람들의 관심을 통해 흐르는 것 같아 사람들이 어떤 관심을 갖고 있는지,
어떤 정보를 알고 싶어하는지에 대해 알고자 했다.

feedparser 라이브러리 설치
pip install feedparser

 

pandas 라이브러리 설치
pip inatall pandas

 

----------------------------------------------------------------------------------------------

 

import feedparser
import pandas as pd
import datetime


# rss url을 전달 받아 파싱해준다
def parseRSS(rss_url):
return feedparser.parse(rss_url)

# 파싱된 rss 데이터 가공
# index / 구분 (구글) / 검색어 / 내용 / 검색 횟수 / 링크
def getTrendsInfo(rss_url, rss_key) :
file_name = datetime.datetime.now().strftime('%Y%m%d%H%M%S')

keywords = []
traffic = []
itemtitle = []
itemlink = []

feed = parseRSS(rss_url)
for trends_item in feed['entries']:
keywords.append(trends_item['title'])
traffic.append(trends_item['ht_approx_traffic'])
itemtitle.append(trends_item['ht_news_item_title'])
itemlink.append(trends_item['ht_news_item_url'])

trend_keywords = pd.Series(keywords)
trend_traffic = pd.Series(traffic)
trend_title = pd.Series(itemtitle)
trend_link = pd.Series(itemlink)

trend_pd = pd.DataFrame({'index': 'google', '검색어': trend_keywords, '내용': trend_title, '검색 수': trend_traffic,
'링크': trend_link})
trend_pd.to_csv(file_name + '_' + rss_key + '.csv', encoding="utf-8")


url_list = {
'KR':'https://trends.google.com/trends/trendingsearches/daily/rss?geo=KR',
'US':'https://trends.google.com/trends/trendingsearches/daily/rss?geo=US',
'GB':'https://trends.google.com/trends/trendingsearches/daily/rss?geo=GB'
}

for key, url in url_list.items():
getTrendsInfo(url, key)

입/출력(Input/Output)은 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고 받는 것을 말한다.

Java에서 입출력을 수행하기 위해서는 스트림이 필요하다.


 


스트림

데이터를 운반하는데 사용되는 연결 통로로 입력 스트림(Input Stream)과 출력스트림(Output Stream)이 있다. 

스트림은 단방향통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 할 수 없다.

입력과 출력을 동시에 수행하기 위해서는 입력스트림과 출력스트림 모두 2개의 스트림이 필요하다.


NodeStream 계열 :

직접 자원에 연결하고 필수적으로 필요한 기본 스트림이다.


 NodeStream 계열 

바이트기반 스트림 

문자기반 스트림 

  

  FileInputStream 

  FileOutputStream


  FileReader

  FileWriter 

  

  ByteArrayInputStream

  ByteArrayInputStream 


  CharArrayReader

  CharArrayWriter 

  

  PipedInputStream

  PipedOutputStream


  PipedReader

  PipedWriter 

 

  

  StringReader

  StringWriter





ProcessingStream 계열 :

스트림 기능을 보완하기 위해 보조스트림이 제공되는데 

실제 데이터를 주고 받는 스트림이 아니기 때문에 데이터를 입출력 할 수 있는 기능은 없지만, 

스트림 기능을 향상시키거나 새로운 기능을 추가할 수 있다.


 ProcessingStream 계열

바이트기반 보조스트림 

 문자기반 보조스트림 

 

  BufferedInputStream

  BufferedOutputStream


  BufferedReader

  BufferedWriter 

   

  FilterInputStream

  FilterOutputStream  


  FilterReader

  FilterWriter 

 


  LineNumberReader

 

 

  PrintStream


  PrintWriter 

 

  PushbackInputStream


  PushbackReader 





예시 1)


출력스트림으로 파일을 생성하고 데이터를 기록하는 예제

public class IOTest {

// 출력 스트림으로 파일을 생성하고 데이터를 기록하는 예제 
/* NodeStream : FileWriter 
 * ProcessingStream : PrintWriter 
 */
	public static void main(String[] args) {
		try {
			FileWriter fw=new FileWriter("C:\\test\\memo.txt",true);//append
			PrintWriter pw=new PrintWriter(fw,true);
			pw.println("파일을 생성하고 데이터를 저장해라!");
			pw.close();
		} catch (IOException e) {
		   e.printStackTrace();
		}
	}

}


예시 2)


파일에 연결하여 위의 파일에 기록한 데이터를 입력받는 스트림을 사용하는 예제 

/*
 * NodeStream : FileReader
 * ProcessiongStream : BufferedReader 	readLind() : String
 */
public class IOTest2 {
	public static void main(String[] args) {
		try {
			FileReader fr= new FileReader("C:\\test\\memo.txt");
			BufferedReader br = new BufferedReader(fr);
			while(br.ready()) //memo.txt 파일에 있는 데이터를 
							  //읽어오기위한 while 문
							  //읽을 데이터가 있으면 true 
			System.out.println(br.readLine());
			br.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}


try : Exception 발생 예상 영역을 지정한다.

catch : Exception 발생시 대안흐름을 실행하는 영역으로 예외를 처리한다.

finally : Exception 발생 및 처리여부와 관계없이 무조건 실행하는 영역이다.

throws : Exception을 자신을 호출한 곳으로 던지겠다는 의미이다.

throw : 필요시 Exception을 발생시키는 keyword.

   

사용자 정의 Exception 

       : 개발자가 Exception class를 정의할 때에는 

          Exception class를 상속받아 만들면 된다.



예외처리 사례


상황 설정 : 

Person 객체를 만들고 findByName 메소드엔 이름을 매개변수로 전달하여

매개변수 name이 공백이거나 null일 경우 예외를 발생 시켜 대안 흐름으로 진행한다.

package tistory.exception;

public class TestExceptionEx {
	public static void main(String[] args) {
		Person p = new Person(); // Person 객체를 만들고
		String name = ""; // name변수에 예외발생시키기 위해서는 "",
							// 정상수행하기위해서는 name에 값을 넣어준다.

		try {		//예외 발생 예상 영역
			System.out.println("예외 흐름1");
			p.findByName(name);
		} catch (NotFindNameException e) {
			System.out.println("예외 흐름4 : 호출한 메소드에서 예외 발생을 던지고 내가 catch했다.");
			System.out.println("예외 흐름5 : "+e.getMessage());
		}
	}
}

class Person {
	public void findByName(String name) throws NotFindNameException {
		// name 값이 공백이거나 null일 때 에러 발생시키기 위해
		// 사용자가 정의한 예외(NotFindNameException)을 발생(throw)
		// 에러메시지를 보낸다.
		try {
			if (name.equals("") || name == null) {
				System.out.println("예외 흐름2 : 예외가 발생하여 예외를 발생시키고 호출한 곳으로 가겠습니다.");
				throw new NotFindNameException("예외 발생시키기 : 이름을 입력하셔야합니다.");
			}
			System.out.println("예외가 발생하지 않았음. 정상 수행");
			System.out.println("당신의 이름은" + name + "입니다.");
		} finally {
			System.out.println("예외 흐름3 : finally은 예외가 발생하나 안하난 무조건 실행");
		}
	}
}

class NotFindNameException extends Exception { // 예외를 사용자가 정의하기 위해 Exception을 상속받는다
	private static final long serialVersionUID = 239605248673105989L;

	public NotFindNameException(String message) { // 부모 클래스 생성자(Exception)를 호출하여
		super(message); // 매개 변수로 받은 예외 메세지 정보를 할당한다.
		// Exception class를 상속받았으므로 getMessage() 메서드가
		// 존재하고 catch 구문에서 getMessage() 를 호출하면
		// super(message) 로 할당한 메세지 정보를 확인할 수 있다.
	}

}



'지난 포스팅 > Exception Handling' 카테고리의 다른 글

JAVA 예외처리(Exception handling) 란?  (0) 2018.02.07

 프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다.

이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다.


 발생시점에 따라 에러를 나눌 수 있다.

 컴파일 에러

  컴파일 발생 시에 발생하는 에러

 런타임 에러 

  실행 시에 발생하는 에러 

 논리적 에러 

  실행은 되지만, 의도와 다르게 동작하는 것

 

소스코드를 컴파일 하면 컴파일러가 소스코드 (*.java)에 대한 기본적인 검사를 수행하여 오류가 있는지 알려준다. 

컴파일러을 마치고 나면, 클래스 파일 (*.class)이 생성되고, 생성된 클래스 파일이 실행된다.


런타임 에러는 실행 도중에 발생하는 에러로 잘못된 결과를 얻거나 프로그램이 비정상으로 종료될 수 있다.


Java에서 발생할 수 있는 오류의 종류는 두가지이다.


 에러(error) 

 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 

 (대체로 에러 발생 시 비정상적인 종료)

 예외(exception) 

 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 

 (예외가 발생하더라도 프로그래머가 명시한 대안으로 처리 가능)


 예외 처리 (Exception Handling) 란 

프로그램이 실행 중 예외 상황이 발생했을 때 중단하지 않고  대안 흐름을 실행한 후 프로그램을 정상 실행시키는 것을 목적으로 한다. 



 <예외처리 계층구조>









컬렉션 프레임웩이란, Java 자료구조체를 모델링하여 정의한 인터페이스 객체 그룹이다.


컬렉션데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고 

각 컬렉션을 다루는데 필요한 기능을 가진 3개의 인터페이스(Set, List, Map)로 정의.


List와 Set의 공통 된 부분을 다시 Collection 인터페이스로 상위 계층으로 정의.


 인터페이스

특징 

List 

 순서가 있는 데이터의 집합. 데이터의 중복을 허용한다. 

 ArrayList, LinkedList, Stack, Vector 등 

Set 

 순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다. 

 HashSet, TreeSet 

Map 

 Key와 Value로 이루어진 데이터의 집합

 순서는 유지되지 않으며, 키는 중복을 허용하지 않고 값의 중복은 허용한다. 

 HashMap, TreeMap, Hashtable, Properties 등 


응용프로그램이 싱행되면 JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당 받는다.

이때, JVM은 이 메모리를 용도에 따라 영역을 나누어 관리한다. 


JVM 메모리 구조는 stack 영역, heap 영역, method area (or class area) 영역으로 구성된다.


지역변수 (local variable) : 지역변수는 일시적으로 사용하기 위해 쓰는 변수로 메서드 또는 생성자 내에 선언된다.

stack 영역에 저장된다. stack영역은 메서드의 작업에 필요한 메모리 공간을 제공한다. 

지역변수는 반드시 명시적인 초기화를 해야 사용할 수 있다. 

해당 메서드 또는 생성자가 실행이 끝나면 메모리에서 해제가 된다.


인스턴스 변수 (instance variable) : 객체의 속성 정보를 저장한다. 

인스턴스 변수는 heap 영역에 저장된다.

명시적 초기화 없이 선언만 하면 기본 초기화가 된다.

객체가 소멸되기 전까지 heap영역에 참조를 유지한다.


클래스 변수 (class variable) :  주로 package, class, method, static 정보를 저장한다.

method area 영역에 저장된다. 

최초 class loading 시점에 메모리에 적재된다.

별도의 객체 생성없이 class명으로 사용이 가능하다.


public class Test6 { public static void main(String[] args) { int lottoNum[] = new int[5]; //로또 번호를 담을 배열을 생성한다 for(int i=0; i <lottoNum.length;i++) { //배열에 로또 번호를 담기 위해 for문을 사용한다. lottoNum[i]=(int)(Math.random()*45)+1; //배열[i] 번째에 로또번호(난수)를 담는다. System.out.println("로또번호 생성"+i); //처음 중복 for문으로 들어갈 때 i는 ++된 1 이된다. for(int j=0; j <i; j++) { //위 for문에서 담은 로또 번호가                  //중복되는지 확인하는 for문이다. if(lottoNum[j]==lottoNum[i]) { //초기엔 배열[0]와 배열[1]의 값을 비교한다 System.out.println(j+"중복발견"+lottoNum[j]+"번호가 중복되어 생성됨"); System.out.println(i+"중복발견"+lottoNum[i]+"번호가 중복되어 생성됨"); i--; //만약 중복되는 값이 있으면 다시 로또 번호를 생성하기 위해 break; //i를 --를 해주고 break를 통해 이전 단계로 간다. } } } for(int i=0; i < lottoNum.length; i++) { System.out.println(lottoNum[i]); } } }


'지난 포스팅 > 배열' 카테고리의 다른 글

JAVA 배열 [예제] 로또번호 생성하기[배열로]  (0) 2017.12.26
JAVA 배열 [예제] 총합과 평균  (0) 2017.12.25
JAVA 배열(Array)  (0) 2017.12.24

+ Recent posts