main.py Saham Turun v1 (belum bisa)
import pandas as pd
import requests
import json
import time
import os.path
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
# CONFIG
SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']
with open('config.json') as f:
config = json.load(f)
SPREADSHEET_ID = config['spreadsheet_id']
TELEGRAM_TOKEN = config['telegram_token']
CHAT_ID = config['telegram_chat_id']
RANGE_NAME = 'Sheet1!A1:H1061'
# --- GOOGLE SHEETS API ---
def get_sheet_service():
creds = None
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
# Kalau token.json tidak ada atau expired:
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Simpan token untuk reuse
with open('token.json', 'w') as token:
token.write(creds.to_json())
service = build('sheets', 'v4', credentials=creds)
return service
def get_sheet_data(service):
sheet = service.spreadsheets()
result = sheet.values().get(spreadsheetId=SPREADSHEET_ID,
range=RANGE_NAME).execute()
values = result.get('values', [])
if not values:
print('No data found.')
return None
else:
headers = values[0]
rows = values[1:]
df = pd.DataFrame(rows, columns=headers)
return df
# --- TELEGRAM ---
def send_telegram_message(message):
url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
payload = {
'chat_id': CHAT_ID,
'text': message
}
requests.post(url, data=payload)
# --- MAIN CHECK ---
def check_prices(df):
for _, row in df.iterrows():
kode = row['Kode Saham']
emiten = row['Nama Emiten']
try:
harga = float(row['Harga Saat Ini'])
batas_turun = float(row['Batas Turun'])
batas_naik = float(row['Batas Naik'])
except:
continue # Skip jika data tidak valid
if harga < batas_turun:
msg = f"🚨 [TURUN] {kode} - {emiten}\nHarga {harga:.2f} di bawah batas turun {batas_turun}"
send_telegram_message(msg)
elif harga > batas_naik:
msg = f"🚀 [NAIK] {kode} - {emiten}\nHarga {harga:.2f} di atas batas naik {batas_naik}"
send_telegram_message(msg)
# --- MAIN LOOP ---
if __name__ == '__main__':
service = get_sheet_service()
while True:
df = get_sheet_data(service)
if df is not None:
check_prices(df)
time.sleep(19)
Comments
Post a Comment