vnai 0.0.6__py3-none-any.whl → 0.0.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- vnai/__init__.py +30 -27
- {vnai-0.0.6.dist-info → vnai-0.0.8.dist-info}/METADATA +1 -1
- vnai-0.0.8.dist-info/RECORD +5 -0
- {vnai-0.0.6.dist-info → vnai-0.0.8.dist-info}/top_level.txt +0 -1
- raw/__init__.py +0 -335
- raw/analytics.py +0 -341
- raw/setup.py +0 -9
- vnai-0.0.6.dist-info/RECORD +0 -8
- {vnai-0.0.6.dist-info → vnai-0.0.8.dist-info}/WHEEL +0 -0
vnai/__init__.py
CHANGED
@@ -23,52 +23,55 @@ TC_PATH = ID_DIR / "terms_agreement.txt"
|
|
23
23
|
class VnstockInitializer:
|
24
24
|
def __init__(self, target):
|
25
25
|
self.TERMS_AND_CONDITIONS = """
|
26
|
-
|
27
|
-
------------------------
|
28
|
-
Khi sử dụng vnstock, bạn xác nhận rằng bạn đã đọc, hiểu rõ, và chấp nhận các điều khoản mô tả dưới đây.
|
29
|
-
Vui lòng nhập 'Tôi đồng ý' hoặc nhấn Enter để chấp nhận các điều khoản và điều kiện này và tiếp tục sử dụng phần mềm.
|
26
|
+
Vui lòng nhập 'Tôi đồng ý' hoặc nhấn Enter để chấp nhận các điều khoản, điều kiện và tiếp tục sử dụng phần mềm.
|
30
27
|
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
Bạn cũng có thể tự động chấp nhận điều khoản và ẩn thông báo này với câu lệnh mẫu bên dưới:
|
29
|
+
```
|
30
|
+
import os
|
31
|
+
if "ACCEPT_TC" not in os.environ:
|
32
|
+
os.environ["ACCEPT_TC"] = "tôi đồng ý"
|
33
|
+
```
|
34
34
|
|
35
|
-
|
35
|
+
THOẢ THUẬN & GIẤY PHÉP SỬ DỤNG PHẦN MỀM VNSTOCK3
|
36
|
+
------------------------------------------------
|
36
37
|
|
37
|
-
|
38
|
+
(*) Gói thư viện Python Vnstock thế hệ thứ 3 được phát hành vào tháng 5 năm 2024, được đề cập đến trong giấy phép này với tên gọi tắt là Vnstock3.
|
38
39
|
|
39
|
-
|
40
|
+
Khi bạn truy cập, sử dụng nội dung mã nguồn Vnstock3, hoặc cài đặt Vnstock3 trên thiết bị của mình, bạn xác nhận rằng mình đã đọc, hiểu rõ, và chấp nhận điều khoản sử dụng phần mềm như mô tả dưới đây. Bạn cần xác nhận điều khoản & điều kiện trong lần đầu tiên chạy thư viện Vnstock để có thể sử dụng.
|
40
41
|
|
41
|
-
|
42
|
+
I. ĐIỀU KHOẢN CHUNG
|
43
|
+
-------------------
|
42
44
|
|
43
|
-
|
44
|
-
------------------------
|
45
|
-
Thư viện này thu thập dữ liệu để phân tích, thống kê, và cải thiện hiệu suất. Dữ liệu này sẽ không được chia sẻ với bên thứ ba. Dưới đây là danh sách các thông tin được thu thập, cùng với giải thích và ví dụ mẫu:
|
45
|
+
Cấp Phép: Thư viện này chỉ dành cho mục đích cá nhân và không được phân phối lại hoặc sử dụng cho mục đích thương mại mà không có sự đồng ý bằng văn bản chính thức từ tác giả. Tất cả bản quyền và sở hữu trí tuệ thuộc về tác giả. Bất kỳ hành vi vi phạm bản quyền hoặc sở hữu trí tuệ sẽ bị xử lý theo pháp luật.
|
46
46
|
|
47
|
-
|
47
|
+
Hạn Chế Sử Dụng Thương Mại: Sử dụng Vnstock3 cho mục đích thương mại bởi bất kỳ tổ chức nào là không được phép. Điều này bao gồm, nhưng không giới hạn, các hoạt động mà Vnstock3 trực tiếp hoặc gián tiếp góp phần tạo ra doanh thu hoặc dòng tiền cho một tổ chức mà không có sự chấp thuận bằng văn bản từ tác giả. Tuy nhiên, việc sử dụng Vnstock3 cho mục đích cá nhân, nghiên cứu vẫn được duy trì miễn phí.
|
48
48
|
|
49
|
-
|
49
|
+
Các Mục Đích Sử Dụng Bị Cấm: Bạn không được sử dụng Vnstock cho các mục đích bất hợp pháp, phi đạo đức, hoặc trái với quy định pháp luật hiện hành.
|
50
50
|
|
51
|
-
|
51
|
+
Từ Chối Trách Nhiệm: Tác giả không chịu trách nhiệm cho bất kỳ thiệt hại, mất mát, hoặc hậu quả nào phát sinh từ việc sử dụng thư viện này, đặc biệt trong hoạt động đầu tư hoặc bất kỳ hoạt động nào có rủi ro. Bạn tự chịu trách nhiệm cho các quyết định đầu tư của mình.
|
52
52
|
|
53
|
-
|
53
|
+
Tuân Thủ Luật Pháp: Bạn đồng ý tuân thủ mọi luật pháp, quy định, và hướng dẫn liên quan khi sử dụng thư viện này.
|
54
54
|
|
55
|
-
|
55
|
+
Bảo Mật Dữ Liệu: Vnstock có thể lưu trữ dữ liệu ẩn danh của thiết bị để tối ưu tính năng và cải thiện hiệu năng phần mềm. Thông tin này sẽ được bảo mật và không được chia sẻ với bên thứ ba mà không có sự đồng ý của bạn.
|
56
56
|
|
57
|
-
|
57
|
+
II. BẢN QUYỀN VÀ SỞ HỮU
|
58
|
+
-----------------------
|
58
59
|
|
59
|
-
|
60
|
+
Bản quyền (c) 2024 Thinh Vu @ Vnstock. Tất cả các quyền được bảo lưu.
|
60
61
|
|
61
|
-
|
62
|
+
Sử Dụng và Phân Phối Không Được Phép: Việc sao chép, phân phối, hoặc khai thác thương mại Vnstock3, hoặc bất kỳ phần nào của nó là không được phép. Giới hạn này bao gồm bất kỳ hình thức tạo ra doanh thu hoặc sử dụng cho tổ chức mà không được sự cho phép rõ ràng của tác giả. Tuy nhiên, việc sử dụng cá nhân, chỉnh sửa, và nghiên cứu học thuật không liên quan đến lợi ích thương mại vẫn được duy trì. Người dùng tham gia vào các hoạt động được cho phép nên tôn trọng mục đích của phần mềm này như một công cụ cho việc thúc đẩy phát triển cá nhân và mục đích giáo dục, chứ không phải để lợi dụng tính chất mở của phần mềm cho mục đích sinh lợi trong khi tổ chức vốn có nguồn tiềm lực về tài chính và con người nhưng không chia sẻ với tác giả và đội ngũ phát triển. Vi phạm các điều khoản này tương đương với việc đánh cắp quyền sở hữu trí tuệ và phi đạo đức, có thể dẫn đến các rắc rối pháp lý kèm theo.
|
62
63
|
|
63
|
-
|
64
|
+
III. CHẤM DỨT
|
65
|
+
-------------
|
64
66
|
|
65
|
-
|
67
|
+
Thỏa thuận này có hiệu lực cho đến khi được chấm dứt. Nó sẽ tự động chấm dứt ngay lập tức mà không cần thông báo từ tác giả nếu bạn không tuân thủ bất kỳ điều khoản nào của thỏa thuận này. Sau khi chấm dứt, bạn phải hủy bỏ tất cả các bản sao của Vnstock3 và tất cả các bộ phận thành phần của nó.
|
66
68
|
|
67
|
-
|
69
|
+
IV. ĐIỀU KHOẢN THI HÀNH
|
70
|
+
-----------------------
|
68
71
|
|
69
|
-
|
72
|
+
Thỏa thuận này sẽ được điều chỉnh và giải thích theo luật pháp của quốc gia mà tác giả cư trú, không kể đến các quy định xung đột của pháp luật.
|
70
73
|
|
71
|
-
|
74
|
+
Bằng cách sử dụng Vnstock3, bạn đồng ý rằng mình sẽ bị ràng buộc bởi các điều khoản của Thỏa thuận này. Nếu bạn không đồng ý với các điều khoản của Thỏa thuận này, vui lòng không cài đặt hoặc sử dụng Vnstock3.
|
72
75
|
"""
|
73
76
|
|
74
77
|
self.home_dir = HOME_DIR
|
@@ -0,0 +1,5 @@
|
|
1
|
+
vnai/__init__.py,sha256=g2A3xU7vNbC-P6P_0nhtwda3k0YcqyfiTVj7Z2BL8KE,16992
|
2
|
+
vnai-0.0.8.dist-info/METADATA,sha256=ONJePzbpjDWiCs-O4s52NJnppS-srWczJl6_79dwztE,576
|
3
|
+
vnai-0.0.8.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
4
|
+
vnai-0.0.8.dist-info/top_level.txt,sha256=4zI0qZHePCwvgSqXl4420sBcd0VzZn4MEcRsAIFae3k,5
|
5
|
+
vnai-0.0.8.dist-info/RECORD,,
|
raw/__init__.py
DELETED
@@ -1,335 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import pathlib
|
3
|
-
import importlib.metadata
|
4
|
-
import requests
|
5
|
-
import psutil
|
6
|
-
import platform
|
7
|
-
import uuid
|
8
|
-
import sys
|
9
|
-
import socket
|
10
|
-
import json
|
11
|
-
import base64
|
12
|
-
from cryptography.fernet import Fernet
|
13
|
-
|
14
|
-
TC_VAR = "ACCEPT_TC"
|
15
|
-
TC_VAL = "tôi đồng ý"
|
16
|
-
|
17
|
-
HOME_DIR = pathlib.Path.home()
|
18
|
-
PROJECT_DIR = HOME_DIR / ".vnstock"
|
19
|
-
ID_DIR = PROJECT_DIR / 'id'
|
20
|
-
TG = b'gAAAAABmOPXPmFYXs94INEralMxhR38geFp91TZRLP29C41OoO0k7D7QiXIR2nWl5PCEoQCKECZw8b-Xeek3oqT6LcpcpJsAPyOGOBTX5cw_r5Mv0o8SBLa53jOeuVAwCAhId_BpMtOO'
|
21
|
-
TC_PATH = ID_DIR / "terms_agreement.txt"
|
22
|
-
|
23
|
-
class VnstockInitializer:
|
24
|
-
def __init__(self, target):
|
25
|
-
self.TERMS_AND_CONDITIONS = """
|
26
|
-
THOẢ THUẬN SỬ DỤNG - ĐIỀU KHOẢN & ĐIỀU KIỆN SỬ DỤNG VNSTOCK3
|
27
|
-
------------------------
|
28
|
-
Khi sử dụng vnstock, bạn xác nhận rằng bạn đã đọc, hiểu rõ, và chấp nhận các điều khoản mô tả dưới đây.
|
29
|
-
Vui lòng nhập 'Tôi đồng ý' hoặc nhấn Enter để chấp nhận các điều khoản và điều kiện này và tiếp tục sử dụng phần mềm.
|
30
|
-
|
31
|
-
I. ĐIỀU KHOẢN CHUNG
|
32
|
-
------------------------
|
33
|
-
- Thư viện này chỉ dành cho mục đích cá nhân và không được phân phối lại hoặc sử dụng cho mục đích thương mại mà không có sự đồng ý bằng văn bản chính thức từ tác giả. Tất cả bản quyền và sở hữu trí tuệ thuộc về tác giả. Bất kỳ hành vi vi phạm bản quyền hoặc sở hữu trí tuệ sẽ bị xử lý theo pháp luật.
|
34
|
-
|
35
|
-
- Bạn không được sử dụng Vnstock cho các mục đích bất hợp pháp, phi đạo đức, hoặc trái với quy định pháp luật hiện hành.
|
36
|
-
|
37
|
-
- Bạn đồng ý rằng tác giả không chịu trách nhiệm cho bất kỳ thiệt hại, mất mát, hoặc hậu quả nào phát sinh từ việc sử dụng thư viện này, đặc biệt trong hoạt động đầu tư hoặc bất kỳ hoạt động nào có rủi ro. Bạn tự chịu trách nhiệm cho các quyết định đầu tư của mình.
|
38
|
-
|
39
|
-
- Bạn đồng ý tuân thủ mọi luật pháp, quy định, và hướng dẫn liên quan khi sử dụng thư viện này.
|
40
|
-
|
41
|
-
- Bạn chấp nhận rằng Vnstock có thể lưu trữ dữ liệu ẩn danh của thiết bị để tối ưu tính năng và cải thiện hiệu năng phần mềm. Thông tin này sẽ được bảo mật và không được chia sẻ với bên thứ ba mà không có sự đồng ý của bạn.
|
42
|
-
|
43
|
-
II. LƯU TRỮ & XỬ LÝ DỮ LIỆU
|
44
|
-
------------------------
|
45
|
-
Thư viện này thu thập dữ liệu để phân tích, thống kê, và cải thiện hiệu suất. Dữ liệu này sẽ không được chia sẻ với bên thứ ba. Dưới đây là danh sách các thông tin được thu thập, cùng với giải thích và ví dụ mẫu:
|
46
|
-
|
47
|
-
- UUID (Machine ID): Một định danh duy nhất cho máy tính của bạn, giúp phân biệt các thiết bị. Ví dụ: "123e4567-e89b-12d3-a456-426614174000".
|
48
|
-
|
49
|
-
- Environment (Môi trường): Mô tả môi trường chạy chương trình, như "development", "testing", hoặc "production". Ví dụ: "production".
|
50
|
-
|
51
|
-
- Python Version (Phiên bản Python): Phiên bản Python đang chạy trên hệ thống của bạn. Ví dụ: "3.9.1".
|
52
|
-
|
53
|
-
- OS Name (Tên hệ điều hành): Tên hệ điều hành đang chạy trên máy tính. Ví dụ: "Windows".
|
54
|
-
|
55
|
-
- OS Version (Phiên bản hệ điều hành): Phiên bản cụ thể của hệ điều hành. Ví dụ: "10.0.19041".
|
56
|
-
|
57
|
-
- Machine (Máy): Mô tả loại máy tính hoặc kiến trúc phần cứng. Ví dụ: "AMD64".
|
58
|
-
|
59
|
-
- CPU Model (Mô hình CPU): Thông tin về loại bộ xử lý (CPU) trên máy tính. Ví dụ: "Intel Core i7-8700".
|
60
|
-
|
61
|
-
- CPU Cores (Số lõi CPU): Số lõi vật lý của CPU. Ví dụ: 6.
|
62
|
-
|
63
|
-
- CPU Logical Cores (Số lõi CPU logic): Số lõi logic của CPU, thường bao gồm cả lõi vật lý và lõi ảo. Ví dụ: 12.
|
64
|
-
|
65
|
-
- RAM Total (Tổng dung lượng RAM): Tổng dung lượng bộ nhớ RAM trên máy tính, tính bằng gigabyte (GB). Ví dụ: 16.0 GB.
|
66
|
-
|
67
|
-
- RAM Available (Dung lượng RAM có sẵn): Dung lượng bộ nhớ RAM còn trống, tính bằng gigabyte (GB). Ví dụ: 8.5 GB.
|
68
|
-
|
69
|
-
- Local IP (Địa chỉ IP cục bộ): Địa chỉ IP cục bộ của máy tính.
|
70
|
-
|
71
|
-
- MAC Address (Địa chỉ MAC): Địa chỉ MAC (Media Access Control) của thiết bị mạng. Ví dụ: "00:1A:A2:3B:4C:5D".
|
72
|
-
"""
|
73
|
-
|
74
|
-
self.home_dir = HOME_DIR
|
75
|
-
self.project_dir = PROJECT_DIR
|
76
|
-
self.id_dir = ID_DIR
|
77
|
-
self.terms_file_path = TC_PATH
|
78
|
-
self.RH = 'asejruyy^&%$#W2vX>NfwrevDRESWR'
|
79
|
-
self.LH = 'YMAnhuytr%$59u90y7j-mjhgvyFTfbiuUYH'
|
80
|
-
|
81
|
-
# Create the project directory if it doesn't exist
|
82
|
-
self.project_dir.mkdir(exist_ok=True)
|
83
|
-
self.id_dir.mkdir(exist_ok=True)
|
84
|
-
self.target = target
|
85
|
-
|
86
|
-
kb = (str(self.project_dir).split("/")[-1] + str(self.id_dir).split("/")[-1] + str(self.terms_file_path).split("/")[-1]).ljust(32)[:32].encode('utf-8')
|
87
|
-
kb64 = base64.urlsafe_b64encode(kb)
|
88
|
-
self.cph = Fernet(kb64)
|
89
|
-
|
90
|
-
def system_info(self):
|
91
|
-
"""
|
92
|
-
Gathers information about the environment and system.
|
93
|
-
"""
|
94
|
-
# Generate UUID
|
95
|
-
machine_id = str(uuid.uuid4())
|
96
|
-
|
97
|
-
# Environment (modify to detect your specific frameworks)
|
98
|
-
try:
|
99
|
-
from IPython import get_ipython
|
100
|
-
if 'IPKernelApp' not in get_ipython().config: # Check if not in IPython kernel
|
101
|
-
if sys.stdout.isatty():
|
102
|
-
environment = "Terminal"
|
103
|
-
else:
|
104
|
-
environment = "Other" # Non-interactive environment (e.g., script executed from an IDE)
|
105
|
-
else:
|
106
|
-
if 'google.colab' in sys.modules:
|
107
|
-
environment = "Google Colab"
|
108
|
-
else:
|
109
|
-
environment = "Jupyter"
|
110
|
-
except (ImportError, AttributeError):
|
111
|
-
# Fallback if IPython isn't installed or other checks fail
|
112
|
-
if sys.stdout.isatty():
|
113
|
-
environment = "Terminal"
|
114
|
-
else:
|
115
|
-
environment = "Other"
|
116
|
-
|
117
|
-
# System information
|
118
|
-
os_info = platform.uname()
|
119
|
-
|
120
|
-
# CPU information
|
121
|
-
cpu_arch = platform.processor()
|
122
|
-
cpu_logical_cores = psutil.cpu_count(logical=True)
|
123
|
-
cpu_cores = psutil.cpu_count(logical=False)
|
124
|
-
|
125
|
-
# Memory information
|
126
|
-
ram_total = psutil.virtual_memory().total / (1024**3) # GB
|
127
|
-
ram_available = psutil.virtual_memory().available / (1024**3) # GB
|
128
|
-
|
129
|
-
hostname = socket.gethostname()
|
130
|
-
IPAddr = socket.gethostbyname(hostname)
|
131
|
-
|
132
|
-
mac = ':'.join(['{:02x}'.format((uuid.getnode() >> elements) & 0xff) for elements in range(0, 2 * 6, 2)])
|
133
|
-
|
134
|
-
# Combine information into a dictionary
|
135
|
-
info = {
|
136
|
-
"uuid": machine_id,
|
137
|
-
"environment": environment,
|
138
|
-
"python_version": platform.python_version(),
|
139
|
-
"os_name": os_info.system,
|
140
|
-
"os_version": os_info.version,
|
141
|
-
"machine": os_info.machine,
|
142
|
-
"cpu_model": cpu_arch,
|
143
|
-
"cpu_cores": cpu_cores,
|
144
|
-
"cpu_logical_cores": cpu_logical_cores,
|
145
|
-
"ram_total": round(ram_total, 1),
|
146
|
-
"ram_available": round(ram_available, 1),
|
147
|
-
"local_ip": IPAddr,
|
148
|
-
"mac_address": mac,
|
149
|
-
}
|
150
|
-
|
151
|
-
return info
|
152
|
-
|
153
|
-
def show_terms_and_conditions(self):
|
154
|
-
"""
|
155
|
-
Displays terms and conditions and asks for acceptance.
|
156
|
-
"""
|
157
|
-
print(self.TERMS_AND_CONDITIONS)
|
158
|
-
|
159
|
-
# check if os.environ[TC_VAR] exist and equal to tôi đồng ý
|
160
|
-
if TC_VAR in os.environ and os.environ[TC_VAR] == TC_VAL:
|
161
|
-
response = TC_VAL
|
162
|
-
else:
|
163
|
-
response = input("Nhập 'Tôi đồng ý' hoặc nhấn Enter để chấp nhận: ")
|
164
|
-
if not response.strip():
|
165
|
-
response = TC_VAL
|
166
|
-
os.environ[TC_VAR] = response
|
167
|
-
|
168
|
-
if response.strip().lower() == TC_VAL:
|
169
|
-
from datetime import datetime
|
170
|
-
# get now time in string
|
171
|
-
now = datetime.now()
|
172
|
-
HARDWARE = self.system_info()
|
173
|
-
# VERSION = pkg_resources.get_distribution('vnstock').version
|
174
|
-
|
175
|
-
VERSION = None
|
176
|
-
try:
|
177
|
-
VERSION = importlib.metadata.version('vnstock')
|
178
|
-
except importlib.metadata.PackageNotFoundError:
|
179
|
-
print("Package 'vnstock' not found")
|
180
|
-
|
181
|
-
# parse HARDWARE to string to store in the file
|
182
|
-
signed_aggreement = f"PHIÊN BẢN: {VERSION}\nMÔ TẢ:\nNgười dùng có mã nhận dạng {HARDWARE['uuid']} đã chấp nhận điều khoản & điều kiện sử dụng Vnstock lúc {now}\n---\n\nTHÔNG TIN THIẾT BỊ: {str(HARDWARE)}\n\nĐính kèm bản sao nội dung bạn đã đọc, hiểu rõ và đồng ý dưới đây:\n{self.TERMS_AND_CONDITIONS}"
|
183
|
-
|
184
|
-
# Store the acceptance
|
185
|
-
with open(self.terms_file_path, "w", encoding="utf-8") as f:
|
186
|
-
f.write(signed_aggreement)
|
187
|
-
|
188
|
-
print("---\nCảm ơn bạn đã chấp nhận điều khoản và điều kiện!\nBạn đã có thể tiếp tục sử dụng Vnstock!")
|
189
|
-
return True
|
190
|
-
else:
|
191
|
-
return False
|
192
|
-
|
193
|
-
def log_analytics_data(self):
|
194
|
-
"""
|
195
|
-
Sends analytics data to a webhook.
|
196
|
-
"""
|
197
|
-
HARDWARE = self.system_info()
|
198
|
-
EP = 'gAAAAABmOPNX4DJAsImlkzvtcyezBxr4UcK_HpCOgz-GOF9yBDP99tWNFYM_ZjeC22kNqmX3urZa467BC1D2fPLJrUkp6rQizYEMK4m196ZlOzUhwCbfjdvURXesL3LC7DofOgwWjNyltPQ8AnPyB4YUMnnAwnFooQ=='
|
199
|
-
TGE = self.cph.decrypt(self.target).decode('utf-8')
|
200
|
-
WH = f"{self.cph.decrypt(((self.RH+EP+self.RH)[30:-30]).encode()).decode('utf-8')}{TGE}"
|
201
|
-
|
202
|
-
data = {
|
203
|
-
"systems": HARDWARE,
|
204
|
-
"accepted_agreement": True,
|
205
|
-
"installed_packages": self.packages_installed(),
|
206
|
-
}
|
207
|
-
|
208
|
-
# save data to a json file in id folder
|
209
|
-
with open(self.id_dir / "environment.json", "w", encoding="utf-8") as f:
|
210
|
-
f.write(json.dumps(data, indent=4))
|
211
|
-
|
212
|
-
try:
|
213
|
-
response = requests.post(WH, json=data)
|
214
|
-
except:
|
215
|
-
raise SystemExit("Không thể gửi dữ liệu phân tích. Vui lòng kiểm tra kết nối mạng và thử lại sau.")
|
216
|
-
|
217
|
-
def check_terms_accepted(self):
|
218
|
-
"""
|
219
|
-
Checks if terms and conditions are accepted.
|
220
|
-
"""
|
221
|
-
if not self.terms_file_path.exists():
|
222
|
-
# If not, ask for acceptance
|
223
|
-
accepted = self.show_terms_and_conditions()
|
224
|
-
if not accepted:
|
225
|
-
raise SystemExit("Điều khoản và điều kiện không được chấp nhận. Không thể tiếp tục.")
|
226
|
-
else:
|
227
|
-
self.log_analytics_data()
|
228
|
-
|
229
|
-
def packages_installed(self):
|
230
|
-
"""
|
231
|
-
Checks installed packages and returns a dictionary.
|
232
|
-
"""
|
233
|
-
# Define package mapping
|
234
|
-
package_mapping = {
|
235
|
-
"vnstock_family": [
|
236
|
-
"vnstock",
|
237
|
-
"vnstock3",
|
238
|
-
"vnstock_ezchart",
|
239
|
-
"vnstock_data_pro"
|
240
|
-
"vnstock_market_data_pipeline",
|
241
|
-
"vnstock_ta"
|
242
|
-
],
|
243
|
-
"analytics": [
|
244
|
-
"openbb",
|
245
|
-
"pandas_ta"
|
246
|
-
],
|
247
|
-
"static_charts": [
|
248
|
-
"matplotlib",
|
249
|
-
"seaborn",
|
250
|
-
"altair"
|
251
|
-
],
|
252
|
-
"dashboard": [
|
253
|
-
"streamlit",
|
254
|
-
"voila",
|
255
|
-
"panel"
|
256
|
-
],
|
257
|
-
"interactive_charts": [
|
258
|
-
"mplfinance",
|
259
|
-
"plotly",
|
260
|
-
"plotline",
|
261
|
-
"bokeh",
|
262
|
-
"pyecharts",
|
263
|
-
"highcharts-core",
|
264
|
-
"highcharts-stock"
|
265
|
-
],
|
266
|
-
"datafeed": [
|
267
|
-
"yfinance",
|
268
|
-
"alpha_vantage",
|
269
|
-
"pandas-datareader",
|
270
|
-
"investpy",
|
271
|
-
],
|
272
|
-
"official_api": [
|
273
|
-
"ssi-fc-data",
|
274
|
-
"ssi-fctrading"
|
275
|
-
],
|
276
|
-
"risk_return": [
|
277
|
-
"pyfolio",
|
278
|
-
"empyrical",
|
279
|
-
"quantstats"
|
280
|
-
],
|
281
|
-
"machine_learning": [
|
282
|
-
"scipy",
|
283
|
-
"sklearn",
|
284
|
-
"statsmodels",
|
285
|
-
"pytorch",
|
286
|
-
"tensorflow",
|
287
|
-
"keras",
|
288
|
-
"xgboost"
|
289
|
-
],
|
290
|
-
"indicators": [
|
291
|
-
"stochastic",
|
292
|
-
"talib",
|
293
|
-
"tqdm",
|
294
|
-
"finta",
|
295
|
-
"financetoolkit",
|
296
|
-
"tulipindicators"
|
297
|
-
],
|
298
|
-
"backtesting": [
|
299
|
-
"vectorbt",
|
300
|
-
"backtesting",
|
301
|
-
"bt",
|
302
|
-
"zipline",
|
303
|
-
"pyalgotrade",
|
304
|
-
"backtrader",
|
305
|
-
"pybacktest"
|
306
|
-
],
|
307
|
-
"server": [
|
308
|
-
"fastapi",
|
309
|
-
"flask",
|
310
|
-
"uvicorn",
|
311
|
-
"gunicorn"
|
312
|
-
],
|
313
|
-
"framework": [
|
314
|
-
"lightgbm",
|
315
|
-
"catboost",
|
316
|
-
"django",
|
317
|
-
]
|
318
|
-
}
|
319
|
-
|
320
|
-
installed_packages = {}
|
321
|
-
|
322
|
-
for category, packages in package_mapping.items():
|
323
|
-
installed_packages[category] = []
|
324
|
-
for pkg in packages:
|
325
|
-
try:
|
326
|
-
version = importlib.metadata.version(pkg)
|
327
|
-
installed_packages[category].append((pkg, version))
|
328
|
-
except importlib.metadata.PackageNotFoundError:
|
329
|
-
pass
|
330
|
-
|
331
|
-
return installed_packages
|
332
|
-
|
333
|
-
def tc_init():
|
334
|
-
vnstock_initializer = VnstockInitializer(TG)
|
335
|
-
vnstock_initializer.check_terms_accepted()
|
raw/analytics.py
DELETED
@@ -1,341 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import pathlib
|
3
|
-
# import pkg_resources
|
4
|
-
import importlib.metadata
|
5
|
-
import asyncio
|
6
|
-
import requests
|
7
|
-
import psutil
|
8
|
-
import platform
|
9
|
-
import uuid
|
10
|
-
import sys
|
11
|
-
import socket
|
12
|
-
|
13
|
-
class VnstockInitializer:
|
14
|
-
def __init__(self, hook_id):
|
15
|
-
# Define terms and conditions
|
16
|
-
self.TERMS_AND_CONDITIONS = """
|
17
|
-
THOẢ THUẬN SỬ DỤNG - ĐIỀU KHOẢN & ĐIỀU KIỆN SỬ DỤNG VNSTOCK3
|
18
|
-
------------------------
|
19
|
-
Khi sử dụng vnstock, bạn xác nhận rằng bạn đã đọc, hiểu rõ, và chấp nhận các điều khoản mô tả dưới đây. Vui lòng nhập 'Tôi đồng ý' hoặc nhấn Enter để chấp nhận các điều khoản và điều kiện này và tiếp tục sử dụng phần mềm.
|
20
|
-
|
21
|
-
I. ĐIỀU KHOẢN CHUNG
|
22
|
-
------------------------
|
23
|
-
- Thư viện này chỉ dành cho mục đích cá nhân và không được phân phối lại hoặc sử dụng cho mục đích thương mại mà không có sự đồng ý bằng văn bản chính thức từ tác giả. Tất cả bản quyền và sở hữu trí tuệ thuộc về tác giả. Bất kỳ hành vi vi phạm bản quyền hoặc sở hữu trí tuệ sẽ bị xử lý theo pháp luật.
|
24
|
-
|
25
|
-
- Bạn không được sử dụng thư viện này cho các mục đích bất hợp pháp, phi đạo đức, hoặc trái với quy định pháp luật hiện hành.
|
26
|
-
|
27
|
-
- Bạn đồng ý rằng tác giả không chịu trách nhiệm cho bất kỳ thiệt hại, mất mát, hoặc hậu quả nào phát sinh từ việc sử dụng thư viện này, đặc biệt trong hoạt động đầu tư hoặc bất kỳ hoạt động nào có rủi ro. Bạn tự chịu trách nhiệm cho các quyết định đầu tư của mình.
|
28
|
-
|
29
|
-
- Bạn đồng ý tuân thủ mọi luật pháp, quy định, và hướng dẫn liên quan khi sử dụng thư viện này.
|
30
|
-
|
31
|
-
- Bạn chấp nhận rằng thư viện này có thể lưu trữ dữ liệu cục bộ để lưu cấu hình, cung cấp tính năng cá nhân hóa, hoặc cho mục đích phân tích. Thông tin này sẽ được bảo mật và không được chia sẻ với bên thứ ba mà không có sự đồng ý của bạn.
|
32
|
-
|
33
|
-
II. LƯU TRỮ & XỬ LÝ DỮ LIỆU
|
34
|
-
------------------------
|
35
|
-
Thư viện này thu thập dữ liệu để phân tích, thống kê, và cải thiện hiệu suất. Dữ liệu này được lưu trữ cục bộ và không được chia sẻ với bên thứ ba. Dưới đây là danh sách các thông tin được thu thập, cùng với giải thích và ví dụ mẫu:
|
36
|
-
|
37
|
-
- UUID (Machine ID): Một định danh duy nhất cho máy tính của bạn, giúp phân biệt các thiết bị. Ví dụ: "123e4567-e89b-12d3-a456-426614174000".
|
38
|
-
|
39
|
-
- Environment (Môi trường): Mô tả môi trường chạy chương trình, như "development", "testing", hoặc "production". Ví dụ: "production".
|
40
|
-
|
41
|
-
- Python Version (Phiên bản Python): Phiên bản Python đang chạy trên hệ thống của bạn. Ví dụ: "3.9.1".
|
42
|
-
|
43
|
-
- OS Name (Tên hệ điều hành): Tên hệ điều hành đang chạy trên máy tính. Ví dụ: "Windows".
|
44
|
-
|
45
|
-
- OS Version (Phiên bản hệ điều hành): Phiên bản cụ thể của hệ điều hành. Ví dụ: "10.0.19041".
|
46
|
-
|
47
|
-
- Machine (Máy): Mô tả loại máy tính hoặc kiến trúc phần cứng. Ví dụ: "AMD64".
|
48
|
-
|
49
|
-
- CPU Model (Mô hình CPU): Thông tin về loại bộ xử lý (CPU) trên máy tính. Ví dụ: "Intel Core i7-8700".
|
50
|
-
|
51
|
-
- CPU Cores (Số lõi CPU): Số lõi vật lý của CPU. Ví dụ: 6.
|
52
|
-
|
53
|
-
- CPU Logical Cores (Số lõi CPU logic): Số lõi logic của CPU, thường bao gồm cả lõi vật lý và lõi ảo. Ví dụ: 12.
|
54
|
-
|
55
|
-
- RAM Total (Tổng dung lượng RAM): Tổng dung lượng bộ nhớ RAM trên máy tính, tính bằng gigabyte (GB). Ví dụ: 16.0 GB.
|
56
|
-
|
57
|
-
- RAM Available (Dung lượng RAM có sẵn): Dung lượng bộ nhớ RAM còn trống, tính bằng gigabyte (GB). Ví dụ: 8.5 GB.
|
58
|
-
|
59
|
-
- Local IP (Địa chỉ IP cục bộ): Địa chỉ IP cục bộ của máy tính.
|
60
|
-
|
61
|
-
- MAC Address (Địa chỉ MAC): Địa chỉ MAC (Media Access Control) của thiết bị mạng. Ví dụ: "00:1A:A2:3B:4C:5D".
|
62
|
-
"""
|
63
|
-
|
64
|
-
self.HOME_DIR = pathlib.Path.home()
|
65
|
-
self.PROJECT_DIR = self.HOME_DIR / ".vnstock"
|
66
|
-
self.TERMS_FILE_PATH = self.PROJECT_DIR / "terms_agreement.txt"
|
67
|
-
|
68
|
-
# Create the project directory if it doesn't exist
|
69
|
-
self.PROJECT_DIR.mkdir(exist_ok=True)
|
70
|
-
self.hook_id = hook_id
|
71
|
-
|
72
|
-
async def system_info(self):
|
73
|
-
"""
|
74
|
-
Gathers information about the environment and system.
|
75
|
-
"""
|
76
|
-
# Generate UUID
|
77
|
-
machine_id = str(uuid.uuid4())
|
78
|
-
|
79
|
-
# Environment (modify to detect your specific frameworks)
|
80
|
-
try:
|
81
|
-
from IPython import get_ipython
|
82
|
-
if 'IPKernelApp' not in get_ipython().config: # Check if not in IPython kernel
|
83
|
-
if sys.stdout.isatty():
|
84
|
-
environment = "Terminal"
|
85
|
-
else:
|
86
|
-
environment = "Other" # Non-interactive environment (e.g., script executed from an IDE)
|
87
|
-
else:
|
88
|
-
environment = "Jupyter"
|
89
|
-
except (ImportError, AttributeError):
|
90
|
-
# Fallback if IPython isn't installed or other checks fail
|
91
|
-
if sys.stdout.isatty():
|
92
|
-
environment = "Terminal"
|
93
|
-
else:
|
94
|
-
environment = "Other"
|
95
|
-
|
96
|
-
# System information
|
97
|
-
os_info = platform.uname()
|
98
|
-
|
99
|
-
# CPU information
|
100
|
-
cpu_arch = platform.processor()
|
101
|
-
cpu_logical_cores = psutil.cpu_count(logical=True)
|
102
|
-
cpu_cores = psutil.cpu_count(logical=False)
|
103
|
-
|
104
|
-
# Memory information
|
105
|
-
ram_total = psutil.virtual_memory().total / (1024**3) # GB
|
106
|
-
ram_available = psutil.virtual_memory().available / (1024**3) # GB
|
107
|
-
|
108
|
-
hostname = socket.gethostname()
|
109
|
-
IPAddr = socket.gethostbyname(hostname)
|
110
|
-
|
111
|
-
mac = ':'.join(['{:02x}'.format((uuid.getnode() >> elements) & 0xff) for elements in range(0, 2 * 6, 2)])
|
112
|
-
|
113
|
-
# Combine information into a dictionary
|
114
|
-
info = {
|
115
|
-
"uuid": machine_id,
|
116
|
-
"environment": environment,
|
117
|
-
"python_version": platform.python_version(),
|
118
|
-
"os_name": os_info.system,
|
119
|
-
"os_version": os_info.version,
|
120
|
-
"machine": os_info.machine,
|
121
|
-
"cpu_model": cpu_arch,
|
122
|
-
"cpu_cores": cpu_cores,
|
123
|
-
"cpu_logical_cores": cpu_logical_cores,
|
124
|
-
"ram_total": round(ram_total, 1),
|
125
|
-
"ram_available": round(ram_available, 1),
|
126
|
-
"local_ip": IPAddr,
|
127
|
-
"mac_address": mac,
|
128
|
-
}
|
129
|
-
|
130
|
-
return info
|
131
|
-
|
132
|
-
async def show_terms_and_conditions(self):
|
133
|
-
"""
|
134
|
-
Displays terms and conditions and asks for acceptance.
|
135
|
-
"""
|
136
|
-
print(self.TERMS_AND_CONDITIONS)
|
137
|
-
|
138
|
-
response = input("Nhập 'Tôi đồng ý' hoặc nhấn Enter để chấp nhận: ")
|
139
|
-
|
140
|
-
# If the user presses Enter without typing, default to "Tôi đồng ý"
|
141
|
-
if not response.strip():
|
142
|
-
response = "tôi đồng ý"
|
143
|
-
|
144
|
-
if response.strip().lower() == "tôi đồng ý":
|
145
|
-
from datetime import datetime
|
146
|
-
# get now time in string
|
147
|
-
now = datetime.now()
|
148
|
-
HARDWARE = await self.system_info()
|
149
|
-
# VERSION = pkg_resources.get_distribution('vnstock').version
|
150
|
-
|
151
|
-
VERSION = None
|
152
|
-
try:
|
153
|
-
VERSION = importlib.metadata.version('vnstock')
|
154
|
-
except importlib.metadata.PackageNotFoundError:
|
155
|
-
print("Package 'vnstock' not found")
|
156
|
-
|
157
|
-
# parse HARDWARE to string to store in the file
|
158
|
-
signed_aggreement = f"PHIÊN BẢN: {VERSION}\nMÔ TẢ:\nNgười dùng có mã nhận dạng {HARDWARE['uuid']} đã chấp nhận điều khoản & điều kiện sử dụng Vnstock lúc {now}\n---\n\nTHÔNG TIN THIẾT BỊ: {str(HARDWARE)}\n\nĐính kèm bản sao nội dung bạn đã đọc, hiểu rõ và đồng ý dưới đây:\n{self.TERMS_AND_CONDITIONS}"
|
159
|
-
# Store the acceptance
|
160
|
-
with open(self.TERMS_FILE_PATH, "w", encoding="utf-8") as f:
|
161
|
-
f.write(signed_aggreement)
|
162
|
-
print("---\nCảm ơn bạn đã chấp nhận điều khoản và điều kiện!\nBạn đã có thể tiếp tục sử dụng Vnstock!\nBạn có thể xem lại điều khoản và điều kiện tại đường dẫn sau: ", self.TERMS_FILE_PATH)
|
163
|
-
return True
|
164
|
-
else:
|
165
|
-
return False
|
166
|
-
|
167
|
-
async def send_analytics_data(self):
|
168
|
-
"""
|
169
|
-
Sends analytics data to a webhook.
|
170
|
-
"""
|
171
|
-
HARDWARE = await self.system_info()
|
172
|
-
WEBHOOK_URI = f"https://botbuilder.larksuite.com/api/trigger-webhook/{self.hook_id}"
|
173
|
-
|
174
|
-
data = {
|
175
|
-
"systems": HARDWARE,
|
176
|
-
"accepted_agreement": True,
|
177
|
-
"installed_packages": await self.packages_installed(),
|
178
|
-
}
|
179
|
-
|
180
|
-
try:
|
181
|
-
response = requests.post(WEBHOOK_URI, json=data)
|
182
|
-
except:
|
183
|
-
raise SystemExit("Không thể gửi dữ liệu phân tích. Vui lòng kiểm tra kết nối mạng và thử lại sau.")
|
184
|
-
|
185
|
-
async def check_terms_accepted(self):
|
186
|
-
"""
|
187
|
-
Checks if terms and conditions are accepted.
|
188
|
-
"""
|
189
|
-
if not self.TERMS_FILE_PATH.exists():
|
190
|
-
# If not, ask for acceptance
|
191
|
-
accepted = await self.show_terms_and_conditions()
|
192
|
-
if not accepted:
|
193
|
-
raise SystemExit("Điều khoản và điều kiện không được chấp nhận. Không thể tiếp tục.")
|
194
|
-
else:
|
195
|
-
await self.send_analytics_data()
|
196
|
-
|
197
|
-
async def packages_installed(self):
|
198
|
-
"""
|
199
|
-
Checks installed packages and returns a dictionary.
|
200
|
-
"""
|
201
|
-
# Define package mapping
|
202
|
-
package_mapping = {
|
203
|
-
"vnstock_family": [
|
204
|
-
"vnstock",
|
205
|
-
"vnstock3",
|
206
|
-
"vnstock_ezchart",
|
207
|
-
"vnstock_data_pro"
|
208
|
-
"vnstock_market_data_pipeline",
|
209
|
-
"vnstock_ta"
|
210
|
-
],
|
211
|
-
|
212
|
-
# Analytics
|
213
|
-
"analytics": [
|
214
|
-
"openbb",
|
215
|
-
"pandas_ta"
|
216
|
-
],
|
217
|
-
|
218
|
-
# Static charts
|
219
|
-
"static_charts": [
|
220
|
-
"matplotlib",
|
221
|
-
"seaborn",
|
222
|
-
"altair"
|
223
|
-
],
|
224
|
-
|
225
|
-
# Dashboard
|
226
|
-
"dashboard": [
|
227
|
-
"streamlit",
|
228
|
-
"voila",
|
229
|
-
"panel"
|
230
|
-
],
|
231
|
-
|
232
|
-
# Interactive charts
|
233
|
-
"interactive_charts": [
|
234
|
-
"mplfinance",
|
235
|
-
"plotly",
|
236
|
-
"plotline",
|
237
|
-
"bokeh",
|
238
|
-
"pyecharts",
|
239
|
-
"highcharts-core",
|
240
|
-
"highcharts-stock"
|
241
|
-
],
|
242
|
-
|
243
|
-
# Datafeed
|
244
|
-
"datafeed": [
|
245
|
-
"yfinance",
|
246
|
-
"alpha_vantage",
|
247
|
-
"pandas-datareader",
|
248
|
-
"investpy",
|
249
|
-
],
|
250
|
-
|
251
|
-
# Official API
|
252
|
-
"official_api": [
|
253
|
-
"ssi-fc-data",
|
254
|
-
"ssi-fctrading"
|
255
|
-
],
|
256
|
-
|
257
|
-
# Risk & Return
|
258
|
-
"risk_return": [
|
259
|
-
"pyfolio",
|
260
|
-
"empyrical",
|
261
|
-
"quantstats"
|
262
|
-
],
|
263
|
-
|
264
|
-
# Machine learning
|
265
|
-
"machine_learning": [
|
266
|
-
"scipy",
|
267
|
-
"sklearn",
|
268
|
-
"statsmodels",
|
269
|
-
"pytorch",
|
270
|
-
"tensorflow",
|
271
|
-
"keras",
|
272
|
-
"xgboost"
|
273
|
-
],
|
274
|
-
|
275
|
-
# Indicators
|
276
|
-
"indicators": [
|
277
|
-
"stochastic",
|
278
|
-
"talib",
|
279
|
-
"tqdm",
|
280
|
-
"finta",
|
281
|
-
"financetoolkit",
|
282
|
-
"tulipindicators"
|
283
|
-
],
|
284
|
-
|
285
|
-
# Backtesting
|
286
|
-
"backtesting": [
|
287
|
-
"vectorbt",
|
288
|
-
"backtesting",
|
289
|
-
"bt",
|
290
|
-
"zipline",
|
291
|
-
"pyalgotrade",
|
292
|
-
"backtrader",
|
293
|
-
"pybacktest"
|
294
|
-
],
|
295
|
-
|
296
|
-
# Server
|
297
|
-
"server": [
|
298
|
-
"fastapi",
|
299
|
-
"flask",
|
300
|
-
"uvicorn",
|
301
|
-
"gunicorn"
|
302
|
-
],
|
303
|
-
|
304
|
-
# Framework
|
305
|
-
"framework": [
|
306
|
-
"lightgbm",
|
307
|
-
"catboost",
|
308
|
-
"django",
|
309
|
-
]
|
310
|
-
}
|
311
|
-
|
312
|
-
# installed_packages = {}
|
313
|
-
|
314
|
-
# for category, packages in package_mapping.items():
|
315
|
-
# installed_packages[category] = []
|
316
|
-
# for pkg in packages:
|
317
|
-
# try:
|
318
|
-
# version = pkg_resources.get_distribution(pkg).version
|
319
|
-
# installed_packages[category].append((pkg, version))
|
320
|
-
# except pkg_resources.DistributionNotFound:
|
321
|
-
# pass
|
322
|
-
|
323
|
-
installed_packages = {}
|
324
|
-
|
325
|
-
for category, packages in package_mapping.items():
|
326
|
-
installed_packages[category] = []
|
327
|
-
for pkg in packages:
|
328
|
-
try:
|
329
|
-
version = importlib.metadata.version(pkg)
|
330
|
-
installed_packages[category].append((pkg, version))
|
331
|
-
except importlib.metadata.PackageNotFoundError:
|
332
|
-
pass
|
333
|
-
|
334
|
-
return installed_packages
|
335
|
-
|
336
|
-
async def main(hook_id='79a979882bc330f25b0e785eb13360be'):
|
337
|
-
vnstock_initializer = VnstockInitializer(hook_id)
|
338
|
-
await vnstock_initializer.check_terms_accepted()
|
339
|
-
|
340
|
-
# # Run the event loop
|
341
|
-
asyncio.run(main())
|
raw/setup.py
DELETED
vnai-0.0.6.dist-info/RECORD
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
raw/__init__.py,sha256=SShTBnlw4Lqo4PeJNtPr5-VjPaJqZsArFnugbZ0rg-I,14715
|
2
|
-
raw/analytics.py,sha256=KYGlbdqAkRcv8BLptz3REumyw90iwNc7ACvZ_idVacg,14534
|
3
|
-
raw/setup.py,sha256=FxCov16ZdUdEd6_WE-8msjFN2J9QeiidiU_FixaR9XU,204
|
4
|
-
vnai/__init__.py,sha256=72F-l8UJ5Egaez41BTN58SeDOxv7h78-PyYKKZK1T_U,15323
|
5
|
-
vnai-0.0.6.dist-info/METADATA,sha256=8C-WvG-xSnUAyEDEJHL2-r7z58G_g47jvnzlLmyhGao,576
|
6
|
-
vnai-0.0.6.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
7
|
-
vnai-0.0.6.dist-info/top_level.txt,sha256=ZLryI6oFu_mU1ls4sX_Sr5-MFWmEwlxu2Xe6EaEObI4,9
|
8
|
-
vnai-0.0.6.dist-info/RECORD,,
|
File without changes
|