Skip to content

Commit

Permalink
[Feature] save media from all post in a group
Browse files Browse the repository at this point in the history
  • Loading branch information
HoangTran0410 committed Sep 18, 2021
1 parent 3f7495a commit d3894fd
Show file tree
Hide file tree
Showing 10 changed files with 174 additions and 75 deletions.
10 changes: 7 additions & 3 deletions list_pages.txt → BEST_GROUPs_AND_PAGEs.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Danh sách page nhiều girl xinh:
Danh sách PAGE nhiều girl xinh:
ColourfulSpace 33841 ảnh
Gentle ∆ 1460 ảnh
girlxinhpro 302 ảnh
Expand All @@ -8,7 +8,11 @@ NgamGaiDep 248 ảnh
viral.tiktok.2019 1282 ảnh
369Choedphong 772 ảnh

Danh sách page nhiều hình đẹp:
Danh sách PAGE nhiều hình đẹp:
deviantart 10536 ảnh
4k.hd.walpaper 123 ảnh
khohinhnen 1877 ảnh
khohinhnen 1877 ảnh

Danh sách GROUP nhiều girl xinh:
J2team girls 8135 ảnh
VSBG ?
9 changes: 4 additions & 5 deletions config.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
// do not modify this
export const FB_API_HOST = "https://graph.facebook.com/v12.0";

// you can modify all the variables below
export const ACCESS_TOKEN = "YOUR_ACCESS_TOKEN";
export const ACCESS_TOKEN = "EAAAAZAw4FxQIBAON6KcVr9O2gvkVJHq1QmCc8uV2wyJTf7Uwk0vqDLmaZA39ZAD4CdXRT0Yspp7WS6zNHY9B3t5iQ8iVGbwkn7769qBJod8gn9YeERZBnQ0r8Yz5ljk7DAQhQn1HO77c36UqjtPJfNiDgQUJybiuNrkVDENkRAZDZD";
export const WAIT_BEFORE_NEXT_FETCH = 0;
export const ID_LINK_SEPERATOR = ";";
export const PHOTO_FILE_FORMAT = 'png'; // OR jpg
export const VIDEO_FILE_FORMAT = 'mp4'; // OR wav ?
export const FOLDER_TO_SAVE_LINKS = "downloads/links";
export const FOLDER_TO_SAVE_IMAGES = 'downloads/images';
export const FOLDER_TO_SAVE_IMAGES = 'downloads/images';
export const FOLDER_TO_SAVE_GROUP_MEDIA = 'downloads/group_media';
Binary file not shown.
18 changes: 9 additions & 9 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ import {
// menu();

// ============ Lấy thông tin album timeline từ page id trên fb ============
(async () => {
const album_id = await fetchTimeLineAlbumId("ColourfulSpace");
console.log(album_id);
// (async () => {
// const album_id = await fetchTimeLineAlbumId("ColourfulSpace");
// console.log(album_id);

if (album_id) {
const album_info = await fetchAlbumInfo(album_id);
console.log(album_info);
}
})();
// if (album_id) {
// const album_info = await fetchAlbumInfo(album_id);
// console.log(album_info);
// }
// })();

// ============ Lưu tất cả hình trong timeline album của 1 page fb ============
// saveTimeLineAlbum_FBPage("BoxGirlVn");
Expand All @@ -30,7 +30,7 @@ import {
// saveTimeLineAlbumPhotoLinks_FBPage("BoxGirlVn");

// ============ Lưu tất cả hình trong 1 album bất kỳ (nếu biết trước id của album) ============
// saveAlbumPhoto("245004546697321");
saveAlbumPhoto("245004546697321");

// ============ Lưu tất cả id ảnh và link ảnh trong 1 album bất kỳ (nếu biết trước id của album) ============
// saveAlbumPhotoLinks("245004546697321");
Expand Down
7 changes: 7 additions & 0 deletions scripts/bookmarks.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,13 @@ javascript: (function () {
return;
}
}

const location_check = /(?<=\/groups\/)(.*?)($|(?=&))/.exec(location.href);
if (location_check && location_check[0]) {
window.prompt(`GROUP ID của ${group_name}:`, location_check[0]);
return;
}

window.prompt(
"Không tìm thấy GROUP ID nào trong trang web!\nBạn có đang ở đúng trang group chưa?\nTrang web Ví dụ:",
"https://www.facebook.com/groups/j2team.community.girls"
Expand Down
5 changes: 5 additions & 0 deletions scripts/constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const FB_API_HOST = "https://graph.facebook.com/v12.0";
export const MEDIA_TYPE = {
PHOTO: "photo",
VIDEO: "video",
};
56 changes: 25 additions & 31 deletions scripts/download_album.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import fetch from "node-fetch";
import { FB_API_HOST } from "./constants.js";
import {
ACCESS_TOKEN,
FB_API_HOST,
WAIT_BEFORE_NEXT_FETCH,
ID_LINK_SEPERATOR,
FOLDER_TO_SAVE_LINKS,
Expand All @@ -12,51 +11,43 @@ import {
createIfNotExistDir,
deleteFile,
downloadFileSync,
myFetch,
saveToFile,
sleep,
} from "./utils.js";

// Hàm này fetch và trả về 2 thứ:
// 1. Toàn bộ link ảnh (max 100) từ 1 vị trí (cursor) nhất định trong album ảnh
// 1. Toàn bộ link ảnh (max 100) từ 1 vị trí (cursor) nhất định trong album ảnh. Định dạng: [[{id: .., url: ...}, ...]
// 2. Vị trí của ảnh tiếp theo (next cursor) (nếu có)
const fetchAlbumPhotosFromCursor = async ({ albumId, cursor, limit = 100 }) => {
// create link to fetch
let url = `${FB_API_HOST}/${albumId}/photos?fields=largest_image&limit=${limit}&access_token=${ACCESS_TOKEN}`;
if (cursor) {
url += `&after=${cursor}`;
}
if (cursor) url += `&after=${cursor}`;

try {
// fetch data
const response = await fetch(url);
const json = await response.json();
const json = await myFetch(url);

// return imgData + next cursor
return {
imgData: json.data.map(
(_) => _.id + ID_LINK_SEPERATOR + _.largest_image.source
),
nextCursor: json.paging?.cursors?.after || null,
};
} catch (e) {
return {};
}
// return imgData + next cursor
return {
imgData: json.data?.map((_) => ({ id: _.id, url: _.largest_image.source })),
nextCursor: json.paging?.cursors?.after || null,
};
};

// Hàm này fetch về toàn bộ ảnh từ 1 album. Sử dụng hàm fetchAlbumPhotosFromCursor
// Liên tục fetch ảnh và lấy nextCursor, rồi lại fetch ảnh tiếp ở cursor mới. Liên tục cho tới khi không còn nextCursor
// Dữ liệu trả về là 1 mảng chứa dữ liệu {id, url} của từng ảnh. Có dạng [{id: .., url: ...}, {id: .., url: ...}, ...]
const fetchAlbumPhotos = async ({
albumId,
pageNum = Infinity,
pageSize = 100, // max is 100 in facebook graph API
pageSize = 100, // max is 100
pageLimit = Infinity,
pageFetchedCallback = async () => {},
}) => {
let currentPage = 1;
let hasNextCursor = true;
let nextCursor = null;
let allImgsData = [];

while (hasNextCursor && currentPage <= pageNum) {
while (hasNextCursor && currentPage <= pageLimit) {
console.log(`Fetching page: ${currentPage}, pageSize: ${pageSize}...`);

const data = await fetchAlbumPhotosFromCursor({
Expand All @@ -67,7 +58,7 @@ const fetchAlbumPhotos = async ({

if (data.imgData) {
// concat data to result array
allImgsData = allImgsData.concat(data.imgData);
allImgsData.push(...data.imgData);

console.log(
`> Fetched ${data.imgData.length} photos. (Total: ${allImgsData.length})`
Expand All @@ -89,6 +80,7 @@ const fetchAlbumPhotos = async ({
} else {
// FAILED => re-fetch currentPage
console.log("FAILED.");
break;
}
}

Expand All @@ -106,7 +98,7 @@ export const fetchAlbumInfo = async (albumId) => {
const response = await fetch(url);
const json = await response.json();

if(json.error) throw json.error;
if (json.error) throw json.error;

// return album infomation
return {
Expand All @@ -131,7 +123,11 @@ export const saveAlbumPhotoLinks = async (albumId) => {
fetchAlbumPhotos({
albumId,
pageFetchedCallback: (pageImgsData) => {
saveToFile(fileName, pageImgsData.join("\n"), false);
saveToFile(
fileName,
pageImgsData.map((_) => _.id + ID_LINK_SEPERATOR + _.url).join("\n"),
false
);
},
});
};
Expand All @@ -151,20 +147,18 @@ export const saveAlbumPhoto = async (albumId) => {
const promises = [];

for (let data of pageImgsData) {
const seperated = data.split(ID_LINK_SEPERATOR);
const photo_id = seperated[0];
const link = seperated[1];
const { id: photo_id, url: photo_url } = data;

const savePath = `${dir}/${photo_id}.${PHOTO_FILE_FORMAT}`;
promises.push(
downloadFileSync({
uri: link,
uri: photo_url,
filename: savePath,
successCallback: () => {
console.log(`> Saved ${savePath}`);
},
failedCallback: (e) => {
console.log(`ERROR while save image ${savePath}`);
console.log(`ERROR while save image ${savePath}`, e.toString());
},
})
);
Expand Down
Loading

0 comments on commit d3894fd

Please sign in to comment.