우선 선행 작업이 필요 합니다. 아래 링크로 선행 작업을 완료 합니다.

1. python 설치, telegram bot 설정

  링크 바로가기

2. import 할 것들 install 하기

  pip install json

  pip install schedule

  pip install time

  pip install request


선행 작업이 완료 되었다면 아래와 같이 코딩된 파이썬 파일(telegram.py)을 생성합니다.

비트맥스의(https://www.bitmex.com) API 중 XBTUSD 값을 1분마다 텔레그램으로 보내는 코드 입니다.

(비트맥스가 아닌 다른 거래소도 API 제공하기 때문에 가능합니다. )

API 는 json 으로 보내주기 때문에 json 을 파싱하는 코드도 포함 되어 있습니다.


import urllib.request
import json
import requests
import schedule
import time

# 반복될 작업을 함수로 정의
def scd():
	# API 링크 가져와서 data 변수에 담기
	with urllib.request.urlopen("https://www.bitmex.com/api/v1/trade?symbol=XBTUSD&count=1&reverse=true") as url:
		data = url.read()
	# json 데이터로 j 변수에 담기
	j = json.loads(data)

	# teleurl 변수에 텔레그램 botfather 한테 받은 자신의 API 넣기
	teleurl = "https://api.telegram.org/bot511337000:AAG7gRmT3Ra8FYl22gekgckK_iwVwkJAAAA/sendMessage"
	
	# 로그 찍어보기(지워도 됨)
	print(j[0]["symbol"] + " : " + str(j[0]["price"]))

	# 챗 id 와 symbol : price 값을 텔레그램에 보내기
	params = {'chat_id': '-1001243756825', 'text': j[0]["symbol"] + " : " + str(j[0]["price"])} 
	
	# 텔레그램으로 메시지 전송
	res = requests.get(teleurl, params=params)

# 스케쥴 설정 매분마다 실행
schedule.every().minute.do(scd)

# while 문을 사용하여 스케쥴러 실행
while 1:
	schedule.run_pending()
	time.sleep(60)




작성 완료 하였다면, 해당 파일이 있는 cmd 창을 열어 'python telegram.py' 실행 합니다.






그리고 텔레그램 채널에 메시지가 잘 오는지 확인 합니다.




잘 되시나요?

잘 안되신다면 댓글 달아주세요~~ 감사합니다.

# 파이썬 # python # telegram # 텔레그램



Python 을 사용하여 Telegram Message 를 보내려면 몇 가지의 선행 작업이 필요합니다.


1. python 설치

설치는 아래 미디움 블로그에 잘 나와있습니다^^

파이썬 설치방법 링크 바로가기


2. Telegram Bot 먼저 만들어야 합니다.

  2-1) 텔레그램 봇세팅

  2-2) 채널 만들기

  2-3) 테스트 메시지 보내기


3. pip install requests

  import 할 requests 를 해당경로에 install 해 줍니다.





위와 같은 작업이 완료 되셨다면 메시지 보내기 시작 하겠습니다.


아래와 같이 코딩된 파이썬 파일을 하나 생성 합니다. (붙여넣기 하시면 편합니다)

주의) 파이썬 코딩 시 세미콜론(;) 을 쓰지 않고 띄어쓰기(들여쓰기) 로 시작과 종료 시점을 구분 합니다. 아래 코딩 내용은 들여쓰기가 하나도 없으므로 코딩 시 들여쓰기 하시면 안됩니다.

예) msg.py


# requests import 해야 합니다(필수)
import requests
# 실행 로그
print("asdf")
# 2-3) 에서 받아온 값을 아래 bot..../ 까지 수정해 줍니다.
teleurl = "https://api.telegram.org/bot511337000:AAG7gRmT3Ra8FYl22gekgckK_iwVwkJAAAA/sendMessage"
# params 변수에 챗 2-2) 에서 받은 챗 id 와 보낼 메시지를 넣습니다.
params = {'chat_id': '-1001243756825', 'text': 'asdf'} 
# 아래 한줄 추가 하면 끝
res = requests.get(teleurl, params=params)


저장이 되었다면 cmd 창에서 저장된 폴더로 이동하여 아래와 같이 python msg.py 명령을 내립니다.




그리고 해당 채널에 메시지가 잘 도착했는지 확인을 해 봅니다.




메시지가 잘 보내지나요?


이해가 안되는 부분이 있으시다면 댓글로 남겨 주시면 보는대로 안내 도와드리겠습니다.



안드로이드 스튜디오 에서는 아래와 같이 작성 합니다.

	

// 먼저 volley 를 import 합니다.
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;

// NODE 서버로 보내기 (보내는 함수 안에 아래 사용)

        // node 서버에 보낼 값 Json 형태로 만들기
	JSONObject requestJsonObject = new JSONObject();
	try {
		requestJsonObject.put("seq", seq);

	} catch(JSONException e) {
		e.printStackTrace();
	}

        // 2. RequestQueue 선언
        RequestQueue requestQueue = VolleyNetwork.getInstance(this).getRequestQueue();
    
        // 3. node 서버 IP와 받을 경로 수정 (http://192.168.20.123:3000/post)  하고, 
	JsonObjectRequest R_Object = new JsonObjectRequest(Request.Method.POST,"http://192.168.20.123:3000/receiv", requestJsonObject, new Response.Listener() {
	
		@Override
		public void onResponse(JSONObject response) {
			JSONArray J_JsonArray = new JSONArray();
			try {
				J_JsonArray = response.getJSONArray("results");
				JSONObject dataObj = J_JsonArray.getJSONObject(0);
	
				EditText etId = (EditText) findViewById(R.id.etId);
				EditText etName = (EditText) findViewById(R.id.etName);
	
				etId.setText(dataObj.getString("id"));
				etName.setText(dataObj.getString("name"));
	
			} catch(JSONException e) {
				e.printStackTrace();
			}
	
		}
	}, new Response.ErrorListener() {
	
		@Override
		public void onErrorResponse(VolleyError error) {
			Toast.makeText(context, "네트워크 연결 오류.", Toast.LENGTH_SHORT).show();
			Log.i("VolleyError", "Volley Error in receiv");
		}
	});
	requestQueue.add(R_Object);


// NODE 서버에서 받기 해당 함수 안에 아래 사용

        // 값 가져오기
	EditText etId = (EditText) findViewById(R.id.etId);
	EditText etName = (EditText) findViewById(R.id.etName);
	// 값 세팅
        Id = String.valueOf(etId.getText());
	Name = String.valueOf(etName.getText());

        // Json 형태로 만들기
	JSONObject requestJsonObject = new JSONObject();
	try {
		requestJsonObject.put("Id", Id);
		requestJsonObject.put("Name", Name);

	} catch(JSONException e) {
		e.printStackTrace();
	}

	final Context context = this;

        // volleynetwork 선언
	RequestQueue requestQueue = VolleyNetwork.getInstance(this).getRequestQueue();
	JsonObjectRequest S_Object = new JsonObjectRequest(Request.Method.POST, "http://192.168.20.123:3000/send", requestJsonObject, new Response.Listener() {
		@Override
		public void onResponse(JSONObject response) {
                    // 받아올 값이 없으므로 빈란
		}
	}, new Response.ErrorListener() {

		@Override
		public void onErrorResponse(VolleyError error) {
			Toast.makeText(context, "네트워크 연결 오류.", Toast.LENGTH_SHORT).show();
			Log.i("VolleyError", "Volley Error in send");
		}
	});
        // 실행
	requestQueue.add(S_Object);


위에서 넘긴 값을 Node 서버에서 아래와 같이 처리 합니다.(receiv 의 경우)


	
    // index.js
server.post('/receiv', function(req, res) {
	// receiv 에서 넘긴 seq 값 변수로 담기
        var id = req.body.seq;
	
	var sql = 'SELECT a.id, a.name FROM  table as a where  a.seq = '+seq;	
	dbPool.getConnection(function(err, dbConnection) {
        if(err){
		dbConnection.release();
		console.log('ERROR: CANNOT CONNECT Mysql');
		console.log(err);
		response.status(500).send('Internal Server Error');
        }else{
		dbConnection.query(sqlgetMemList, function(err, result, fields) {
        if(err) {
          dbConnection.release();
          console.log('ERROR: CANNOT QUERY Mysql');
          console.log(err);
          res.status(500).send('Internal Server Error');
        } else {
			
            dbConnection.release();
	    res.setHeader('Content-Type', 'application/json; charset=utf-8');
	    res.status(200);
	    res.json({"results": result});
        }
      });
    }
  });
});


서두 없이 작성해서 죄송합니다. 자세한 내용 원하시면 답변 부탁 드립니다.


+ Recent posts