import time
import logging
import os
import re
import pyperclip
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import StaleElementReferenceException
import pandas as pd
# ==========================
# CHẾ ĐỘ VIẾT
# ==========================
# “FIXED_SP” : viết theo 1 SP + P cố định
# “ROW_BASED” : viết lần lượt theo từng dòng Excel (SP/P động)
WRITE_MODE = “ROW_BASED”
# WRITE_MODE = “FIXED_SP”
# ==========================
# Cấu hình & Chuẩn bị dữ liệu
# ==========================
seo_workflow_file = r’G:\My Drive\UNILAW_BRAIN\GPT_WP_AUTOPOST\KE_HOACH_TU_KHOA\UNILAW_VN\LUAT_DAT_DAI.xlsx’
seo_html_output_gpt = r’G:\My Drive\UNILAW_BRAIN\GPT_WP_AUTOPOST\SEO_HTML_Output_GPT’
if not os.path.exists(seo_html_output_gpt):
os.makedirs(seo_html_output_gpt)
df = pd.read_excel(seo_workflow_file, sheet_name=’Sheet1′)
keywords = df[‘Focus_Keyword’]
statuses = df[‘Written_by_GPT’]
status_col = df.get(‘Status’, pd.Series([None] * len(df)))
belongs_to_sp_col = df.get(‘BelongsTo_SP’, pd.Series([None] * len(df)))
belongs_to_p_col = df.get(‘BelongsTo_P’, pd.Series([None] * len(df)))
# ==========================
# Chỉ dùng cho FIXED_SP
# ==========================
target_belongs_to_sp = “Quy hoạch sử dụng đất”
target_belongs_to_p = “Luật đất đai”
# ==========================
# Hàm tiện ích
# ==========================
def clean_text(text):
text = re.sub(r’\*\*\*+’, ”, text)
text = re.sub(r’\n+’, ‘\n’, text)
return text.strip()
def safe_send_keys(driver, text, retries=3, delay=1):
for attempt in range(retries):
try:
chat_input = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ‘div[contenteditable=”true”]’))
)
chat_input.send_keys(text)
return True
except StaleElementReferenceException:
print(f”⚠️ Stale element, retry {attempt+1}/{retries}”)
time.sleep(delay)
return False
# ==========================
# Khởi tạo Chrome với profile
# ==========================
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option(“debuggerAddress”, “localhost:9222”)
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()),
options=chrome_options
)
time.sleep(3)
print(“🚀 Đã kết nối ChatGPT”)
# ==========================
# GPT duy nhất cần dùng
# ==========================
selected_gpt = “UniLaw LexSEO”
gpt_xpath = “//a[contains(@href,’g-p-68fdd7859e848191b021873a2bb7d22e’) and .//div[normalize-space()=’UniLaw LexSEO’]]”
# ==========================
# Selenium helpers
# ==========================
def click_chatgpt():
try:
wait = WebDriverWait(driver, 5)
btn = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, ‘a[data-testid=”create-new-chat-button”]’))
)
driver.execute_script(“arguments[0].scrollIntoView({block:’center’});”, btn)
time.sleep(0.5)
driver.execute_script(“arguments[0].click();”, btn)
time.sleep(2)
print(“✅ New chat”)
return True
except Exception as e:
logging.error(f”❌ New chat lỗi: {e}”)
return False
def click_selected_gpt(name, xpath):
try:
btn = WebDriverWait(driver, 8).until(
EC.presence_of_element_located((By.XPATH, xpath))
)
driver.execute_script(“arguments[0].scrollIntoView({block:’center’});”, btn)
time.sleep(0.5)
driver.execute_script(“arguments[0].click();”, btn)
print(f”✅ Đã chọn GPT: {name}”)
return True
except Exception as e:
logging.error(f”❌ Không click được GPT {name}: {e}”)
return False
# ==========================
# Xử lý 1 từ khóa
# ==========================
def process_keyword(i, keyword, belongs_to_sp, belongs_to_p):
try:
prompt = f”””
Truy xuất tệp Dự án, viết một bài viết SEO tiếng Việt có độ dài 2000 từ
về chủ đề “{keyword}”, dưới dạng HTML.
Đảm bảo rằng từ khóa “{keyword}” xuất hiện chính xác như đã viết.
Bài viết phải chứa chính xác một lần từ “{belongs_to_sp}”
và một lần từ “{belongs_to_p}” được chèn tự nhiên vào nội dung.
Tuân thủ nghiêm ngặt tất cả các yêu cầu được nêu trong phần
Hướng dẫn áp dụng cho GPT này.
“””
for line in prompt.split(“\n”):
if line.strip():
safe_send_keys(driver, line)
time.sleep(0.8)
send_btn = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, “composer-submit-button”))
)
driver.execute_script(“arguments[0].click();”, send_btn)
print(“🖱️ Đã gửi prompt”)
WebDriverWait(driver, 360).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ‘button[aria-label=”Good response”]’))
)
print(“👌 GPT trả xong”)
copy_buttons = driver.find_elements(By.XPATH, “//button[@aria-label=’Copy’]”)
target_btn = copy_buttons[1] if len(copy_buttons) > 1 else copy_buttons[0]
driver.execute_script(“arguments[0].click();”, target_btn)
content = pyperclip.paste()
if not content.strip():
raise Exception(“Clipboard trống”)
folder = os.path.join(seo_html_output_gpt, belongs_to_sp)
os.makedirs(folder, exist_ok=True)
filepath = os.path.join(folder, f”{keyword.strip()}.html”)
with open(filepath, “w”, encoding=”utf-8″) as f:
f.write(content)
df.at[i, ‘Written_by_GPT’] = ‘Done’
df.to_excel(seo_workflow_file, sheet_name=’Sheet1′, index=False)
print(f”💾 Đã lưu: {filepath}”)
except Exception as e:
logging.error(f”❌ Lỗi keyword {keyword}: {e}”)
# ==========================
# Vòng lặp chính
# ==========================
batch_size = 40
count = 0
for i, keyword in enumerate(keywords):
if count >= batch_size:
print(“🚦 Đã đủ batch”)
break
if not isinstance(keyword, str) or not keyword.strip():
continue
if statuses[i] == ‘Done’ or (isinstance(status_col[i], str) and status_col[i].strip() == ‘Đã viết’):
print(f”⏩ Bỏ qua: {keyword}”)
continue
# ==========================
# MODE FIXED_SP
# ==========================
if WRITE_MODE == “FIXED_SP”:
if belongs_to_sp_col[i] != target_belongs_to_sp:
continue
belongs_to_sp = target_belongs_to_sp
belongs_to_p = target_belongs_to_p
# ==========================
# MODE ROW_BASED
# ==========================
elif WRITE_MODE == “ROW_BASED”:
belongs_to_sp = belongs_to_sp_col[i]
belongs_to_p = belongs_to_p_col[i]
if not isinstance(belongs_to_sp, str) or not isinstance(belongs_to_p, str):
print(f”⚠️ Thiếu SP/P tại dòng {i+2}”)
continue
else:
raise ValueError(“WRITE_MODE không hợp lệ”)
print(f”\n=== Viết: {keyword} | SP={belongs_to_sp} | P={belongs_to_p} ===”)
if not click_chatgpt():
continue
time.sleep(5)
if not click_selected_gpt(selected_gpt, gpt_xpath):
continue
time.sleep(5)
process_keyword(i, keyword, belongs_to_sp, belongs_to_p)
time.sleep(5)
count += 1
print(“🎉 HOÀN THÀNH BATCH”)
PHẦN 2 – ỨNG DỤNG THỰC TIỄN PHÁP LUẬT
Trong thực tiễn giải quyết tranh chấp đất đai, việc áp dụng đúng quy định pháp luật không chỉ phụ thuộc vào văn bản luật mà còn gắn chặt với cách Tòa án đánh giá chứng cứ, xác định ý chí thực sự của các bên và xử lý các giao dịch phát sinh trên thực tế. Phần này phân tích một vụ việc điển hình đã được xét xử theo thủ tục giám đốc thẩm, qua đó làm rõ cách pháp luật đất đai được vận dụng trong bối cảnh tranh chấp phức tạp.
1. Tình huống thực tế: Tranh chấp quyền sử dụng đất và yêu cầu hủy Giấy chứng nhận
Vụ việc được Hội đồng Thẩm phán Tòa án nhân dân tối cao xem xét tại Quyết định giám đốc thẩm số 29/2022/DS-GĐT ngày 24/8/2022. Đây là tranh chấp phát sinh từ việc nhiều hộ gia đình cùng nhận chuyển nhượng đất, sau đó xảy ra mâu thuẫn về diện tích, ranh giới và tính hợp pháp của các giao dịch tiếp theo.
2. Tóm tắt vụ việc
Các đương sự trong vụ án đều là những hộ gia đình sinh sống liền kề, cùng nhận chuyển nhượng đất từ một chủ sử dụng ban đầu. Mặc dù các hợp đồng chuyển nhượng được lập riêng cho từng hộ và có chứng thực của chính quyền địa phương, nhưng quá trình quản lý, sử dụng đất sau đó không được phân định rõ ràng trên thực địa.
Do tin tưởng lẫn nhau, một bên đã giao bản gốc hợp đồng chuyển nhượng cho hộ liền kề giữ giúp để thực hiện thủ tục sang tên sau. Thời gian sau, khi phát sinh nhu cầu làm thủ tục cấp Giấy chứng nhận, bên giao hợp đồng phát hiện nội dung hợp đồng bị sửa đổi về diện tích, đồng thời phần đất thực tế đang bị lấn chiếm và tiếp tục được chuyển nhượng cho người thứ ba.
3. Vấn đề pháp lý đặt ra
Từ tình huống trên, vụ án đặt ra nhiều vấn đề pháp lý quan trọng:
- Xác định giá trị pháp lý của hợp đồng chuyển nhượng quyền sử dụng đất khi có dấu hiệu bị sửa chữa, tẩy xóa.
- Đánh giá tính hợp pháp của Giấy chứng nhận quyền sử dụng đất đã được cấp trên cơ sở giao dịch có tranh chấp.
- Xử lý quyền lợi của người thứ ba nhận chuyển nhượng đất trong khi nguồn gốc đất đang bị khiếu kiện.
- Phân định trách nhiệm bồi hoàn giá trị quyền sử dụng đất trong trường hợp không thể hoàn trả hiện trạng.
Những vấn đề này không chỉ liên quan đến Luật Đất đai mà còn gắn với các nguyên tắc của Bộ luật Dân sự về giao dịch dân sự vô hiệu, bảo vệ người thứ ba ngay tình và nghĩa vụ hoàn trả.
4. Phán quyết của Tòa án
Hội đồng Thẩm phán nhận định rằng việc quản lý hợp đồng chuyển nhượng và sử dụng đất giữa các bên có nhiều sai sót, thể hiện sự chủ quan và thiếu cẩn trọng. Tuy nhiên, Tòa án tập trung xem xét bản chất giao dịch ban đầu và quá trình sử dụng đất thực tế để xác định quyền, nghĩa vụ của từng bên.
Tòa án cho rằng Giấy chứng nhận quyền sử dụng đất được cấp cho người nhận chuyển nhượng sau dựa trên giao dịch không phản ánh đúng ý chí ban đầu của các bên, trong khi tranh chấp về quyền sử dụng đất đã tồn tại từ trước. Do đó, việc cấp Giấy chứng nhận là chưa bảo đảm căn cứ pháp lý vững chắc.
Trên cơ sở đó, Tòa án quyết định hủy Giấy chứng nhận quyền sử dụng đất đã cấp, đồng thời buộc bên lấn chiếm phải hoàn trả giá trị quyền sử dụng đất tương ứng với diện tích chiếm giữ trái phép. Quyền lợi của người thứ ba được xem xét trên cơ sở lỗi và mức độ ngay tình trong giao dịch.
5. Bài học thực tiễn rút ra
Từ vụ việc trên, có thể rút ra nhiều bài học quan trọng trong thực tiễn áp dụng pháp luật:
- Không giao phó toàn bộ giấy tờ pháp lý cho người khác quản lý: Việc giao hợp đồng gốc cho bên thứ ba giữ hộ tiềm ẩn rủi ro rất lớn, đặc biệt trong quan hệ đất đai có giá trị cao.
- Cần xác lập ranh giới sử dụng đất rõ ràng ngay từ đầu: Sau khi nhận chuyển nhượng, các bên cần tiến hành đo đạc, cắm mốc và quản lý sử dụng theo đúng diện tích đã thỏa thuận.
- Người nhận chuyển nhượng sau phải kiểm tra kỹ tình trạng pháp lý: Việc kiểm tra hồ sơ địa chính, hiện trạng sử dụng đất và thông tin tranh chấp là yếu tố then chốt để hạn chế rủi ro.
- Giấy chứng nhận không phải lúc nào cũng là “bảo chứng tuyệt đối”: Trong trường hợp việc cấp Giấy chứng nhận dựa trên giao dịch có tranh chấp hoặc vi phạm pháp luật, Tòa án vẫn có thể tuyên hủy.
Thực tiễn cho thấy, các tranh chấp dạng này thường phát sinh từ sự chủ quan và thiếu hiểu biết pháp lý của người sử dụng đất. Việc chủ động tìm kiếm Tư vấn luật đất đai ngay từ giai đoạn giao dịch ban đầu có thể giúp hạn chế đáng kể nguy cơ tranh chấp kéo dài và thiệt hại kinh tế.
6. Ý nghĩa đối với việc áp dụng pháp luật
Quyết định giám đốc thẩm trong vụ việc này thể hiện rõ quan điểm nhất quán của Tòa án trong việc bảo vệ quyền sử dụng đất hợp pháp, đồng thời không hợp thức hóa các giao dịch có dấu hiệu gian dối hoặc vi phạm trật tự quản lý đất đai.
Đối với người dân và doanh nghiệp, đây là lời nhắc nhở rằng pháp luật đất đai không chỉ được áp dụng trên giấy tờ mà còn được soi chiếu qua hành vi, thái độ và mức độ tuân thủ của các bên trong suốt quá trình sử dụng đất. Sự tham gia của luật sư đất đai có kinh nghiệm sẽ giúp đánh giá rủi ro toàn diện và lựa chọn phương án bảo vệ quyền lợi phù hợp trong từng tình huống cụ thể.
Qua việc phân tích vụ án này, có thể thấy rằng ứng dụng thực tiễn pháp luật đất đai luôn đòi hỏi sự kết hợp giữa hiểu biết quy định pháp luật và đánh giá chính xác bối cảnh thực tế, từ đó bảo đảm tính công bằng và ổn định trong các quan hệ về quyền sử dụng đất.








