http 요청을에 전송해야하는 github 작업을 만들려고합니다 https://www.instagram.com/<username>/?__a=1
.
로컬에서 실행할 때 완벽하게 잘 실행되고 팔로워 수를 제공합니다.
하지만 github 작업에서 사용할 때 응답이 null이므로 JSON 문자열을 구문 분석 할 수 없습니다.
다음은 github 작업 파일 https://github.com/ashawe/actions-check/blob/e80ca115544979cdb3180207b99c7724e4446849/index.js에 대한 링크입니다.
팔로어를 얻는 코드는 다음과 같습니다 (# 94에서 시작)
promiseArray.push(new Promise((resolve, reject) => {
const url = 'https://www.instagram.com/' + INSTAGRAM_USERNAME + '/?__a=1';
core.info("url is");
core.info(url);
http.get(url, (response) => {
let chunks_of_data = [];
response.on('data', (fragments) => {
chunks_of_data.push(fragments);
});
response.on('end', () => {
let response_body = Buffer.concat(chunks_of_data);
core.info(response_body.toString());
let responseJSON = JSON.parse(response_body.toString());
resolve((responseJSON.graphql.user.edge_followed_by.count).toString());
});
response.on('error', (error) => {
reject(error);
});
});
}));
그런 다음 다음과 같이 처리하고 있습니다.
Promise.allSettled(promiseArray).then((results) => {
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
// Succeeded
// core.info(runnerNameArray[index] + ' runner succeeded. Post count: ' + result.value.length);
// postsArray.push(result.value);
instagram_followers = result.value;
} else {
jobFailFlag = true;
// Rejected
//core.error(runnerNameArray[index] + ' runner failed, please verify the configuration. Error:');
core.error(result.reason);
}
});
}).finally(() => {
try {
const followers = instagram_followers;
const readmeData = fs.readFileSync(README_FILE_PATH, 'utf8');
// core.info(readmeData);
const shieldURL = "https://img.shields.io/badge/ %40 " + INSTAGRAM_USERNAME + "-" + followers + "-%23E4405F?style=for-the-badge&logo=instagram";
const instagramBadge = "<img align='left' alt='instagram-followers' src='" + shieldURL + "' />";
const newReadme = buildReadme(readmeData, instagramBadge);
// core.info(newReadme);
// if there's change in readme file update it
if (newReadme !== readmeData) {
core.info('Writing to ' + README_FILE_PATH);
fs.writeFileSync(README_FILE_PATH, newReadme);
if (!process.env.TEST_MODE) {
// noinspection JSIgnoredPromiseFromCall
commitReadme();
}
} else {
core.info('No change detected, skipping');
process.exit(0);
}
} catch (e) {
core.error(e);
process.exit(1);
}
});
이는 response_body가 완전한 JSON 응답이 아니지만 https://www.instagram.com/USERNAME/?__a=1에 대한 요청 이 json 응답을 전송 함을 의미합니다 .
최신 정보
기본적으로 해당 엔드 포인트에 도달 할 때마다 로그인 html 페이지가 반환되어 json 구문 분석이 실패합니다. 사용자로부터 정보를 얻기 전에 인증이 필요한 API를 사용해야 할 수 있습니다. 또는 다른 스크래핑 방법론을 알아 내십시오.
VPN 및 개인 브라우저로 이동하여 로컬 PC에서이 오류를 재현 할 수있었습니다. 엔드 포인트에 도달했을 때 로그인 화면으로 이동했습니다. 그리고 터미널에서 컬을 통해 끝점에 도달했을 때 아무것도 반환하지 않았습니다. 그러나 내가 VPN을 해제했을 때 모든 것이 잘 작동했습니다. 로컬에서 작동하는 이유는 브라우저에서 캐싱이 일어나고 VPN이 아니라고 생각하기 때문이라고 생각합니다. VPN에서 네트워크 블랙리스트가 발생한다고 생각합니다. 나는 github 호스팅 네트워크를 모르기 때문에 그것에 대해 더 알고 싶다면 그들과 함께 티켓을 여는 것이 좋습니다.
다음은 빠른 참조를위한 Instagram API 문서입니다. https://developers.facebook.com/docs/instagram-basic-display-api/getting-started
미리보기 응답 : 다른 사용자가 나중에 참조 할 수 있도록 여기에 남겨 둡니다.
사용자 이름을 전달하지 않아 사용자 이름이 비어있는 엔드 포인트를 쿼리하려고합니다.
작업에서 index.js 노드 만 실행하는 대신 작업을 호출하고 필요한 매개 변수를 제공해야합니다.
- name: Your github action
uses: ./ # Uses an action in the root directory
with:
username: '_meroware'
그러면 코드가 올바르게 선택합니다.
const INSTAGRAM_USERNAME = core.getInput('username');
const url = 'https://www.instagram.com/' + INSTAGRAM_USERNAME + '/?__a=1';
리소스 : https://docs.github.com/en/actions/creating-actions/creating-a-javascript-action
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다