.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "SN0INT" "1" "Jul 17, 2025" "" "sn0int" .SH "نام (NAME)" sn0int \- چارچوب و مدیر بسته نیمهخودکار OSINT .sp در دست تکمیل .SH "اجرای نخستین کاوش (RUNNING YOUR FIRST INVESTIGATION)" .sp این صفحه شما را در مراحل راهاندازی محیط و اجرای نخستین کاوش خود راهنمایی میکند. .SS "نصب ماژولهای پیشفرض" .sp بهصورت پیشفرض، هیچ ماژولی روی sn0int نصب نیست. اگر sn0int را اجرا کنید، تعدادی از فایلهای مورد نیازش را بارگیری کرده و سپس نصب مجموعهای از ماژولهای توصیهشده را پیشنهاد میدهد: .INDENT 0.0 .INDENT 3.5 .sp .EX $ sn0int ___/ . ____ , __ .\(aq /\e \(ga , __ _/_ ( |\(aq \(ga. | / | | |\(aq \(ga. | \(ga\-\-. | | |,\(aq | | | | | \e___.\(aq / | /\(ga\-\-\-\(aq / / | \e__/ osint | recon | security irc.hackint.org:6697/#sn0int [+] Connecting to database [+] Downloading public suffix list [+] Downloading \(dqGeoLite2\-City.mmdb\(dq [+] Downloading \(dqGeoLite2\-ASN.mmdb\(dq [+] Loaded 0 modules [*] No modules found, run pkg quickstart to install default modules [sn0int][default] > .EE .UNINDENT .UNINDENT .sp با وارد کردن \fBpkg quickstart\fP تعداد قابلتوجهی از ماژولهای برگزیده نصب خواهند شد: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][default] > pkg quickstart [+] Installing kpcyrd/asn [+] Installing kpcyrd/ctlogs [+] Installing kpcyrd/dns\-resolve [+] Installing kpcyrd/geoip [+] Installing kpcyrd/hackertarget\-subdomains [+] Installing kpcyrd/otx\-subdomains [+] Installing kpcyrd/passive\-spider [+] Installing kpcyrd/pgp\-keyserver [+] Installing kpcyrd/threatminer\-ipaddr [+] Installing kpcyrd/threatminer\-subdomains [+] Installing kpcyrd/url\-scan [+] Installing kpcyrd/waybackurls [+] Loaded 12 modules [sn0int][default] > .EE .UNINDENT .UNINDENT.SS افزودن به محدوده کاری (Adding something to scope) .sp احتمالاً میخواهید بررسیهای خود را تفکیک کنید، بنابراین باید یک فضای کاری (workspace) انتخاب کنید تا نتایج شما در آن ذخیره شوند: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][default] > workspace demo [+] Connecting to database [sn0int][demo] > .EE .UNINDENT .UNINDENT .sp در مرحله بعد، باید کار را از جایی آغاز کنیم و نخستین موجودیت (entity) را به محدوده کاری (scope) خود بیفزاییم: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo] > add domain Domain: example.com [sn0int][demo] > .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 مفهومی به نام دامنه (domain) در برابر زیردامنه (subdomain) وجود دارد. منظور ما از دامنه، هر چیزی است که یک زیردامنه از \X'tty: link https://publicsuffix.org'\fI\%public suffix\fP\X'tty: link'\& باشد. برای نمونه، .com یک پسوند عمومی (public suffix) است و این امر example.com را در اصطلاحات sn0int به یک domain تبدیل میکند. به هر زیردامنهای از آن، مانند www.example.com، زیردامنه (subdomain) گفته میشود. .sp توجه داشته باشید که example.com میتواند به عنوان یک زیردامنه نیز افزوده شود چرا که میتواند دربردارنده رکوردها باشد. در این حالت، example.com هم نام منطقه dns (dns zone) است و هم یک موجودیت درون آن منطقه. .UNINDENT .UNINDENT .sp میتوانید با اجرای یک دستور select بر روی دامنههایی که اکنون داریم، این مورد را تأیید کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo] > select domains #1, \(dqexample.com\(dq [sn0int][demo] > .EE .UNINDENT .UNINDENT .sp چیزی که در حال حاضر به آن نیازی نداریم، اما بعداً بسیار کاربردی خواهد بود، قابلیت فیلتر کردن موجودیتهایتان است: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo] > select domains where id=1 #1, \(dqexample.com\(dq [sn0int][demo] > [sn0int][demo] > select domains where value like %.com #1, \(dqexample.com\(dq [sn0int][demo] > [sn0int][demo] > select domains where ( value like e% and value like %m ) or false #1, \(dqexample.com\(dq [sn0int][demo] > .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 تقریباً تمام موجودیتها دارای ستون \fBvalue\fP هستند که مقدار اصلی موجودیت را نگهداری میکند. .UNINDENT .UNINDENT .SS اجرای یک ماژول (Running a module) .sp اکنون که دادهای برای شروع داریم، میتوانیم نخستین ماژول خود را اجرا کنیم. ابتدا بیایید تمام ماژولهایی را که در اختیار داریم فهرست کنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo] > pkg list kpcyrd/asn (0.1.0) Run a asn lookup for an ip address kpcyrd/ctlogs (0.1.0) Query certificate transparency logs to discover subdomains kpcyrd/dns\-resolve (0.1.0) Query subdomains to discovery ip addresses and verify the record is visible kpcyrd/geoip (0.1.0) Run a geoip lookup for an ip address kpcyrd/hackertarget\-subdomains (0.1.0) Query hackertarget for subdomains of a domain kpcyrd/otx\-subdomains (0.1.0) Query alienvault otx passive dns for subdomains of a domain kpcyrd/passive\-spider (0.1.0) Scrape known http responses for urls kpcyrd/pgp\-keyserver (0.1.0) Query pgp keyserver for email addresses kpcyrd/threatminer\-ipaddr (0.1.0) Query ThreatMiner passive dns for subdomains of an ip address kpcyrd/threatminer\-subdomains (0.1.0) Query ThreatMiner passive dns for subdomains of a domain kpcyrd/url\-scan (0.1.0) Scan subdomains for websites kpcyrd/waybackurls (0.1.0) Discover subdomains from wayback machine [sn0int][demo] > .EE .UNINDENT .UNINDENT .sp بیایید با پرسوجو از گزارشهای شفافیت گواهی (certificate transparency logs) آغاز کنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo] > use ctlogs [sn0int][demo][kpcyrd/ctlogs] > run [*] \(dqexample.com\(dq : Subdomain: \(dqwww.example.com\(dq [*] \(dqexample.com\(dq : Subdomain: \(dqm.example.com\(dq [*] \(dqexample.com\(dq : Subdomain: \(dqdev.example.com\(dq [*] \(dqexample.com\(dq : Subdomain: \(dqproducts.example.com\(dq [*] \(dqexample.com\(dq : Subdomain: \(dqsupport.example.com\(dq [+] Finished kpcyrd/ctlogs [sn0int][demo][kpcyrd/ctlogs] > .EE .UNINDENT .UNINDENT .sp به نظر میرسد در اینجا چند زیردامنه کشف کردهایم. شاید وسوسهانگیز باشد که برخی از آنها را فوراً در مرورگر باز کنید، اما دست نگه دارید؛ روش بسیار کارآمدتری برای انجام این کار وجود دارد. .sp \fBراهنمایی:\fP .INDENT 0.0 .INDENT 3.5 میتوانید ماژولها را با دستور \fBrun \-j3\fP بهصورت همروند (concurrently) اجرا کنید. .UNINDENT .UNINDENT.SS "اجرای ماژولهای تکمیلی روی نتایج" .sp زمان زیادی صرف بخش پایگاهداده شده است. با اینکه تا حدی شبیه به یک پایگاهدادهٔ no\-sql به نظر میرسد، ما در واقع با دلیل موجهی به جای استفاده از دیکشنریهای عمومی و رها کردن کار، یک ساختار مشخص (schema) را اِعمال میکنیم. .sp بسیار حیاتی است که موجودیتهای ایجادشده توسط یک ماژول، همانند قطعات لگو، توسط ماژول دیگری قابل دریافت و استفاده باشند. بیایید با ماژولی برای پرسوجوی رکوردهای dns کار را ادامه دهیم: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo][kpcyrd/ctlogs] > use dns\-resolve [sn0int][demo][kpcyrd/dns\-resolve] > run [*] \(dqwww.example.com\(dq : Updating \(dqwww.example.com\(dq (resolvable => true) [*] \(dqwww.example.com\(dq : IpAddr: 93.184.216.34 [*] \(dqwww.example.com\(dq : \(dqwww.example.com\(dq \-> 93.184.216.34 [*] \(dqm.example.com\(dq : Updating \(dqm.example.com\(dq (resolvable => false) [*] \(dqdev.example.com\(dq : Updating \(dqdev.example.com\(dq (resolvable => false) [*] \(dqproducts.example.com\(dq : Updating \(dqproducts.example.com\(dq (resolvable => false) [*] \(dqsupport.example.com\(dq : Updating \(dqsupport.example.com\(dq (resolvable => false) [+] Finished kpcyrd/dns\-resolve [sn0int][demo][kpcyrd/dns\-resolve] > .EE .UNINDENT .UNINDENT .sp در اینجا دو اتفاق رخ داد: تعدادی آدرس IP شناسایی کردیم و آنها را به محدوده (scope) افزودیم، و همچنین موجودیتهای زیردامنهٔ خود را با اطلاعات جدید بهروزرسانی کردیم، زیرا اکنون میدانیم کدامیک از آنها قابل تحلیل (resolvable) هستند و کدامیک نیستند. .sp بیایید ماژول بعدی را اجرا کنیم که وجود وبسایتها روی آنها را بررسی میکند؛ اما تنها زیردامنههایی را هدف قرار میدهیم که میدانیم قابل تحلیل (resolvable) هستند: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo][kpcyrd/dns\-resolve] > use url\-scan [sn0int][demo][kpcyrd/url\-scan] > target #1, \(dqwww.example.com\(dq 93.184.216.34 #2, \(dqm.example.com\(dq #3, \(dqdev.example.com\(dq #4, \(dqproducts.example.com\(dq #5, \(dqsupport.example.com\(dq [sn0int][demo][kpcyrd/url\-scan] > target where resolvable [+] 1 entities selected [sn0int][demo][kpcyrd/url\-scan] > target #1, \(dqwww.example.com\(dq 93.184.216.34 [sn0int][demo][kpcyrd/url\-scan] > .EE .UNINDENT .UNINDENT .sp میتوانیم با دستور target اهدافی را که قرار است به ماژول فرستاده شوند، هم پیشنمایش دهیم و هم محدود کنیم. پس از اینکه از انتخاب خود مطمئن شدیم، میتوانیم این ماژول را اجرا کنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo][kpcyrd/url\-scan] > run [*] \(dqwww.example.com\(dq : Url: \(dqhttp://www.example.com/\(dq (200) [*] \(dqwww.example.com\(dq : Url: \(dqhttps://www.example.com/\(dq (200) [+] Finished kpcyrd/url\-scan [sn0int][demo][kpcyrd/url\-scan] > .EE .UNINDENT .UNINDENT .sp ما اکنون هر دو پورت 80 و 443 را برای هر زیردامنه کاوش (probe) کرده و از این طریق دو پاسخ http دریافت کردهایم. اگر فهرستی از نشانیها (urls) را میخواهید که ممکن است مایل باشید در مرورگر خود بررسی کنید، اکنون میتوانید از آنها پرسوجو بگیرید: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo][kpcyrd/url\-scan] > select urls #1, \(dqhttp://www.example.com/\(dq (200) #2, \(dqhttps://www.example.com/\(dq (200) [sn0int][demo][kpcyrd/url\-scan] > .EE .UNINDENT .UNINDENT.SS خارج کردن موجودیتها از دامنه (Unscoping entities) .sp یکی از مواردی که با آن روبرو خواهید شد این است که ماژولها ممکن است بیش از حد حریصانه عمل کرده و مواردی را به دامنه بیفزایند که مورد نظر ما نیستند. شما میتوانید آنها را با استفاده از دستور delete حذف کنید، اما احتمالاً مجدداً توسط یک ماژول جمعآوری خواهند شد. .sp کاری که میتوانید به جای آن انجام دهید، تنظیم یک پرچم (flag) روی یک موجودیت است که آن را از دامنه خارج میکند. این کار با استفاده از دستور noscope انجام میشود: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo] > use ctlogs [sn0int][demo][kpcyrd/ctlogs] > target #1, \(dqexample.com\(dq [sn0int][demo][kpcyrd/ctlogs] > add domain Domain: google.com [sn0int][demo][kpcyrd/ctlogs] > target #1, \(dqexample.com\(dq #2, \(dqgoogle.com\(dq [sn0int][demo][kpcyrd/ctlogs] > noscope domains where value=google.com [+] Updated 1 rows [sn0int][demo][kpcyrd/ctlogs] > target #1, \(dqexample.com\(dq [sn0int][demo][kpcyrd/ctlogs] > .EE .UNINDENT .UNINDENT .sp موجودیتهایی که از دامنه خارج شدهاند (unscoped)، به طور خودکار توسط تمام ماژولها نادیده گرفته میشوند. .sp میتوانید با استفاده از دستور scope این عمل را بازگردانی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [sn0int][demo][kpcyrd/ctlogs] > target #1, \(dqexample.com\(dq [sn0int][demo][kpcyrd/ctlogs] > scope domains where true [+] Updated 2 rows [sn0int][demo][kpcyrd/ctlogs] > target #1, \(dqexample.com\(dq #2, \(dqgoogle.com\(dq [sn0int][demo][kpcyrd/ctlogs] > .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 تمام موجودیتها دارای این فیلد هستند؛ میتوانید در پرسوجوها با استفاده از \fBunscoped=1\fP\& به آن ارجاع دهید. .UNINDENT .UNINDENT .SH "پیکربندی (CONFIGURATION)" .sp این بخش مستندات فایل پیکربندی را شرح میدهد. به طور پیشفرض این فایل وجود ندارد و به جای آن از یک پیکربندی پیشفرض استفاده میشود. .INDENT 0.0 .TP .B Linux/BSD \fB~/.config/sn0int.toml\fP .TP .B OSX \fB~/Library/Preferences/sn0int.toml\fP .TP .B Windows \fB%APPDATA%/sn0int.toml\fP .UNINDENT .SS [core] .INDENT 0.0 .TP .B \fBregistry\fP رجیستری مورد نظری را که میخواهید استفاده کنید پیکربندی میکند. مقدار پیشفرض \fBhttps://sn0int.com\fP\& است. .TP .B \fBno\-autoupdate\fP ابزار sn0int هنگام راهاندازی، هفتهای یک بار بررسی میکند که آیا ماژولهای شما قدیمی شدهاند یا خیر. این گزینه را روی \fBtrue\fP تنظیم کنید تا این قابلیت غیرفعال شود. .UNINDENT.SS [namespaces] .sp بهطور پیشفرض فرض میشود که ماژولهای sn0int از رجیستری نصب شدهاند. ممکن است بخواهید بهویژه در هنگام توسعه، یک دایرکتوری محلی با ماژولهای خصوصی نگه دارید. میتوانید با افزودن یک بخش namespace به فایل پیکربندی، پوشهای شامل ماژولهایی که توسط sn0int مدیریت نمیشوند را پیکربندی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [namespaces] foo = \(dq/opt/sn0int/foo\(dq bar = \(dq~/repos/a/b/c/sn0int\-modules\(dq .EE .UNINDENT .UNINDENT .sp این کار ماژولها را از این دو پوشه بارگذاری کرده و آنها را در فضای نام \fBfoo\fP و \fBbar\fP ثبت میکند. .sp توجه داشته باشید که sn0int همچنین فرض میکند پیوندهای نمادین در \fB~/.local/share/sn0int/modules\fP و پوشههای حاوی یک پوشهٔ \fB\&.git\fP بهصورت خارجی مدیریت میشوند. .SS [network] .sp برای فعالسازی یک پراکسی، موارد زیر را به فایل پیکربندی خود اضافه کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [network] proxy = \(dq127.0.0.1:9050\(dq .EE .UNINDENT .UNINDENT .sp این کار همه چیز را از طریق tor (یا هر پراکسی socks5 دیگر) هدایت کرده و تمام توابع دیگر وابسته به شبکه را محدود میکند. برای نمونه، در صورت پیکربندی یک پراکسی، تابع \fBdns\fP بهطور کامل غیرفعال میشود. .SH "مرجع توابع (FUNCTION REFERENCE)" .SS asn_lookup .sp یک جستجوی ASN را برای نشانی IP دادهشده اجرا میکند. این تابع \fBasn\fP و \fBas_org\fP را بازمیگرداند. این تابع ممکن است با شکست مواجه شود. .INDENT 0.0 .INDENT 3.5 .sp .EX lookup = asn_lookup(\(aq1.1.1.1\(aq) if last_err() then return end .EE .UNINDENT .UNINDENT .SS base64_decode .sp یک رشتهٔ base64 را با الفبا و پدینگ (padding) پیشفرض رمزگشایی میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX base64_decode(\(dqww==\(dq) .EE .UNINDENT .UNINDENT .SS base64_encode .sp یک آرایهٔ باینری را با base64 و الفبا و پدینگ (padding) پیشفرض کدگذاری میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX base64_encode(\(dq\ex00\exff\(dq) .EE .UNINDENT .UNINDENT .SS base64_custom_decode .sp یک رشتهٔ base64 را با الفبا و پدینگ (padding) سفارشی رمزگشایی میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX \-\- base64 base64_custom_decode(\(aqb2hhaQ==\(aq, \(aqABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\(aq, \(aq=\(aq) \-\- base64 no padding base64_custom_decode(\(aqb2hhaQ\(aq, \(aqABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\(aq, \(aq\(aq) \-\- base64 url safe base64_custom_decode(\(aqb2hhaQ==\(aq, \(aqABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\-_\(aq, \(aq=\(aq) .EE .UNINDENT .UNINDENT.SS base64_custom_encode .sp کدگذاری یک آرایه باینری با base64 و الفبا+پدینگ سفارشی. .INDENT 0.0 .INDENT 3.5 .sp .EX \-\- base64 base64_custom_encode(\(aqohai\(aq, \(aqABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\(aq, \(aq=\(aq) \-\- base64 no padding base64_custom_encode(\(aqohai\(aq, \(aqABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\(aq, \(aq\(aq) \-\- base64 url safe base64_custom_encode(\(aqohai\(aq, \(aqABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\-_\(aq, \(aq=\(aq) .EE .UNINDENT .UNINDENT .SS base32_custom_decode .sp رمزگشایی یک رشته base32 با الفبا+پدینگ سفارشی. .INDENT 0.0 .INDENT 3.5 .sp .EX \-\- rfc\-4648 base32 base32_custom_decode(\(aqN5UGC2I=\(aq, \(aqABCDEFGHIJKLMNOPQRSTUVWXYZ234567\(aq, \(aq=\(aq) \-\- z\-base\-32 base32_custom_decode(\(aqp7wgn4e\(aq, \(aqybndrfg8ejkmcpqxot1uwisza345h769\(aq, \(aq\(aq) .EE .UNINDENT .UNINDENT .SS base32_custom_encode .sp کدگذاری یک آرایه باینری با base32 و الفبا+پدینگ سفارشی. .INDENT 0.0 .INDENT 3.5 .sp .EX \-\- rfc\-4648 base32 x = base32_custom_encode(\(aqohai\(aq, \(aqABCDEFGHIJKLMNOPQRSTUVWXYZ234567\(aq, \(aq=\(aq) \-\- z\-base\-32 x = base32_custom_encode(\(aqohai\(aq, \(aqybndrfg8ejkmcpqxot1uwisza345h769\(aq, \(aq\(aq) .EE .UNINDENT .UNINDENT .SS clear_err .sp پاک کردن آخرین خطای ثبتشده از وضعیت داخلی. همچنین ببینید: \fI\%last_err\fP\&. .INDENT 0.0 .INDENT 3.5 .sp .EX if last_err() then \-\- ignore this error clear_err() end .EE .UNINDENT .UNINDENT .SS create_blob .sp قرار دادن یک آرایه بایتی در فضای ذخیرهسازی پایای blob. این کار اجازه میدهد تا این بایتها به توابعی که روی ذخیرهساز blob عمل میکنند منتقل شوند. یک شناسه blob بازمیگرداند که بر اساس محتوای blob قطعی است. دادههای blob تغییرناپذیر هستند. .INDENT 0.0 .INDENT 3.5 .sp .EX blob = create_blob(\(dqsome bytes\(dq) debug(blob) .EE .UNINDENT .UNINDENT .SS datetime .sp بازگرداندن زمان فعلی در UTC. این تابع برای تعیین تاریخ و زمان برای فیلدهای پایگاهداده \fBDATETIME\fP مناسب است. .INDENT 0.0 .INDENT 3.5 .sp .EX now = datetime() .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این قالب مختص sn0int است؛ برای دریافت زمان فعلی به منظور اسکریپتنویسی، در عوض از \fI\%time_unix\fP استفاده کنید. .UNINDENT .UNINDENT .sp \fBهشدار:\fP .INDENT 0.0 .INDENT 3.5 این تابع در آینده منسوخ خواهد شد. برای اسکریپتهای جدید ترجیحاً از \fI\%sn0int_time\fP استفاده کنید. .UNINDENT .UNINDENT.SS db_add .sp یک موجودیت را به پایگاهداده اضافه میکند یا در صورت وجود، آن را بهروزرسانی میکند. این تابع ممکن است با شکست مواجه شود یا \fBnil\fP\& بازگرداند. برای جزئیات، \fI\%db_add\fP را ببینید. .INDENT 0.0 .INDENT 3.5 .sp .EX domain_id = db_add(\(aqdomain\(aq, { value=\(aqexample.com\(aq, }) .EE .UNINDENT .UNINDENT .SS db_add_ttl .sp یک موجودیت موقت را به پایگاهداده اضافه میکند. این تابع معمولاً برای درج پیوندهای موقتی استفاده میشود که با گذشت زمان بهطور خودکار منقضی میشوند. اگر موجودیت از قبل وجود داشته باشد و همچنین به عنوان موقت علامتگذاری شده باشد، ttl جدید جایگزین ttl قبلی خواهد شد. اگر موجودیت از قبل وجود داشته باشد اما هرگز منقضی نشود، ttl جدیدی اضافه نخواهد شد. .INDENT 0.0 .INDENT 3.5 .sp .EX \-\- this link is valid for 2min domain_id = db_add_ttl(\(aqnetwork\-device\(aq, { network_id=1, device_id=13, }, 120) .EE .UNINDENT .UNINDENT .SS db_activity .sp یک رویداد فعالیت را ثبت میکند. یک رویداد پایه به این شکل است: .INDENT 0.0 .INDENT 3.5 .sp .EX db_activity({ topic=\(aqharness/activity\-ping:dummy\(aq, time=sn0int_time(), content={ a=\(aqb\(aq, foo={ bar=1337, }, msg=\(aqohai\(aq, }, }) .EE .UNINDENT .UNINDENT .sp این تابع با جزئیات در بخش \fI\%activity\fP توضیح داده شده است. .SS db_select .sp بررسی میکند که آیا یک هدف در محدوده (scope) قرار دارد یا خیر. اگر مقداری غیر از nil بازگردانده شود، این موجودیت در محدوده قرار دارد. این تابع ممکن است با شکست مواجه شود. برای جزئیات، \fI\%db_select\fP را ببینید. .INDENT 0.0 .INDENT 3.5 .sp .EX domain_id = db_select(\(aqdomain\(aq, \(aqexample.com\(aq) if domain_id ~= nil then \-\- do something end .EE .UNINDENT .UNINDENT .SS db_update .sp یک موجودیت را در پایگاهداده بهروزرسانی میکند. این تابع ممکن است با شکست مواجه شود. برای جزئیات، \fI\%db_update\fP را ببینید. .INDENT 0.0 .INDENT 3.5 .sp .EX db_update(\(aqipaddr\(aq, arg, { asn=lookup[\(aqasn\(aq], as_org=lookup[\(aqas_org\(aq], }) .EE .UNINDENT .UNINDENT.SS dns .sp یک رکورد dns را تحلیل میکند. اگر پرسوجوی dns موفقیتآمیز باشد و پاسخ dns برابر با \fBNoError\fP باشد، مقدار \fBx[\(aqerror\(aq]\fP برابر با \fBnil\fP خواهد بود\&. رکوردهای پاسخ در \fBx[\(aqanswers\(aq]\fP قرار دارند\&. این تابع ممکن است با شکست مواجه شود. .sp این تابع گزینههای زیر را میپذیرد: .INDENT 0.0 .TP .B \fBrecord\fP مقدار \fBquery_type\fP؛ میتواند هر یک از \fBA\fP، \fBAAAA\fP، \fBMX\fP، \fBAXFR\fP و غیره باشد. .TP .B \fBnameserver\fP سروری که باید برای جستجو استفاده شود. پیشفرض، تحلیلگر سیستم شما است. .TP .B \fBtcp\fP مشخص میکند که آیا جستجو باید از tcp استفاده کند یا خیر، true/false. .TP .B \fBtimeout\fP مدت زمان تا اتمام مهلت پرسوجو به میلیثانیه. .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX records = dns(\(aqexample.com\(aq, { record=\(aqA\(aq, }) if last_err() then return end if records[\(aqerror\(aq] ~= nil then return end records = records[\(aqanswers\(aq] .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 پاسخهای DNS که کد خطا در آنها تنظیم شده است، باعث تغییر در \fBlast_err()\fP نمیشوند\&. باید این مورد را بهصورت صریح بررسی کنید. .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 اگر یک پراکسی socks5 پیکربندی شده باشد، این تابع در دسترس نخواهد بود. .UNINDENT .UNINDENT .SS error .sp یک خطا را در ترمینال ثبت میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX error(\(aqohai\(aq) .EE .UNINDENT .UNINDENT .SS geoip_lookup .sp یک جستجوی geoip را برای یک نشانی ip مشخص اجرا میکند. این تابع موارد زیر را برمیگرداند: .INDENT 0.0 .IP \(bu 2 continent .IP \(bu 2 continent_code .IP \(bu 2 country .IP \(bu 2 country_code .IP \(bu 2 city .IP \(bu 2 latitude .IP \(bu 2 longitude .UNINDENT .sp این تابع ممکن است با شکست مواجه شود. .INDENT 0.0 .INDENT 3.5 .sp .EX lookup = geoip_lookup(\(aq1.1.1.1\(aq) if last_err() then return end .EE .UNINDENT .UNINDENT.SS hex .sp کدگذاری هگز (Hex) فهرستی از بایتها. .INDENT 0.0 .INDENT 3.5 .sp .EX hex(\(dq\ex6F\ex68\ex61\ex69\ex0A\ex00\(dq) .EE .UNINDENT .UNINDENT .SS hmac_md5 .sp محاسبه یک hmac با md5. یک آرایه باینری را بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hmac_md5(\(dqsecret\(dq, \(dqmy authenticated message\(dq) .EE .UNINDENT .UNINDENT .SS hmac_sha1 .sp محاسبه یک hmac با sha1. یک آرایه باینری را بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hmac_sha1(\(dqsecret\(dq, \(dqmy authenticated message\(dq) .EE .UNINDENT .UNINDENT .SS hmac_sha2_256 .sp محاسبه یک hmac با sha2_256. یک آرایه باینری را بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hmac_sha2_256(\(dqsecret\(dq, \(dqmy authenticated message\(dq) .EE .UNINDENT .UNINDENT .SS hmac_sha2_512 .sp محاسبه یک hmac با sha2_512. یک آرایه باینری را بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hmac_sha2_512(\(dqsecret\(dq, \(dqmy authenticated message\(dq) .EE .UNINDENT .UNINDENT .SS hmac_sha3_256 .sp محاسبه یک hmac با sha3_256. یک آرایه باینری را بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hmac_sha3_256(\(dqsecret\(dq, \(dqmy authenticated message\(dq) .EE .UNINDENT .UNINDENT .SS hmac_sha3_512 .sp محاسبه یک hmac با sha3_512. یک آرایه باینری را بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hmac_sha3_512(\(dqsecret\(dq, \(dqmy authenticated message\(dq) .EE .UNINDENT .UNINDENT .SS html_select .sp یک سند html را تجزیه کرده و نخستین عنصری را که با انتخابگر css مطابقت دارد بازمیگرداند. مقدار بازگشتی یک جدول است که در آن \fItext\fP متن درونی و \fIattrs\fP جدولی از ویژگیهای عنصر است. .INDENT 0.0 .INDENT 3.5 .sp .EX csrf = html_select(html, \(aqinput[name=\(dqcsrf\(dq]\(aq) token = csrf[\(dqattrs\(dq][\(dqvalue\(dq] .EE .UNINDENT .UNINDENT.SS html_select_list .sp همانند \fI\%html_select\fP است اما به جای مورد اول، تمام موارد منطبق را بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX html_select_list(html, \(aqinput[name=\(dqcsrf\(dq]\(aq) .EE .UNINDENT .UNINDENT .SS http_mksession .sp یک شیء نشست (session) ایجاد میکند. این تابع شبیه به \fBrequests.Session\fP در python\-requests است و وضعیت کوکیها را دنبال و نگهداری میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX session = http_mksession() .EE .UNINDENT .UNINDENT .SS http_request .sp یک درخواست http آماده میکند. آرگومان نخست، ارجاع به نشست است و کوکیهای مربوط به آن نشست درون درخواست کپی میشوند. پس از ارسال درخواست، کوکیهای حاصل از پاسخ دوباره به درون نشست کپی میشوند. .sp آرگومانهای بعدی عبارتند از \fBmethod\fP، \fBurl\fP و گزینههای اضافی. لطفاً توجه داشته باشید که حتی اگر هیچ گزینهای تنظیم نشده باشد، باز هم باید یک جدول خالی \fB{}\fP مشخص کنید. گزینههای زیر در دسترس هستند: .INDENT 0.0 .TP .B \fBquery\fP نگاشتی از پارامترهای query که باید روی url تنظیم شوند. .TP .B \fBheaders\fP نگاشتی از سرایندها (headers) که باید تنظیم شوند. .TP .B \fBbasic_auth\fP پیکربندی سرایند basic auth با \fB{\(dquser, \(dqpassword\(dq}\fP\&. .TP .B \fBuser_agent\fP بازنویسی user agent پیشفرض با یک رشته. .TP .B \fBjson\fP بدنه درخواست که باید بهصورت json کدگذاری شود. .TP .B \fBform\fP بدنه درخواست که باید بهصورت form کدگذاری شود. .TP .B \fBfollow_redirects\fP دنبال کردن خودکار تغییرمسیرها (redirects) تا تعداد مشخصشده. اگر روی 1 تنظیم شود، تنها یک تغییرمسیر دنبال خواهد شد. مقدار پیشفرض 0 است، بنابراین تغییرمسیرها دنبال نمیشوند. .TP .B \fBbody\fP بدنه خام درخواست بهصورت رشته. .TP .B \fBinto_blob\fP اگر true باشد، بدنه پاسخ در فضای ذخیرهسازی blob ذخیره میشود و به جای بدنه کامل، یک ارجاع به blob بهعنوان \fBblob\fP بازگردانده میشود. .TP .B \fBproxy\fP استفاده از یک پراکسی socks5 در قالب \fB127.0.0.1:9050\fP\&. این گزینه تنها در صورتی کار میکند که با تنظیمات سراسری پراکسی تداخل نداشته باشد. .TP .B \fBbinary\fP روی \fBtrue\fP تنظیم شود تا پاسخ http بهصورت بایتهای خام دریافت گردد. .UNINDENT .sp این تابع ممکن است با شکست مواجه شود. .INDENT 0.0 .INDENT 3.5 .sp .EX req = http_request(session, \(aqPOST\(aq, \(aqhttps://httpbin.org/post\(aq, { json={ user=user, password=password, } }) resp = http_send(req) if last_err() then return end if resp[\(aqstatus\(aq] ~= 200 then return \(aqhttp status error: \(aq .. resp[\(aqstatus\(aq] end .EE .UNINDENT .UNINDENT.SS http_send .sp درخواستی که با \fI\%http_request\fP ساخته شده است را ارسال میکند. یک جدول با کلیدهای زیر برمیگرداند: .INDENT 0.0 .TP .B \fBstatus\fP کد وضعیت http .TP .B \fBheaders\fP جدولی از سرآیندها .TP .B \fBtext\fP بدنه پاسخ بهصورت رشته .TP .B \fBbinary\fP بدنه پاسخ بهصورت بایت (در صورت \fBbinary=true\fP) .TP .B \fBblob\fP اگر \fBinto_blob\fP برای درخواست فعال شده باشد، بدنه در فضای ذخیرهسازی blob بارگیری میشود و ارجاعی به بدنه در این فیلد قرار میگیرد. .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX req = http_request(session, \(aqPOST\(aq, \(aqhttps://httpbin.org/post\(aq, { json={ user=user, password=password, } }) resp = http_send(req) if last_err() then return end if resp[\(aqstatus\(aq] ~= 200 then return \(aqhttp status error: \(aq .. resp[\(aqstatus\(aq] end .EE .UNINDENT .UNINDENT .SS http_fetch .sp این تابع یک \fI\%http_send\fP انجام داده و همچنین کد وضعیت را بهطور خودکار اعتبارسنجی میکند. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 هنگام تنظیم گزینهٔ \fBinto_blob\fP تقریباً همیشه به این تابع نیاز خواهید داشت، چرا که این تابع کد وضعیت را \fIپیش از\fP درج بدنه پاسخ در فضای ذخیرهسازی blob اعتبارسنجی میکند. .UNINDENT .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX \-\- short form data = http_fetch(req) if last_err() then return end \-\- long form resp = http_send(req) if last_err() then return end if resp[\(aqstatus\(aq] ~= 200 then return \(aqhttp status error: \(aq .. resp[\(aqstatus\(aq] end .EE .UNINDENT .UNINDENT .SS http_fetch_json .sp همانند \fI\%http_fetch\fP است، اما بدنه پاسخ را نیز بهطور خودکار بهصورت json تجزیه میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX \-\- short form data = http_fetch_json(req) if last_err() then return end \-\- long form resp = http_send(req) if last_err() then return end if resp[\(aqstatus\(aq] ~= 200 then return \(aqhttp status error: \(aq .. resp[\(aqstatus\(aq] end data = json_decode(resp[\(aqtext\(aq]) if last_err() then return end .EE .UNINDENT .UNINDENT.SS img_load .sp تلاش برای رمزگشایی یک blob به عنوان تصویر و بازگرداندن فرادادههای اولیهای مانند mime type، ارتفاع و عرض. .INDENT 0.0 .INDENT 3.5 .sp .EX img = img_load(blob) if last_err() then return end debug(img) .EE .UNINDENT .UNINDENT .SS img_exif .sp استخراج فرادادههای exif از یک تصویر. .INDENT 0.0 .INDENT 3.5 .sp .EX exif = img_exif(blob) if last_err() then return end debug(exif) .EE .UNINDENT .UNINDENT .SS img_ahash .sp محاسبه هش ادراکی Mean (aHash). .INDENT 0.0 .INDENT 3.5 .sp .EX hash = img_ahash(blob) if last_err() then return end debug(hash) .EE .UNINDENT .UNINDENT .SS img_dhash .sp محاسبه هش ادراکی Gradient (dHash). .INDENT 0.0 .INDENT 3.5 .sp .EX hash = img_dhash(blob) if last_err() then return end debug(hash) .EE .UNINDENT .UNINDENT .SS img_phash .sp محاسبه هش ادراکی DCT (pHash). .INDENT 0.0 .INDENT 3.5 .sp .EX hash = img_phash(blob) if last_err() then return end debug(hash) .EE .UNINDENT .UNINDENT .SS img_nudity .sp طبقهبندی یک تصویر از نظر برهنگی. امتیاز از 0 تا 2 متغیر است. امتیاز بالاتر از 1 به این معنی است که برهنگی تشخیص داده شده است. .INDENT 0.0 .INDENT 3.5 .sp .EX nudity = img_nudity(blob) if last_err() then return end debug(nudity) .EE .UNINDENT .UNINDENT.SS info .sp ثبت یک پیام اطلاعاتی (info) در ترمینال. .INDENT 0.0 .INDENT 3.5 .sp .EX info(\(aqohai\(aq) .EE .UNINDENT .UNINDENT .SS intval .sp تجزیه یک عدد از یک رشته. .INDENT 0.0 .INDENT 3.5 x = strval(\(aq1234\(aq) .UNINDENT .UNINDENT .SS json_decode .sp رمزگشایی یک مقدار lua از یک رشته json. .INDENT 0.0 .INDENT 3.5 .sp .EX json_decode(\(dq{\e\(dqdata\e\(dq:{\e\(dqpassword\e\(dq:\e\(dqfizz\e\(dq,\e\(dquser\e\(dq:\e\(dqbar\e\(dq},\e\(dqlist\e\(dq:[1,3,3,7]}\(dq) .EE .UNINDENT .UNINDENT .SS json_decode_stream .sp بسیار شبیه به \fI\%json_decode\fP است، اما با چندین شیء json که مستقیماً به یکدیگر متصل شدهاند یا با خطوط جدید جدا شدهاند کار میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX json_decode_stream(\(dq{\e\(dqdata\e\(dq:1}{\e\(dqdata\e\(dq:2}\(dq) .EE .UNINDENT .UNINDENT .SS json_encode .sp کدگذاری یک ساختار داده به صورت یک رشته. .INDENT 0.0 .INDENT 3.5 .sp .EX x = json_encode({ some=1, fancy={ data=\(aqstructures\(aq, } }) print(x) .EE .UNINDENT .UNINDENT .SS key_trunc_pad .sp کوتاهسازی یا پر کردن (truncate/pad) یک کلید تا یک طول مشخص. .INDENT 0.0 .INDENT 3.5 .sp .EX \-\- if longer than 32 bytes: truncate to 32 \-\- if shorter than 32 bytes: pad with \ex00 local key = key_trunc_pad(password, 32, 0) .EE .UNINDENT .UNINDENT .SS keyring .sp درخواست تمام کلیدها از یک فضاینام (namespace) مشخص. برای جزئیات به بخش \fI\%keyring\fP مراجعه کنید. .INDENT 0.0 .INDENT 3.5 .sp .EX creds = keyring(\(aqaws\(aq) print(creds[1][\(aqaccesskey\(aq]) print(creds[1][\(aqsecretkey\(aq]) .EE .UNINDENT .UNINDENT.SS last_err .sp اطلاعاتی را درباره آخرین خطای مشاهدهشده (در صورت وجود) برمیگرداند. در غیر این صورت \fBnil\fP را بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX if last_err() then \-\- Something went wrong, abort return end .EE .UNINDENT .UNINDENT .SS md5 .sp یک آرایه بایتی را با md5 هش کرده و نتیجه را بهصورت بایت بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hex(md5(\(dq\ex00\exff\(dq)) .EE .UNINDENT .UNINDENT .SS mqtt_connect .sp به یک کارگزار mqtt متصل میشود. .INDENT 0.0 .INDENT 3.5 .sp .EX local sock = mqtt_connect(\(aqmqtts://mqtt.example.com\(aq, { username=\(aqfoo\(aq, password=\(aqsecret\(aq, }) if last_err() then return end .EE .UNINDENT .UNINDENT .SS mqtt_subscribe .sp در یک موضوع (topic) مشترک میشود. در حال حاضر فقط از QoS 0 پشتیبانی میشود. .INDENT 0.0 .INDENT 3.5 .sp .EX mqtt_subscribe(sock, \(aq#\(aq, 0) if last_err() then return end .EE .UNINDENT .UNINDENT .SS mqtt_recv .sp یک بسته mqtt دریافت میکند. این بسته لزوماً یک بسته publish نیست و ممکن است در آینده بستههای بیشتری اضافه شوند، بنابراین باید نوع آن را بهطور مشخص بررسی کنید. .sp اگر یک مهلت زمانی خواندن (read timeout) با \fI\%mqtt_connect\fP تنظیم شده باشد، این تابع در صورت پایان مهلت زمانی خواندن \fBnil\fP بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX local pkt = mqtt_recv(sock) if last_err() then return end if pkt == nil then \-\- read timeout, consider sending a ping or disconnect if the previous ping failed elseif pkt[\(aqtype\(aq] == \(aqpong\(aq then \-\- broker sent a pong elseif pkt[\(aqtype\(aq] == \(aqpublish\(aq then local payload = utf8_decode(pkt[\(aqbody\(aq]) if last_err() then return end info(payload) end .EE .UNINDENT .UNINDENT .SS mqtt_ping .sp یک بسته pingreq ارسال میکند که باعث میشود کارگزار یک pingresp بفرستد. این تابع برای اطمینان از برقراری و عملکرد صحیح اتصال استفاده میشود. .INDENT 0.0 .INDENT 3.5 .sp .EX mqtt_ping(sock) if last_err() then return end .EE .UNINDENT .UNINDENT.SS pgp_pubkey .sp همانند \fI\%pgp_pubkey_armored\fP، اما بدون مرحلهی unarmor. .SS pgp_pubkey_armored .sp استخراج \fBuids\fP، \fBsigs\fP و \fBfingerprint\fP از یک کلید عمومی pgp منطبق با rfc 4880. این تابع ممکن است ناموفق باشد. .INDENT 0.0 .INDENT 3.5 .sp .EX key = pgp_pubkey_armored([===[ \-\-\-\-\-BEGIN PGP PUBLIC KEY BLOCK\-\-\-\-\- Version: GnuPG v2 mQENBFu6q90BCADgD7Q9aH5683yt7hzPktDkAUNAZJHwYhUNeyGK43frPyDRWQmq N+oXTfiYWLQN+d7KNBTnF9uwyBdaLM7SH44lLNYo8W09mVM2eK+wt19uf5HYNgAE 8la45QLo/ce9CQVe1a4oXNWq6l0FOY7M+wLe+G2wMwz8RXGgwd/qQp4/PB5YpUhx nAnzClxvwymrL6BQXsRcKSMSD5bIzIv95n105CvW5Hql7JR9zgOR+gHqVOH8HBUc ZxMumrTM6aKLgAhgM8Sn36gCFOfjlG1b1OFLZhUtgro/nnEOmAurRsCZy8M5h8QM FpZChIH8kgHs90F/CCvGjMq3qvWcH8ZsPUizABEBAAG0NUhhbnMgQWNrZXIgKGV4 YW1wbGUgY29tbWVudCkgPGhhbnMuYWNrZXJAZXhhbXBsZS5jb20+iQFOBBMBCAA4 FiEEyzeO1eEwbB03hcqBM00IodGdlj8FAlu6q90CGwMFCwkIBwIGFQgJCgsCBBYC AwECHgECF4AACgkQM00IodGdlj/AJQgAjmk+iP5b7Jt7+f+lU4Oprlf3f3DG/uh5 Ge6MjV7cvtxlhZJRD5hxGt9RwwnEp61TBSbrem288pM89ilQfTNe0wUr9OzwWzh/ 8Ngl5iWnD2ah3Mpi5R1V/YMNf2cnwVjqNvfkRHdNc43pZOkC2GoiTUn0QY0UBpOW ZMN3//ANi6ZtiK/L0IZQND/gKvOzu/4tfaJeBl26T3cVYj53p3G3jhlb92vVa8SR uL3S3bzd1h5snDgU1uXHmNHGbhkEc4KUneQ0V9/bdZrg6OzFAfM1ghgfoId+YpQH er9L26ISL3QF58wdEXfIdHYEmMlANjBMO2cUlQXgONuCgkMuY7GBmrkBDQRbuqvd AQgA41jqCumCxYV0NdSYNnTSSDRyd69dOUYCAPT80iZ739s7KKJS9X9KVfGmDjfi u2RcfR/KYj53HoyOm4Pm/+ONN8De4ktzXpIpJxGC+O8NBvd9vkboAS6qnCjK7KVE r91ymxxVKp2dzZvVfpIjWVZR5i2EAvS5vw8UK4gL8ALH+S9leJFZrQWcgyoJOJzH Rzr9pesX2HvdgcNG1O6QUArlsnsTnqpi/hu7tQa8tifBpWDeArOA23Y2DgeehdDF lSU/8KD4J+AkFrWWlcTaMsvSChXQkCHEMRIcSOfXtdpX5KJSE7UBQdD1opm+mR79 VeHnuJAAVZZtUZmJA7pjdKykYQARAQABiQE2BBgBCAAgFiEEyzeO1eEwbB03hcqB M00IodGdlj8FAlu6q90CGwwACgkQM00IodGdlj8bMAf+Lq3Qive4vcrCTT4IgvVj arOACdcbtt5RhVBTimT19rDWNH+m+PfPjo3FSlBj5cm70KAXUS2LBFFxhakTZ/Mq cQroWZpVbBxj4kipEVVJZFdUZQaDERJql0xYGOQrNMQ4JGqJ84BRrtOExjSqo41K hAhNe+bwPGH9/Igiixc4tH07xa7TOy4MyJv/6gpbHy/lW1hqpCAgM5fT/im5/6QF k0tED6vIuc54IWiOmwCnjZiQnJ8uCwEu+cuJ5Exwy9CNERLp5v0y4eG+0E+at9j/ macOg39qf09t53pTqe9dWv5NIi319TeBsKZ2lb0crrQjsbHqk0DAUwgQuoANqLku vA== =kRIv \-\-\-\-\-END PGP PUBLIC KEY BLOCK\-\-\-\-\- ]===]) if last_err() then return end print(key) .EE .UNINDENT .UNINDENT .SS print .sp نوشتن مستقیم دادهها در ترمینال. .INDENT 0.0 .INDENT 3.5 .sp .EX print({ some=1, fancy={ data=\(aqstructures\(aq, } }) .EE .UNINDENT .UNINDENT .sp \fBهشدار:\fP .INDENT 0.0 .INDENT 3.5 این تابع دادهها را مستقیماً در ترمینال مینویسد و میتواند با سایر قابلیتهای ترمینال تداخل ایجاد کند. استفاده از این تابع فقط باید در طول مراحل توسعه انجام شود. .UNINDENT .UNINDENT .SS psl_domain_from_dns_name .sp دامنه والد را مطابق با فهرست پسوندهای عمومی (public suffix list) برمیگرداند. برای \fBwww.a.b.c.d.example.co.uk\fP این مقدار برابر با \fBexample.co.uk\fP\& خواهد بود. .INDENT 0.0 .INDENT 3.5 .sp .EX domain = psl_domain_from_dns_name(\(aqwww.a.b.c.d.example.co.uk\(aq) print(domain == \(aqexample.co.uk\(aq) .EE .UNINDENT .UNINDENT.SS ratelimit_throttle .sp ایجاد یک محدودکننده نرخ (ratelimit) که در هر y میلیثانیه تنها x بار میتواند عبور کند. این محدودیت برای یک \fBrun\fP منفرد بهصورت سراسری بوده و با threadها نیز کار میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX \-\- allow this to pass every 250ms ratelimit_throttle(\(aqfoo\(aq, 1, 250) \-\- allow this to pass not more than 4 times per second ratelimit_throttle(\(aqfoo\(aq, 4, 1000) .EE .UNINDENT .UNINDENT .sp این قابلیت زمانی مفید است که بخواهید اجراهای خود را هماهنگ کنید تا پایینتر از یک آستانه مشخص از درخواستها باقی بمانید. .SS regex_find .sp اعمال یک regex روی یک متن. در صورتی که regex مطابقت نداشته باشد \fBnil\fP و در صورت تطابق، گروههای ضبط (capture groups) را برمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX m = regex_find(\(dq.(.)\(dq, \(dqabcdef\(dq) if m == nil then print(\(aqNo captures\(aq) end print(m[1] == \(aqab\(aq) print(m[2] == \(aqb\(aq) .EE .UNINDENT .UNINDENT .SS regex_find_all .sp مشابه \fI\%regex_find\fP، اما تمام تطابقها را برمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX m = regex_find_all(\(dq.(.)\(dq, \(dqabcdef\(dq) print(m[1][1] == \(aqab\(aq) print(m[1][2] == \(aqb\(aq) print(m[2][1] == \(aqcd\(aq) print(m[2][2] == \(aqd\(aq) print(m[3][1] == \(aqef\(aq) print(m[3][2] == \(aqf\(aq) .EE .UNINDENT .UNINDENT .SS semver_match .sp مقایسه یک نسخه با پیشنیاز نسخه. این تابع میتواند همراه با \fI\%sn0int_version\fP برای بررسی قابلیتها یا رفتارهای مشخصی استفاده شود. .INDENT 0.0 .INDENT 3.5 .sp .EX semver_match(\(aq=0.11.2\(aq, sn0int_version()) semver_match(\(aq>0.11.2\(aq, sn0int_version()) semver_match(\(aq<0.11.2\(aq, sn0int_version()) semver_match(\(aq~0.11.2\(aq, sn0int_version()) semver_match(\(aq^0.11.2\(aq, sn0int_version()) semver_match(\(aq0.11.2\(aq, sn0int_version()) \-\- synonym for ^0.11.2 semver_match(\(aq<=0.11.2\(aq, sn0int_version()) semver_match(\(aq>=0.11.2\(aq, sn0int_version()) semver_match(\(aq>=0.4.0, <=0.10.0\(aq, sn0int_version()) .EE .UNINDENT .UNINDENT .SS set_err .sp دستکاری شیء خطای سراسری (global error object). اگر قصد دارید تابع اصلی \fBrun\fP را با یک خطا خاتمه دهید، میتوانید صرفاً یک رشته را برگردانید، اما انتشار آنها از میان توابع مختلف دشوار است. \fBset_err\fP بهطور ویژه خطایی را به شیء خطای سراسری اختصاص میدهد که توسط تمام توابع دیگر rust نیز استفاده میشود. .INDENT 0.0 .INDENT 3.5 .sp .EX function foo() set_err(\(dqsomething failed\(dq) end foo() if last_err() then return end .EE .UNINDENT .UNINDENT.SS sha1 .sp یک آرایهٔ بایتی را با sha1 هش کرده و نتایج را به صورت بایت بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hex(sha1(\(dq\ex00\exff\(dq)) .EE .UNINDENT .UNINDENT .SS sha2_256 .sp یک آرایهٔ بایتی را با sha2_256 هش کرده و نتایج را به صورت بایت بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hex(sha2_256(\(dq\ex00\exff\(dq)) .EE .UNINDENT .UNINDENT .SS sha2_512 .sp یک آرایهٔ بایتی را با sha2_512 هش کرده و نتایج را به صورت بایت بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hex(sha2_512(\(dq\ex00\exff\(dq)) .EE .UNINDENT .UNINDENT .SS sha3_256 .sp یک آرایهٔ بایتی را با sha3_256 هش کرده و نتایج را به صورت بایت بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hex(sha3_256(\(dq\ex00\exff\(dq)) .EE .UNINDENT .UNINDENT .SS sha3_512 .sp یک آرایهٔ بایتی را با sha3_512 هش کرده و نتایج را به صورت بایت بازمیگرداند. .INDENT 0.0 .INDENT 3.5 .sp .EX hex(sha3_512(\(dq\ex00\exff\(dq)) .EE .UNINDENT .UNINDENT .SS sleep .sp برنامهٔ جاری را به تعداد ثانیههای مشخص شده متوقف میکند. این معمولاً تنها برای اشکالزدایی استفاده میشود. .INDENT 0.0 .INDENT 3.5 .sp .EX sleep(1) .EE .UNINDENT .UNINDENT .SS sn0int_time .sp زمان کنونی را بر اساس UTC بازمیگرداند. این تابع برای تعیین تاریخ و زمان برای فیلدهای پایگاه دادهٔ \fBDATETIME\fP مناسب است. .INDENT 0.0 .INDENT 3.5 .sp .EX now = sn0int_time() .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این قالب مختص sn0int است؛ برای دریافت زمان کنونی جهت اسکریپتنویسی به جای آن از \fI\%time_unix\fP استفاده کنید. .UNINDENT .UNINDENT.SS sn0int_time_from .sp همانند \fI\%sn0int_time\fP است، اما به جای زمان کنونی از یک برچسب زمان یونیکس (unix timestamp) بر حسب ثانیه استفاده میکند. این تابع با \fI\%time_unix\fP و \fI\%strptime\fP سازگار است\&. .INDENT 0.0 .INDENT 3.5 .sp .EX time = sn0int_time_from(1567931337) .EE .UNINDENT .UNINDENT .SS sn0int_version .sp رشتهٔ نسخهٔ کنونی sn0int را دریافت میکند. این رشته میتواند به همراه \fI\%semver_match\fP برای بررسی قابلیتها یا رفتارهای مشخص به کار رود. .INDENT 0.0 .INDENT 3.5 .sp .EX info(sn0int_version()) .EE .UNINDENT .UNINDENT .SS sock_connect .sp یک اتصال tcp ایجاد میکند. .sp گزینههای زیر در دسترس هستند: .INDENT 0.0 .TP .B \fBtls\fP برای فعالسازی tls مقدار را برابر با true قرار دهید (گواهیها اعتبارسنجی میشوند). .TP .B \fBsni_value\fP به جای آرگومان host، از یک رشتهٔ سفارشی برای افزونهٔ sni استفاده میکند. .TP .B \fBdisable_tls_verify\fP \fBخطر\fP: غیرفعالسازی اعتبارسنجی tls. این گزینه تمامی امنیت روی اتصال را غیرفعال میکند. توجه داشته باشید که sn0int همچنان نسبتاً سختگیر است؛ در صورتی که به پشتیبانی از رمزهای (ciphers) ناامن نیاز داشته باشید، با مشکل مواجه خواهید شد. .TP .B \fBproxy\fP استفاده از یک پروکسی socks5 در قالب \fB127.0.0.1:9050\fP\&. این گزینه تنها در صورتی کار میکند که با تنظیمات سراسری پروکسی تداخلی نداشته باشد. .TP .B \fBconnect_timeout\fP لغو تلاشهای اتصال tcp پس از \fBn\fP ثانیه. .TP .B \fBread_timeout\fP لغو تلاشهای خواندن پس از \fBn\fP ثانیه. از این گزینه میتوان برای بیدار کردن دورهای اتصالها استفاده کرد. .TP .B \fBwrite_timeout\fP لغو تلاشهای نوشتن پس از \fBn\fP ثانیه. .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX sock = sock_connect(\(dq127.0.0.1\(dq, 1337, { tls=true, }) .EE .UNINDENT .UNINDENT .SS sock_upgrade_tls .sp یک اتصال tcp موجود را دریافت کرده و دستتکانی tls را آغاز میکند. گزینهها همانند \fI\%sock_connect\fP هستند، اما مقدار \fBtls\fP همیشه true در نظر گرفته میشود. .sp مقدار sni باید به صورت مشخص تنظیم شود، در غیر این صورت افزونهٔ sni غیرفعال خواهد بود. .sp استفاده از این تابع به صورت ویژه اطلاعات اضافی بازمیگرداند که هنگام استفادهٔ مستقیم از \fI\%sock_connect\fP با \fBtls=true\fP نادیده گرفته میشوند\&. .INDENT 0.0 .INDENT 3.5 .sp .EX sock = sock_connect(\(dq127.0.0.1\(dq, 1337, {}) if last_err() then return end tls = sock_upgrade_tls(sock, { sni_value=\(aqexample.com\(aq, }) if last_err() then return end info(tls) .EE .UNINDENT .UNINDENT.SS sock_options .sp بهروزرسانی گزینههای یک اتصال موجود: .INDENT 0.0 .TP .B \fBread_timeout\fP لغو تلاشهای خواندن پس از \fBn\fP ثانیه. این گزینه میتواند برای بیدار کردن دورهای اتصالها استفاده شود. .TP .B \fBwrite_timeout\fP لغو تلاشهای نوشتن پس از \fBn\fP ثانیه. .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX sock_options(sock, { read_timeout=3, }) .EE .UNINDENT .UNINDENT .SS sock_send .sp ارسال داده به سوکت. .INDENT 0.0 .INDENT 3.5 .sp .EX sock_send(sock, \(dqhello world\(dq) .EE .UNINDENT .UNINDENT .SS sock_recv .sp دریافت حداکثر ۴۰۹۶ بایت از سوکت. .INDENT 0.0 .INDENT 3.5 .sp .EX x = sock_recv(sock) .EE .UNINDENT .UNINDENT .SS sock_sendline .sp ارسال یک رشته به سوکت. یک خط جدید (newline) بهطور خودکار به انتهای رشته افزوده میشود. .INDENT 0.0 .INDENT 3.5 .sp .EX sock_sendline(sock, line) .EE .UNINDENT .UNINDENT .SS sock_recvline .sp دریافت یک خط از سوکت. این خط شامل نویسه خط جدید نیز خواهد بود. .INDENT 0.0 .INDENT 3.5 .sp .EX x = sock_recvline(sock) .EE .UNINDENT .UNINDENT .SS sock_recvall .sp دریافت تمام دادهها از سوکت تا رسیدن به EOF. .INDENT 0.0 .INDENT 3.5 .sp .EX x = sock_recvall(sock) .EE .UNINDENT .UNINDENT .SS sock_recvline_contains .sp دریافت خطوط از سرور تا زمانی که یک خط شامل needle باشد، سپس بازگرداندن این خط. .INDENT 0.0 .INDENT 3.5 .sp .EX x = sock_recvline_contains(sock, needle) .EE .UNINDENT .UNINDENT.SS sock_recvline_regex .sp دریافت خطها از سرور تا زمانی که یک خط با عبارت باقاعده (regex) مطابقت پیدا کند، سپس بازگرداندن این خط. .INDENT 0.0 .INDENT 3.5 .sp .EX x = sock_recvline_regex(sock, \(dq^250 \(dq) .EE .UNINDENT .UNINDENT .SS sock_recvn .sp دریافت دقیقاً n بایت از سوکت. .INDENT 0.0 .INDENT 3.5 .sp .EX x = sock_recvn(sock, 4) .EE .UNINDENT .UNINDENT .SS sock_recvuntil .sp دریافت دادهها تا زمانی که needle پیدا شود، سپس بازگرداندن تمام دادهها شامل needle. .INDENT 0.0 .INDENT 3.5 .sp .EX x = sock_recvuntil(sock, needle) .EE .UNINDENT .UNINDENT .SS sock_sendafter .sp دریافت دادهها تا زمانی که needle پیدا شود، سپس نوشتن data در سوکت. .INDENT 0.0 .INDENT 3.5 .sp .EX sock_sendafter(sock, needle, data) .EE .UNINDENT .UNINDENT .SS sock_newline .sp بازنویسی خط جدید پیشفرض \fB\en\fP. .INDENT 0.0 .INDENT 3.5 .sp .EX sock_newline(sock, \(dq\er\en\(dq) .EE .UNINDENT .UNINDENT .SS sodium_secretbox_open .sp استفاده از رمزنگاری متقارن احراز هویت شده برای رمزگشایی یک پیام مشخص. .sp در لایهٔ درونی، این معادل \fBcrypto_secretbox_xsalsa20poly1305\fP\& است. .sp کلید \fBباید\fP ۳۲ بایت باشد، در صورت لزوم \fI\%key_trunc_pad\fP را ببینید. .sp انتظار میرود ۲۴ بایت نخست پیام رمزنگاریشده nonce باشد. .INDENT 0.0 .INDENT 3.5 .sp .EX plain = sodium_secretbox_open(encrypted, key) if last_err() then return end txt = utf8_decode(plain) if last_err() then return end info(txt) .EE .UNINDENT .UNINDENT .SS status .sp بهروزرسانی برچسب نشانگر پیشرفت. .INDENT 0.0 .INDENT 3.5 .sp .EX status(\(aqohai\(aq) .EE .UNINDENT .UNINDENT.SS stdin_readline .sp یک خط را از stdin میخواند. نویسه خط جدید پایانی حذف نمیشود. .INDENT 0.0 .INDENT 3.5 .sp .EX stdin_readline() .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این تابع تنها با \fIsn0int run \-\-stdin\fP کار میکند. .UNINDENT .UNINDENT .SS stdin_read_to_end .sp ورودی stdin را تا رسیدن به EOF به صورت یک رشته utf\-8 میخواند. .INDENT 0.0 .INDENT 3.5 .sp .EX stdin_read_to_end() .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 این تابع تنها با \fIsn0int run \-\-stdin\fP کار میکند. .UNINDENT .UNINDENT .SS str_find .sp شاخص بایتی نخستین نویسهای که با الگو مطابقت دارد را بازمیگرداند. این تطابق صراحتاً یک تطابق لفظی (literal) است نه یک الگوی lua. .sp در صورتی که تطابقی یافت نشود، مقدار \fBnil\fP بازگردانده میشود. .INDENT 0.0 .INDENT 3.5 .sp .EX x = str_find(\(aqasdf\(aq, \(aqsd\(aq) print(x == 2) .EE .UNINDENT .UNINDENT .SS str_replace .sp تمام موارد تطابق یک الگو در یک رشته را جایگزین میکند. این تطابق صراحتاً یک تطابق لفظی (literal) است نه یک الگوی lua. .sp اگر تطابقی یافت نشود، یک رونوشت تغییرنیافته بازگردانده میشود. .INDENT 0.0 .INDENT 3.5 .sp .EX x = str_replace(\(aqthis is old\(aq, \(aqold\(aq, \(aqnew\(aq) print(x == \(aqthis is new\(aq) .EE .UNINDENT .UNINDENT .SS strftime .sp یک برچسب زمانی (timestamp) تولیدشده با \fI\%time_unix\fP را به یک تاریخ قالببندی میکند؛ نگاه کنید به \X'tty: link https://docs.rs/chrono/0.4.6/chrono/format/strftime/index.html'\fI\%قوانین strftime\fP\X'tty: link'\&. .INDENT 0.0 .INDENT 3.5 .sp .EX t = strftime(\(aq%d/%m/%Y %H:%M\(aq, 1558584994) .EE .UNINDENT .UNINDENT .SS strptime .sp یک تاریخ را به یک برچسب زمانی یونیکس (unix timestamp) تجزیه میکند؛ نگاه کنید به \X'tty: link https://docs.rs/chrono/0.4.6/chrono/format/strftime/index.html'\fI\%قوانین strftime\fP\X'tty: link'\&. .INDENT 0.0 .INDENT 3.5 .sp .EX t = strptime(\(aq%d/%m/%Y %H:%M\(aq, \(aq23/05/2019 04:16\(aq) .EE .UNINDENT .UNINDENT.SS strval .sp تبدیل یک عدد به رشته. .INDENT 0.0 .INDENT 3.5 x = strval(1234) .UNINDENT .UNINDENT .SS time_unix .sp دریافت زمان کنونی به صورت ثانیههای سپریشده از \fB1 ژانویه 1970، ساعت 0:00:00 UTC\fP که به عنوان برچسب زمان یونیکس (UNIX timestamp) نیز شناخته میشود. این برچسب زمان را میتوان با استفاده از \fI\%strftime\fP قالببندی کرد. .INDENT 0.0 .INDENT 3.5 .sp .EX now = time_unix() .EE .UNINDENT .UNINDENT .SS url_decode .sp تجزیه یک رشته پرسمان (query string) به یک نگاشت (map). برای رمزگشایی درصدی خام \fI\%url_unescape\fP را ببینید. .INDENT 0.0 .INDENT 3.5 .sp .EX v = url_decode(\(aqa=b&c=d\(aq) print(v[\(aqa\(aq] == \(aqb\(aq) print(v[\(aqc\(aq] == \(aqd\(aq) .EE .UNINDENT .UNINDENT .SS url_encode .sp کدگذاری یک نگاشت (map) به یک رشته پرسمان (query string). برای کدگذاری درصدی خام \fI\%url_escape\fP را ببینید. .INDENT 0.0 .INDENT 3.5 .sp .EX v = url_encode({ a=\(aqb\(aq, c=\(aqd\(aq, }) print(v == \(aqa=b&c=d\(aq) .EE .UNINDENT .UNINDENT .SS url_escape .sp اعمال گریز نشانی وب (url escaping) بر روی یک رشته. .INDENT 0.0 .INDENT 3.5 .sp .EX v = url_escape(\(aqfoo bar?\(aq) print(v == \(aqfoo%20bar%3F\(aq) .EE .UNINDENT .UNINDENT .SS url_join .sp پیوستن یک پیوند نسبی به یک پیوند مطلق. اگر هر دو پیوند مطلق باشند، فقط پیوند نخست بازگردانده میشود: .INDENT 0.0 .INDENT 3.5 .sp .EX x = url_join(\(aqhttps://example.com/x\(aq, \(aq/foo\(aq) print(x == \(aqhttps://example.com/foo\(aq) x = url_join(\(aqhttps://example.com/x\(aq, \(aqhttps://github.com/\(aq) print(x == \(aqhttps://github.com/\(aq) .EE .UNINDENT .UNINDENT .SS url_parse .sp تجزیه یک url به مؤلفههای آن. مؤلفههای زیر بازگردانده میشوند: .INDENT 0.0 .IP \(bu 2 scheme .IP \(bu 2 host .IP \(bu 2 port .IP \(bu 2 path .IP \(bu 2 query .IP \(bu 2 fragment .IP \(bu 2 params .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX url = url_parse(\(aqhttps://example.com\(aq) print(url[\(aqscheme\(aq] == \(aqhttps\(aq) print(url[\(aqhost\(aq] == \(aqexample.com\(aq) print(url[\(aqpath\(aq] == \(aq/\(aq) .EE .UNINDENT .UNINDENT.SS url_unescape .sp حذف کدگذاری نشانی وب (URL escaping) از یک رشته. .INDENT 0.0 .INDENT 3.5 .sp .EX v = url_unescape(\(aqfoo%20bar%3F\(aq) print(v == \(aqfoo bar?\(aq) .EE .UNINDENT .UNINDENT .SS utf8_decode .sp رمزگشایی فهرستی از بایتها/اعداد به یک رشته. ممکن است اجرای این تابع با شکست مواجه شود. .INDENT 0.0 .INDENT 3.5 .sp .EX x = utf8_decode({65, 65, 65, 65}) if last_err() then return end print(x == \(aqAAAA\(aq) .EE .UNINDENT .UNINDENT .SS warn .sp ثبت یک پیام هشدار در ترمینال. .INDENT 0.0 .INDENT 3.5 .sp .EX warn(\(aqohai\(aq) .EE .UNINDENT .UNINDENT .SS warn_once .sp ثبت یکبارهٔ یک هشدار در ترمینال. این قابلیت میتواند برای نمایش یک هشدار به کاربر استفاده شود، بدون اینکه همان هشدار برای تکتک ساختارهای در حال پردازش در طول یک اجرای \fBrun\fP تکرار گردد. .INDENT 0.0 .INDENT 3.5 .sp .EX warn_once(\(aqohai\(aq) warn_once(\(aqohai\(aq) .EE .UNINDENT .UNINDENT .SS ws_connect .sp ایجاد یک اتصال websocket. قالب آدرس وب به صورت \fBws://example.com/asdf\fP است، همچنین از \fBwss://\fP نیز پشتیبانی میشود. .sp گزینههای زیر در دسترس هستند: .INDENT 0.0 .TP .B \fBheaders\fP نگاشتی از سرآیندهای (headers) اضافی که باید برای درخواست تنظیم شوند. .TP .B \fBproxy\fP استفاده از یک پروکسی socks5 در قالب \fB127.0.0.1:9050\fP\&. این گزینه تنها در صورتی کار میکند که با تنظیمات سراسری پروکسی تداخلی نداشته باشد. .TP .B \fBconnect_timeout\fP لغو تلاشها برای برقراری اتصال tcp پس از \fBn\fP ثانیه. .TP .B \fBread_timeout\fP لغو تلاشهای خواندن پس از \fBn\fP ثانیه. این گزینه میتواند برای فعالسازی دورهای اتصالها استفاده شود. .TP .B \fBwrite_timeout\fP لغو تلاشهای نوشتن پس از \fBn\fP ثانیه. .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX sock = ws_connect(\(dqwss://example.com/asdf\(dq, {}) .EE .UNINDENT .UNINDENT.SS ws_options .sp بهروزرسانی گزینههای یک اتصال موجود: .INDENT 0.0 .TP .B \fBread_timeout\fP تلاشهای خواندن را پس از \fBn\fP ثانیه لغو میکند. از این مورد میتوان برای بیدار کردن دورهای اتصالات استفاده کرد. .TP .B \fBwrite_timeout\fP تلاشهای نوشتن را پس از \fBn\fP ثانیه لغو میکند. .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX ws_options(sock, { read_timeout=3, }) .EE .UNINDENT .UNINDENT .SS ws_recv_text .sp منتظر میماند تا سرور یک فریم متنی ارسال کند. دریافت یک فریم باینری خطا در نظر گرفته میشود. به درخواستهای Ping بهطور خودکار پاسخ داده میشود. .INDENT 0.0 .INDENT 3.5 .sp .EX msg = ws_recv_text(sock) .EE .UNINDENT .UNINDENT .SS ws_recv_binary .sp منتظر میماند تا سرور یک فریم باینری ارسال کند. دریافت یک فریم متنی خطا در نظر گرفته میشود. به درخواستهای Ping بهطور خودکار پاسخ داده میشود. .INDENT 0.0 .INDENT 3.5 .sp .EX msg = ws_recv_binary(sock) .EE .UNINDENT .UNINDENT .SS ws_recv_json .sp مشابه \fI\%ws_send_text\fP است، اما بهطور خودکار \fI\%json_decode\fP را روی پاسخ اجرا میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX msg = ws_recv_json(sock) .EE .UNINDENT .UNINDENT .SS ws_send_text .sp ارسال یک فریم متنی روی اتصال websocket. .INDENT 0.0 .INDENT 3.5 .sp .EX ws_send_text(sock, \(dqohai!\(dq) .EE .UNINDENT .UNINDENT .SS ws_send_binary .sp ارسال یک فریم باینری روی اتصال websocket. .INDENT 0.0 .INDENT 3.5 .sp .EX ws_send_binary(sock, \(dq\ex00\ex01\ex02\(dq) .EE .UNINDENT .UNINDENT.SS ws_send_json .sp شیء را بهصورت یک رشتهٔ json کدگذاری کرده و آن را در قالب یک فریم متنی بر روی اتصال websocket ارسال میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX ws_send_text(sock, { foo=\(dqohai!\(dq, x={ y={1,3,3,7}, }, }) .EE .UNINDENT .UNINDENT .SS x509_parse_pem .sp یک گواهی کدگذاریشده با pem را تجزیه میکند. این تابع ممکن است ناموفق باشد. .INDENT 0.0 .INDENT 3.5 .sp .EX x = x509_parse_pem([[\-\-\-\-\-BEGIN CERTIFICATE\-\-\-\-\- MIID9DCCA3qgAwIBAgIQBWzetBRl/ycHFsBukRYuGTAKBggqhkjOPQQDAjBMMQsw CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSYwJAYDVQQDEx1EaWdp Q2VydCBFQ0MgU2VjdXJlIFNlcnZlciBDQTAeFw0xODAzMzAwMDAwMDBaFw0yMDAz MjUxMjAwMDBaMGwxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMN U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQQ2xvdWRmbGFyZSwgSW5jLjEdMBsGA1UE AwwUKi5jbG91ZGZsYXJlLWRucy5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC AASyRQsxrFBjziHmfDQjGsXBU0WWl3oxh7vg6h2V9f8lBMp18PY/td9R6VvJPa20 AwVzIJI+dL6OSxviaIZEbmK7o4ICHDCCAhgwHwYDVR0jBBgwFoAUo53mH/naOU/A buiRy5Wl2jHiCp8wHQYDVR0OBBYEFN+XTeVDs7BBp0LykM+Jf64SV4ThMGMGA1Ud EQRcMFqCFCouY2xvdWRmbGFyZS1kbnMuY29thwQBAQEBhwQBAAABghJjbG91ZGZs YXJlLWRucy5jb22HECYGRwBHAAAAAAAAAAAAERGHECYGRwBHAAAAAAAAAAAAEAEw DgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBp BgNVHR8EYjBgMC6gLKAqhihodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc3NjYS1l Y2MtZzEuY3JsMC6gLKAqhihodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc3NjYS1l Y2MtZzEuY3JsMEwGA1UdIARFMEMwNwYJYIZIAYb9bAEBMCowKAYIKwYBBQUHAgEW HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQICMHsGCCsGAQUF BwEBBG8wbTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEUG CCsGAQUFBzAChjlodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRF Q0NTZWN1cmVTZXJ2ZXJDQS5jcnQwDAYDVR0TAQH/BAIwADAKBggqhkjOPQQDAgNo ADBlAjEAjoyy2Ogh1i1/Kh9+psMc1OChlQIvQF6AkojZS8yliar6m8q5nqC3qe0h HR0fExwLAjAueWRnHX4QJ9loqMhsPk3NB0Cs0mStsNDNG6/DpCYw7XmjoG3y1LS7 ZkZZmqNn2Q8= \-\-\-\-\-END CERTIFICATE\-\-\-\-\- ]]) if last_err() then return end print(x) .EE .UNINDENT .UNINDENT .SS xml_decode .sp یک مقدار lua را از یک سند xml رمزگشایی میکند. .INDENT 0.0 .INDENT 3.5 .sp .EX x = xml_decode(\(aq