Python Hints
رفتن به کانال در Telegram
Python tips and tricks The Good, Bad and the Ugly توی این کانال فقط قرار هست در مورد core python صحبت کنیم. این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از ۱۰ سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازهکار) Admin: @Abbasi_ai
نمایش بیشتر9 566
مشترکین
+1024 ساعت
+597 روز
+19630 روز
آرشیو پست ها
9 566
چندتا فیش پیدا کردم :
قبل از فیلترینگها (حدود سال ۸۸ اینا) - ماهیانه ۸۰ گیگ اینترنت میگرفتم برای کل خانواده سرعت دانلودم هم از الان بهتر بوده سرویس اختصاصی میگرفتم.
توی دوره فیلترینگ؛ تا همین ماه پیش برای خودم تنها مجموع اینترنت خونه و گوشی و ... ماهیانه ۱ ترابایت خرید میشه که ۹۹.۹٪ به ۳۰ روز نمیکشه (۱ ترابایت داخلی هست بینالمللی میشه حدود ۳۳۰ گیگ)
که احتمالا ۱۰۰ گیگش سر retry ها میره که وسطش قطع شده
درحال حاضر هم ۷-۸ روز پیش؛ برای ایمیل زدن به یکی از شرکتها که تازه باهاش کار رو شروع کرده بودم ۷ گیگ اینترنت خریدم که ۶ گیگش مونده
اما به ترتیب هرچی جلوتر اومدیم؛ بیشتر وقت و انرژی و عمرم صرف برقرار شدن اتصال شد؛ سایتهایی که نمیشه باز کرد یا خیلی وقتم رو میگیره
sqlalchemy, pypi, github, crates.io, rustlang, rust docs, docker, prometheus, grafana, ...
هست بخصوص توی مواردی که سایت هم مارو تحریم کرده
اما خیلی جالبه جاهایی که سعی کردند فیلتر کنند راحتتر باز میشه
telegram, x/tweeter, instagram, ...
بحثم کار کردن نیست؛ بحثم عمریه که داره تلف میشه؛ وگرینه این روزا تنها چیزی که براش وقت نمیذارم کار هست.
جاهایی که قبول کردند مرخصی گرفتم (البته من بخاطر شرایطی که قبل از اعتراضات بوجود اومد برام مرخصی گرفته بودم)
جاهایی هم که قبول نکردند به بهانه اینترنت کار نکردم (خیلی جاها هم اونا قبول نکردند ادامه بدند بخاطر اینترنت)9 566
پیام شما:
به بچه ها بگو با dns زیر رو مخابرات میتونن یوتوب رو باز کنن، سرعت و کیفیت عالیه78.157.42.101 78.157.42.101همچنین اگه تو اتصال به کانفیگ های مختلف و... رو مخابرات اختلال دارن dns زیر رو ست کن تو کلاینت هاشون شاید نتیجه بهتر شد94.140.14.14 94.140.15.15
9 566
چندنفر چندتا نکته گفتند،
پست مربوط به بازرگانان رو حذف کردم.
چون از آدمهای مختلفی شنیدم بنظرم قابل تأمل بود.
عذرخواهی هم میکنم از بازرگانانی که مجبور شدند حضور داشته باشند.
9 566
یک دوستی گفته برای ایمیل چیکار کنیم ؟
البته که ایمیلهای متصل به اکانت که verify و ... میخواد رو (مثلاً ایمیل به دانشگاه) که هیچ اما باقی موارد
سرویس ایمیل رو عوض کنید؛ سرورهای gmail رو زدن باقی بالاس
تست نکردم ولی شاید جواب بده:
میتونید gmail رو هم با این سرویسها که فعال هستند بیارید بالا
من غیر از gmail رو با این سرویسها آوردم بالا و جواب داد (تونستم ایمیل بزنم)
9 566
بازرگانها امروز صف کشیدن (طبق اخبار) برای دسترسی به ایمیل به همراه ناظر اونم فقط برای ۲۰ دقیقه.
یعنی ننگ، خفت، خواری ازین بالاتر نیست.
شخصاً حاضر بودم تا ترکیه پیاده برم و کارم رو انجام بدم و برگردم.
چندتا مثال هم هست که باید زده بشه ولی اینجا زن و بچه رد میشه، شما تو ذهن بیار.
فقط من چندتا سوال برام پیش اومد، از بازرگانهایی که رفتند:
۱- اگر ۲۰ دیقه بشه ۲۱ دیقه باید پاشو بلیسی بهت اجازه بیشتر بده ؟ یا التماس خالی کفایت میکنه ؟
۲- از اونجایی که هر دفعه دارن بیشتر تحقیرتون میکنند، دقیقاً کی قراره بگن ناموست رو بیار .... به اندازه دقایقش اینترنت بگیر ؟
اگر این سوالات رو پاسخ بدند ممنون میشم،
جهت شفاف سازی میگم، خداشاهده
9 566
تقریبا ۱ ساعتی هست که به هر دلیلی نه
url test
و نه
pingروی سرورهایی که داشتم جواب نمیده اما نکته جالب اینه که با همین سرورها به اینترنت بینالمللی وصل هستم. فکر کردم شاید مشکل از timeout باشه ولی نبود
9 566
کارهای اسکریپت
DNS هم داخلش هست و اونارو هم داره
فقط یک مورد با شما
اونم اسکریپت پایتون برای استخراج دیتای مربوط به کانالها9 566
nekoray, nekobox
دارها اینو تست کنید؛ لیست کانفیگها رو روی چندتا دامنه تست میزنه و بعد بهتون وصل شدهها و نشدههارو میده
فقط اگر لازم شد یک سری تنظیمات رو باید داخلش عوض کنید
NEKOBOX_DEFAULT_DIR
NEKOBOX_CODE_PATH
مثلا9 566
اینم شما فرستادید دوتا DNS قوی هست مثل اینکه:
2.188.21.130
2.188.21.46
دوستان ببخشید که کانال و رباتهایی که میگید رو معرفی نمیکنم.
بخاطر فروارد کردن مطلب از این مدل کانالها؛ randrng ریپورت شد
یک مقدار در شرایط فعلی ترجیح میدم با احتیاط عمل کنم که تریبون رو برای آموزش حفظ کنم
9 566
# ---------------- 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 رو آپدیت کنید موارد بهتر هم وجود داره
این هم برای بچههای لینوکسی هست9 566
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[@]}"9 566
روی اینترنت ثابت تنظیمات 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}$ ]]
}9 566
chatgpt
در حال قطع شدن هست اما :
https://chat.deepseek.com/
https://chat.z.ai/
هنوز وصل هستند؛ بهترین کار اینه که فعلا پروکسی تلگرام بفرستید
بعدا که به تلگرام وصل شدند راهکارهای دیگه رو تست کنید.
هردو مورد گزینه به اشتراک گذاری چت رو داره؛ برای sms کردن لینک چت هم دقت کنید حتما بخش اول url رو پاک کنید و بعد تلفنی توضیج بدید که اضافه کنند9 566
psiphon
هم دوستان اشاره میکنند روی ?
ADSL
متصل هست
اما برای نصب کردن مطمئن بشید از جای امن دانلود میکنید
9 566
چون chatgpt روی اکثر شبکهها باز هست :
پروکسیهای تلگرامی که گذاشتم یا خودتون دارید رو میتونید اینطوری به اشتراک بذارید
یا اینکه همرو توی یک چت بنویسید و لینک اون چت رو برای دیگران بفرستید اگر فکر میکنید اپلیکیشن رو ندارند.
چت گروهی فقط توی اپلیکیشن باز میشه اما اچت معمولی رو به اشتراک بذارید روی وب هم باز میشه
9 566
دوستان اطلاع دادند حتی به youtube هم تونستند وصل بشوند ولی روی 240-360
این خیلی خوبه ولی خواهشا؛ اگر واجب نیست اینکار رو نکنید
ترافیک و لود اضافی روی سرورهای vpn نذارید
خیلی از بچهها اعضای خانوادههاشون خارج از ایران هستند و این تنها راهی هست که از حال هم باخبر بشوند.
یک مقدار صبر کنید و روزهای آینده به یوتیوب گردی بپردازید البته اگر براتون مقدور هست
9 566
یکی پیام داده؛ به زودی اینترنت وصل میشه.
امیدوارم که بشه ولی :
رئیس اتاق بازرگانی ایران و چین تُجار میتوانند روزانه ۲۰ دقیقه با حضور ناظر از اینترنت استفاده کنندبا این اخبار عمرا فکر نکنم؛ سعی کنید دسترسی رو با روشهایی که گفتم حفظ کنید. شخصا فکر نمیکنم به این زودیها اینترنت بینالمللی وصل بشه. (حتی تا آخر بهمن هم وصل بشه تعجب میکنم)
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
