fa
Feedback
Python Hints

Python Hints

رفتن به کانال در Telegram

Python tips and tricks The Good, Bad and the Ugly توی این کانال فقط قرار هست در مورد core python صحبت کنیم. این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از ۱۰ سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار) Admin: @Abbasi_ai

نمایش بیشتر
9 566
مشترکین
+1024 ساعت
+597 روز
+19630 روز
آرشیو پست ها
خبرهایی هست قطعی داره بیشتر میشه

چندتا فیش پیدا کردم :‌ قبل از فیلترینگ‌ها (حدود سال ۸۸ اینا) - ماهیانه ۸۰ گیگ اینترنت می‌گرفتم برای کل خانواده سرعت دانلودم هم از الان بهتر بوده سرویس اختصاصی میگرفتم. توی دوره فیلترینگ؛ تا همین ماه پیش برای خودم تنها مجموع اینترنت خونه و گوشی و ... ماهیانه ۱ ترابایت خرید میشه که ۹۹.۹٪ به ۳۰ روز نمی‌کشه (۱ ترابایت داخلی هست بین‌المللی میشه حدود ۳۳۰ گیگ) که احتمالا ۱۰۰ گیگش سر retry ها میره که وسطش قطع شده درحال حاضر هم ۷-۸ روز پیش؛ برای ایمیل زدن به یکی از شرکت‌ها که تازه باهاش کار رو شروع کرده بودم ۷ گیگ اینترنت خریدم که ۶ گیگش مونده اما به ترتیب هرچی جلوتر اومدیم؛ بیشتر وقت و انرژی و عمرم صرف برقرار شدن اتصال شد؛‌ سایت‌هایی که نمیشه باز کرد یا خیلی وقتم رو میگیره sqlalchemy, pypi, github, crates.io, rustlang, rust docs, docker, prometheus, grafana, ... هست بخصوص توی مواردی که سایت هم مارو تحریم کرده اما خیلی جالبه جاهایی که سعی کردند فیلتر کنند راحت‌تر باز میشه telegram, x/tweeter, instagram, ... بحثم کار کردن نیست؛ بحثم عمریه که داره تلف میشه؛ وگرینه این روزا تنها چیزی که براش وقت نمی‌ذارم کار هست. جاهایی که قبول کردند مرخصی گرفتم (البته من بخاطر شرایطی که قبل از اعتراضات بوجود اومد برام مرخصی گرفته بودم) جاهایی هم که قبول نکردند به بهانه اینترنت کار نکردم (خیلی جاها هم اونا قبول نکردند ادامه بدند بخاطر اینترنت)

پیام شما:
به بچه ها بگو با dns زیر رو مخابرات میتونن یوتوب رو باز کنن، سرعت و کیفیت عالیه 78.157.42.101 78.157.42.101 همچنین اگه تو اتصال به کانفیگ های مختلف و... رو مخابرات اختلال دارن dns زیر رو ست کن تو کلاینت هاشون شاید نتیجه بهتر شد 94.140.14.14 94.140.15.15

چندنفر چندتا نکته گفتند، پست مربوط به بازرگانان رو حذف کردم. چون از آدم‌های مختلفی شنیدم بنظرم قابل تأمل بود. عذرخواهی هم می‌کنم از بازرگانانی که مجبور شدند حضور داشته باشند.

یک دوستی گفته برای ایمیل چیکار کنیم ؟ البته که ایمیل‌های متصل به اکانت که verify و ... می‌خواد رو (مثلاً ایمیل به دانشگاه) که هیچ اما باقی موارد سرویس ایمیل رو عوض کنید؛ سرورهای gmail رو زدن باقی بالاس تست نکردم ولی شاید جواب بده: می‌تونید gmail رو هم با این سرویس‌ها که فعال هستند بیارید بالا من غیر از gmail رو با این سرویس‌ها آوردم بالا و جواب داد (تونستم ایمیل بزنم)

بازرگان‌ها امروز صف کشیدن (طبق اخبار) برای دسترسی به ایمیل به همراه ناظر اونم فقط برای ۲۰ دقیقه. یعنی ننگ، خفت، خواری ازین بالاتر نیست. شخصاً حاضر بودم تا ترکیه پیاده برم و کارم رو انجام بدم و برگردم. چندتا مثال هم هست که باید زده بشه ولی اینجا زن و بچه رد می‌شه، شما تو ذهن بیار. فقط من چندتا سوال برام پیش اومد، از بازرگان‌هایی که رفتند: ۱- اگر ۲۰ دیقه بشه ۲۱ دیقه باید پاشو بلیسی بهت اجازه بیشتر بده ؟ یا التماس خالی کفایت می‌کنه ؟ ۲- از اونجایی که هر دفعه دارن بیشتر تحقیرتون می‌کنند، دقیقاً کی قراره بگن ناموست رو بیار .... به اندازه دقایقش اینترنت بگیر ؟ اگر این سوالات رو پاسخ بدند ممنون میشم، جهت شفاف سازی می‌گم، خداشاهده

من وصل می‌مونم
من وصل می‌مونم

پدرسگا ببین چجوری وقت و انرژیمون رو دارن میگیرنا اعصاب نذاشتن برامون

تقریبا ۱ ساعتی هست که به هر دلیلی نه url test و نه
ping
روی سرورهایی که داشتم جواب نمیده اما نکته جالب اینه که با همین سرورها به اینترنت بین‌المللی وصل هستم. فکر کردم شاید مشکل از timeout باشه ولی نبود

کارهای اسکریپت DNS هم داخلش هست و اونارو هم داره فقط یک مورد با شما اونم اسکریپت پایتون برای استخراج دیتای مربوط به کانال‌ها

nekoray, nekobox دارها اینو تست کنید؛‌ لیست کانفیگ‌ها رو روی چندتا دامنه تست میزنه و بعد بهتون وصل شده‌ها و نشده‌هارو میده فقط اگر لازم شد یک سری تنظیمات رو باید داخلش عوض کنید
NEKOBOX_DEFAULT_DIR
NEKOBOX_CODE_PATH
مثلا

اینم شما فرستادید دوتا DNS قوی هست مثل اینکه: 2.188.21.130 2.188.21.46 دوستان ببخشید که کانال‌ و ربات‌هایی که می‌گید رو معرفی نمی‌کنم. بخاطر فروارد کردن مطلب از این مدل‌ کانال‌ها؛ randrng ریپورت شد یک مقدار در شرایط فعلی ترجیح میدم با احتیاط عمل کنم که تریبون رو برای آموزش حفظ کنم



# ---------------- Fast selection: parse temp files (no network) --------------
best_dns=""; best_proto=""; best_domain=""; best_ip=""; best_time=999999999; best_http=""

# iterate through result files
for f in "$TMPDIR"/job.*; do
  [[ -f "$f" ]] || continue
  IFS=$'\t' read -r dns proto domain result ip time http < "$f" || continue

  # prefer HTTP OK (2xx or 4xx) when in curl mode
  if (( CURL_MODE == 1 )); then
    if [[ "$result" == "OK" ]] && [[ "$http" =~ ^[24][0-9]{2}$ ]]; then
      if (( time < best_time )); then
        best_time=$time; best_dns="$dns"; best_proto="$proto"; best_domain="$domain"; best_ip="$ip"; best_http="$http"
      fi
    fi
  else
    if [[ "$result" == "OK" ]]; then
      if (( time < best_time )); then
        best_time=$time; best_dns="$dns"; best_proto="$proto"; best_domain="$domain"; best_ip="$ip"; best_http="$http"
      fi
    fi
  fi
done

echo
if [[ -z "$best_dns" ]]; then
  echo "No suitable candidate found (no OK answers matching criteria)."
else
  echo "Best candidate: DNS=$best_dns PROTO=$best_proto DOMAIN=$best_domain IP=$best_ip TIME_MS=$best_time HTTP=${best_http:--}"

  if (( SET_GNOME == 1 )); then
    if ! command -v nmcli >/dev/null 2>&1; then
      echo "nmcli not found; cannot set GNOME/NetworkManager DNS automatically."
    else
      echo "Attempting to set '$best_dns' as DNS on active NetworkManager connections..."
      mapfile -t actives < <(nmcli -t -f NAME connection show --active)
      if (( ${#actives[@]} == 0 )); then
        echo "No active NetworkManager connections found to modify."
      else
        for nm in "${actives[@]}"; do
          echo "Modifying connection: $nm"
          if nmcli connection modify "$nm" ipv4.dns "$best_dns" ipv4.ignore-auto-dns yes >/dev/null 2>&1; then
            if nmcli connection up "$nm" >/dev/null 2>&1; then
              echo "Set DNS for $nm -> $best_dns (reactivated)"
            else
              echo "Modified $nm but failed to bring it up. You may need to run 'nmcli connection up \"$nm\"' as root."
            fi
          else
            echo "Failed to modify $nm. You might need to run the script as a user with permissions or via sudo."
          fi
        done
      fi
    fi
  fi
fi

exit 0
من این اسکریپت رو برای لینوکس چندروز قبل نوشتم به کمک chatgpt ولی دوتا نکته داره : ۱- پیشنهاد می‌کنم اگر شبکه‌های زیادی رو تنظیم دارید اصلا از -s استفاده نکنید ۲- حتما سعی کنید که لیست dns رو کامل کنید؛ خیلی از موارد توی این کد نیست و موارد جدید رو به DNS_LIST اضافه کنید بعضی وقتا فاصله شما تا وصل شدن به اینترنت دقیقا همین DNS هست. پیشنهاد خودم برای اجرا کردنش این هست که فایل رو به اسم dns_test.sh ذخیره کنید
./dns_test.sh -p 8
و بعد که dns‌های متصل داشتید از
./dns_test.sh -c 
استفاده کنید مثلا برای من DNS های عادی گوگل رو هم باز نمی‌کرد برای پیدا کردن dns درست تست رو روی گوگل گذاشتم آپشن‌های دیگه رو هم من به chatgpt گفتم اضافه کنه ولی نیازم نشد برای همین تست نکردم؛ احتمال اینکه اشتباه کرده باشه زیاده چون خیلی از کد رو خودم ادیت کردم توی بخش‌های قبلیش بازم تاکید می‌کنم حتما DNS_LIST رو آپدیت کنید موارد بهتر هم وجود داره این هم برای بچه‌های لینوکسی هست



curl_via_ip() {
  local domain="$1" ip="$2" code="000"
  if command -v curl >/dev/null 2>&1; then
    code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 6 --resolve "${domain}:443:${ip}" "https://${domain}" 2>/dev/null || echo "000")
    [[ "$code" == "000" ]] && code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 6 --resolve "${domain}:80:${ip}" "http://${domain}" 2>/dev/null || echo "000")
    printf "%s" "$code"
  elif command -v wget >/dev/null 2>&1; then
    code=$(wget --timeout=6 --tries=1 --server-response --header="Host: ${domain}" "http://${ip}/" -qO- 2>&1 | awk '/^  HTTP/{print $2; exit}' || true)
    printf "%s" "${code:-000}"
  else
    printf "000"
  fi
}

print_header() {
  printf "%-18s %-5s %-26s %-10s %-18s %7s %6s\n" "DNS" "PROTO" "DOMAIN" "RESULT" "IP" "TIME_MS" "HTTP"
  printf "%-18s %-5s %-26s %-10s %-18s %7s %6s\n" "------------------" "-----" "--------------------------" "----------" "------------------" "-------" "------"
}

print_row() {
  local dns="$1" proto="$2" domain="$3" result="$4" ip="$5" time_ms="$6" http="$7"
  printf "%-18s %-5s %-26s %-10s %-18s %7s %6s\n" "$dns" "$proto" "$domain" "$result" "${ip:--}" "$time_ms" "${http:--}"
}

# --------------- Tempdir for job outputs --------------
TMPDIR="$(mktemp -d)"
trap 'rm -rf -- "$TMPDIR"' EXIT

# Worker: write single-line result to a unique temp file for later fast parsing
dns_worker() {
  local dns="$1" proto="$2" domain="$3"
  local start end time out ip result http

  start=$(now_ms)
  if [[ "$proto" == "tcp" ]]; then
    out=$(safe_dig_stdout dig +tcp +short @"$dns" "$domain")
  else
    out=$(safe_dig_stdout dig +short @"$dns" "$domain")
  fi
  end=$(now_ms)
  time=$((end - start))

  ip=$(printf "%s\n" "$out" | extract_ipv4)
  if [[ -n "$ip" ]] && valid_ipv4 "$ip"; then
    result="OK"
  else
    result="NO_ANSWER"
    ip="-"
  fi
  http="-"

  # atomic write to unique file
  local f
  f="$(mktemp "$TMPDIR/job.XXXXXX")"
  printf "%s\t%s\t%s\t%s\t%s\t%s\t%s\n" "$dns" "$proto" "$domain" "$result" "$ip" "$time" "$http" > "$f"
  # also print to stdout formatted row
  print_row "$dns" "$proto" "$domain" "$result" "$ip" "$time" "$http"
}

curl_worker() {
  local dns="$1" domain="$2" url_override="$3"
  local start end time out ip http_code result req_url

  start=$(now_ms)
  out=$(safe_dig_stdout dig +short @"$dns" "$domain")
  ip=$(printf "%s\n" "$out" | extract_ipv4)
  if [[ -z "$ip" ]]; then
    out=$(safe_dig_stdout dig +tcp +short @"$dns" "$domain")
    ip=$(printf "%s\n" "$out" | extract_ipv4)
  fi
  end=$(now_ms)
  time=$((end - start))

  if [[ -z "$ip" ]] || ! valid_ipv4 "$ip"; then
    result="NO_ANSWER"
    ip="-"
    http_code="-"
  else
    if [[ -n "$url_override" ]]; then
      req_url="$url_override"
    else
      req_url="https://${domain}/"
    fi
    http_code=$(curl_via_ip "$domain" "$ip")
    if [[ "$http_code" =~ ^2[0-9]{2}$ || "$http_code" =~ ^4[0-9]{2}$ ]]; then
      result="OK"
    else
      result="HTTP_FAIL"
    fi
  fi

  local f
  f="$(mktemp "$TMPDIR/job.XXXXXX")"
  printf "%s\t%s\t%s\t%s\t%s\t%s\t%s\n" "$dns" "-" "$domain" "$result" "${ip:--}" "$time" "${http_code:--}" > "$f"
  print_row "$dns" "-" "$domain" "$result" "${ip:--}" "$time" "${http_code:--}"
}

# ------------- Parallel runner -------------
run_parallel() {
  local max="$1"; shift
  local -a cmds=( "$@" )
  local -a pids=()
  for cmd in "${cmds[@]}"; do
    eval "$cmd" &
    pids+=( "$!" )
    if (( ${#pids[@]} >= max )); then
      wait "${pids[0]}" 2>/dev/null || true
      pids=( "${pids[@]:1}" )
    fi
  done
  for pid in "${pids[@]}"; do
    wait "$pid" 2>/dev/null || true
  done
}

# --------------- Main ---------------
print_header

jobs=()
if (( CURL_MODE == 1 )); then
  for dns in "${DNS_LIST[@]}"; do
    jobs+=( "curl_worker \"$dns\" \"${DOMAINS[0]}\" \"$CURL_URL\"" )
  done
else
  for dns in "${DNS_LIST[@]}"; do
    for proto in udp tcp; do
      for domain in "${DOMAINS[@]}"; do
        jobs+=( "dns_worker \"$dns\" $proto \"$domain\"" )
      done
    done
  done
fi

run_parallel "$PARALLEL" "${jobs[@]}"

روی اینترنت ثابت تنظیمات DNS خیلی خیلی مهم هست حتما DNS های مختلف رو تست کنید. شرکت زیرساخت؛ همراه‌اول؛ ایرانسل و ...
#!/usr/bin/env bash
# dns_test.sh - DNS tester (parallel) with fast best-candidate selection via temp files.
# Defaults: domain=google.com, parallel=3 (1..16), timeout=2
set -u
IFS=$'\n\t'

# ---------------- Defaults ----------------
DNS_LIST=(
  217.218.127.127 217.218.155.155 185.98.113.113 77.238.109.196
  37.10.67.11 92.42.49.43 178.22.122.100 185.51.200.2
  8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1 9.9.9.9 149.112.112.112
  64.6.64.6 64.6.65.6 84.200.69.80 84.200.70.40
)

DOMAINS=( "google.com" )
PARALLEL=3
CURL_MODE=0
CURL_URL=""
SET_GNOME=0
TIMEOUT=2
VERBOSE=0

# ---------------- Usage ----------------
usage() {
  cat <<EOF
dns_test.sh - test DNS servers (UDP/TCP) and optionally HTTP via DNS-resolved IP.

Usage: $0 [options]

Options:
  -d, --domain DOMAIN[,DOMAIN...]    Add domains (can be used multiple times).
                                     Default: google.com
  -p, --parallel N                   Parallel workers (default 3). Allowed: 1..16
  -c, --curl                         Curl-mode: resolve then HTTP-check via resolved IP.
  -u, --url URL                      (curl-mode) request this URL (default: https://<domain>/)
  -s, --set-gnome                    Set best DNS via NetworkManager (nmcli)
  -t, --timeout N                    dig timeout seconds (default 2)
  -v, --verbose                      Verbose
  -h, --help                         Show this help
EOF
}

append_domains() {
  local input="$1"
  IFS=',' read -ra parts <<< "$input"
  for p in "${parts[@]}"; do
    p="$(echo "$p" | xargs)"
    [[ -n "$p" ]] && DOMAINS+=("$p")
  done
}

# --------------- Arg parsing ----------------
while [[ $# -gt 0 ]]; do
  case "$1" in
    -d|--domain)
      shift
      [[ $# -gt 0 ]] || { echo "Missing argument for --domain"; exit 2; }
      append_domains "$1"; shift ;;
    --domain=*)
      append_domains "${1#*=}"; shift ;;
    -p|--parallel)
      shift
      [[ $# -gt 0 ]] || { echo "Missing argument for --parallel"; exit 2; }
      v="$1"
      if ! [[ "$v" =~ ^[0-9]+$ ]]; then echo "Parallel must be integer 1..16"; exit 2; fi
      vnum=$((v+0))
      if (( vnum < 1 || vnum > 16 )); then echo "Parallel must be between 1 and 16"; exit 2; fi
      PARALLEL=$vnum
      shift ;;
    --parallel=*)
      v="${1#*=}"
      if ! [[ "$v" =~ ^[0-9]+$ ]]; then echo "Parallel must be integer 1..16"; exit 2; fi
      vnum=$((v+0))
      if (( vnum < 1 || vnum > 16 )); then echo "Parallel must be between 1 and 16"; exit 2; fi
      PARALLEL=$vnum; shift ;;
    -c|--curl)
      CURL_MODE=1; shift ;;
    -u|--url)
      shift
      [[ $# -gt 0 ]] || { echo "Missing argument for --url"; exit 2; }
      CURL_URL="$1"; shift ;;
    --url=*)
      CURL_URL="${1#*=}"; shift ;;
    -s|--set-gnome)
      SET_GNOME=1; shift ;;
    -t|--timeout)
      shift
      [[ $# -gt 0 ]] || { echo "Missing argument for --timeout"; exit 2; }
      tt="$1"
      if ! [[ "$tt" =~ ^[0-9]+$ ]]; then echo "Timeout must be integer seconds"; exit 2; fi
      TIMEOUT=$((tt+0))
      shift ;;
    --timeout=*)
      tt="${1#*=}"
      if ! [[ "$tt" =~ ^[0-9]+$ ]]; then echo "Timeout must be integer seconds"; exit 2; fi
      TIMEOUT=$((tt+0)); shift ;;
    -v|--verbose)
      VERBOSE=1; shift ;;
    -h|--help)
      usage; exit 0 ;;
    *)
      echo "Unknown option: $1"; usage; exit 2 ;;
  esac
done

command -v dig >/dev/null 2>&1 || { echo "dig not found; install dnsutils"; exit 1; }
if (( CURL_MODE == 1 )); then
  if ! command -v curl >/dev/null 2>&1 && ! command -v wget >/dev/null 2>&1; then
    echo "Warning: curl/wget not found; HTTP checks won't work."
  fi
fi

# --------------- Utilities -----------------
now_ms() { date +%s%3N; }

safe_dig_stdout() {
  "$@" +tries=1 +time="$TIMEOUT" 2>/dev/null || true
}

extract_ipv4() {
  grep -m1 -E '^[0-9]{1,3}(\.[0-9]{1,3}){3}$' || true
}

valid_ipv4() {
  [[ "$1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]
}

chatgpt در حال قطع شدن هست اما : https://chat.deepseek.com/ https://chat.z.ai/ هنوز وصل هستند؛ بهترین کار اینه که فعلا پروکسی تلگرام بفرستید بعدا که به تلگرام وصل شدند راهکارهای دیگه رو تست کنید. هردو مورد گزینه به اشتراک گذاری چت رو داره؛ برای sms کردن لینک چت هم دقت کنید حتما بخش اول url رو پاک کنید و بعد تلفنی توضیج بدید که اضافه کنند

psiphon هم دوستان اشاره می‌کنند روی ? ADSL متصل هست اما برای نصب کردن مطمئن بشید از جای امن دانلود می‌کنید

چون chatgpt روی اکثر شبکه‌ها باز هست : پروکسی‌های تلگرامی که گذاشتم یا خودتون دارید رو می‌تونید اینطوری به اشتراک بذارید یا اینکه همرو توی یک چت بنویسید و لینک اون چت رو برای دیگران بفرستید اگر فکر می‌کنید اپلیکیشن رو ندارند. چت گروهی فقط توی اپلیکیشن باز می‌شه اما اچت معمولی رو به اشتراک بذارید روی وب هم باز می‌شه

دوستان اطلاع دادند حتی به youtube هم تونستند وصل بشوند ولی روی 240-360 این خیلی خوبه ولی خواهشا؛ اگر واجب نیست اینکار رو نکنید ترافیک و لود اضافی روی سرورهای vpn نذارید خیلی از بچه‌ها اعضای خانواده‌هاشون خارج از ایران هستند و این تنها راهی هست که از حال هم باخبر بشوند. یک مقدار صبر کنید و روزهای آینده به یوتیوب گردی بپردازید البته اگر براتون مقدور هست

یکی پیام داده؛ به زودی اینترنت وصل میشه. امیدوارم که بشه ولی :
رئیس اتاق بازرگانی ایران و چین تُجار می‌توانند روزانه ۲۰ دقیقه با حضور ناظر از اینترنت استفاده کنند
با این اخبار عمرا فکر نکنم؛ سعی کنید دسترسی رو با روش‌هایی که گفتم حفظ کنید. شخصا فکر نمی‌کنم به این زودی‌ها اینترنت بین‌المللی وصل بشه. (حتی تا آخر بهمن هم وصل بشه تعجب می‌کنم)