Tự động điều chỉnh độ sáng màn hình dựa trên mặt trời mọc và mặt trời lặn


10

Có những câu hỏi và câu trả lời tương tự trong Hỏi Ubuntu chỉ ra các giải pháp sau:

nhưng chúng hoặc yêu cầu nhập thủ công thời gian mặt trời mọc và mặt trời lặn hoặc chúng chỉ điều chỉnh cân bằng màu sắc và thêm màu đỏ vào ban đêm.

Tôi đang tìm kiếm một giải pháp tự động đạt được thời gian mặt trời mọc và mặt trời lặn mỗi ngày và điều chỉnh vật lý độ sáng màn hình. Hơn nữa, tôi muốn có hiệu ứng chuyển tiếp trong khoảng thời gian từ 60 đến 120 phút vì vậy tôi không nhận thấy sự thay đổi hiển thị.

Cấu hình lại vào những ngày nhiều mây (bên ngoài mờ hơn) hoặc khi mặt trời lặn giữa hai tòa nhà ba tầng thay vì ngọn mái của chúng (sáng hơn trước khi mặt trời lặn) nên là một quá trình nhanh chóng và dễ dàng.

Câu trả lời:


7

Cập nhật bài viết từ năm 2019 - Eygie

Eyemme là một kịch bản bash chạy như một deamon và ngủ hầu hết thời gian 24/7. Nó tự động điều chỉnh độ sáng màn hình (và cả gamma tùy chọn) cho màn hình máy tính xách tay của bạn thông qua giao diện phần cứng và tối đa hai màn hình khác sử dụng điều khiển phần mềm của xrandr.

Khi mặt trời mọc (thời gian được lấy tự động từ internet mỗi ngày), độ sáng màn hình của bạn (và cả gamma tùy chọn nữa) được điều chỉnh dần dần. Điều chỉnh dần dần được xác định bởi bạn, nhưng 120 phút làm việc cho tôi. Để giữ cho các điều chỉnh không được chú ý, hãy đặt khoảng thời gian ngủ giữa các lần điều chỉnh. Bất cứ nơi nào trong khoảng từ 15 đến 60 giây có lẽ là tốt nhất và mặc định là 60.

Eygie daemon ngủ nhiều giờ cho đến khi chuyển hoàng hôn bắt đầu. Ngược lại với quá trình chuyển đổi mặt trời mọc, quá trình chuyển đổi hoàng hôn giảm dần độ sáng màn hình (và cả gamma tùy chọn nữa) nên không thể nhận thấy. 90 phút trước khi mặt trời lặn được khuyến nghị nhưng bạn có thể đặt bất kỳ khoảng thời gian nào bạn muốn.

Trong quá trình chuyển đổi hoàng hôn gamma có thể được xác định để tăng. Ví dụ, gamma đỏ có thể được định nghĩa là 1.0 vào ban ngày và 1.2 vào ban đêm để giảm mỏi mắt. Gamma màu xanh lần lượt có thể được định nghĩa là 1.0 vào ban ngày và .8 vào ban đêm nên thay vào đó nó sẽ giảm.

Để giảm tài nguyên, mắt đẹp ngủ toàn bộ thời gian giữa hoàng hôn và bình minh chuyển tiếp. Có một số trường hợp ngoại lệ một lần khi tiếp tục từ việc treo hoặc cắm nóng màn hình bên ngoài. Nó phụ thuộc vào nơi bạn sống và mùa trong năm, nhưng, giấc ngủ trung bình sẽ là 12 giờ.

Bạn có thể tải xuống Eygie từ Github


Bài gốc từ năm 2017

Giới thiệu

Đây là một giải pháp bash không cần cài đặt các chương trình bổ sung. Nó yêu cầu kết nối Internet (nếu bạn đang đọc cái này bạn có) để tự động nhận được thời gian mặt trời mọc và mặt trời lặn mỗi ngày. Nó cung cấp một màn hình cấu hình thân thiện với người dùng. Nó khởi động tự động với cronvà không yêu cầu tương tác người dùng.

Câu trả lời này được chia thành nhiều phần

  • Tự động nhận được thời gian mặt trời mọc và mặt trời lặn mỗi ngày với cron
  • Định cấu hình cài đặt độ sáng và thời gian chuyển tiếp
  • Kịch bản chính để điều chỉnh độ sáng dựa trên thời gian trong ngày
  • Bắt đầu tự động hiển thị độ sáng mỗi khi khởi động với cron
  • Điều chỉnh độ sáng tức thì / trong suốt tiếp tục từ quá trình treo
  • Tóm lược

Tự động nhận được thời gian mặt trời mọc và mặt trời lặn mỗi ngày với cron

Có rất nhiều trang web để báo cáo thời gian mặt trời mọc và mặt trời lặn cho vị trí của bạn. Kịch bản này sử dụng ( https://www.timeanddate.com/ ) đã là một trang web nổi tiếng trong một thời gian dài.

Với quyền hạn sudo chỉnh sửa tệp /usr/local/bin/sun-hoursvà dán này:

#!/bin/bash

# Called daily from /etc/cron.daily/sun-hours
while true; do

### "-q"= quiet, "-O-" pipe output
echo $(wget -q -O- https://www.timeanddate.com/sun/canada/edmonton | grep -oE 'Sunrise Today.{35}' | awk -F\> '{print $3}' | tr --delete "<") > /tmp/sunrise
echo $(wget -q -O- https://www.timeanddate.com/sun/canada/edmonton | grep -oE 'Sunset Today.{35}' | awk -F\> '{print $3}' | tr --delete "<") > /tmp/sunset

## If network is down files will have one byte size
size1=$(wc -c < /tmp/sunrise)
size2=$(wc -c < /tmp/sunset)

if [ $size1 -gt 1 ] && [ $size2 -gt 1 ] ; then
    cp /tmp/sunrise /usr/local/bin/sunrise
    cp /tmp/sunset  /usr/local/bin/sunset
    chmod 666 /usr/local/bin/sunrise
    chmod 666 /usr/local/bin/sunset
    rm /tmp/sunrise
    rm /tmp/sunset
    exit 0
else
    logger "/etc/cron.daily/sun-hours: Network is down. Waiting 5 minutes to try again."
    sleep 300
fi

done

Trước khi lưu tập lệnh thay thế hai lần xuất hiện /canada/edmontonvới quốc gia và thành phố của riêng bạn. Truy cập trang web www.timeanddate.comđể có được tên hoặc số chính xác. Ví dụ: "Paris, USA" có hàng tá tên, vì vậy chúng sẽ chứa một số như /worldclock/@5205082"Paris, PA USA".

Sử dụng cron để chạy tập lệnh giờ nắng mỗi ngày

Với quyền hạn sudo chỉnh sửa tệp /etc/cron.daily/sun-hoursvà dán này:

#!/bin/sh
#
# Each day /etc/cron.daily/sun-hours will get sunrise and sunset times.

sleep 60 # give time for network to come up.
/usr/local/bin/sun-hours

Đánh dấu cả hai tệp là có thể thực thi được sudo chmod a+x ___/sun-hourstrong đó "___" là thư mục cho mỗi tệp.

Sử dụng Conky để theo dõi sự thay đổi thời gian mặt trời mọc / mặt trời lặn mỗi ngày

Conky là một công cụ phổ biến để theo dõi hệ thống của bạn. Dưới đây là các lệnh để nó hiển thị cài đặt mặt trời mọc, mặt trời lặn và độ sáng:

${color orange}${voffset 2}${hr 1}
${color}${goto 5}Day: ${color green}${execpi 300 cat /usr/local/bin/sunrise}  ${color}Night: ${color green}${execpi 300 cat /usr/local/bin/sunset}  ${color}Level: ${color green}${execpi 10 cat cat /sys/class/backlight/intel_backlight/brightness}
${color orange}${voffset 2}${hr 1}

Đây là những gì nó trông giống như:

conky hiển thị-tự động sáng

Lưu ý: mã Conky này sử dụng intel_backlightmà bạn cần thay đổi tùy thuộc vào bộ điều hợp hiển thị của bạn như được mô tả trong các phần bên dưới.

Định cấu hình cài đặt độ sáng và thời gian chuyển tiếp

Bạn không muốn màn hình của mình thay đổi thành độ sáng đầy đủ khi mặt trời mọc và độ mờ hoàn toàn vào lúc hoàng hôn. Một giai đoạn chuyển tiếp là cần thiết. Ngoài ra, một tập tin cấu hình là cần thiết để ghi lại các biến cho độ sáng đầy đủ và mờ hoàn toàn. Đây là màn hình cấu hình:

display-auto-độ sáng-config

Màn hình được xây dựng bằng lệnh zenity tiêu chuẩn và các giá trị hiện có như vậy được hiển thị trong nhãn với thẻ "(value)" và bạn nhập các giá trị mới nếu cần. Mặt khác, các tệp hiện có được giữ khi các giá trị mới trống.

Thay thế intel_backlightbằng trình điều khiển hiển thị của bạn nếu khác. Để tìm ra tên của bạn sử dụng : ls /sys/class/backlight/*/brightness.

Sử dụng quyền hạn sudo tạo tệp /usr/local/bin/auto-brightness-configvà dán vào mã này:

#!/bin/bash

# Read hidden configuration file with entries separated by " " into array
IFS=' ' read -ra CfgArr < /usr/local/bin/.auto-brightness-config

# Zenity form with current values in entry label
# because initializing multiple entry data fields not supported
output=$(zenity --forms --title="Display Auto Brightness Configuration" \
        --text="Enter new settings or leave entries blank to keep (existing) settings" \
   --add-entry="/sys/class/backlight/??????/brightness driver : (${CfgArr[0]})" \
   --add-entry="Day time maximum display brightness : (${CfgArr[1]})" \
   --add-entry="Transition minutes after sunrise to maximum : (${CfgArr[2]})" \
   --add-entry="Night time minimum display brightness : (${CfgArr[3]})" \
   --add-entry="Transition minutes before sunset to minimum : (${CfgArr[4]})")

IFS='|' read -a ZenArr <<<$output # Split zenity entries separated by "|" into array elements

# Update non-blank zenity array entries into configuration array
for i in ${!ZenArr[@]}; do
    if [[ ${ZenArr[i]} != "" ]]; then CfgArr[i]=${ZenArr[i]} ; fi
done

# write hidden configuration file using array (fields automatically separated by " ")
echo "${CfgArr[@]}" > /usr/local/bin/.auto-brightness-config

Đánh dấu tệp là tệp thực thi bằng cách sử dụng:

chmod a+x /usr/local/bin/auto-brightness-config

Chương trình chính display-auto-brightness

Sử dụng quyền hạn sudo tạo tệp /usr/local/bin/display-auto-brightnessvà dán vào mã này:

#!/bin/bash

# NAME: display-auto-brightness
# PATH: /usr/local/bin
# DESC: Set display brightness based on min/max values, sun rise/set time
#       and transition minutes.
# CALL: Called from cron on system startup with @reboot option.
# DATE: Feb 17, 2017. Modified: Dec 2, 2017.

# NOTE: Only sleep for 1 minute to make display brightness changes gradual.
#       Configuration file can change any time so variables reread when waking.
#       The file is maintained by /usr/local/bin/auto-brightness-config script.

#       Sunrise and sunset time obtained from www.dateandtime.com using
#       /usr/local/bin/sun-hours script. The script is called from cron using
#       /etc/cron.daily/cron-daily-sun-hours. Variables stored in am/pm format
#       in /usr/local/bin/sunrise and /usr/local/bin/sunset.

#       When suspending at 6 am it might be dark with setting at 300. When 
#       resuming at 4:30pm it might be full sun and setting needs to be 2000.
#       It will take between 1 and 59 seconds to adjust screen brightness with
#       sudden jump in brightness. To correct this create kill sleep command
#       during suspend with /lib/systemd/system-sleep/display-auto-brightness
#       script.

# TODO: Add support for external monitors connected via HDMI / DisplayPort.
#       xrandr --output HDMI-0  --brightness .799
#       xrandr --output DP-1-1  --brightness 1.15

if [[ $(id -u) != 0 ]]; then # root powers needed to call this script
    echo display-auto-brightness must be called with sudo powers
    exit 1
fi

# global variable
LastSetting=""

function set-and-sleep {
    if [[ "$1" != "$LastSetting" ]]; then
        sudo sh -c "echo $1 | sudo tee $backlight"
        echo "$1" > "/tmp/display-current-brightness"
        LastSetting="$1"
    fi
    sleep 60
}  

re='^[0-9]+$'   # regex for valid numbers

function calc-level-and-sleep {
    # Parms $1 = number of minutes for total transition
    #       $2 = number of seconds into transition

    secTotal=$(( $1 * 60 )) # Convert total transition minutes to seconds
    Adjust=$( bc <<< "scale=6; $transition_spread * ( $2 / $secTotal )" )
    Adjust=$( echo $Adjust | cut -f1 -d"." ) # Truncate number to integer

    if ! [[ $Adjust =~ $re ]] ; then
        Adjust=0   # When we get to last minute $Adjust can be non-numeric
    fi

    calc_bright=$(( $min_bright + $Adjust ))
    set-and-sleep "$calc_bright"
}


while true ; do

    # Although variables change once a day it could be weeks between reboots.
    sunrise=$(cat /usr/local/bin/sunrise)
    sunset=$(cat /usr/local/bin/sunset)

    # Read hidden configuration file with entries separated by " " into array
    IFS=' ' read -ra CfgArr < /usr/local/bin/.auto-brightness-config
    backlight="/sys/class/backlight/${CfgArr[0]}/brightness"
    max_bright="${CfgArr[1]}"
    after_sunrise="${CfgArr[2]}"
    min_bright="${CfgArr[3]}"
    before_sunset="${CfgArr[4]}"

    # Current seconds
    secNow=$(date +"%s")
    secSunrise=$(date --date="$sunrise today" +%s)
    secSunset=$(date --date="$sunset today" +%s)

    # Is it night time?
    if [ "$secNow" -gt "$secSunset" ] || [ "$secNow" -lt "$secSunrise" ]; then
        # MINIMUN: after sunset or before sunrise nightime setting
        set-and-sleep "$min_bright"
        continue
    fi

    # We're somewhere between sunrise and sunset
    secMaxCutoff=$(( $secSunrise + ( $after_sunrise * 60 ) ))
    secMinStart=$((  $secSunset  - ( $before_sunset * 60 ) ))

    # Is it full bright day time?
    if [ "$secNow" -gt "$secMaxCutoff" ] && [ "$secNow" -lt "$secMinStart" ]; then
        # MAXIMUN: after sunrise transition AND before nightime transition
        set-and-sleep "$max_bright"
        continue
    fi

    # Daytime - nightime = transition brightness levels
    transition_spread=$(( $max_bright - $min_bright ))

    # Are we between sunrise and full brightness?
    if [ "$secNow" -gt "$secSunrise" ] && [ "$secNow" -lt "$secMaxCutoff" ]; then
        # Current time - Sunrise = progress through transition
        secPast=$(( $secNow - $secSunrise ))
        calc-level-and-sleep $after_sunrise $secPast
        continue
    fi

    # Are we between beginning to dim and sunset (full dim)?
    if [ "$secNow" -gt "$secMinStart" ] && [ "$secNow" -lt "$secSunset" ]; then
        # Sunset - Current time = progress through transition
        secBefore=$(( $secSunset - $secNow ))
        calc-level-and-sleep $before_sunset $secBefore
        continue
    fi

    # At this stage brightness was set with manual override outside this program
    # or exactly at a testpoint, then it will change next minute so no big deal.
    sleep 60 # reset brightness once / minute.

done # End of forever loop

Đánh dấu tệp là tệp thực thi bằng cách sử dụng:

chmod a+x /usr/local/bin/display-auto-brightness

LƯU Ý: Đã sửa đổi không thành công vào ngày 26 tháng 8 năm 2017 để sửa lỗi trong đó chương trình sẽ dừng khi mức độ sáng cuối cùng bằng độ sáng tối thiểu hoặc tối đa và giá trị điều chỉnh của phút hiện tại là trống (không). Đã sửa thành công ngày 2 tháng 12 năm 2017 nhưng không được công bố cho đến ngày 17 tháng 2 năm 2018. Ooops!

Bắt đầu tự động hiển thị độ sáng mỗi khi khởi động với cron

Cron được sử dụng để khởi động ứng dụng chính mỗi khi khởi động. Tạo tập tin /etc/cron.d/display-auto-brightnessvới quyền hạn sudo và sao chép trong này:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    /usr/local/bin/display-auto-brightness

Điều chỉnh độ sáng tức thì nối lại từ trạng thái treo

Bạn có thể tạm dừng máy tính của mình lúc 6 giờ sáng khi trước khi mặt trời mọc và cài đặt của bạn ở mức 300. Bạn có thể khôi phục máy vào lúc 4 giờ chiều khi mặt trời sáng và cài đặt phải là 2000 nhưng bạn phải đợi 1 đến 59 giây display-auto-brightnessđể đặt lại màn hình Khi màn hình hiển thị lại, sự thay đổi là rất lớn. Để giải quyết điều này một systemdkịch bản là cần thiết. Tạo tập tin /lib/systemd/system-sleep/display-auto-brightnesschứa:

#!/bin/sh

# NAME: display-auto-brightness
# PATH: /lib/systemd/system-sleep/
# DESC: Restart display brightness when resuming from suspend
# CALL: Automatically called when system goes to sleep and wakes up
# DATE: August 2017. Modified: June 10, 2018.

# NOTE: Gives instant display brightness adjustment instead of waiting 1 to 59 seconds.

logger -t "logger -t "test" "\$0=$0, \$1=$1, \$2=$2" test" "\$0=$0, \$1=$1, \$2=$2"

case $1/$2 in
  pre/*)
    echo "/lib/systemd/system-sleep/display-auto-brightness: Going to $2..."
    ;;
  post/*)
    # March 28, 2018 On AW17R3 this script runs too fast
    sleep 2

    echo "/lib/systemd/system-sleep/display-auto-brightness: Resuming from $2..."

    # Find running tree processes containing "display-auto" AND "sleep"
    ProgramTree=$(pstree -g -p | grep display-auto | grep sleep)
    # echo's below will print in /var/log/syslog. Comment out with # to suppress
    echo "pstree -g -p | grep display-auto | grep sleep"
    echo "============================================="
    echo "$ProgramTree"

    # extract sleep program ID within `pstree`. eg we would want "16621" below:
    # |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(16621,1308)
    pID=$(echo "$ProgramTree" | cut -f 6 -d '(' )
    pID=$(echo "$pID" | cut -f1 -d",")

    kill $pID  # kill sleep command forcing screen brightness to adjust immediately
    rm /tmp/display-current-brightness
    echo "display-auto-brightness: sleep pID: '$pID' has been killed."
    ;;
esac

Đánh dấu tệp là tệp thực thi bằng cách sử dụng:

chmod a+x /lib/systemd/system-sleep/display-auto-brightness

Tóm lược

Hiển thị mức độ sáng hiện tại là systray

Ngoài ví dụ Conky được trình bày trước đó, sysmonitor chỉ báo bạn có thể hiển thị độ sáng hiện tại trong systray thông qua bash:

màn hình tự động hiển thị

Trong ví dụ systray này, độ sáng được đặt tại 418và khoảng 20 phút trước khi mặt trời lặn. Vào lúc hoàng hôn, giá trị sẽ là 250 và độ sáng đầy đủ vào ban ngày là 1200. Trên máy này intel_backlight = 4882 là có thể, nhưng nếu bạn ở trong nhà có rèm mở màn hình thì giống như nhìn chằm chằm vào mặt trời.

Chỉ báo systray được thiết lập bằng mã này:

#!/bin/bash

if [ -f ~/.lock-screen-timer-remaining ]; then
    text-spinner
    Spinner=$(cat ~/.last-text-spinner) # read last text spinner used
    Minutes=$(cat ~/.lock-screen-timer-remaining)
    systray=" $Spinner Lock screen in: $Minutes"
else
    systray=" Lock screen: OFF"
fi

if [ -f /tmp/display-current-brightness ]; then
    Brightness=$(cat /tmp/display-current-brightness)
    systray="$systray Brightness: $Brightness"
else
    systray="$systray Brightness: OFF"
fi

echo "$systray" # sysmon-indidicator will put echo string into systray for us.

exit 0

Câu hỏi và trả lời này ( BASH có thể hiển thị trong systray dưới dạng chỉ báo ứng dụng không? ) Mô tả cách thiết lập sysmonitor chỉ báo.

Cải tiến trong tương lai

  • Di chuyển tập lệnh bash cho câu trả lời này vào github
  • Thêm hỗ trợ cho màn hình ngoài bằng cách sử dụng xrandr
  • Thêm hỗ trợ cho nhiều màu đỏ hơn / ít màu xanh hơn bằng cách sử dụng xrandr

Bài đăng tuyệt vời nhưng bạn có thể giúp tôi làm thế nào để vào màn hình để định cấu hình quá trình chuyển đổi không?
MU

@MU Cảm ơn bạn đã bình luận. Tôi đang trong quá trình cải tiến tài liệu với các thay đổi Tạm dừng / Tiếp tục được viết cách đây vài tháng. Thêm vào đó, tôi sẽ sớm viết mã kết hợp WSL (Hệ thống con Windows cho Linux). Tôi cũng muốn giải quyết mối quan tâm của bạn vào tài liệu mới. Bạn đang gặp vấn đề khi tạo /usr/local/bin/auto-brightness-configtập lệnh? Bạn đang gặp khó khăn trong việc xác định /sys/class/backlight/??????/brightnesstên trình điều khiển? Tôi muốn biến điều này thành một tiện ích tuyệt vời và câu hỏi của bạn rất quan trọng.
WinEunuuchs2Unix

Tôi chỉ không có ý tưởng dựa trên bài đăng của bạn làm thế nào để có được Cấu hình hiển thị tự động hiển thị
MU

@MU sao chép mã trên cho /usr/local/bin/auto-brightness-configvào /usr/local/binthư mục của bạn trong một tệp có tên auto-brightness-config. Sau đó, từ thiết bị đầu cuối đánh dấu nó thực thi với chmod a+x /usr/local/bin/auto-brightness-config. Sau đó chạy tập lệnh từ thiết bị đầu cuối bằng cách gõ /usr/local/bin/auto-brightness-config. Bạn có thể thiết lập lối tắt trên màn hình cho tập lệnh để tránh mở thiết bị đầu cuối và nhập tên tập lệnh.
WinEunuuchs2Unix

1
@dPlay Cuối cùng tôi đã thiết lập một trang github cho eyesomelần tái sinh tiếp theo của display-auto-brightness: github.com/WinEunuuchs2Unix/eyemme Nó sẽ được cập nhật thường xuyên trong vài tuần tới với tài liệu và các sàng lọc cho giao diện.
WinEunuuchs2Unix

3

Tôi chỉ viết một chương trình gần như làm những gì bạn đang tìm kiếm. Nó thay đổi độ sáng của màn hình dựa trên hình ảnh được chụp bởi webcam của bạn để có được độ sáng xung quanh. Bạn có thể chọn khoảng thời gian để tự phát hiện độ sáng và tốc độ mờ.

https://github.com/Wandersalamander/Dimmer


1
Nghe có vẻ là một ý tưởng tuyệt vời cho hầu hết mọi người - ngoại trừ những người trong chúng ta có mặt nạ băng qua webcam ...
WinEunuuchs2Unix 17/12/17

1
@ WinEunuuchs2Unix Ngay cả đối với những người 'quan tâm' với băng trên cam, nó có thể rất tuyệt! Bạn không cần phải che webcam bằng băng keo đen để khiến cho ảnh chụp trở nên vô dụng - một mảnh giấy trắng đạt được hiệu ứng ẩn danh tương tự, và vẫn giữ được khả năng đo độ sáng của máy ảnh. Trên thực tế, tờ giấy thực sự có thể cải thiện nó, vì nó sẽ đo được lượng ánh sáng thực sự chiếu vào máy ảnh nhiều hơn, âm thanh tương đương với lượng ánh sáng chiếu vào màn hình, nếu máy ảnh ở ngay trên nó. =)
Vinícius M


0

Nếu bạn không có quyền truy cập Internet, bạn có thể sử dụng hdate:

hdate -s -l N50 -L E14 -z2

Đầu ra:

Wednesday, 26 June 2019, 23 Sivan 5779

sunrise: 04:55

sunset: 21:17

-s hoàng hôn mặt trời mọc

-l -L Độ cao và Vĩ độ của Prague (50 ° 05′N 14 ° 25′E)

-z vùng TỰ CHỌN = + 2

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.