ch
Feedback
Python Hints

Python Hints

前往频道在 Telegram

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

显示更多
9 665
订阅者
+324 小时
+457
+20130
帖子存档
خیال راحت‌ترین حالت استفاده درحال حاضر mtproto هست چون غیر از تلگرام جایی استفاده نمی‌شه و تلگرام هم تمام پیام‌ها encryption دارند

دوستان با این وضعیت اینترنت، اینکه پیام میدید چرا نا امن هست چطوری بفهمیم امن هست یا نه چرا سکرت تلگرام امن هست و ... والا من نمی‌تونم جواب بدم انقدر سوال رو؛ تمام کانفیگ‌ها رو هم نمی‌تونم تست کنم چندتا از دوستان گفتند منم نکات رو بررسی کردم دیدم می‌خونه با گفته‌ها، برای همین اطلاع دادم سوالات عمومی تر خودتون رو هم می‌تونید از chatgpt بپرسید مطمئنم جواب میده به این مواردی که پرسیدید فقط نکاتی که گفتم رو حتماً رعایت کنید که امنیت از دسترسی مهمتره

یک پیشنهاد خوب که یکی از دوستان دادند من هم داشتم همین رو تست میکردم کانفیگ‌های این کانال رو اگر مجبور به استفاده هستید روی یک گوشی که باهاش هیچ سایتی رو باز نمی‌کنید و هیچکاری نمی‌کنید بیارید بالا و بعد اون رو بعنوان پروکسی استفاده کنید تا vpn های معمول گوشی‌های دیگه رو وصل کنه براتون روی گوشی خودتون هم می‌تونید بجای حالت vpn از حالت پروکسی استفاده کنید و فقط تلگرام رو باهاش کانفیگ کنید.

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

با این کانفیگ‌های عمومی بجز تلگرام نباید جایی رو باز کنید لطفاً این نکات رو جدی بگیرید؛ اگر کاری که می‌کنید حتی مهم‌تر هم هست حتماً حتماً حتماً از Secret Chat استفاده کنید.

شدیداً مراقب کانفیگ‌های کانال اینترنت آزاد باشید (تازه به ۱.۲ میلیون کاربر رسیده) بچه‌ها هم گفتند من هم چک کردم؛ شدیداً کانفیگ‌ها ناامن هست. بخصوص اگر توی فضایی غیر از تلگرام استفاده می‌کنید

خبرهایی هست قطعی داره بیشتر میشه

چندتا فیش پیدا کردم :‌ قبل از فیلترینگ‌ها (حدود سال ۸۸ اینا) - ماهیانه ۸۰ گیگ اینترنت می‌گرفتم برای کل خانواده سرعت دانلودم هم از الان بهتر بوده سرویس اختصاصی میگرفتم. توی دوره فیلترینگ؛ تا همین ماه پیش برای خودم تنها مجموع اینترنت خونه و گوشی و ... ماهیانه ۱ ترابایت خرید میشه که ۹۹.۹٪ به ۳۰ روز نمی‌کشه (۱ ترابایت داخلی هست بین‌المللی میشه حدود ۳۳۰ گیگ) که احتمالا ۱۰۰ گیگش سر 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[@]}"