Hverju getur heili nemanda sem lærir um tölvuheiminn?

Góður dagur.

Eftir að hafa lokið við að skrifa annað handrit í Bash áttaði ég mig á því að allt ætti að vera allt öðruvísi en allt virkaði. Ég vil sýna þér hvaða ósæmilega og hækjur ég skrifaði til að leysa vandamálið, en ekki enn með þekkingarvagn. Með öðrum orðum, skopmynd af forritun.

Verkefni


Eitthvað varð nauðsynlegt til að:

  • Sýndi margar rím fyrir orðið, nema ferninga
  • Farið yfir margar rím tveggja orða

Til hvers? Jæja, það er það - og það er það.
Hver veit ekki, ferningsrím (í venjulegu orðalagi - ferningur) eru tvö orð þar sem tveir síðustu stafirnir í stafsetningu falla saman, sem (oft er þetta það eina) gerir þá að rím. Til dæmis eru rósir frostar; dekk - bíll. Notkun ferninga í nútíma vísbendingu er ekki sérstaklega vel þegin af fólki, vegna frumstæðu þeirra.

ákvörðun


Mér virtist sem einfaldasta lausnin væri að skrifa handrit í Bash sem notar þegar fyrirliggjandi rímgenerator - HOST, sem fyrst og fremst velur þau með samhljóði, en ekki með stafsetningu. Hvers konar HOST? Vegna þess að ef þú gefur til kynna raunverulegt nafn síðunnar munu þeir segja að það sé auglýsing. Af hverju ekki að halda áfram að nota það? Í fyrsta lagi, þrátt fyrir þann kost sinn að velja rím byggðar á samhljóðum, framleiðir hann samt oft ferninga. Í öðru lagi þarftu samt að hugsa með heilanum, eyða tíma í að skipta á milli flipa og orku í að leggja á minnið endurtekin orð í listum til að finna rím fyrir tvö orð.

Að fá sterkar rím

Hvað veit ég? Ég veit um gagnsemina wget, sem hleður niður síðunni á tilgreindri vefslóð. Allt í lagi, við skulum framkvæma beiðnina - við fáum HTML síðu í skrá sem heitir með rímorði. Við skulum til dæmis leita að orðinu „hér“:

wget https://HOST/rifma/здесь

En ég þarf bara orðalista, hvernig get ég losnað við allt annað? Við skoðum og sjáum að orðalistinn er sniðinn, sama hversu skrítinn hann kann að vera, í formi lista og orðin eru í töggum . Jæja, við erum með frábært gagn. sed - við skulum skrifa þetta niður svona:

cat $word | grep '<li>' | sed -e "s%<li>%%" | sed -e "s%</li>%%" | sed -e "s/ //g" | sed -e "/^$/d" 1> $word

Fyrst skaltu velja línurnar sem innihalda merkið úr orðskránni — við fáum fullt af tómum merkjum og línum með orðum. Við fjarlægjum merkið sjálft og það sem lokar - hér eru prósentutákn notuð í stað skástrik vegna þess að í merkinu sjálfu það er nú þegar skástrik, af hverju? sed skil þig ekkert smá. Og allt er í lagi með vexti. Við fjarlægjum öll bil úr skránni, fjarlægjum tómar línur. Voila - tilbúinn listi yfir orð.

Til að fjarlægja orð sem ríma með síðustu bókstöfunum skaltu velja síðustu tvo stafina úr upprunalega orðinu og hreinsa listann:

squad=${word:((${#word}-2)):2}
cat $word | sed -e "/.$squad$/d" 1> $word

Við skoðum, við reynum - allt virkar... svo, hvar er listinn fyrir orðið „leikur“? Og fyrir orðið „ég er að fara“? Skráin er tóm! Og þetta er allt vegna þess að þessi orð eru sagnir og við vitum hvað þau gera við þá sem ríma við sagnir. Sagnirím er verra en jafnvel ferhyrnt rím, vegna þess að rússneska tungumálið hefur flestar sagnir, og allar hafa þær sömu endingar, þess vegna voru þær ekki í lokaskránni eftir að hafa athugað endingarnar.

Hins vegar erum við ekkert að flýta okkur. Fyrir hvert orð eru ekki aðeins rím, heldur einnig rím, sem hljóma stundum miklu betur en rím - þess vegna eru þær rím (franska assonans, úr latínu assono - ég hljóma í samhljómi).

Við fáum assonances

Þetta er þar sem gamanið byrjar: assonancer birtast á sérstakri vefslóð og á sömu síðu, með því að keyra skriftu, senda HTTP beiðni og fá svar. Hvernig get ég sagt wget„Ýtirðu á takkann? En engin leið. Því miður.

Ég tók eftir því að slóðin í línunni var einhvern veginn að breytast, ég afritaði það sem var þar eftir að hafa skipt yfir í assonans og límdi það í nýjan vafraflipa - sterkar rím opnuðust. Ekki þetta.

Í meginatriðum, hélt ég, ætti það ekki að skipta máli fyrir netþjóninn hvort handritið sem sendir henni beiðnina er keyrt eða hvort aðilinn slær hana inn handvirkt. Svo? Hver veit, við skulum fara að athuga það.

Hvert á að senda? Hvað á að senda? HTTP beiðni til netþjóns IP, það er eitthvað eins og GET... svo er eitthvað HTTP/1.1... Við þurfum að sjá hvað vafrinn sendir og hvert. Settu upp wireshark, sjáðu umferðina:

0040 37 5d a3 84 27 e7 fb 13 6d 93 ed cd 56 04 9d 82 7]£.'çû.m.íÍV...
0050 32 7c fb 67 46 71 dd 36 4d 42 3d f3 62 1b e0 ad 2|ûgFqÝ6MB=ób.à.
0060 ef 87 be 05 6a f9 e1 01 41 fc 25 5b c0 77 d3 94 ï.¾.jùá.Aü%[ÀwÓ.

Um... hvað? Ó já, við erum með HTTPS. Hvað skal gera? Gerðu MITM árás á sjálfan þig? Helst mun fórnarlambið sjálft hjálpa okkur.

Almennt séð, eftir að hafa ákveðið að vafra um vafrann, fann ég loksins beiðnina sjálfa og viðtakandann. Farðu:

Samtal við flugstöðina

telnet IP PORT
Trying IP...
Connected to IP.
Escape character is '^]'.
GET /rifma/%D0%BC%D0%B0%D1%82%D1%8C?mode=block&type=asn HTTP/1.1
Host: HOST
Accept-Language: en-US,en;q=0.5
X-Requested-With: XMLHttpRequest
Connection: close

HTTP/1.1 400 Bad Request
Server: nginx/1.8.0
Date: Sun, 03 Nov 2019 20:06:59 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 270
Connection: close

<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.8.0</center>
</body>
</html>
Connection closed by foreign host.

Hæ. Hehehe. Reyndar, það er það sem ég bjóst við þegar ég sendi beina HTTP beiðni til HTTPS tengi. Eigum við að dulkóða núna? Allt þetta læti með RSA lykla, svo með SHA256. Hvers vegna, það er OpenSSL fyrir svona hluti. Jæja, við vitum nú þegar hvað við eigum að gera, við munum bara fjarlægja Referer og Cookie reitina fyrst - ég held að þeir hafi ekki mikil áhrif á málið:

Samtal við flugstöðina

openssl s_client -connect IP:PORT
{Всякие ключи, сертификаты}
GET /rifma/%D0%B7%D0%B4%D0%B5%D1%81%D1%8C?mode=block&type=asn HTTP/1.1
Host: HOST
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/javascript,text/html,application/xml,text/xml,*/*
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
X-Requested-With: XMLHttpRequest
Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Status: 200 OK
Date: Sun, 03 Nov 2019 20:34:33 GMT
Set-Cookie: COOKIE
X-Powered-By: Phusion Passenger 5.0.16
Server: nginx/1.8.0 + Phusion Passenger 5.0.16
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Cache-Control: no-cache
Strict-Transport-Security: max-age=31536000
Content-Security-Policy: block-all-mixed-content
Content-Encoding: gzip

Hverju getur heili nemanda sem lærir um tölvuheiminn?

Hvað er þetta, blótsyrði á þjóninum? Jæja, að minnsta kosti svöruðu þeir mér 200 OK, sem þýðir að vafrakökur og vísarinn hafa ekki áhrif á neitt. Þjöppun er gzip, en við afritun eru ASCII stafir afritaðir. Nákvæmlega, þú getur fjarlægt línuna Samþykkja-kóðun. Allt er í lagi - við fáum HTML skjal, núna með assonances. En hér eru tvær spurningar: hvernig á að keyra OpenSSL og flytja gögn yfir á það með handriti? Og hvernig á að lesa úttakið ef við erum eftir að hafa fengið svarið áfram, eins og það var, í OpenSSL „skel“? Ef þú getur fundið eitthvað með því seinni, en með því fyrsta...

Það er gott að það sé til Habrþar sem ég las um veituna búast, sem gerir sjálfvirkan ferlið við að hafa samskipti við forrit sem búast við mannlegum samskiptum. Að vera með lið er enn meira aðlaðandi sjálfsvænt, mynda búast handrit byggt á aðgerðum þínum. Jæja, við ræsum það, gerum þetta allt og hér er fullbúið handrit. Aðeins hann er mjög stór, og allt vegna þess OpenSSL sýnir vottorð, lykla og búast bíður eftir útkomu alls þessa. Þurfum við þetta? Nei. Við fjarlægjum alla fyrstu kvaðninguna og skiljum aðeins síðasta línuskil „r“ eftir. Við fjarlægjum einnig reitina User-Agent og Samþykkja úr beiðni okkar - þeir hafa ekki áhrif á neitt. Svo, við skulum ræsa. Handritið var keyrt, en hvar er dýrmæta HTML skjalið? Búast borðaði það. Til að láta hann spýta því út þarftu að setja:

set results $expect_out(buffer)

fyrir lok skriftunnar - þetta er hvernig úttak keyrslunnar verður skrifað búast'om skipun og birtist á skjánum. Í stuttu máli, eitthvað á þessa leið:

búast við handriti

#!/usr/bin/expect -f

set timeout -1
spawn openssl s_client -connect IP:PORT
match_max 100000
expect -exact "
---r
"
send -- "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1rHost: HOSTrAccept-Language: en-US,en;q=0.5rX-Requested-With: XMLHttpRequestrConnection: close"
expect -exact "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1r
Host: HOSTr
Accept-Language: en-US,en;q=0.5r
X-Requested-With: XMLHttpRequestr
Connection: close"
send -- "r"
set results $expect_out(buffer)
expect -exact "r
"
send -- "r"
expect eof

En það er ekki allt! Eins og þú sérð var beiðnislóðin í öllum dæmum kyrrstæð, en það er vefslóðin sem ber ábyrgð á því hvaða orð verður tengt við assonances. Og svo kemur í ljós að við munum stöðugt leita að orðinu "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" í ASCII eða "hér" í UTF-8. Hvað skal gera? Auðvitað, bara einfaldlega búa til nýtt handrit í hvert skipti, vinir! Ekki lengur sjálfsvænt'ó, og með hjálpinni sakna, vegna þess Í nýju okkar breytist ekkert nema orðið. Og lengi lifi nýja vandamálið: hvernig getum við þýtt orð úr kýrilísku yfir á vefslóðarsnið á skynsamlegan hátt? Það er ekkert sérstakt fyrir flugstöðina heldur. Jæja, það er allt í lagi, við getum gert það, ekki satt? Dós:

Sjáðu hvað ég get gert!

function furl {
furl=$(echo "$word" | sed 's:А:%d0%90:g;s:Б:%d0%91:g;s:В:%d0%92:g;s:Г:%d0%93:g;s:Д:%d0%94:g;s:Е:%d0%95:g;s:Ж:%d0%96:g;s:З:%d0%97:g;s:И:%d0%98:g;s:Й:%d0%99:g;s:К:%d0%9a:g;s:Л:%d0%9b:g;s:М:%d0%9c:g;s:Н:%d0%9d:g;s:О:%d0%9e:g;s:П:%d0%9f:g;s:Р:%d0%a0:g;s:С:%d0%a1:g;s:Т:%d0%a2:g;s:У:%d0%a3:g;s:Ф:%d0%a4:g;s:Х:%d0%a5:g;s:Ц:%d0%a6:g;s:Ч:%d0%a7:g;s:Ш:%d0%a8:g;s:Щ:%d0%a9:g;s:Ъ:%d0%aa:g;s:Ы:%d0%ab:g;s:Ь:%d0%ac:g;s:Э:%d0%ad:g;s:Ю:%d0%ae:g;s:Я:%d0%af:g;s:а:%d0%b0:g;s:б:%d0%b1:g;s:в:%d0%b2:g;s:г:%d0%b3:g;s:д:%d0%b4:g;s:е:%d0%b5:g;s:ж:%d0%b6:g;s:з:%d0%b7:g;s:и:%d0%b8:g;s:й:%d0%b9:g;s:к:%d0%ba:g;s:л:%d0%bb:g;s:м:%d0%bc:g;s:н:%d0%bd:g;s:о:%d0%be:g;s:п:%d0%bf:g;s:р:%d1%80:g;s:с:%d1%81:g;s:т:%d1%82:g;s:у:%d1%83:g;s:ф:%d1%84:g;s:х:%d1%85:g;s:ц:%d1%86:g;s:ч:%d1%87:g;s:ш:%d1%88:g;s:щ:%d1%89:g;s:ъ:%d1%8a:g;s:ы:%d1%8b:g;s:ь:%d1%8c:g;s:э:%d1%8d:g;s:ю:%d1%8e:g;s:я:%d1%8f:g;s:ё:%d1%91:g;s:Ё:%d0%81:g')}

Alls erum við með skriftu sem breytir orði í ASCII texta og býr til annað skriftu sem biður um síðu með assonances frá þjóninum í gegnum OpenSSL. Og svo beinum við úttakinu af síðasta handritinu yfir í skrá og, á gamla mátann, sendum það í gegnum "síur" auka ferninga og skrifa þá í skrána.

Gatnamót margra. Kjarni málsins

Reyndar er þetta einmitt það sem veldur minnstu vandræðum. Við framkvæmum ofangreindar aðferðir fyrir tvö orð, síðan berum við saman hvert orð úr listunum tveimur og ef samsvörun finnst, sendum við það út. Nú höfum við handrit sem tekur tvö orð sem inntak og sýnir lista yfir orð sem ríma við bæði, og jafnvel að teknu tilliti til assonans, og allt þetta án þess að skipta handvirkt á milli fjögurra flipa og muna orð „með auga“ - þetta er allt safnað, gert grein fyrir og hent sjálfkrafa. Dásamlegt.

Tilgangur þessarar útgáfu var að sýna að ef einstaklingur þarf eitthvað þá gerir hann það samt. Mjög áhrifalaust, skakkt, hrollvekjandi, en það mun virka.

Heimild: www.habr.com

Bæta við athugasemd