From 221bc63c228b9b6d9fe727f0eee95b7f393573dc Mon Sep 17 00:00:00 2001 From: Sourabh Date: Fri, 10 Jul 2026 17:49:50 +0000 Subject: [PATCH 1/5] Practical --- Day-11/test.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Day-11/test.py diff --git a/Day-11/test.py b/Day-11/test.py new file mode 100644 index 00000000..149200a6 --- /dev/null +++ b/Day-11/test.py @@ -0,0 +1,17 @@ +student_properties= { + "name":"abhi", + "class":"12th" +} + +students_info=[ + { + "name":"nishka", + "class":"12th" +}, + { + "name":"kiyana", + "class":"12th" +}] + +print (student_properties ["name"]) +print (students_info[0]["name"]) \ No newline at end of file From 8b2de6d52bc9e5b716385aaa36c5cc67ab9916f0 Mon Sep 17 00:00:00 2001 From: Sourabh Date: Sat, 11 Jul 2026 07:31:35 +0000 Subject: [PATCH 2/5] Practical --- Day-12/fileoperations.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 Day-12/fileoperations.py diff --git a/Day-12/fileoperations.py b/Day-12/fileoperations.py new file mode 100644 index 00000000..2fa7ea50 --- /dev/null +++ b/Day-12/fileoperations.py @@ -0,0 +1,13 @@ +def updatefileProperties (filePath,key,value): + with open(filePath,"r") as serverConf: + lines = serverConf.readlines(); + + with open(filePath,"w") as serverConf: + for line in lines: + if key in line: + serverConf.write(key+"="+value+"\n") + else: + serverConf.write(line) + + +updatefileProperties("server.conf","MAX_CONNECTIONS","200") \ No newline at end of file From e998a7bf0752e5e8f385a3a4c4c4f768ef950a83 Mon Sep 17 00:00:00 2001 From: Sourabh Date: Tue, 21 Jul 2026 01:55:10 +0000 Subject: [PATCH 3/5] Initial draft for screener --- Day-11/screener-integration.py | 90 ++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 Day-11/screener-integration.py diff --git a/Day-11/screener-integration.py b/Day-11/screener-integration.py new file mode 100644 index 00000000..b6d828c5 --- /dev/null +++ b/Day-11/screener-integration.py @@ -0,0 +1,90 @@ +import json + +import requests + +url = "https://chartink.com/screener/process" + +headers = { + "accept": "*/*", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "en-GB,en-US;q=0.9,en;q=0.8", + "content-type": "application/json", + "origin": "https://chartink.com", + "priority": "u=1, i", + "referer": "https://chartink.com/screener/copy-rsi-above-55-and-breakout-615", + "sec-ch-ua": '"Not;A=Brand";v="8", "Chromium";v="150", "Google Chrome";v="150"', + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": '"macOS"', + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36", + "x-requested-with": "XMLHttpRequest", + "x-xsrf-token": "eyJpdiI6Ikt2alpTV25KblVsUFVKYlZNckZiZWc9PSIsInZhbHVlIjoiNG9kWXpEUnZIY3YxNm1hVnlremVvNkVVSktkU1RNbmxidFdMZTlMQ3o4YUFITXBVOGUrUExIb0dNRHNwaHBzWXZrOEVnZ3NiMkMyamorMzIwSzljbzhyUWQwVkVLWjlEK3RPb2E5U1RaRUh5N1lMdnd2RjZOcVpWRHFEdXRrb1EiLCJtYWMiOiJjNzBjNjdiN2M1MzE2OWMyZjQ2NDRjZTE3NGEwZjBjMjYxNDJiYmFiYjYwY2IxMGJhMjI2ZWQ5ZGQ2NzJhYTFlIiwidGFnIjoiIn0=", +} + +cookie_header = ( + "remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d=" + "eyJpdiI6IkhDd05qM2pTT1JVZW0vdGVHOWNQYlE9PSIsInZhbHVlIjoiNWpJVlIzdW8vRnpWemJGWW80ZWVKelBQUmJqSUZiNy9MWW1HbXk5UEFTa2RWaEJFekNxY0F2bHRpc3M0S2hOR0JGQU5pbzZYNityTURhTGJrT25RcHVNQjR3N2dnNTNWRnhwV1o5QlNnT1ZVYlh4UWgrMWNuYlprM2VMR0tTZmoxczdRRXNFMnIzMndsaUp4MWp1bU00d0tKK3FyNnlhdDgyaytXdmZhUm91NGtLa25JcDYwYkIzTCs5M0Y0VDZnUk92ZWdVQytya0JIdkx1RGlsS1hZdzlUMEJ5RGJXSjZqb0Y3YytwK2V3VT0iLCJtYWMiOiJhOGZiOGY1ZDFiYmExNDRhNmVhMjRmZmExN2FmOGI1Y2VjMDYwZDNkNzZkOGMyOGIzYmM0OWU3M2VkZGEzZWY3IiwidGFnIjoiIn0%3D; " + "_gid=GA1.2.1835299030.1784555416; " + "_cc_id=ddd4893ce0c7883fd0816bb00b1dd02a; " + "panoramaId_expiry=1784641817964; " + "panoramaId=29b17ab660a39c0eba0bea427d07a9fb927a6e7c21f7005df6d60ced08258c76; " + "panoramaIdType=panoDevice; " + "FCCDCF=%5Bnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2C%5B%5B32%2C%22%5B%5C%226f1b27a0-7d11-4a14-98ae-03a35fed3e2a%5C%22%2C%5B1784555417%2C262000000%5D%5D%22%5D%5D%5D; " + "FCNEC=%5B%5B%22AKsRol-TAHbJACJY4lTrE5ZSlvrKAxjPJXn5e-ns2BOn-gqwuibhr6NbHGZUaZzRF80Ca7kNMBb7QAhsRqSehMMwoudMOCcEK5KcwrhEfRWcCXflfJ6qWQ5mePeAXNlA69Fav4cxcIwmIYxtne0C09Q3gSkT2v11bg%3D%3D%22%5D%5D; " + "_ga=GA1.1.1968319544.1784554512; " + "_ga_7P3KPC3ZPP=GS2.1.s1784598208$o3$g1$t1784598228$j40$l0$h0; " + "__gads=ID=a475dc11d13edfcf:T=1784555440:RT=1784598228:S=ALNI_MYui5MgqrqdpMh-ReKIEte6_hI-uA; " + "__gpi=UID=000014cd24fad536:T=1784555440:RT=1784598228:S=ALNI_MZGgCFV-utYaaRCbqopFGIu-JkQow; " + "__eoi=ID=262f680056f8b3e7:T=1784555440:RT=1784598228:S=AA-Afja56EFTSdPZv4hb308AWKUH; " + "XSRF-TOKEN=eyJpdiI6Ikt2alpTV25KblVsUFVKYlZNckZiZWc9PSIsInZhbHVlIjoiNG9kWXpEUnZIY3YxNm1hVnlremVvNkVVSktkU1RNbmxidFdMZTlMQ3o4YUFITXBVOGUrUExIb0dNRHNwaHBzWXZrOEVnZ3NiMkMyamorMzIwSzljbzhyUWQwVkVLWjlEK3RPb2E5U1RaRUh5N1lMdnd2RjZOcVpWRHFEdXRrb1EiLCJtYWMiOiJjNzBjNjdiN2M1MzE2OWMyZjQ2NDRjZTE3NGEwZjBjMjYxNDJiYmFiYjYwY2IxMGJhMjI2ZWQ5ZGQ2NzJhYTFlIiwidGFnIjoiIn0%3D; " + "ci_session=eyJpdiI6IjFST0k3V0svdkZHdzNEZTBMWDVrbHc9PSIsInZhbHVlIjoiMGZZMjIyNFpjMlhLTTFKYlNmVG9CWUJlaStWbzZmb3BUOEhpTmVTTFM4TGhhVlJTZlZqV2IzV0xveExwUFVKWEZuWW5PU240NmR0Vzc2NFhXNmpyMmFuR1EzMjFZL2dXNFQ3TjJxL3JJTk9CMXh2MjlLL0RIKytFVFBVaW83bS8iLCJtYWMiOiI2ZjYyMWQ2ZGQ5YmE3Y2MzZGI2YjYzNmI2NDdhNjg3MjdmMmRhOGM1NmM2NGE2MmYzODE0NTcyNjY2ZDhmMTk3IiwidGFnIjoiIn0%3D" +) + +cookies = {} +for raw_cookie in cookie_header.split(";"): + if "=" in raw_cookie: + key, value = raw_cookie.split("=", 1) + cookies[key.strip()] = value.strip() + +payload = { + "scan_clause": "( {cash} ( weekly close >= 52 and daily ema( close,5 ) > daily ema( close,26 ) and daily ema( close,13 ) > daily ema( close,26 ) and daily close > 1 day ago close * 1.03 and daily volume > daily sma( volume,20 ) * 1.0 and daily ema( close,5 ) > daily ema( close,13 ) and daily high = daily max( 260 , daily high ) * 1 and 1 day ago close > 2 days ago close * 0.98 and daily rsi( 14 ) > 50 ) )", + "debug_clause": "groupcount( 1 where weekly close >= 52),groupcount( 1 where daily ema( close,5 ) > daily ema( close,26 )),groupcount( 1 where daily ema( close,13 ) > daily ema( close,26 )),groupcount( 1 where daily close > 1 day ago close * 1.03),groupcount( 1 where daily volume > daily sma( volume,20 ) * 1.0),groupcount( 1 where daily ema( close,5 ) > daily ema( close,13 )),groupcount( 1 where daily high = daily max( 260 , daily high ) * 1),groupcount( 1 where 1 day ago close > 2 days ago close * 0.98),groupcount( 1 where daily rsi( 14 ) > 50)", + "column_clause": " Daily Close as 'scan-column-default-close', Daily \"close - 1 candle ago close / 1 candle ago close * 100\" as 'scan-column-default-percent-change', filternumber( daily close > 1 day ago close,1) as 'default-percent-change-conditional-filters-color', Daily Volume as 'scan-column-default-volume'", +} + +response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30) + +print(f"Status code: {response.status_code}") +print("Response headers:") +for key, value in response.headers.items(): + if key.lower() in {"content-type", "set-cookie", "cache-control", "server"}: + print(f"{key}: {value}") +print("\n SCRIPT: RSI ABOVE 50 AND BREAKOUT") +print("\nFormatted table:") +try: + data = response.json() + rows = data.get("data", []) + if not rows: + print("No matching records found.") + else: + headers = ["CODE", "NAME", "CLOSE", "CHANGE %", "VOLUME"] + rows_display = [ + [ + item.get("nsecode", ""), + item.get("name", ""), + item.get("scan-column-default-close", ""), + item.get("scan-column-default-percent-change", ""), + item.get("scan-column-default-volume", ""), + ] + for item in rows + ] + + col_widths = [max(len(str(row[i])) for row in [headers] + rows_display) for i in range(len(headers))] + print(" | ".join(header.ljust(col_widths[i]) for i, header in enumerate(headers))) + print("-+-".join("-" * width for width in col_widths)) + for row in rows_display: + print(" | ".join(str(value).ljust(col_widths[i]) for i, value in enumerate(row))) +except ValueError: + print(response.text[:4000]) From 4160d52b442fc8cfbc065706d323e710de140fce Mon Sep 17 00:00:00 2001 From: Sourabh Date: Wed, 22 Jul 2026 01:54:00 +0000 Subject: [PATCH 4/5] Update --- Day-11/screener-integration.py | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/Day-11/screener-integration.py b/Day-11/screener-integration.py index b6d828c5..931b19b4 100644 --- a/Day-11/screener-integration.py +++ b/Day-11/screener-integration.py @@ -1,5 +1,10 @@ import json +try: + import brotli +except ImportError: # pragma: no cover - optional dependency + brotli = None + import requests url = "https://chartink.com/screener/process" @@ -15,12 +20,12 @@ "sec-ch-ua": '"Not;A=Brand";v="8", "Chromium";v="150", "Google Chrome";v="150"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": '"macOS"', - "sec-fetch-dest": "empty", + "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-origin", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36", "x-requested-with": "XMLHttpRequest", - "x-xsrf-token": "eyJpdiI6Ikt2alpTV25KblVsUFVKYlZNckZiZWc9PSIsInZhbHVlIjoiNG9kWXpEUnZIY3YxNm1hVnlremVvNkVVSktkU1RNbmxidFdMZTlMQ3o4YUFITXBVOGUrUExIb0dNRHNwaHBzWXZrOEVnZ3NiMkMyamorMzIwSzljbzhyUWQwVkVLWjlEK3RPb2E5U1RaRUh5N1lMdnd2RjZOcVpWRHFEdXRrb1EiLCJtYWMiOiJjNzBjNjdiN2M1MzE2OWMyZjQ2NDRjZTE3NGEwZjBjMjYxNDJiYmFiYjYwY2IxMGJhMjI2ZWQ5ZGQ2NzJhYTFlIiwidGFnIjoiIn0=", + "x-xsrf-token": "eyJpdiI6InptcjdMOFQyNUorZ2pCS1EvZE53MHc9PSIsInZhbHVlIjoidDNjUjNla2NkOFY2N2NKZEliNjQvTHp1MzRINnZVSUtDTEhCdDB4TnBtVlkwajNtT1RUVVVQOUx3RGUzYklVSWNITTVQVkk3RTc3ZVNNTy9HL1hEVzFNSUs3SXpWOFhvRVYwamM3MEwrM1l0SUFDdllRRHl4MzVkejZRMzM2U1QiLCJtYWMiOiJmMjExY2UzMmY0Mjk3NjNlMTQ5ZjYyYzgyMjc1NTkyZmY1NzU3ZGFhOTBhMWJjNjkyMTU3ZTk0NDVhMGE0ZTEyIiwidGFnIjoiIn0=", } cookie_header = ( @@ -38,8 +43,8 @@ "__gads=ID=a475dc11d13edfcf:T=1784555440:RT=1784598228:S=ALNI_MYui5MgqrqdpMh-ReKIEte6_hI-uA; " "__gpi=UID=000014cd24fad536:T=1784555440:RT=1784598228:S=ALNI_MZGgCFV-utYaaRCbqopFGIu-JkQow; " "__eoi=ID=262f680056f8b3e7:T=1784555440:RT=1784598228:S=AA-Afja56EFTSdPZv4hb308AWKUH; " - "XSRF-TOKEN=eyJpdiI6Ikt2alpTV25KblVsUFVKYlZNckZiZWc9PSIsInZhbHVlIjoiNG9kWXpEUnZIY3YxNm1hVnlremVvNkVVSktkU1RNbmxidFdMZTlMQ3o4YUFITXBVOGUrUExIb0dNRHNwaHBzWXZrOEVnZ3NiMkMyamorMzIwSzljbzhyUWQwVkVLWjlEK3RPb2E5U1RaRUh5N1lMdnd2RjZOcVpWRHFEdXRrb1EiLCJtYWMiOiJjNzBjNjdiN2M1MzE2OWMyZjQ2NDRjZTE3NGEwZjBjMjYxNDJiYmFiYjYwY2IxMGJhMjI2ZWQ5ZGQ2NzJhYTFlIiwidGFnIjoiIn0%3D; " - "ci_session=eyJpdiI6IjFST0k3V0svdkZHdzNEZTBMWDVrbHc9PSIsInZhbHVlIjoiMGZZMjIyNFpjMlhLTTFKYlNmVG9CWUJlaStWbzZmb3BUOEhpTmVTTFM4TGhhVlJTZlZqV2IzV0xveExwUFVKWEZuWW5PU240NmR0Vzc2NFhXNmpyMmFuR1EzMjFZL2dXNFQ3TjJxL3JJTk9CMXh2MjlLL0RIKytFVFBVaW83bS8iLCJtYWMiOiI2ZjYyMWQ2ZGQ5YmE3Y2MzZGI2YjYzNmI2NDdhNjg3MjdmMmRhOGM1NmM2NGE2MmYzODE0NTcyNjY2ZDhmMTk3IiwidGFnIjoiIn0%3D" + "XSRF-TOKEN=eyJpdiI6Ikhpdmp3UytoVTFFM3JrNjJXUitISEE9PSIsInZhbHVlIjoiZkR0YllPK2dlRmtpUURSdStnZ0h0NXdjaHpabzlFM3dQT1B3S3RTbjh5eVVJS1hGV0M3dEhWSml1WU91ckRzTE4wSGFtQmhCelJjVVRUdmJqMWtjd3FnOVkxZXRtMXV6ZHJaWWNONjZtVk9aWDdWVkQrWG5FdlJZZ204VnJzakwiLCJtYWMiOiJkZDQzNWFkYmRhZmRlYmE1Njg3MGU1N2Y1MzAxMTFiYTUzZjdkNzNlYjlkMGEwY2ZhOGVlMzRkZGZhNzlhMzEyIiwidGFnIjoiIn0%3D; " + "ci_session=eyJpdiI6InA0S1dNdCs1ZjN5VVdqQUNtNFcxaXc9PSIsInZhbHVlIjoianJZRnJuR0RpS04rQ1VBZ3M2T0FibWJRd09ETm12aC84Vjc0OVRWMkNJcGpScVdYWVM2S3lPYnEwNlZjZjRHby9uekRrUGl0N0grenN2dmtkK3RaYk1icUxTN05zMnlvR0JhcVVhS2NuTWFRY3ZaWTBaQjhSV2xaT3p3bDNtZUciLCJtYWMiOiI1ZjZlNTJkZDY3ZmEyNjA3ZGQ0OTBkYjRkODkyOWFmMjlmNmI1YThjM2VlMWViNjRlOWU5MTgzY2Q5ZDViYzBhIiwidGFnIjoiIn0%3D" ) cookies = {} @@ -49,10 +54,7 @@ cookies[key.strip()] = value.strip() payload = { - "scan_clause": "( {cash} ( weekly close >= 52 and daily ema( close,5 ) > daily ema( close,26 ) and daily ema( close,13 ) > daily ema( close,26 ) and daily close > 1 day ago close * 1.03 and daily volume > daily sma( volume,20 ) * 1.0 and daily ema( close,5 ) > daily ema( close,13 ) and daily high = daily max( 260 , daily high ) * 1 and 1 day ago close > 2 days ago close * 0.98 and daily rsi( 14 ) > 50 ) )", - "debug_clause": "groupcount( 1 where weekly close >= 52),groupcount( 1 where daily ema( close,5 ) > daily ema( close,26 )),groupcount( 1 where daily ema( close,13 ) > daily ema( close,26 )),groupcount( 1 where daily close > 1 day ago close * 1.03),groupcount( 1 where daily volume > daily sma( volume,20 ) * 1.0),groupcount( 1 where daily ema( close,5 ) > daily ema( close,13 )),groupcount( 1 where daily high = daily max( 260 , daily high ) * 1),groupcount( 1 where 1 day ago close > 2 days ago close * 0.98),groupcount( 1 where daily rsi( 14 ) > 50)", - "column_clause": " Daily Close as 'scan-column-default-close', Daily \"close - 1 candle ago close / 1 candle ago close * 100\" as 'scan-column-default-percent-change', filternumber( daily close > 1 day ago close,1) as 'default-percent-change-conditional-filters-color', Daily Volume as 'scan-column-default-volume'", -} + "scan_clause":"( {cash} ( quarterly indian promoter and group percentage > 1 quarter ago indian promoter and group percentage and market cap >= 1000 and daily \"close - 1 candle ago close / 1 candle ago close * 100\" > 10 ) )","debug_clause":"groupcount( 1 where quarterly indian promoter and group percentage > 1 quarter ago indian promoter and group percentage),groupcount( 1 where market cap >= 1000),groupcount( 1 where daily \"close - 1 candle ago close / 1 candle ago close * 100\" > 10)","column_clause":" Daily Close as 'scan-column-default-close', Daily \"close - 1 candle ago close / 1 candle ago close * 100\" as 'scan-column-default-percent-change', filternumber( daily close > 1 day ago close,1) as 'default-percent-change-conditional-filters-color', Daily Volume as 'scan-column-default-volume'"} response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30) @@ -64,7 +66,15 @@ print("\n SCRIPT: RSI ABOVE 50 AND BREAKOUT") print("\nFormatted table:") try: - data = response.json() + content_encoding = response.headers.get("content-encoding", "").lower() + decoded_body = response.text or "" + + if not decoded_body and brotli is not None and "br" in content_encoding: + decoded_body = brotli.decompress(response.content).decode("utf-8", errors="replace") + elif not decoded_body: + decoded_body = response.content.decode("utf-8", errors="replace") + + data = json.loads(decoded_body) rows = data.get("data", []) if not rows: print("No matching records found.") @@ -86,5 +96,6 @@ print("-+-".join("-" * width for width in col_widths)) for row in rows_display: print(" | ".join(str(value).ljust(col_widths[i]) for i, value in enumerate(row))) -except ValueError: - print(response.text[:4000]) +except (ValueError, json.JSONDecodeError, AttributeError) as exc: + print(f"Unable to parse response as JSON: {exc}") + print(decoded_body[:4000] if "decoded_body" in locals() else response.text[:4000]) From 95f5a32a0a91a0766636af4ef325e6c4e8166e93 Mon Sep 17 00:00:00 2001 From: Sourabh Date: Wed, 22 Jul 2026 02:10:05 +0000 Subject: [PATCH 5/5] Updated --- Day-11/screener-integration.py | 132 +++++++++++++++++++++------------ 1 file changed, 84 insertions(+), 48 deletions(-) diff --git a/Day-11/screener-integration.py b/Day-11/screener-integration.py index 931b19b4..496a7729 100644 --- a/Day-11/screener-integration.py +++ b/Day-11/screener-integration.py @@ -1,15 +1,15 @@ import json +import requests + try: import brotli except ImportError: # pragma: no cover - optional dependency brotli = None -import requests - -url = "https://chartink.com/screener/process" +URL = "https://chartink.com/screener/process" -headers = { +HEADERS = { "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "accept-language": "en-GB,en-US;q=0.9,en;q=0.8", @@ -20,7 +20,7 @@ "sec-ch-ua": '"Not;A=Brand";v="8", "Chromium";v="150", "Google Chrome";v="150"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": '"macOS"', - "sec-fetch-dest": "empty", + "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-origin", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36", @@ -47,55 +47,91 @@ "ci_session=eyJpdiI6InA0S1dNdCs1ZjN5VVdqQUNtNFcxaXc9PSIsInZhbHVlIjoianJZRnJuR0RpS04rQ1VBZ3M2T0FibWJRd09ETm12aC84Vjc0OVRWMkNJcGpScVdYWVM2S3lPYnEwNlZjZjRHby9uekRrUGl0N0grenN2dmtkK3RaYk1icUxTN05zMnlvR0JhcVVhS2NuTWFRY3ZaWTBaQjhSV2xaT3p3bDNtZUciLCJtYWMiOiI1ZjZlNTJkZDY3ZmEyNjA3ZGQ0OTBkYjRkODkyOWFmMjlmNmI1YThjM2VlMWViNjRlOWU5MTgzY2Q5ZDViYzBhIiwidGFnIjoiIn0%3D" ) -cookies = {} +COOKIES = {} for raw_cookie in cookie_header.split(";"): if "=" in raw_cookie: key, value = raw_cookie.split("=", 1) - cookies[key.strip()] = value.strip() + COOKIES[key.strip()] = value.strip() + +PAYLOADS = { + "RSIAbove50": { + "scan_clause": "( {cash} ( weekly close >= 52 and daily ema( close,5 ) > daily ema( close,26 ) and daily ema( close,13 ) > daily ema( close,26 ) and daily close > 1 day ago close * 1.03 and daily volume > daily sma( volume,20 ) * 1.0 and daily ema( close,5 ) > daily ema( close,13 ) and daily high = daily max( 260 , daily high ) * 1 and 1 day ago close > 2 days ago close * 0.98 and daily rsi( 14 ) > 55 ) )", + "debug_clause": "groupcount( 1 where weekly close >= 52),groupcount( 1 where daily ema( close,5 ) > daily ema( close,26 )),groupcount( 1 where daily ema( close,13 ) > daily ema( close,26 )),groupcount( 1 where daily close > 1 day ago close * 1.03),groupcount( 1 where daily volume > daily sma( volume,20 ) * 1.0),groupcount( 1 where daily ema( close,5 ) > daily ema( close,13 )),groupcount( 1 where daily high = daily max( 260 , daily high ) * 1),groupcount( 1 where 1 day ago close > 2 days ago close * 0.98),groupcount( 1 where daily rsi( 14 ) > 55)", + "column_clause": " Daily Close as 'scan-column-default-close', Daily \"close - 1 candle ago close / 1 candle ago close * 100\" as 'scan-column-default-percent-change', filternumber( daily close > 1 day ago close,1) as 'default-percent-change-conditional-filters-color', Daily Volume as 'scan-column-default-volume'", + }, + "ShortTermBreakouts": { + "scan_clause": "( {cash} ( daily max( 5 , daily close ) > 6 days ago max( 120 , daily close ) * 1.05 and daily volume > daily sma( volume,5 ) and daily close > 1 day ago close ) )", + "debug_clause": "groupcount( 1 where daily max( 5 , daily close ) > 6 days ago max( 120 , daily close ) * 1.05),groupcount( 1 where daily volume > daily sma( volume,5 )),groupcount( 1 where daily close > 1 day ago close)", + "column_clause": " Daily Close as 'scan-column-default-close', Daily \"close - 1 candle ago close / 1 candle ago close * 100\" as 'scan-column-default-percent-change', filternumber( daily \"close - 1 candle ago close / 1 candle ago close * 100\" > 0,1) as 'default-percent-change-conditional-filters-color', Daily Volume as 'scan-column-default-volume'", + }, + "52wHighBreakouts": { + "scan_clause":"( {cash} ( daily close > 1 day ago max( 240 , daily high ) ) )","debug_clause":"groupcount( 1 where daily close > 1 day ago max( 240 , daily high ))","column_clause":" Daily Close as 'scan-column-default-close', Daily \"close - 1 candle ago close / 1 candle ago close * 100\" as 'scan-column-default-percent-change', filternumber( daily close > 1 day ago close,1) as 'default-percent-change-conditional-filters-color', Daily Volume as 'scan-column-default-volume'"} +} -payload = { - "scan_clause":"( {cash} ( quarterly indian promoter and group percentage > 1 quarter ago indian promoter and group percentage and market cap >= 1000 and daily \"close - 1 candle ago close / 1 candle ago close * 100\" > 10 ) )","debug_clause":"groupcount( 1 where quarterly indian promoter and group percentage > 1 quarter ago indian promoter and group percentage),groupcount( 1 where market cap >= 1000),groupcount( 1 where daily \"close - 1 candle ago close / 1 candle ago close * 100\" > 10)","column_clause":" Daily Close as 'scan-column-default-close', Daily \"close - 1 candle ago close / 1 candle ago close * 100\" as 'scan-column-default-percent-change', filternumber( daily close > 1 day ago close,1) as 'default-percent-change-conditional-filters-color', Daily Volume as 'scan-column-default-volume'"} +aggregated_rows = {} -response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30) +for tag, payload in PAYLOADS.items(): + response = requests.post(URL, headers=HEADERS, cookies=COOKIES, json=payload, timeout=30) + print(f"\nTag: {tag} | Status code: {response.status_code}") -print(f"Status code: {response.status_code}") -print("Response headers:") -for key, value in response.headers.items(): - if key.lower() in {"content-type", "set-cookie", "cache-control", "server"}: - print(f"{key}: {value}") -print("\n SCRIPT: RSI ABOVE 50 AND BREAKOUT") + try: + content_encoding = response.headers.get("content-encoding", "").lower() + decoded_body = response.text or "" + + if not decoded_body and brotli is not None and "br" in content_encoding: + decoded_body = brotli.decompress(response.content).decode("utf-8", errors="replace") + elif not decoded_body: + decoded_body = response.content.decode("utf-8", errors="replace") + + data = json.loads(decoded_body) + rows = data.get("data", []) + if not rows: + print(f"No matching records found for {tag}.") + continue + + for item in rows: + code = item.get("nsecode", "") + name = item.get("name", "") + key = (code, name) + + if key not in aggregated_rows: + aggregated_rows[key] = { + "code": code, + "name": name, + "close": item.get("scan-column-default-close", ""), + "change": item.get("scan-column-default-percent-change", ""), + "volume": item.get("scan-column-default-volume", ""), + "tags": [tag], + } + elif tag not in aggregated_rows[key]["tags"]: + aggregated_rows[key]["tags"].append(tag) + except (ValueError, json.JSONDecodeError, AttributeError) as exc: + print(f"Unable to parse response for {tag}: {exc}") + print(decoded_body[:4000] if "decoded_body" in locals() else response.text[:4000]) + +print("\n SCRIPT: MULTI-PAYLOAD SCREENER RESULTS") print("\nFormatted table:") -try: - content_encoding = response.headers.get("content-encoding", "").lower() - decoded_body = response.text or "" - - if not decoded_body and brotli is not None and "br" in content_encoding: - decoded_body = brotli.decompress(response.content).decode("utf-8", errors="replace") - elif not decoded_body: - decoded_body = response.content.decode("utf-8", errors="replace") - - data = json.loads(decoded_body) - rows = data.get("data", []) - if not rows: - print("No matching records found.") - else: - headers = ["CODE", "NAME", "CLOSE", "CHANGE %", "VOLUME"] - rows_display = [ - [ - item.get("nsecode", ""), - item.get("name", ""), - item.get("scan-column-default-close", ""), - item.get("scan-column-default-percent-change", ""), - item.get("scan-column-default-volume", ""), - ] - for item in rows +if not aggregated_rows: + print("No matching records found.") +else: + headers = ["CODE", "NAME", "TAGS", "CLOSE", "CHANGE %", "VOLUME"] + rows_display = [ + [ + row["code"], + row["name"], + ", ".join(row["tags"]), + row["close"], + row["change"], + row["volume"], ] + for row in sorted( + aggregated_rows.values(), + key=lambda item: (-len(item["tags"]), item["code"], item["name"]), + ) + ] - col_widths = [max(len(str(row[i])) for row in [headers] + rows_display) for i in range(len(headers))] - print(" | ".join(header.ljust(col_widths[i]) for i, header in enumerate(headers))) - print("-+-".join("-" * width for width in col_widths)) - for row in rows_display: - print(" | ".join(str(value).ljust(col_widths[i]) for i, value in enumerate(row))) -except (ValueError, json.JSONDecodeError, AttributeError) as exc: - print(f"Unable to parse response as JSON: {exc}") - print(decoded_body[:4000] if "decoded_body" in locals() else response.text[:4000]) + col_widths = [max(len(str(row[i])) for row in [headers] + rows_display) for i in range(len(headers))] + print(" | ".join(header.ljust(col_widths[i]) for i, header in enumerate(headers))) + print("-+-".join("-" * width for width in col_widths)) + for row in rows_display: + print(" | ".join(str(value).ljust(col_widths[i]) for i, value in enumerate(row)))