JavaScript로 나의 신혼여행을 해독하다🦒
Want more great content like this? Sign up for my newsletter, visit: alec.coffee/signup
내 아내가 인스타그램에서 이 글을 보았을 때, 그녀는 곧 끌렸다.
우리는 곧 케냐에서 신혼여행을 갈 것이다. 우리는 방을 예약할 계획이다.몇 년 전 케냐에 다녀온 고모에게 문의한 후 그녀는 이곳에 남아 예약에 아무런 어려움이 없었다.우리가 이곳이 1, 2년 앞당겨 꽉 찼다는 말을 들었을 때, 우리는 놀랐다.p>
이런 갑작스러운 유행에는 틀림없이 원인이 있을 것이다.작은 연구에 의하면 이곳이 최근에 에른에게 포위되었다고 한다
빌어먹을, 에른
처음에 우리는 그들의 사이트를 보고 우리가 케냐에 있는 날짜가 사용 가능한지 보았지만 운이 없었다.그리고 나서 우리는 정원에 메일을 보냈고 다시 한 번 말했다. 아니, 보노. 우리는 우리가 그들의 후보 명단에 들어갔다는 것을 알게 되었다.후보자 명단에 있는 다른 사람들과 경쟁할 가능성이 높다. 우리의 여정은 몇 달밖에 남지 않았다. 나와 내 아내의 희망은 막연해졌다
The search for solutions
가용성을 표시하는 사이트는 읽기만 하고 방을 예약하는 기능이 없습니다
전화를 하고 이메일을 보내는 것이 그들에게 연락하는 유일한 방법이며, 이것은 느리고 어려운 과정이다.나는 데이트가 무료로 변할 때 그들의 사이트가 먼저 , 을 업데이트한 후에 대기 명단 구성원에게 연락하기 시작할 것이라고 가정한다.이렇게 하면 탈락한 사람이 있으면 예약을 받을 수 있습니다
Assumptions
내 다음 가설은 만약 우리가 방에 시간이 있는 날 그들에게 연락을 한다면 우리는 대기 명단을 돌아갈 가능성이 높다는 것이다.하지만 한 시간에 한 번씩 사이트를 보는 것은 결코 재미있는 일이 아니다
프로그래머의 바지를 입었는데 이것은 아주 좋은 OLWebscraper의 사용 사례가 될 것이라고 생각합니다. JazzHands.30분에 한 번씩 로그인해서 아내와 내 핸드폰에 문자를 보내면 우리는 그들에게 전화를 할 수 있다.1990년대의 케냐 사이트는 로봇을 보호하는 것이 불가능했다
간단한 책상처럼 보이지만, 결과는 간단한 책상이다:
// Example of a unbooked day HTML node
<td
width="25"
unselectable="on"
ab="0"
style="border-top: none; "
name="WB15:Salas Camp:Keekorok Honeymoon
Tent-Tent 1:0*:1:11e8485f8b9898cc8de0ac1f6b165406:0"
id="WB15:07:28:2019"
darkness="0"
onmousedown="mouseDownFunction(arguments[0]);"
onmouseup="cMouseUp(arguments[0]);"
onmouseover="mouseOverFunction(arguments[0]);"
class="overbooking calIndicator0"
>
1
</td>
이것이 바로 내가 찾아야 할 것이다. 노드 텍스트가 1
라면 사용할 수 있다
간단한 html 구조를 연구한 후에 나는 노드를 작성하기 시작했다.js 서비스는 폐기합니다.나는 우연히 NPM 모듈crawler을 발견했는데 이것은 나에게 상자를 여는 데 필요한 모든 것을 주었다
const Crawler = require("crawler");
const startCrawler = async () => {
return new Promise(resolve => {
const c = new Crawler({
maxConnections: 10,
callback: (error, res, done) => {
if (error) {
console.log(error);
throw new Error(
`Error with sending request to website! ${JSON.stringify(error)}`
);
}
const $ = res.$;
// get the table of bookings
const results = $("#tblCalendar tbody tr").slice(12, 17);
done();
// return the results
resolve(results);
}
});
// hit giraffe manors website
c.queue(
"http://thesafaricollection.resrequest.com/reservation.php?20+2019-02-08" +
"+RS12:RS14:RS16:WB656:RS2274+15:20:30:25++WB5++n/a++true+true+0+0"
);
});
};
이것은 약간의 디버깅이 필요하지만, 지금은 기린 장원 사이트에서 온 HTML로 사용할 수 있습니다
다음, 나는 cheerio라는 NPM 패키지로 검색 결과
const parseResults = async () => {
let availability = false;
// get HMTL
const results = await startCrawler();
for (let x = 0; x < results.length; x++) {
// Feb 13th - Feb 20th
const validDates = cheerio(results[x]).find("td").slice(7, 14);
// See if any of the dates are not booked
for (let y = 0; y < validDates.length; y++) {
if (parseInt(validDates[y].children[0].data, 10) === 1) {
availability = true;
}
}
}
...
지금 재미있는 부분이 하나 있는데, 방이 비었을 때 아내에게 문자를 보냅니다.나는 Twilio로 이 일을 하지만 다른 서비스도 많다.이것은 무료 계정을 만들어야 합니다. 제가 몇 개의 문자를 보내지 않을 거라는 것을 알고 있습니다
...
// send text message if availability
if (availability) {
// Your Account Sid and Auth Token from twilio.com/console
const accountSid = process.env.ACCOUND_SID;
const authToken = process.env.AUTH_TOKEN;
const twilio = require("twilio");
const client = twilio(accountSid, authToken);
client.messages
.create({
body: "Giraffe manor is available for our dates!",
from: process.env.SMS_FROM,
to: process.env.SMS_TO
})
.then(message => console.log(`Sent a text! ${message.sid}`))
.done();
return;
}
console.log("No availability!");
}
몇 개의 덜 익은 날짜를 테스트한 후에 성공했습니다!이제 5분마다 실행할 예정입니다(왜 그렇지 않습니까?)
const schedule = require("node-schedule");
schedule.scheduleJob("*/5 * * * *", () => {
console.log("Running availability checker!");
try {
main();
} catch (e) {
console.log(`Error! ${JSON.stringify(e)}`);
}
});
코드를 위탁 관리하고 실행하기 위해 Heroku를 선택했습니다. 왜냐하면 저는 코드를 사용한 경험이 있고 무료층이 제 수요를 충족시킬 수 있다는 것을 알고 있기 때문입니다.그들의 무료 계층이 백그라운드 서비스를 어떻게 지원하는지 모르겠지만 어쨌든
몇 주 후(나는 정말 그것이 실행 중인 것을 잊었다) 내 아내가 휴대전화에서 문자를 받았다!우리는 즉시 그들에게 전화를 걸었다. 받았다.우리가 바라는 대로 대기 명단을 돌아간 것 같다.그녀는 대량의 문자를 받았는데, 트와이리오에서 나의 빈 층을 다 썼다. 왜냐하면 그것이 쓸만한 방을 찾았을 때, 나는 정지 방법을 쓰지 않았기 때문이다🤣
나는 이렇게 하는 것을 특히 좋아한다. 왜냐하면 나는 생활 속의 문제를 해결하기 위해 코드를 자주 쓰지 않기 때문이다. 그러나 나는 이런 그림이 가치가 있다고 생각한다.
이것은 내가 프로그래밍 기교를 어떻게 활용하여'현실'문제를 해결하는지의 예이다.나는 네가 이미 해결한 문제를 듣고 싶다. 여기서 평론을 발표한다
Like this post? Consider buying me a coffee to support me writing more.
Want to receive quarterly emails with new posts? Signup for my newsletter
Reference
이 문제에 관하여(JavaScript로 나의 신혼여행을 해독하다🦒), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aleccool213/hacking-my-honeymoon-with-javascript-11fg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)